/* some plugins we use ... TODO: move to external file? */
(function( $ ){

	$.fn.followWindow = function ( startPos, endPos, windowOffset ) {
	
		var callLimitMS = 10; // call limit in milliseconds
		var startDate = new Date();
   		var $this = this;
   		var height = $this.height();
   		$window = $(window);
   		
   		if( $this.length > 0 ){
   		
	   		$window.scroll(function(e){
	   		
				var callDate = new Date();
				if( callDate.getTime() - callLimitMS > startDate ){
		
					startDate = new Date();
		   			var scrollPos = $window.scrollTop();
		   			var finalEndPos = endPos - height;
		   			var divOffset = scrollPos - ($this.offset().top - scrollPos);
		   			
					//console.log( divOffset + ', ' + finalEndPos );
		   			
		   			if( divOffset > finalEndPos ){
			        
			        	$this.css({
			                top: finalEndPos,
			                left: 0
			            });
		   			
			        } else if ( scrollPos > startPos) {
	
			            $this.css({
			                top: scrollPos - windowOffset,
			                left: 0
			            });
			            
			            // $this.animate({'top': scrollPos - windowOffset}, 50);
			            
			        } else {
			            $this.css({
			                top: startPos,
			                left: 0
			            });
			        }
		        }
		    });
	    
	    }
	};
	
 $.fn.slideDown = function( duration, startPos ) {
	
		var endPos = this.css( 'top' );
		
		if( endPos == 'auto' ){
			endPos = '0';
		}
		
		if( startPos == undefined ){
			startPos = "-" + this.css('height');
		}
		
		this.css( {"top":startPos,"opacity":"1"} );
		this.animate({
		  	opacity: 1,
		  	top: [endPos, 'easeInOutQuint']
		 }, parseInt( duration ) ).show();	
		 
 		return this;		
	};
	
	
	$.fn.slideUp = function( duration ) {
	
		var endPos = this.css( 'top' );
		var startPos = this.css('height');
		
		this.css( {"top":startPos,"opacity":"1"} );
		this.delay(1000).animate({
		  	opacity: 1,
		  	top: [endPos, 'easeInOutQuint']
		  }, parseInt( duration ) ).show();

		return this;
	};
		
})( jQuery );

var RiverCafe = RiverCafe || {};

RiverCafe = (function($) {

	return {
	
	constants: 
	{
			CONTENT_DIV		: 'content',
			NAV_DIV			: 'nav',
			FOOTER_DIV		: 'footer',
			PART_UNLOAD_EVT	: 'partialUnloadEvent'
	},
	global:
	{		
		init: function()
		{
											
			$.each( $('.capitalized'), function() {
				$this = $(this);
				var title = $this.html().replace(/(<([^>]+)>)/ig,'');
				// lowercase with a few extra utf chars (è,é,à,á)
				$this.html( title.replace( /([a-z\u00E9\u00E8\u00E0\u00E1]+|\&[a-z]+;)/g, '<span class="smaller">$1</span>' ) );
				
				$this = null;
			});
			
			$nav = $('#' + RiverCafe.constants.NAV_DIV );
			
			/*
			// setup single reservation drop-down
			$('.reserveBadge').click( function( event ) {
				RiverCafe.global.clickDropdown( event, 'bookReservation' );
			});	
			
			var $bookResLink = $nav.find('a[href*="make_a_reservation"]'); // uri of page
			$bookResLink.click( function( event ) {
				RiverCafe.global.clickDropdown( event, 'bookReservation' );
				event.stopImmediatePropagation();
			});
			$bookResLink = null;
			*/
			
			// setup newsletters
			$('.newsletterLink').click( function( event ) {
				RiverCafe.global.clickDropdown( event, 'newsletterSignup' );
				//$('html, body').animate({ scrollTop: 0 }, 0);
				event.stopImmediatePropagation();
			});	
			
			/*
			var $newsletterLink = $nav.find('a[href*="newsletter"]'); // uri of page
			$newsletterLink.click( function( event ) {
				RiverCafe.global.clickDropdown( event, 'newsletterSignup' );
				event.stopImmediatePropagation();
			});	
			$newsletterLink = null;
			*/
			
			$('#eventBadge').show();
			
			RiverCafe.awards.init();
			
		}, // --- END global.init
		
		clickDropdown: function( event, dropdownId, closeDivIds )
		{
			event.preventDefault();
			
			$this = $(event.currentTarget);

			// un-bind the old click event and assign to one that does nothing
			// (otherwise if user clicks again (before animation is finished) the position
			// doesn't get re-set properly and click no longer animates as expected)
			$this.unbind( 'click' ).click( function( e ) { e.preventDefault(); return false } );

			//$element = $( '#' + $this.attr('href') );
			$element = $( '#' + dropdownId );
			//console.log( 'ELEMENT -- #' + $this.attr('href') );
			//console.log( 'ELEMENT -- #' + dropdownId );
							
			RiverCafe.global.animateDropdown( $element, function() {
			
			  	// re-bind click event
  				if( $this != null ){
			  	
			  	$this.unbind( 'click' );
			  	$this.click( function( event ) {
					RiverCafe.global.clickDropdown( event, dropdownId );
				});	

				// $this.click( RiverCafe.global.clickDropdown );
				
				
				// setup the close button action
				$element.find('a.close-button').unbind('click').click( function( e ) {
					e.preventDefault();
					$element.unbind('clickoutside');
					RiverCafe.global.animateDropdown( $( '#' + dropdownId ) );
				});
				
				// setup close action if click outside the div
				// TODO: fix bug where if we open TWO pop-ups we get problems;
				// basically, we can't stop a click event on another pop-up link from firing 
				// b/c we only recieve the event notification AFTER it does :(
				// NOTE: this isn't a huge deal b/c on refresh it's fixed + most 
				// ppl don't click on two pop-ups before closing the first one
				/*
				$element.bind('clickoutside',function( e ){
					e.stopImmediatePropagation();
					$element.unbind('clickoutside');
					RiverCafe.global.animateDropdown( $( '#' + dropdownId ) );
				});
				*/
				}
				
			});
			
		
		}, // --- END global.clickDropdown
		
		
		closeAllDropdowns: function( elements, excludeDiv )
		{
		
			for( i=0; i<elements.length; i++){
			
				if( excludeDiv != elements[i] ){
			
					var $element = $('#' + elements[i] );
					
					// only if it's visible should we worry about it..
					if( $element.css( 'display' ) != 'none' ){
						RiverCafe.global.animateDropdown( $element );
					}
				}
			}
			
		}, // --- END global.closeAllDropdowns
		
		animateDropdown: function( $element, callbackFnc, staticPosition )
		{
			
			if( $element != undefined ){
			 
				var aniLen = 600;
			
				var hidePos = "-" + ( parseInt( $element.css('height').replace( 'px', '' ) ) * 2 ) + 'px';
				var showPos = $(window).scrollTop() + 25; 
				
				if( true === staticPosition ){
					showPos = $element.css( 'top' );
				}
				
				if( hidePos == 'auto' ){
					hidePos = '0';
				}
				
				var startPos = 0;
				var endPos = 0;
				var show = false;
			
				if( $element.css( 'display' ) == 'none' ){
					
					// SHOW
					//console.log( 'SHOW ' + $element.attr('id')  );
					startPos = hidePos;
					endPos = showPos;
					show = true;
					
				} else {
					
					// HIDE
					//console.log( 'HIDE ' + $element.attr('id') );
					startPos = $element.css( 'top' );
					endPos = hidePos;
					show = false;
				}
				
				//console.log( 'ANIMATE -- ' + $element.attr('id') + startPos + ' - ' +  endPos + ' (' + aniLen + ')' );
				
				if( true === staticPosition ){
					$element.css( {"top":startPos,"opacity":"1"} );
				}else {
					$('.popup').css('z-index', "18");
					$element.css( {"top":startPos,"opacity":"1", "z-index": "19"} );					
				}
				
				$element.animate({
				  	opacity: 1,
				  	top: [endPos, 'easeInOutQuint']
				  }, aniLen, function(){ 
				  
				  	// on complete
				  	if( false == show ){
				  	
				  		// reset back to original position
				  		$element.hide();
				  		$element.css( {"top":startPos} );
				  	}
				  	
			  	 	if(typeof callbackFnc == 'function'){
				  		callbackFnc();
				  	}
				  
				  }).show();
			}
			
			return false;
		
		}, // --- END global.animateDropdown
		
		
		hrMinToTimeStr: function ( hours, mins )
		{
			var timeStr = "";
			if (mins < 10){
					mins = "0" + mins
			}
			
			timeStr = ":" + mins + " ";
			
			if(hours > 11){
					timeStr += "pm";
			} else {
			 timeStr += "am";
			}
			
			// to 12 hour time
			if( hours > 12 ){
	 			hours = hours - 12;
			}
			
			timeStr = hours +	timeStr;
			
			return timeStr;
			
		}, // --- END global.hrMinToTimeStr
		
		updateAvailReserveTimes: function ( year, month, day  )
		{
		
			var minuteVals = new Array( 0, 30 );
			var reserveDate = new Date( parseInt( year ), parseInt( month )-1, parseInt( day ) );
			var dow = reserveDate.getDay();
			var times;
			
			if( dow == 0 || dow == 6 ){					
			
				// weekend -- 10:00 to 3:00
				times = new Array( 
					new Array( "Brunch", "10-15" ), 
					new Array( "Dinner" , "17-23" ));
					
			}else {
			
				// weekday -- 11:00 to 3:00, 5:00 to 11:00
				 times = new Array( 
					new Array( "Lunch", "11-15" ), 
					new Array( "Dinner" , "17-23" ));
			}
			
			var options = '';
			var previousSelection = $('#time-combo').val();
			
			for( i=0; i<times.length; i++){
							
				var timeRange = times[i][1];
				var timeRangeSplit = timeRange.split( "-" );
				var startTime = parseInt( timeRangeSplit[0] );
				var endTime = parseInt( timeRangeSplit[1] );
				
				var label = times[i][0];
				options += "<optgroup label='" + label + " (" +  RiverCafe.global.hrMinToTimeStr( startTime, 0 ) + " - " + RiverCafe.global.hrMinToTimeStr( endTime, 0 ) + ")'>";
	
				if( endTime >= startTime ){
	
				for( j=startTime; j<=endTime; j++ ){
					
					   for( k=0; k<minuteVals.length; k++){
	
				   			var selected = "";		
			   				var timeStr = RiverCafe.global.hrMinToTimeStr( j, minuteVals[k] );
					   	
					   		if( timeStr == previousSelection ){
												selected = " selected='selected'";
										}
				   				
				   			// don't output the minute options for the ending hour
				   			if( j < endTime || (j == endTime && minuteVals[k] == 0) ){
					   					options += "<option value='" + timeStr + "'" + selected + ">" + timeStr + "</option>";
					   		}
					   }
						
					}
				}
					
					options += "</optgroup>";
					
			} // end for
			
			$('#time-combo').html( options );
		
		} // --- END global.updateAvailReserveTimes
		
		
	}, // --- END global
	
	home:
	{
	
		init: function()
		{
			
			//console.log( 'home.init();' );
			
			// rotate some of the images in JS so our files size aren't so huge
			$('#homePic1').rotate( -4 );
			$('#homePic2').rotate( 4 );
			//$('#homePic3').rotate( 5 );
			
			// setup image animations
			$.each( $('.headerImages img, .headerImages canvas'), function( i , val) {
				$(this).show();
				$(this).slideDown( 1300 + ( 300 * i ) ); 
			});
			
			/*
			$.each( $('.badge'), function( i , val) {
				$(this).show();
				$(this).slideDown( 1400 + ( 300 * i ), -700 ); 
			});
			*/
				
			/*
			$.each( $('.footerImages div'), function( i , val) {
				$(this).show();
				$(this).slideUp( 1500 + ( 300 * i ) );
			});
			*/

			$('#eventBadge').delay(1000).css('display', 'inline').slideDown( 1500 );

			// setup on click handlers			
			//$('#awardsBadge').click( function( event ) {
			setTimeout( function(){ 
				//var e = jQuery.Event("click");
				//RiverCafe.global.clickDropdown( e, 'awards' );
				RiverCafe.global.animateDropdown( $('#awards'), null, true );
			}, 2000 );
			
			
			//});	
			
			// call unload func. on pageUnLoad
			//$(window).bind( RiverCafe.constants.PART_UNLOAD_EVT, RiverCafe.home.unload );
		
		}, // --- END home.init() 
		
		unload: function()
		{
			
			//console.log( 'home.unload();' );
			
			//$(window).unbind( RiverCafe.constants.PART_UNLOAD_EVT );
			//$('#awardsBadge').unbind( 'click' );
			//$('#newsletterBadge').unbind( 'click' );
		}
		
	}, // --- END home
	
	
	reservation:
	{
	
		init: function()
		{
		
			//console.log( 'reserve init()' );
		
			$('#reserve-date-input').datepicker({
				// numberOfMonths: 3,
				showButtonPanel: true,
				minDate: '+0d',
				dateFormat: 'MM d, yy',
				altFormat: 'mm/dd/yy',
				altField: '#reserve-date-hidden',
				gotoCurrent: true
			});
			
			// this will adjust what times are available to the user
			// when they change the date
			$('#reserve-date-input').change( function() {
	
				var strDate = $('#reserve-date-hidden').val();
				var strDateParts = strDate.split( '/', 3);
		
				var year = parseInt( strDateParts[2] );
				var month = parseInt( strDateParts[0] );
				var day = parseInt( strDateParts[1] );
		
				RiverCafe.global.updateAvailReserveTimes( year, month, day );
				
			});
			
			// initialize date picker with tomorrow's date by default
			var today = new Date();
			//console.log( today );
			var tomorrow = new Date( today.getTime() + (1000*3600*24) );
			//console.log( tomorrow );
			$('#reserve-date-input').datepicker("setDate", tomorrow );
			RiverCafe.global.updateAvailReserveTimes( tomorrow.getFullYear(), tomorrow.getMonth()+1, tomorrow.getDate() );
			
			// open table only supports 6 or less people
			// if it's greater than that, re-direct user to our group
			// bookings page
			$("#party-size-combo").append( 
				$('<option></option>').val("group_booking").html("7+")
			);
			
			$('#reserve').submit( function(){
				
				if( $('#party-size-combo').val() == "group_booking" ){
					
					$('#reserve').attr('target', '_self');
					$('#reserve').attr('action', '/reservations/large_parties/group_bookings/' );
				}
				
			});
			
		}
	
	}, // --- END reservation 
	
	newsletter :
	{
	
	
		init: function()
		{
		
			$('#signupForm').validate({
				 submitHandler: function( form ) {
				 	
					$('#submitter').replaceWith( '<img src="/img/loading.gif">' );
					
		   			$(form).ajaxSubmit({
		   				success: function() {
		   					$('#signupForm').replaceWith( '<span>You have successfully Subscribed to our newsletter.</span>' );
		   				},
		   				error: function()
		   				{
		   					// error
		   				}
		   			});
		   			
		   			return false;
			    },
				wrapper: 'div class="error-msg"',
				errorElement: 'p',
				rules: {
					'email': {
						required: true,
						email: true
					}
				},
				messages: {
					'email': 'Please enter a valid email'
				}
			});

		}
	
	}, // --- END newsletter 
	
	
	review :
	{
	
		init: function()
		{
			
			// setup review
			$('#submitReview').click( function( event ) {
				RiverCafe.global.clickDropdown( event, 'submitReviewForm' );
				event.stopImmediatePropagation();
			});	
		
		}, 
		
		openSubmitForm: function()
		{
			//var e = jQuery.Event('click');
			//RiverCafe.global.clickDropdown( e, 'submitReviewForm' );
			RiverCafe.review.init();
			$('#submitReview').trigger( 'click' );
		}
	
	}, // --- END review 
	
	
	awards : 
	{
	
		init: function()
		{
			
			// the yearometer should follow the window as a user scrolls down
			// ---------
													
			$('#yearometer').followWindow( 425, $('#footer').offset().top - 250, 50 );
			$('#yearometer a').click( function( e ) {
							
				var $this = $(this);
				
			 	var anchorId = $this.attr( 'href' );
			 	var scrollToPos = $( anchorId ).position().top;
			 
				/*
				var pos = $this.position();
				var endPos = pos.top - $this.height()/2;
				
				$('#brass-slider').animate({
		  			top: [endPos, 'easeInOutQuint']
		 		 }, 500 );
				*/
															
				 $('html, body').animate({scrollTop : scrollToPos},'slow');
				
				e.preventDefault();
						
			});
			
			
			
			// the 'brass' sliding bar in the yearometer has to slide
			// around to match the content on the page
			// ------------

			
			// find all the yearometer links & thier associated anchor positions
			var linkAnchorPos = new Array();
			var count = 0;
			var yearometerOffset = 0;
			
			if( $('#yearometer').offset() != null ){
				yearometerOffset = $('#yearometer').offset().top;
			}
			$('#yearometer a').each( function( index, link ){
			
				var $this = $(this);
				var linkPos = $(this).offset().top - yearometerOffset;
				linkPos += ($this.css('font-size').replace("px", "")/2); // to account for the difference 
					
				//console.log( $this.css('font-size').replace("px", "")/2 );
						
				var anchorId = $this.attr( 'href' );
			  	var anchorPos = $( anchorId ).offset().top; // relative to document
						
				linkAnchorPos[index] = new Array( linkPos, anchorPos );
				
				//console.log( linkPos );
				
			});
				
			//console.log( linkAnchorPos );
			
			//$('#brass-slider').css('top', 86.5 + 55  );
			

			var callLimitMS = 25; // call limit in milliseconds
			var startDate = new Date();
		
			var $slider = $('#brass-slider');
			var sliderOffset = $slider.height()/2;
			 $(window).scroll(function(e){
				  		
				var callDate = new Date();
				if( callDate.getTime() - callLimitMS > startDate ){
	
					startDate = new Date();

					// when an anchor link is clicked by a user, the browser moves the view window so that
					// the anchor is partway down the page, 190 is my guess for that offset
					var currentPos = $(window).scrollTop() + 190;
					
					for( i=0; i<linkAnchorPos.length; i++ ){
					
						var lowerLinkPos = linkAnchorPos[i][0]
						var lowerAnchorPos = linkAnchorPos[i][1];
						
						if( linkAnchorPos[i+1] != undefined ){
																								
							var upperAnchorPos = linkAnchorPos[i+1][1];
				
							if( currentPos >= lowerAnchorPos && currentPos <= upperAnchorPos ){
									
									//console.log( 'CurrentPos = ' + currentPos );
									
									var upperLinkPos = linkAnchorPos[i+1][0];

									//console.log( 'FOUND RANGE' );
									//console.log( 'i = ' + i );
											
									var anchorDif = upperAnchorPos - lowerAnchorPos;
									//console.log( 'anchor Dif = ' + anchorDif );
											
									var ratio = Math.abs( (lowerAnchorPos - currentPos) / anchorDif);
									//console.log( 'ratio = ' + ratio );
											
									var newPos = (upperLinkPos - lowerLinkPos) * ratio + lowerLinkPos;
									//console.log( 'new pos = ' + newPos );
											
							 		 // adjust for height of slider (so we get the middle of the slider not the top)			
								 	newPos -= sliderOffset;
								 
									//console.log( 'new pos = ' + newPos );
																													
									$slider.css('top', newPos);
									break;
								
								}
							}

					} // end for
			
				}
			
			});
			
		
		}
	
	} // --- END awards 

	};
	
})(jQuery);

// --------------- GLOBAL INIT --------------------
$(window).load(function(){

	RiverCafe.global.init();
});
