/**
 *	primary JavaScript file for PopTarts.com
 *	requires: jquery.js (written and tested against jQuery version 1.7.1)
 *	requires: bgc.js
 */
if ( $.browser.msie ) {
	var browserVersion = parseInt ( $.browser.version );
	$( 'html' ).removeClass( 'no-js' ).addClass( 'js ie ie' + browserVersion );
} else {
	$( 'html' ).removeClass( 'no-js' ).addClass( 'js not-ie' );
}

// prevent background image flicker in IE
try {
	if (!window.opera) document.execCommand("BackgroundImageCache", false, true);
} catch(err) {};

// Creates method on global string object for scrubbing purposes
String.prototype.cleanLabel = function () {
	return this.replace(/\W/g, "");
};


var PT = PT || {};

$(function() {
	PT.Navigation.init();
	PT.SideBuddies.init();
	PT.UI.init();
	PT.IE.init();
	PT.Overlay.init();
	PT.SiteFooter.init();
});

PT.Global = {
	isJSReady: false
};

PT.SideBuddies = {
	
	settings: {
		bodyWidth: 960,
		imgNudge: 53,
		imgWidth: 215,
		imgHeight: 186,
		jsonService: '/global/getBuddies',
		wrapperClass: 'side-buddy',
		leftImg: '/img/side_buddies/left/cherry_1.png',
		leftX: 0,
		rightX: 0,
		rightImg: '/img/side_buddies/right/cherry_1.png',
		rightX: 0,
		rightY: 0,
		parentWrapper: '#site-wrapper',
		parentWrapperWidth: 960
	},
	
	init: function ( options ) {
		
		if ( options ) {
			$.extend ( PT.SideBuddies.settings, options );
		}
		
		if ( $( PT.SideBuddies.settings.parentWrapper ).length == 0 ) {
			return;
		}
		
		PT.SideBuddies.setImages();
		PT.SideBuddies.setYOffsets();
		PT.SideBuddies.setWidths();
		PT.SideBuddies.addShims();
		PT.SideBuddies.setBackgrounds();
		
		$(window).resize( function() {
			PT.SideBuddies.setYOffsets();
			PT.SideBuddies.setWidths();
			PT.SideBuddies.setBackgrounds();
		});
		
	},
	
	addShims: function() {
		if ( $('html').hasClass('multiplebgs') ) { return; }
		
		$( PT.SideBuddies.settings.parentWrapper ).wrap( '<div id="' + PT.SideBuddies.settings.wrapperClass + '-right" class="' + PT.SideBuddies.settings.wrapperClass + '" />' );
		$( '#' + PT.SideBuddies.settings.wrapperClass + '-right' ).wrap( '<div id="' + PT.SideBuddies.settings.wrapperClass + '-left" class="' + PT.SideBuddies.settings.wrapperClass + '" />' );
	},
	
	setBackgrounds: function() {
		
		if ( $('html').hasClass('multiplebgs') ) {
			
			var bgi = 'url(' + PT.SideBuddies.settings.leftImg + '), url(' + PT.SideBuddies.settings.rightImg + ')';
			var bgp = PT.SideBuddies.settings.leftX + 'px ' + PT.SideBuddies.settings.leftY + 'px, ' + PT.SideBuddies.settings.rightX + 'px ' + PT.SideBuddies.settings.rightY + 'px';
			var bgr = 'no-repeat';
			$( 'body' ).css({
				'background-attachment': 'fixed',
				'background-image': bgi,
				'background-position': bgp,
				'background-repeat': bgr
			});
			
			
		} else {
			$( '#' + PT.SideBuddies.settings.wrapperClass + '-left' ).css({
				'background-attachment': 'fixed',
				'background-color': 'transparent',
				'background-image': 'url(' + PT.SideBuddies.settings.leftImg + ')',
				'background-position': PT.SideBuddies.settings.leftX + 'px ' + PT.SideBuddies.settings.leftY + 'px',
				'background-repeat': 'no-repeat'
			});
			
			$( '#' + PT.SideBuddies.settings.wrapperClass + '-right' ).css({
				'background-attachment': 'fixed',
				'background-color': 'transparent',
				'background-image': 'url(' + PT.SideBuddies.settings.rightImg + ')',
				'background-position': PT.SideBuddies.settings.rightX + 'px ' + PT.SideBuddies.settings.rightY + 'px',
				'background-repeat': 'no-repeat'
			});
			
		}
		
	},
	
	setImages: function() {
		$.ajax({
			async: false,
			type: 'GET',
			url: PT.SideBuddies.settings.jsonService,
			data: {},
			dataType: 'json',
			success: function(data) {
				PT.SideBuddies.settings.leftImg = data.Left;
				PT.SideBuddies.settings.rightImg = data.Right;
			}
		});
	},
	
	setXOffsets: function() {
		var parentOffset = $(PT.SideBuddies.settings.parentWrapper).offset().left;
		PT.SideBuddies.settings.rightX = parentOffset + ( PT.SideBuddies.settings.parentWrapperWidth - PT.SideBuddies.settings.imgNudge );
		PT.SideBuddies.settings.leftX = parentOffset - ( PT.SideBuddies.settings.imgWidth - PT.SideBuddies.settings.imgNudge );
	},
	
	setYOffsets: function() {
		var fold = $(window).height();
		var doc = $(document).outerHeight();
		var y1 = randomFromTo(142,fold - PT.SideBuddies.settings.imgHeight - 100);
		var y2 = randomFromTo(142,fold - PT.SideBuddies.settings.imgHeight - 100);
		var d = new Date();
		mt = d.getSeconds();
		if ( mt % 2 == 0 ) {
			PT.SideBuddies.settings.leftY = y2;
			PT.SideBuddies.settings.rightY = y1;
		} else {
			PT.SideBuddies.settings.leftY = y1;
			PT.SideBuddies.settings.rightY = y2;
		}
	},
	
	setWidths: function() {
		PT.SideBuddies.bodyWidth = $('body').outerWidth();
		PT.SideBuddies.parentWrapperWidth = $(PT.SideBuddies.settings.parentWrapper).outerWidth();
		PT.SideBuddies.setXOffsets();
	}
	
};

PT.Navigation = {

	init: function () {
		
		$( 'header#site-header nav .has-submenu' ).delegate( 'a.item', 'click', function(e) {
			e.preventDefault();
			
			if ( $( this ).parent().hasClass('expanded') ) {
				$( this ).parent().find( 'ol' ).slideUp( 100, function() {
					$( this ).parent().removeClass( 'expanded' );
				});
			} else {
				$( this ).parent().addClass( 'expanded' );
				$( this ).parent().find( 'ol' ).slideDown( 100 );
			}
			
		});
		
		$( 'header#site-header nav .inactive' ).delegate( 'a.item', 'click', function(e) {
			e.preventDefault();
		});
		
	}

};

PT.IE = {

	init: function() {
	
		if ( ! $.browser.msie ) {
			return;
		}
		
		var browserVersion = parseInt ( $.browser.version );
		
		if ( browserVersion > 8 ) {
			return;
		}
		
		//DD_roundies.addRule( '#secondary-content .container', ')
		
		DD_roundies.addRule( '.round-16', '16px', true);
		DD_roundies.addRule( '.round-16-top', '16px 16px 0 0', true);
		
		
		//$( '#secondary-content .container' ).corner( '16px cc:#dedede' );
		//$( '#secondary-content .container h3' ).corner( 'top 16px cc:#dedede' );
		//$( '.round-16' ).corner('16px');
	
	}

};

PT.Overlay = {

	settings: {
	
	},
	
	init: function ( options ) {
		
		if ( options ) {
			$.extend ( PT.Overlay.settings, options );
		}
		
		$( 'a[href$="/print"]' ).fancybox({
			autoSize: false,
			closeBtn: true,
			height: 953,
			minHeight: 953,
			maxHeight: 953,
			type: 'iframe',
			title: null,
			padding: 0,
			scrolling: 'auto',
			maxWidth: 880,
			minWidth: 880,
			width: 880
		});
		
	}

};

PT.UI = {

	settings: {
		
		navigation: {
			parent: '#primary-nav',
			subParent: 'li.has-submenu',
			toggleItem: '.primary-nav-item',
			eventAction: 'click',
			classShow: 'show-submenu',
			classHide: 'hide-submenu'
		},
		
		slider: {
			animation: "slide",             //String: Select your animation type, "fade" or "slide"
			slideDirection: "horizontal",   //String: Select the sliding direction, "horizontal" or "vertical"
			slideshow: true,                //Boolean: Animate slider automatically
			slideshowSpeed: 4000,           //Integer: Set the speed of the slideshow cycling, in milliseconds
			animationDuration: 600,         //Integer: Set the speed of animations, in milliseconds
			directionNav: true,             //Boolean: Create navigation for previous/next navigation? (true/false)
			controlNav: true,               //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage
			keyboardNav: false,             //Boolean: Allow slider navigating via keyboard left/right keys
			mousewheel: false,              //Boolean: Allow slider navigating via mousewheel
			prevText: "Previous",           //String: Set the text for the "previous" directionNav item
			nextText: "Next",               //String: Set the text for the "next" directionNav item
			pausePlay: false,               //Boolean: Create pause/play dynamic element
			pauseText: 'Pause',             //String: Set the text for the "pause" pausePlay item
			playText: 'Play',               //String: Set the text for the "play" pausePlay item
			randomize: false,               //Boolean: Randomize slide order
			slideToStart: 0,                //Integer: The slide that the slider should start on. Array notation (0 = first slide)
			animationLoop: true,            //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
			pauseOnAction: true,            //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
			pauseOnHover: false,            //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
			controlsContainer: "",          //Selector: Declare which container the navigation elements should be appended too. Default container is the flexSlider element. Example use would be ".flexslider-container", "#container", etc. If the given element is not found, the default action will be taken.
			manualControls: "",             //Selector: Declare custom control navigation. Example would be ".flex-control-nav li" or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs.
			start: function(){},            //Callback: function(slider) - Fires when the slider loads the first slide
			before: function(){},           //Callback: function(slider) - Fires asynchronously with each slider animation
			after: function(){},            //Callback: function(slider) - Fires after each slider animation completes
			end: function(){}               //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
		},
		sliderSelector: '.slider',
		tabs: {
			
		},
		tabsSelector: '.tabs'
		
	},

	init: function ( options ) {
		
		if ( options ) {
			$.extend ( PT.UI.settings, options );
		}
		
		PT.UI.windowSize();
		
		$( window ).resize( function() {
			PT.UI.windowSize();	
		});
		
	},
	
	slider: function ( options ) {
		
		if ( options ) {
			$.extend( PT.UI.settings.slider, options );
		}
		
		//if ( $( PT.UI.settings.sliderSelector ).find('li').length > 1 ) {
			$( PT.UI.settings.sliderSelector ).flexslider( PT.UI.settings.slider );
		//}

	},
	
	windowSize: function() {
		
		var wrapperHeight = $('#site-wrapper-inner').outerHeight();
		var windowHeight = $(window).height();
		
		if ( windowHeight > wrapperHeight ) {
			$( '#site-wrapper-inner' ).height( windowHeight + 200 );
		}
	}

};

PT.FB = {

	settings: {
		appId: 139504832749806
	},

	init: function ( options ) {
	
		if ( options ) {
			$.extend ( PT.FB.settings, options );
		}
		
		PT.FB.buildBridge();
	
	},
	
	buildBridge: function() {
		
		(function(d, s, id) {
  			var js, fjs = d.getElementsByTagName(s)[0];
  			if (d.getElementById(id)) return;
  			js = d.createElement(s); js.id = id;
  			js.async = true;
  			js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=" + PT.FB.settings.appId;
  			fjs.parentNode.insertBefore(js, fjs);
		}(document, 'script', 'facebook-jssdk'));
		
	}

};

PT.Raty = {
	
	settings: {
		
		selector: '.raty'
	},
	
	init: function ( options ) {
		
		if ( options ) {
			$.extend ( PT.Raty.settings, options );
		}
		
		$( PT.Raty.settings.selector ).each(function ( i ) {
			var myStart = $(this).data('rating');
			var myName = $(this).data('name');
			var myID = $(this).data('item-id');
			var myCategory = $(this).data('category');
			var myStarOn = myCategory === '' ? 'star-on.png' : 'flavors/' + myCategory + '/rating-on.gif';
			var myStarOff = myCategory === '' ? 'star-off.png' : 'flavors/' + myCategory + '/rating-off.gif';
			$(this).raty({
					hintList: [ null, null, null, null, null ],
					starOn: myStarOn,
					starOff: myStarOff,
					start: myStart,
					path: '/img/',
					click: function ( score, evt ) {
							
						var myData = {
							'RecipeID': myID,
							'Rating': score
						};
							
						$.ajax({
							'url': '/Recipe/TallyRating',
							'type': 'POST',
							'data': myData
						});
					}
			});
		});
		
	}
	
};

PT.SiteFooter = {

	settings: {
		flashContainerID: 'footer-flash',
		flashFile: '/swf/Footer.swf',
		parent: 'footer#site-footer'
	},

	init: function ( options ) {
		
		// If any options are set, override default settings
		if ( options ) {
			$.extend ( PT.FB.settings, settings );
		}
		
		if ( $( PT.SiteFooter.settings.parent ).length == 0 ) {
			return;
		}
	
		// Since we don't need the div if we don't have flash
		// AND JS, we can safely prepend the container div via
		// JavaScript
		PT.SiteFooter.embedFlash();
	},
	
	// Use SWFObject flash embed script
	// to insert flash video
	embedFlash: function() {
		// The container our flash will be placed into	
		var containerSelector = PT.SiteFooter.settings.flashContainerID;
		
		var params = {
			'allowfullscreen': false,
			'allowscriptaccess': 'always',
			'wmode': 'transparent',
			'quality': 'high'
		};
		var attributes = {};
		var flashvars = {};
		var expressInstallSwfurl = "";
		var callbackFn = function() {
		};
		
		swfobject.embedSWF(PT.SiteFooter.settings.flashFile, PT.SiteFooter.settings.flashContainerID, "960", "88", "10.0.0", expressInstallSwfurl, flashvars, params, attributes, callbackFn);
		
		$( '#footer-flash' ).css('z-index', '999999' );
		
	}
	
};

function isJSReady() {
	return ( PT.Global.isJSReady );
}

function randomFromTo(from, to){
	return Math.floor(Math.random() * (to - from + 1) + from);
}

function microtime (get_as_float) {
    var now = new Date().getTime() / 1000;
    var s = parseInt(now, 10); 
    return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}
