
/* js site parameters */
disneyj.logging =  disneyj.externalProperties.debugEnabled;

/* logging class */

disneyj.loggerclass = function(){
	
	var __this__ = this;
	var logging = true;
	
	var fallback = function(msg){
		try{
			console.log(msg);
		}catch(e){
			return;
		}
	};
	
	var construct = function(){
		/* replace specialist console functions if they are not available */
		try{
			if (typeof window.console != 'undefined'){
				if (typeof window.console.debug != 'function'){
					window.console.debug = fallback;
				}
				if (typeof window.console.warn != 'function'){
					window.console.warn = fallback;
				}
				if (typeof window.console.error != 'function'){
					window.console.error = fallback;
				}
				if (typeof window.console.info != 'function'){
					window.console.info = fallback;
				}
			}
		}catch(e){
			return;
		}
	}();
	
	this.enableLogging = function(){
		logging = true;
	};
	
	this.disableLogging = function(){
		logging = false;
	};
	
	this.debug = function(msg){
		if (logging == false){return;};
		try{
			console.debug("[DEBUG] "+msg);
		}catch (e){
			return;
		}
	};
	this.info = function(msg){
		if (logging == false){return;};
		try{
			console.info("[INFO] "+msg);
		}catch (e){
			return;
		}
	};
	this.warn = function(msg){
		if (logging == false){return;};
		try{
			console.warn("[WARN] "+msg);
		}catch(e){
			return;
		}
	};
	this.error = function(msg){
		if (logging == false){return;};
		try{
			console.error("[ERROR] "+msg);
		}catch(e){
			return;
		}
		try{
			console.trace();
		}catch(e){}
	};
	
};
disneyj.logger = new disneyj.loggerclass();
if (disneyj.logging!=true){
	disneyj.logger.disableLogging();
}

/*
 * solution for dealing with browser image scaling quality
 * issues.
 * This will search the same directory as the source image
 * for a replacement matching the size.
 */
var selectPagerImage = function(currentPath,prefix,idealSize){
	
	var checkImageExists = function(path){
		exists = false;
		$.ajax({
		  url: path,
		  async: false,
		  success: function(){
			  exists = true;
		  }
		});
		return exists;
	}
	
	/**
	 * basic binary search
	 */
	var searchClosest = function(array, value){
		
		//console.log("closest to "+value);
		
		var low = 0, high = array.length - 1, i, comparison;
		var closestSoFar = value;
		var winningDiff = null;
		
		while (low <= high) {
			
			i = Math.floor((low + high) / 2); // middle
			
			//console.log("i:"+i+" low:"+low+" high:"+high+" closestSoFar:"+closestSoFar);
			
			if (array[i]==value){
				//console.log("found exact match: "+value);
				return i;
			}else if (array[i]<value){
				//console.log("array["+i+"] "+array[i]+" is "+" too low");
				low = i+1;
				var diff = value - array[i];
				if (winningDiff==null){
					winningDiff = diff;
					closestSoFar = array[i];
				}else{
					if (diff<winningDiff){
						closestSoFar = array[i];
					}
				}
				continue;
			}else if (array[i]>value){
				//console.log(array[i]+" is "+" too high");
				high = i-1;
				var diff = array[i] - value;
				if (winningDiff==null){
					winningDiff = diff;
					closestSoFar = array[i];
				}else{
					if (diff<winningDiff){
						closestSoFar = array[i];
					}
				}
				continue;
			}	
		}
		
		//console.log("returning: "+closestSoFar);
		return closestSoFar;
	}
	
	// hardcode available samples for speed
	var samples = [20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52];
	
	var closest = searchClosest(samples,idealSize);
	//console.log("ideal= "+idealSize+"; closest= "+closest);
	
	if (prefix==null || prefix == 'undefined'){
		prefix = '';
	}
	
	var dir = currentPath.substring(0,currentPath.lastIndexOf("/")+1);
	var idealImage = dir+prefix+closest+".png";
	if (checkImageExists(idealImage)){
		return idealImage;
	}else{
		return currentPath;
	}
}

/**/
$(document).ready(function(){
	disneyj.logger.debug("disneyj starting up...");
	
	/* bind events for promo link tracking */
	$(".promoLinkTracking").bind('click',function(){
		/* ----------------------------------------------------------------
		 * OMNITURE TRACKING
		 * ---------------------------------------------------------------*/
		 window.disneyj.tracking.trackLink(this);
		 /* ------------------------------------------------------------- */
	});
	
	// pnc printable download tracking
	$("#savePrintableBtn").bind('click',function(){
		/* ----------------------------------------------------------------
		 * OMNITURE TRACKING
		 * ---------------------------------------------------------------*/
		 window.disneyj.tracking.trackLink(this);
		 /* ------------------------------------------------------------- */
	});
	
	/* ----------------------------------------------------------------
	 * SHOW PAGER CONTAINERS
	 * ---------------------------------------------------------------*/
	$("#brand_promos_inner").css("display","block");
	$("#brand_standalone_promos_inner").css("display","block");
	$("#wswdt_promos_inner").css("display","block");
	$("#hero_inner").css("display","block");
	$("#bottom_promos").css("display","block");
	$("#content_main_promos_inner").css("display","block");
	$("#video_main_promos_inner").css("display","block");
	$(".xpromo_frame_inner").css("display","block");
	$("#pnc_thumbs").css("display","block");
	$("#grownups_home_inner").css("display","block");
	$("#grownups_news_frame_inner").css("display","block");
	
	
	/* ----------------------------------------------------------------
	 * PAGERS
	 * ---------------------------------------------------------------*/
	
	/* generic for all pagers */
	// NOTE: this is only generic if the parent of promo_nav is the first sibling of the slideshow container
	function pagerFactory(idx, slide) {
		// show all nav buttons for this slide
		var container = $(slide).parent().next();		
		container.children('.promo_nav').children('.promo_nav_back_btn, .promo_nav_next_btn').css("visibility","visible");
		var w = container.width();
		w = w + 52; // hardcoded based on width of pager images
		container.width(w);
	    var s = idx < 0 ? ' style="display:none"' : '';
	    return '<li '+s+'><a href="#" '+s+'><img src="/cms_res/disney-junior/images/promo_pagers/inactive/52.png" style="height:52px; width:52px; position:relative; " /></a></li>';
	}
	
	function parentsPagerFactory(idx, slide) {
		// show all nav buttons for this slide
		var container = $(slide).parent().next();		
		container.children('.promo_nav').children('.promo_nav_back_btn, .promo_nav_next_btn').css("visibility","visible");
		var w = container.width();
		w = w + 42; // hardcoded based on width of pager images
		container.width(w);
	    var s = idx < 0 ? ' style="display:none"' : '';
	    return '<li '+s+'><a href="#" '+s+'><img src="/cms_res/disney-junior/images/grownups/grownups_nav_pager_inactive.png" style="height:35px; width:42px; position:relative; top:22px;" /></a></li>';
	}
	
	/*
	 *  demo for dynamic pagerFactory
	 */
	function pagerFactoryDynamic(idx, slide) {
		
		var startingPagerSize = 52; // hardcoded based on width of pager images
		var pagerSize = startingPagerSize;
		
		// used to construct pager ears
		var pagerInactiveDir = '/cms_res/disney-junior/images/promo_pagers/inactive/';
		var pagerActiveDir = '/cms_res/disney-junior/images/promo_pagers/active/';
		var pagerSuffix = '.png';
		
		// construct default pager ears
		window.activePager = pagerActiveDir+"52"+pagerSuffix;
		window.inactivePager = pagerInactiveDir+"52"+pagerSuffix;
		
		// show all nav buttons for this slide
		var container = $(slide).parent().next();	
		
		container.children('.promo_nav').children('.promo_nav_back_btn, .promo_nav_next_btn').css("visibility","visible");
		var pager = container.find("ul").first();
		var cw = container.width();
		var w = pager.width();
		var t = pager.css("top");
		t = parseInt(t.substring(0,t.length-2));
		
		// update pagerSize if it has changed since init
		if (container.find("li").size()==0){
			// init
			window.__pagerStartingWidth = w;
			pager.css("position","relative");
			pager.css("top","0px");
		}else{
			var aCurrentPager = $(container).find("li").first().find("img").first();
			var currentWidth = aCurrentPager.width();
			if (currentWidth!=0){
				pagerSize = aCurrentPager.width();
				startingPagerSize = aCurrentPager.width();
			}
		}
		
		// new width
		w = w + pagerSize;
		cw = cw + pagerSize;
		
		var growth = pager.width() - window.__pagerStartingWidth;
		
		/* scale down ears to hold them within the fixed container  */
		var maxContainerWidth = 450;
		var maxWidth = pager.css('max-width');
		if (maxWidth!='none'){
			if (maxWidth.length>2){
				if (maxWidth.substring(maxWidth.length-2,maxWidth.length)=='px'){
					maxWidth = maxWidth.substring(0,maxWidth.length-2);
					maxContainerWidth = maxWidth;
				}
			}
		}
		if (w>maxContainerWidth){
			// need to resize ears and make it all fit without increasing W
			var numItems = container.find("li").size()+1;
			pagerSize = Math.floor(growth/numItems);
			
			// go in and re-size all pagers in the container
			$(container.find("li").each(function(){
				var image = $(this).find("img").first();
				image.css("height",pagerSize);
				image.css("width",pagerSize);
				
				/* not an exact science but some scaling in the Y direction as pagers shrink */
				var diffPagerSize = parseInt(Math.abs(pagerSize - startingPagerSize));
				var newTop = (t+((diffPagerSize)/1.5))+"px";
				pager.css("top",newTop);
			}));
			
		}else{
			// dynamically increase the container size IF we are still under maxContainerWidth
			//console.log("pager is w:"+pager.width()+" increasing to "+w);
			pager.width();
			container.width(cw+5); // 5 is just for a bit of margin of error on ie
		}
		
	    var s = idx < 0 ? ' style="display:none"' : '';
	    return '<li '+s+'><a href="#" '+s+'><img class="earPagers" src="'+inactivePager+'" height="'+pagerSize+'" width="'+pagerSize+'" style="height:'+pagerSize+'px; width:'+pagerSize+'px; position:relative; " /></a></li>';
	}
	
	/* nav rollovers */
	$(".promo_nav_back_btn").live('mouseover',function(){$(this).children('img').attr('src','/cms_res/disney-junior/images/promo_nav_back_a.png');});
	$(".promo_nav_back_btn").live('mouseout',function(){$(this).children('img').attr('src','/cms_res/disney-junior/images/promo_nav_back.png');});
	$(".promo_nav_next_btn").live('mouseover',function(){$(this).children('img').attr('src','/cms_res/disney-junior/images/promo_nav_forward_a.png');});
	$(".promo_nav_next_btn").live('mouseout',function(){$(this).children('img').attr('src','/cms_res/disney-junior/images/promo_nav_forward.png');});
	
	$.fn.cycle.updateActivePagerLink = function(pager, currSlideIndex) {
		// retain current sample
		var pagerInactive = '/cms_res/disney-junior/images/promo_pagers/inactive/52.png';
		var pagerActive = '/cms_res/disney-junior/images/promo_pagers/active/52.png';
		var size =  $(pager).find('a').children('img').first().width();
		
		/* find an image with the same/closer size to reduce browser scaling problems */
		
		if (size!=52){
			var inactivePager = selectPagerImage(pagerInactive,null,size);
			var activePager = selectPagerImage(pagerActive,null,size);
		}else{
			var inactivePager = pagerInactive;
			var activePager = pagerActive;
		}
		
	    $(pager).find('a').children('img').attr('src',inactivePager);
	    $(pager).find('li').filter('li:eq('+currSlideIndex+')').children('a').children('img').attr('src',activePager);
	};
	
	
	/* per pager cycle calls */
	
	$('#brand_promos_inner').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#brand_promo_next',
	    prev:'#brand_promo_prev',
	    pager: '#brand_promo_nav_pager',
	    timeout:0,
	    cleartypeNoBg:true,
	    pagerAnchorBuilder: pagerFactory
	});
	
	$('#brand_standalone_promos_inner').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#brand_promo_next',
	    prev:'#brand_promo_prev',
	    pager: '#brand_promo_nav_pager',
	    timeout:0,
	    cleartypeNoBg:true,
	    pagerAnchorBuilder: pagerFactory
	});
	
	$('#wswdt_promos_inner').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#brand_promo_next',
	    prev:'#brand_promo_prev',
	    pager: '#brand_promo_nav_pager',
	    timeout:0,
	    cleartypeNoBg:true,
	    pagerAnchorBuilder: pagerFactoryDynamic
	});
	
	var updateHeroVideo = function(slideElement){
		/*  destroy all other embedded videos, replace with empty target 
		 */
    	$("#hero_inner").find(".hero_video_holder").each(function(){
    		var thisParent = $(this).parent();
    		
    		var t = $(this).attr('id');
    		$(this).html("<div id='"+t+"_target'></div>");
    		
    		/*
    		 * TODO this was meant to address the video getting removed too quickly but it isn't working quite yet
    		if (thisParent.get(0)==slideElement){
    			// replace next immediately
        		var t = $(this).attr('id');
        		$(this).html("<div id='"+t+"_target'></div>");
    		}else{
    			window.setTimeout(function(this){
    	    		var t = $(this).attr('id');
    	    		$(this).html("<div id='"+t+"_target'></div>");
    			},500);
    		}
    		*/
    	});
		
		
    	/* embed new video */
    	var holder = $(slideElement).find(".hero_video_holder").first();
    	if (holder.length==1){
    		var target = holder.children().first();
    		if (target.length==1){
            	var container_id = target.attr("id");
            	var path = $(slideElement).find(".hero_video_path").first().text();
            	embedHero(container_id,path);
    		}
    	}
	}
	
	$('#hero_inner').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#hero_next',
	    prev:'#hero_prev',
        pager: '#hero_pager',
        timeout:0, //3000
        cleartypeNoBg:true,
        pagerAnchorBuilder: pagerFactory,
        onPrevNextEvent:function(isNext, zeroBasedSlideIndex, slideElement){
        	updateHeroVideo(slideElement);
        },
        onPagerEvent:function(zeroBasedSlideIndex, slideElement){
        	updateHeroVideo(slideElement);
        }
	});
	
	$('#bottom_promos').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#promo_next',
	    prev:'#promo_prev',
        pager: '#promo_nav_pager',
        timeout:0,
        cleartypeNoBg:true,
        pagerAnchorBuilder: pagerFactory	
	});
	
	disneyj.cycleContentMainPromoInner = function(){
		$('#content_main_promos_inner').cycle({ 
		    fx:     'scrollHorz', 
		    easing: 'easeOutQuint',
		    next: '#promo_next',
		    prev:'#promo_prev',
		    pager: '#promo_nav_pager',
		    timeout:0,
		    //cleartype:true,
		    cleartypeNoBg: true,
		    pagerAnchorBuilder: pagerFactoryDynamic
		});
	};
	disneyj.cycleContentMainPromoInner();
	
	disneyj.cycleVideoMainPromoInner = function(){
		$('#video_main_promos_inner').cycle({ 
		    fx:     'scrollHorz', 
		    easing: 'easeOutQuint',
		    next: '#promo_next',
		    prev:'#promo_prev',
		    pager: '#promo_nav_pager',
		    timeout:0,
		    //cleartype:true,
		    cleartypeNoBg: true,
		    pagerAnchorBuilder: pagerFactoryDynamic
		});
	};
	disneyj.cycleVideoMainPromoInner();
	
	$('.xpromo_frame_inner').cycle({ 
	    fx:     'scrollHorz', //scrollDown
	    easing: 'easeOutQuint',
	    cleartypeNoBg:true,
	    //easeIn: 'bounceout',
	    //easeOut: 'backin',
	    timeout:7000,
	    speed:2000
	});
	
	$('#pnc_thumbs').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#thumb_next',
	    prev:'#thumb_prev',
	    pager: '#thumb_nav_pager',
	    timeout:0,
	    cleartypeNoBg:true,
	    pagerAnchorBuilder: pagerFactoryDynamic
	});
	
	
	/*
	barwidth = '802';
	bgcolour = '#04b3d9';
	rollovercolour = '#a6e2f9';
	textcolour = '#000';
	$('#Items').selectbox();
	*/
	
	/* 
	 * it's important that the scrollers get created 
	 * before the cycle code runs
	 */
	$('.scrollable').BionicScrollBar();
	//$('.scrollable_other').BionicScrollBar();
	$('.scrollable_other').jScrollPane({
		verticalDragMinHeight: 45,
		verticalDragMaxHeight: 45,
		horizontalDragMinWidth: 45,
		horizontalDragMaxWidth: 45
    });
	$('.scrollable_other_long').jScrollPane({
		verticalDragMinHeight: 45,
		verticalDragMaxHeight: 45,
		horizontalDragMinWidth: 45,
		horizontalDragMaxWidth: 45
    });

	$.fn.cycle.updateActivePagerLink = function(pager, currSlideIndex) {
	    $(pager).find('a').children('img').attr('src','/cms_res/disney-junior/images/grownups/grownups_nav_pager_inactive.png');
	    $(pager).find('li').filter('li:eq('+currSlideIndex+')').children('a').children('img').attr('src','/cms_res/disney-junior/images/grownups/grownups_nav_pager_active.png');
	};
	
	$('#grownups_home_inner').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#promo_next',
	    prev:'#promo_prev',
	    pager: '#promo_nav_pager',
	    timeout:0,
	    cleartypeNoBg:true,
	    pagerAnchorBuilder: parentsPagerFactory
	});
	
	$('#grownups_news_frame_inner').cycle({ 
	    fx:     'scrollHorz', 
	    easing: 'easeOutQuint',
	    next: '#promo_next',
	    prev:'#promo_prev',
	    pager: '#promo_nav_pager',
	    timeout:0,
	    cleartypeNoBg:true,
	    pagerAnchorBuilder: parentsPagerFactory
	});
	
	$("#userFilterForm").change(function(){
		
		var form = $(this);
		var selection = $("#userFilterSelect option:selected");
		var value = selection.attr("value");
		
		// TODO set GET param so playlist can autostart IF it is active
		
		if (value==null || value == ''){
			
			var url = window.location.href;
			// trim GET
			var startGet = url.indexOf('?');
			if (startGet!=-1){
				url = url.substring(0,startGet);
			}
			window.location.href = url;
			return;
		}else{
			
			var url = window.location.href;
			// trim GET
			var startGet = url.indexOf('?');
			if (startGet!=-1){
				url = url.substring(0,startGet);
			}
			var param = encodeURIComponent(parseInt(value).toString(16).toUpperCase());
			url += "?f="+param;
			window.location.href = url;
			return;
			
			/*
			// submit ajax
			disneyj.logger.debug("_userSorting sending async request for "+value+" to server...");
			$.ajax({
				  url: '/cms_inc/disney-junior/jsp/form_actions/_userSorting.jsp',
				  data: "requestedFilterGroup="+encodeURIComponent(value),
				  dataType:'xml',
				  error:function(jqXHR, textStatus, errorThrown){
					  disneyj.logger.debug("_userSorting request returned with a failure.");
					  return false;
				  },
				  success:function(data, textStatus, jqXHR){
					  disneyj.logger.debug("_userSorting request returned successfully.");
					  disneyj.logger.debug("_userSorting response:["+data+"]");
					  
					  var promos = new Array();
					  // parse xml
					  $(data).find("promo").each(function() {
						  var promo = {};
						  
						  var id = $(this).find("id").text();
						  var name = $(this).find("name").text();
						  var thumb = $(this).find("thumb").text();
						  var title = $(this).find("title").text();
						  var type = $(this).find("type").text();
						  var url = $(this).find("url").text();
						  promo.id = id;
						  promo.name = name;
						  promo.thumb = thumb;
						  promo.title = title;
						  promo.type = type;
						  promo.url = url;
						  promos.push(promo);
					  });
					  
					  filteredPromos = {};
					  filteredPromos.promos = promos;
					  
					  window.filteredPromosCache = filteredPromos;
					  
					  // clear promo container
					  $("#content_main_promos_inner").empty();
					  
					  // populate new content
					  var numPromos = promos.length;
					  var numPages = null;
					  var pageSize = 6;
					  
					  // FIXME should match serverside config, right now this is unlimited
					  if (numPromos>pageSize){
						numPages = Math.floor(numPromos / pageSize);
						var mod = numPromos % pageSize;
						if (mod!=0){
							numPages = numPages + 1;
						}
					  }else{
					  	numPages = 1;
					  }
					  
					  var page_fragment = '<div class="promo_page"></div>';
					  
					  var current = 0;
					  for (var i=0; i<numPages; i++){
						  
						 $("#content_main_promos_inner").append(page_fragment);
						  
						  for (var j=0; j<pageSize; j++){
							  var promo = null;
							  try{
								  var promo = promos[current];
							  }catch(e){}
							  if (promo == null){break;}
							  
							  // TODO index this propertly... also need to set playlist_button_large correctly
							  var promo_fragment_zeromargin = ""+
								"<div class='promo' style='margin-right:0px; background-image: url(/cms_res/disney-junior/images/promo_support/promo_holders/"+promo.type+".png);'>"+
									"<a href='"+promo.url+"'><img src='"+promo.thumb+"' class='promo_image' alt=''/></a>"+
									"<div class='promo_title_3row'><p>"+promo.title+"</p></div>"+
									//"<a class='playlist_button_large'  href='' ref=''><img src='/cms_res/disney-junior/images/promo_support/playlist_add_icon.png' alt='' /></a>"+
								"</div>"
									
							  var promo_fragment = ""+
								"<div class='promo' style=' background-image: url(/cms_res/disney-junior/images/promo_support/promo_holders/"+promo.type+".png);'>"+
									"<a href='"+promo.url+"'><img src='"+promo.thumb+"' class='promo_image' alt=''/></a>"+
									"<div class='promo_title_3row'><p>"+promo.title+"</p></div>"+
									//"<a class='playlist_button_large'  href='' ref=''><img src='/cms_res/disney-junior/images/promo_support/playlist_add_icon.png' alt='' /></a>"+
								"</div>"

							  if (current % 2 == 0) {
								  $("#content_main_promos_inner").find(".promo_page").last().append(promo_fragment);
							  }else{
								  $("#content_main_promos_inner").find(".promo_page").last().append(promo_fragment_zeromargin);
							  }
							  current++;
						  }
					  }
					  
					  // disable nav if not enough pages
					  if (numPages<2){
						  //$("#content_index_navigation").css("display","none");
					  }
					  
					  // update paging
					  $('#content_main_promos_inner').cycle('destroy');
					  disneyj.cycleContentMainPromoInner(); // this calls the original cycle with params etc
					  
				  },
				  beforeSend:function(){
					  
					  //$("#playlist_tab_link").parent().append('<img src="/cms_res/disney-junior/images/loader.gif" alt="" id="__loader__" style="display:none;"/>');
					  //$("#__loader__").css("position","absolute");
				  	  //$("#__loader__").css("top","5px");
					  //$("#__loader__").css("right","60px");
					  //$("#__loader__").css("display","block");
					  
				  },
				  complete:function(){
					  
					  //$("#__loader__").css("display","none");
					  
				  }
			});
			
			*/
		}
	});

});


