/**
 * @author jordand
 * Channels are:
 * The-N (TeenNick) and Noggin, Nicktoons currently do not have a delayed West feed
 * Nick - 11
 * Nicktoons - 37
 * The N (TEENick) - 53
 * Nickjr - 11 but this is taking over Noggin
 * Noggin - 13
 */


if(typeof KIDS == "undefined" || !KIDS) var KIDS = {};
KIDS.namespace("tvSchedule");
KIDS.tvSchedule.weekDaysShort=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
KIDS.tvSchedule.weekDays=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
KIDS.tvSchedule.months =["January","February","March","April","May","June","July","August","September","October","November","December"];
KIDS.tvSchedule.seriesList = null;
KIDS.tvSchedule.dateDropdown = null;
KIDS.tvSchedule.root = null;
KIDS.tvSchedule.seriesFilter = null;

$(document).ready(function() {
	KIDS.tvSchedule.root = $("#showScheduleList");
	KIDS.tvSchedule._linkContext = $("#schedule-linkContext");
	KIDS.tvSchedule._dateContext = $("#schedule-dateContext");
	KIDS.tvSchedule._activeDay = 1; // 1 => Today, 2 => Tomorrow

	KIDS.tvSchedule._linkContext.bind( "click", KIDS.tvSchedule.switchDays );
});

KIDS.tvSchedule.initTvSchedule = function(channel, days, startHour, endHour ,seriesFilter){
	if(KIDS.tvSchedule.seriesList == null ){
		KIDS.tvSchedule.loadSeriesData(channel, days, startHour, endHour,seriesFilter);
	}else{
		KIDS.tvSchedule.setupTVSchedule(channel, days, startHour, endHour,seriesFilter);
	}
}

KIDS.tvSchedule.loadSeriesData = function(channel, days, startHour, endHour,seriesFilter){
	var nick_url = KIDS.utils.getNickDomain();
	NICK.request.doRequest({
		dataType:"jsonp",
		url: "http://"+ nick_url + "/sbcom/data/scenic/show_series_data.jhtml",
		data: {},
		onSuccess: function(response) {
			KIDS.utils.doLog("JSON Series Data: onSuccess");
			KIDS.tvSchedule.seriesList = response.data;
			KIDS.tvSchedule.initTvSchedule(channel, days, startHour, endHour,seriesFilter);
		},
		onFail: function(errors) {
			for(var error in errors) {
				KIDS.utils.doLog("JSON Response: Error: "+error+" - "+errors[error]);
			}
		}				
	});
	
}

KIDS.tvSchedule.getScheduleTemplate = function(){
	/*
	 * Grab the templates from a table on the page
	 * First tr is the normally viewable row
	 * Second tr is the more information row that is invisible at initialization
	 */
	KIDS.tvSchedule.scheduleTemplate = $("#showScheduleListItemClone").removeAttr("id");
	//KIDS.tvSchedule.moreScheduleTemplate = $("#schedule-list tr").eq(1).clone();
	//$("#schedule-list table").html("");
}

KIDS.tvSchedule.setupShowSchedule = function(seriesID, days){
	/*Sets up the show schedule with a jhtml that calls multiple channels and combines the information */
	KIDS.utils.doLog("setupShowScedule");
	KIDS.tvSchedule.seriesID = seriesID;
	KIDS.tvSchedule.getScheduleTemplate();
	var nick_url = KIDS.utils.getNickDomain();
	NICK.request.doRequest({
		dataType:"jsonp",
		url: "http://"+ nick_url + "/sbcom/data/json/all_channels_listing.jhtml",
		data: {seriesID:KIDS.tvSchedule.seriesID, days:days},
		onSuccess: function(response) {
			KIDS.utils.doLog("JSON Response: onSuccess");
			
			KIDS.tvSchedule.combineShowSchedule(response.data);
		},
		onFail: function(errors) {
			for(var error in errors) {
				KIDS.utils.doLog("JSON Response: Error: "+error+" - "+errors[error]);
			}
		}				
	});
	
}

KIDS.tvSchedule.setupTVSchedule = function(channel, days, startHour, endHour,seriesFilter){	
	/* Sets up the TV schedule for one channel */
	KIDS.utils.doLog("setupTVSchedule");
	KIDS.tvSchedule.currentChannel = channel;
	KIDS.tvSchedule.getScheduleTemplate();
	//Setup the Week Dropdown
	var today = new Date();
	KIDS.tvSchedule.setDateText(today);
	KIDS.tvSchedule.changeSchedule(KIDS.tvSchedule.currentChannel,new Date(),startHour, endHour,null,seriesFilter);
}

KIDS.tvSchedule.setDateText = function( tDate ) {
	$("#schedule-dateSelected").html( KIDS.tvSchedule.weekDays[tDate.getDay()] + ", " + KIDS.tvSchedule.months[tDate.getMonth()] + " " + tDate.getDate() );
}

/* Changes the TV schedule nav buttons and the timezone notification
 * Gets the full broadcast day for this channel
 */ 
KIDS.tvSchedule.changeSchedule = function(channel, date, startHour, endHour, channelButton, seriesFilter){
	
	if(seriesFilter != null){
		KIDS.tvSchedule.seriesFilter = seriesFilter;
	}else{
		KIDS.tvSchedule.seriesFilter = null;
	}
	
	KIDS.utils.doLog("changeSchedule");
	KIDS.tvSchedule.currentChannel = channel;
	$("#schedule-list").hide();
	$("#showScheduleLoader").show();

	/*Select the button just pressed */
	if(channelButton != null){
		$("#channel-nav li.active").removeClass("active");
		$(channelButton).parent().addClass('active');
	}
	/*Check the current channel and change the Timezone information if not Nick - channel 11 */
	if (KIDS.tvSchedule.currentChannel == "11" || KIDS.tvSchedule.currentChannel == "41" ) {
		$("#schedule-timezone span").html("ET/PT");
	}else{
		$("#schedule-timezone span").html("ET");
	}
	
	//MM/dd/yyyy
	if (date == null && KIDS.tvSchedule.dateDropdown == null) {
		date = new Date();
	}
	else if(KIDS.tvSchedule.dateDropdown != null){
		date = KIDS.tvSchedule.dateDropdown;
	}
	var lookupDay = (date.getMonth()+1) + "/" + date.getDate() + "/" + date.getFullYear();
	var nick_url = KIDS.utils.getNickDomain();
	NICK.request.doRequest({
		dataType:"jsonp",
		url: "http://"+ nick_url + "/sbcom/data/json/broadcast_day_listing.jhtml",
		data: {channelID:channel, day:lookupDay},
		onSuccess: function(response) {
			KIDS.utils.doLog("JSON Response: onSuccess");
			KIDS.tvSchedule.showScheduleGrid(response.data,$("#schedule-list"), startHour, endHour, date.getDate() );
		},
		onFail: function(errors) {
			for(var error in errors) {
				KIDS.utils.doLog("JSON Response: Error: "+error+" - "+errors[error]);
			}
		}				
	});
}

/**
 * Adds dynamic content from json calls into the templates
 * The schedule can be capped by a start hour and end hour - currently used for Nick JR
 */
KIDS.tvSchedule.showScheduleGrid = function( data, target, startHour, endHour, sday ) {
	NickLog.info("Rendering Schedule Grid");

	// Empty the current schedule being displayed
	this.root.empty();

	// Create default time values
	startHour = startHour ? startHour : 0;
	endHour = endHour ? endHour : 23;
	var today = new Date();
	var timeZoneOffet = today.getTimezoneOffset() / 60;
	var viewingToday = sday && sday == today.getDate();

	// Hide "what was on earlier today" if they aren't on today
	if ( viewingToday ) {
		$("#showSchedulePrevious").show();
	} else {
		$("#showSchedulePrevious").hide();
	}

		KIDS.utils.doLog("offset "+timeZoneOffet);
		//Offset the time for the Nick Channel and nick at nite for any timezone except pacific
		if(timeZoneOffet != 7 || (KIDS.tvSchedule.currentChannel != "11" && KIDS.tvSchedule.currentChannel != "41") )  {
			today = new Date(today.getTime() + (((today.getTimezoneOffset()/60) -4)*60*60*1000) );
		}
		
		var onNow = 0;
		var alt = true;
		for (var loopID in data) {	
			alt = !alt;
			var scheduleData = data[loopID];
			
			if(KIDS.tvSchedule.seriesFilter == null || KIDS.tvSchedule.seriesFilter == scheduleData.seriesID){
			
				var scheduleDate = new Date(Date.parse(scheduleData.CalendarAirTime));
				//--- Make sure the current time is always showing Eastern
				scheduleDate = new Date(scheduleDate.getTime() + (((today.getTimezoneOffset()/60) -4)*60*60*1000) );
			
				/*Skip itme if its not within the start and end hour cap */
				/* Time should be military */
			
				if( (startHour <= scheduleDate.getHours()) && (endHour >= scheduleDate.getHours())){
		
					var episodeName = scheduleData.EpisodeName != "null" ? KIDS.tvSchedule.treatText(scheduleData.EpisodeName) : "";
					var showThumb = KIDS.tvSchedule.seriesList["showThumb_" + scheduleData.seriesID];
					var showLogo = KIDS.tvSchedule.seriesList["logo_" + scheduleData.seriesID];
					var outputTemplate = KIDS.tvSchedule.scheduleTemplate.clone();
					
					outputTemplate.find(".data-time").append(KIDS.tvSchedule.convertTime(scheduleDate));
					outputTemplate.find(".data-episodename").prepend(episodeName);
					outputTemplate.find(".data-seriesname").prepend(KIDS.tvSchedule.treatText(scheduleData.seriesName));
					outputTemplate.find(".data-parental").html(scheduleData.parentalGuideline);
					outputTemplate.find("a").click(function(sd) {
						return function() {
							KIDS.tvSchedule.showMore(this, sd.seriesID, sd.episodeId);
						}
					}(scheduleData));
		
					if ( showThumb && showThumb != "null" ) {
						outputTemplate.find(".data-image").append(
							'<img width="96" height="54" border="0" src="' + 
							showThumb + 
							'?height=54&amp;width=96&amp;format=jpeg" alt="" />'
						);
					}
		
					if ( showLogo && showLogo != "null" ) {
						outputTemplate.find(".data-showlogo").append(
							'<img width="145" border="0" src="' + 
							showLogo + 
							'?width=145&amp;format=png" alt="SpongeBob SquarePants game"/>'
						);
					}
		
						var isBeforeEnd = today.getTime() <= ( scheduleDate.getTime() + (60000 * 30));
						var isCurrentDay = today.getDate() == scheduleDate.getDate();
						var isCurrentHour = today.getHours() > (scheduleDate.getHours() - 3);
						var isComplete = (scheduleDate.getTime() + (60000 * 30)) < today.getTime();
		
						if( viewingToday && isBeforeEnd && isCurrentDay && isCurrentHour && (onNow < 3) ){
							if (onNow == 0) {
								outputTemplate.find(".data-timetitle").prepend("On Now");
								outputTemplate.addClass("onNow withTitle");
								onNow ++;
							} else if (onNow == 1) {
								outputTemplate.find(".data-timetitle").prepend("Up Next");
								outputTemplate.addClass("onNext withTitle");
								onNow ++;
							} else if (onNow == 2) {
								outputTemplate.find(".data-timetitle").prepend("Later");
								outputTemplate.addClass("onLater withTitle");
								onNow ++;
							} else {
								onNow ++;
								outputTemplate.find(".data-timetitle").remove();
							}
						} else {
							outputTemplate.find(".data-timetitle").remove();
						}
		
					if ( isComplete ) outputTemplate.addClass("showComplete").hide();
					outputTemplate.appendTo( this.root );
				
				}
			
			}
	}

	$("#showScheduleLoader").hide();
	$("#schedule-list").show();
}

KIDS.tvSchedule.showMore = function(el, seriesId, episodeId) {
	var time = 400;
	var button = $(el);
	var target = button.next().children(".showInfoWrapper");

	if ( target.is(":hidden") ) {
		KIDS.tvSchedule.root.find(".showInfoWrapper").not(target).slideUp(time);
		button.parent().siblings().children("a").removeClass("showExpandActive");
		target.slideDown(time);
		button.addClass("showExpandActive");
	} else {
		target.slideUp(time);
		button.removeClass("showExpandActive");
	}

	KIDS.tvSchedule.getEpisodeDescription(
			seriesId,
			episodeId,
			KIDS.tvSchedule.currentChannel, 
			target
	);
}

KIDS.tvSchedule.showPrevious = function() {
	if ( this.root.find(".showComplete").is(":visible") ) {
		$("#showScheduleList").find(".showComplete").slideUp("slow", function() {
			$("#nick-footer-top").css("display", "none").css("display", "block");	// necessary for ie8 bug
		  });
		$("#showSchedulePrevious").text("See what was on earlier today").attr("class", "sup");
	} else {
		$("#showScheduleList").find(".showComplete").slideDown("slow", function() {
			$("#nick-footer-top").css("display", "none").css("display", "block");	// necessary for ie8 bug
		  });
		$("#showSchedulePrevious").text("See what's on now").attr("class", "sdown");
	}
}

KIDS.tvSchedule.getEpisodeDescription = function(seriesId, episodeId, channelID, target){
	/*
	 * Json call made when the more button is pressed
	 * Gets the episodes description and puts it in the target
	 */
	var nick_url = KIDS.utils.getNickDomain();
	NICK.request.doRequest({
		dataType: "jsonp",
		url: "http://" + nick_url + "/sbcom/data/json/episode_details.jhtml",
		data: {
			seriesID: seriesId,
			episodeId: episodeId,
			channelID: channelID
		},
		onSuccess: function(response){
			var episodeDescription = response.data.episodeDescription != "null" ? KIDS.tvSchedule.treatText(response.data.episodeDescription) : "No description available.";
			target.find(".data-description").html(episodeDescription);
		}
	});
}

KIDS.tvSchedule.getEpisode = function(seriesId,episodeId,channelID){
	var nick_url = KIDS.utils.getNickDomain();
	NICK.request.doRequest({
		dataType:"jsonp",
		url: "http://"+ nick_url + "/sbcom/data/json/episode_details.jhtml",
		data: {seriesID:seriesId, episodeId:episodeId, channelID:channelID},
		onSuccess: function(response) {
			KIDS.utils.doLog("JSON Response: onSuccess");
			$("#show-schedule-more h4.show-title").html(response.data.seriesName);
			$("#show-schedule-more span.episode-name").html(response.data.EpisodeName);
			$("#show-schedule-more p.episode-details").html(KIDS.tvSchedule.treatText(response.data.episodeDescription));
		},
		onFail: function(errors) {
			for(var error in errors) {
				KIDS.utils.doLog("JSON Response: Error: "+error+" - "+errors[error]);
			}
		}				
	});
}

KIDS.tvSchedule.switchDays = function() {
	var sDate = new Date();

	if ( KIDS.tvSchedule._activeDay == 1 ) {
		sDate.setDate( sDate.getDate() + 1 );
		KIDS.tvSchedule._activeDay = 2;
		KIDS.tvSchedule._linkContext.text("See What's on Today");
		KIDS.tvSchedule._dateContext.text("What's on Tomorrow:")
	} else {
		KIDS.tvSchedule._activeDay = 1;
		KIDS.tvSchedule._linkContext.text("See What's on Tomorrow");
		KIDS.tvSchedule._dateContext.text("What's on Today:")
	}

	KIDS.tvSchedule.setDateText(sDate);
	KIDS.tvSchedule.dateDropdown = sDate;
	KIDS.tvSchedule.changeSchedule(KIDS.tvSchedule.currentChannel, KIDS.tvSchedule.dateDropdown,null,null,null,KIDS.tvSchedule.seriesFilter);

	return false;
}

KIDS.tvSchedule.switchSpongebobDays = function(activeDay) {
	var sDate = new Date();

	$("li.active").removeClass("active");
	
	if ( activeDay == 1 ) {
		sDate.setDate( sDate.getDate() + 1 );
		KIDS.tvSchedule._activeDay = 2;
		KIDS.tvSchedule._linkContext.text("See What's on Today");
		KIDS.tvSchedule._dateContext.text("What's on Tomorrow:")
		$("#tab-tomorrow").parent("li").addClass("active");
	} else {
		KIDS.tvSchedule._activeDay = 1;
		KIDS.tvSchedule._linkContext.text("See What's on Tomorrow");
		KIDS.tvSchedule._dateContext.text("What's on Today:")
		$("#tab-today").parent("li").addClass("active");
	}

	KIDS.tvSchedule.setDateText(sDate);
	KIDS.tvSchedule.dateDropdown = sDate;
	KIDS.tvSchedule.changeSchedule(KIDS.tvSchedule.currentChannel, KIDS.tvSchedule.dateDropdown,null,null,null,KIDS.tvSchedule.seriesFilter);

	return false;
}

/*  Schedule Utilities    */

KIDS.tvSchedule.combineShowSchedule = function(data){
	KIDS.utils.doLog("combineShowSchedule");
	var channelsArr = [];
	/*Merge the Channels */
	for(channel in data){
		$.merge(channelsArr,data[channel]);
	}
	/*Sort the array by their dates*/
	channelsArr.sort(KIDS.tvSchedule.sortShowSchedule);

	if($("div.show-schedule").length > 0){
		KIDS.tvSchedule.showScheduleGrid(channelsArr,$("#schedule-list"));
	}
}

KIDS.tvSchedule.convertTime = function(date){
	/*
	 * Convert a time from javascript date to a viewable HH:MM AM/PM format
	 */
	var realHour = date.getHours();
	if(!realHour){realHour = date.getHours() -1}
	if(!date.dst()){realHour = date.getHours()- 1;}
	var minutes = date.getMinutes();
	if (minutes < 10){
		minutes = "0" + minutes
	}
	var amPm = '';
	if(realHour > 11){
		amPm = " PM";
	} else {
		amPm = " AM";
	}
	if (realHour > 12) {
		realHour = realHour -12
	}
	if(realHour < 1){realHour = 12;}
	var timeText = realHour + ":" + minutes + amPm;
	return timeText
}

KIDS.tvSchedule.formatDateText = function(date){
	/*Format a date from javascript date into a format Weekday MM/DD */
	return ( KIDS.tvSchedule.weekDaysShort[date.getDay()] + " " + (date.getMonth()+1) + "/" + (date.getDate()) );
}


KIDS.tvSchedule.sortShowSchedule = function(a,b){
	var x = new Date(a.CalendarAirTime).getTime();
    var y = new Date(b.CalendarAirTime).getTime();
	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}


KIDS.tvSchedule.treatText = function(text){
	/*Titles and descriptions coming from json calls are treated with an URL encoding
	 * This unescapes the URL encoding, and also replaces the "+" signs with spaces.
	 */
	return unescape(text).replace(/\+/g, " ");
}
Date.prototype.stdTimezoneOffset = function() {
	var jan = new Date(this.getFullYear(), 0, 1);
	var jul = new Date(this.getFullYear(), 6, 1);
	return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}
Date.prototype.dst = function() {
	return this.getTimezoneOffset() < this.stdTimezoneOffset();
}
