// BEGIN NBCU.TEMPLATE
Namespace("Nbcu.Template");

// cssFile is optional
Nbcu.Template = function(templateName, cssFile)
{
	this.templateVars = new Object();
	this.templateName = new Object();
	this.loadTemplate(templateName, cssFile);
}

Nbcu.Template.method("loadTemplate", function(templateName, cssFile)
{	
	this.templateName = "Nbcu.Template." + templateName.replace("Nbcu.Template.", "");
	nbcu.util.common.loadClass(this.templateName);
	this.template = eval("new " + this.templateName + "(cssFile, nbcu.template.helper)");
});

Nbcu.Template.method("assign", function(key, value)
{	
	this.templateVars[key] = value;
});

Nbcu.Template.method("getVar", function(key)
{	
	return this.templateVars[key];
});

Nbcu.Template.method("fetch", function(part)
{	
	var output = this.getOutput(this.templateVars, part);
	
	return output;
});

Nbcu.Template.method("display", function(part, cssSelector, callback)
{	
	var output = this.fetch(part);

	if (cssSelector)
	{
		jqN(document).ready(function()
		{
			jqN(cssSelector).html(output);

			if (typeof(callback) == "string")
			{
					eval(callback);
			}
			else
			{
				callback;
			}
		});
	}
	else
	{
		document.write(output);
	}
});

Nbcu.Template.method("getOutput", function(templateVars, part)
{
	return eval("this.template." + part + "(templateVars, nbcu.template.helper)");
});

Nbcu.Template.method("pager", function(vars, helper)
{
	return helper.getPager(vars.currentPage, vars.maxPages, vars.maxRecordsPerPage, vars.totalRecords, vars.href, vars.onclick, vars.firstText, vars.lastText, vars.previousText, vars.nextText);
});
// END NBCU.TEMPLATE

// BEGIN NBCU.TEMPLATE.HELPER
Namespace("Nbcu.Template.Helper");
Nbcu.Template.Helper = function(templateName){}
Nbcu.Template.Helper.inherits(Nbcu.Util.Common);

Nbcu.Template.Helper.method("loadTemplateCss", function(cssFile)
{
	var cssUrl = nbcu.config.getParam("frameworkUrl") + "/templates/" + cssFile;
	nbcu.util.common.loadCss(cssUrl);
});
	
Nbcu.Template.Helper.method("getProfileUrl", function(username)
{
	if(nbcu.config.getParam("socialNetworkName")=="Dunder Mifflin Sabre") {
		return nbcu.config.getParam("socialNetworkUrl") + username;
	} else {
		return nbcu.config.getParam("socialNetworkUrl") + "/" + username;
	}
});	
	
Nbcu.Template.Helper.method("getAvatarUrl", function(avatarUrl, isFullSize)
{
	if (avatarUrl)
	{
		return avatarUrl;
	}
	else
	{
		suffix = (isFullSize) ? "" : "_th";
		suffix += Math.ceil(Math.random() * 5);
		
		return "http://my.nbc.com" + "/images/no_photo" + suffix + ".jpg";
	}
});
	
Nbcu.Template.Helper.method("swapValue", function(currentValue, value1, value2)
{
	return (currentValue == value1) ? value2 : value1;
});
	
Nbcu.Template.Helper.method("getFlagLink", function(linkText)
{
	linkText = linkText || "Report Abuse";
	flagLink = '<a href="#" class="sn_flag_link" onclick="nbcu.sn.flagging.defaultAlert(); nbcu.sn.flagging.flagContent(null, ' + contentId + '); return false;">' + linkText + '</a>';

	return flagLink;
});

Nbcu.Template.Helper.method("wrapScript", function(theScript)
{
	return '<sc' + 'ript language="JavaScript" type="text/JavaScript">' + "\n" + theScript + "\n" + '</script>';
});

Nbcu.Template.Helper.method("standardDate", function(dateString)
{
	var newDate = this.mysqlTimeStampToDate(dateString.replace(".0", ""));
	var hours = newDate.getHours();
	var minutes = newDate.getMinutes();
	var ampm = "am";
	
	if (hours == 0) hours = 12;
	if (hours > 11) ampm = "pm";
	if (hours > 12) hours -= 12;
	if (minutes < 10) minutes = "0" + minutes;

	return (newDate.getMonth()+1 || 12) + "/" + newDate.getDate() + "/" + newDate.getFullYear() + " " + hours + ":" + minutes + ampm + " ET";
});

Nbcu.Template.Helper.method("friendlyDate", function(dateString, timeZone)
{
	if (typeof(timeZone) != "undefined" && timeZone == "UTC") {
		return humane_date(dateString);
	}
	
	// convert date from EST/EDT to UTC
	var rDate = this.mysqlTimeStampToDate(dateString.replace(".0", ""));
	
	switch(timeZone) {
		case "Pacific":
		  offset = 3;
		  break;
		case "Mountain":
		  offset = 2;
		  break;
		case "Central":
		  offset = 1;
		  break;
		default:
		  offset = 0;
	}
	
	rDate.setHours(rDate.getHours() + (this.isDaylightSaving(rDate) ? 4 : 5) + offset);

	// convert to something that's more understandable.  need to pass it a UTC date.
	return humane_date(this.dateToMysqlTimeStamp(rDate));


	/*
	 * Javascript Humane Dates
	 * Copyright (c) 2008 Dean Landolt (deanlandolt.com)
	 * Re-write by Zach Leatherman (zachleat.com)
	 * 
	 * Adopted from the John Resig's pretty.js
	 * at http://ejohn.org/blog/javascript-pretty-date
	 * and henrah's proposed modification 
	 * at http://ejohn.org/blog/javascript-pretty-date/#comment-297458
	 * 
	 * Licensed under the MIT license.
	 */
	function humane_date(date_str){
		var time_formats = [
			[60, 'just now'],
			[90, '1 minute'], // 60*1.5
			[3600, 'minutes', 60], // 60*60, 60
			[5400, '1 hour'], // 60*60*1.5
			[86400, 'hours', 3600], // 60*60*24, 60*60
			[129600, '1 day'], // 60*60*24*1.5
			[604800, 'days', 86400], // 60*60*24*7, 60*60*24
			[907200, '1 week'], // 60*60*24*7*1.5
			[2628000, 'weeks', 604800], // 60*60*24*(365/12), 60*60*24*7
			[3942000, '1 month'], // 60*60*24*(365/12)*1.5
			[31536000, 'months', 2628000], // 60*60*24*365, 60*60*24*(365/12)
			[47304000, '1 year'], // 60*60*24*365*1.5
			[3153600000, 'years', 31536000], // 60*60*24*365*100, 60*60*24*365
			[4730400000, '1 century'], // 60*60*24*365*100*1.5
		];
	
		var time = ('' + date_str).replace(/-/g,"/").replace(/[TZ]/g," "),
			dt = new Date,
			seconds = ((dt - new Date(time) + (dt.getTimezoneOffset() * 60000)) / 1000),
			token = ' ago',
			i = 0,
			format;
	
		if (seconds < 0) {
			seconds = Math.abs(seconds);
			token = '';
		}
	
		while (format = time_formats[i++]) {
			if (seconds < format[0]) {
				if (format.length == 2) {
					return format[1] + (i > 1 ? token : ''); // Conditional so we don't return Just Now Ago
				} else {
					return Math.round(seconds / format[2]) + ' ' + format[1] + (i > 1 ? token : '');
				}
			}
		}
	
		// overflow for centuries
		if(seconds > 4730400000)
			return Math.round(seconds / 4730400000) + ' Centuries' + token;
	
		return date_str;
	};
});

Nbcu.Template.Helper.method("mysqlTimeStampToDate", function(timestamp)
{
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
	var regex = /^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
	var parts = timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
	return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
});


Nbcu.Template.Helper.method("dateToMysqlTimeStamp", function(date)
{
	var hours = date.getHours();
	var minutes = date.getMinutes();
	var seconds = date.getSeconds();
	
	if (hours < 10) hours = "0" + hours;
	if (minutes < 10) minutes = "0" + minutes;
	if (seconds < 10) seconds = "0" + seconds;

	return date.getFullYear() + '-' +
	(date.getMonth() < 9 ? '0' : '') + (date.getMonth()+1) + '-' +
	(date.getDate() < 10 ? '0' : '') + date.getDate() + ' ' +
	hours + ':' + minutes + ':' + seconds;
});

/**
 * Given a US-based date & time, check if daylight savings is in effect.
 *
 * @name isDaylightSaving
 * @type Nbcu.Template.Helper
 * @param Object date The date object.
 * @return Bool.
 */		
Nbcu.Template.Helper.method("isDaylightSaving", function(date)
{
	var sDate = null;
	var eDate = null;

	if ( date.getFullYear() >= 2007 ) {
		// Daylight Saving start date
		sDate = this.calcNthDayOfMonth("02", date.getFullYear(), 2, 0);
		
		// Daylight Saving end date
		eDate = this.calcNthDayOfMonth("10", date.getFullYear(), 1, 0);			
	}
	else if ( date.getFullYear() >= 1987 ) {
		// Daylight Saving start date
		sDate = this.calcNthDayOfMonth("03", date.getFullYear(), 1, 0);
		
		// Daylight Saving end date
		eDate = this.calcNthDayOfMonth("09", date.getFullYear(), 6, 0);	
	}
	else {
		return false;
	}
	
	// Daylight Saving start and end times
	sDate.setHours(3);
	eDate.setHours(1,59,59);

	if ( date >= sDate && date <= eDate ) {
		return true;
	}
	return false;
});

/**
 * Calculates the nth occurrance of a specific day.  Returns the Date object of that day.
 * If the nth occurance is out of bounds, then the last occorance is returned.
 *
 * @name calcNthDayOfMonth
 * @type Nbcu.Template.Helper
 * @param Number mm The numeric representation of the month minus one (00-11).
 * @param Number yyyy The numeric representation of the year (4 digits).
 * @param Number nth The nth occurance.
 * @param Number day The numeric representation of the day of the week (0-6) where Sunday is 0.
 * @return Object.
 */	
Nbcu.Template.Helper.method("calcNthDayOfMonth", function(mm, yyyy, nth, day)
{
	var date = new Date(yyyy, mm, 01);				// 1st day of the specified month and year
	var dayDiff = day - date.getDay() + (day < date.getDay() ? 7 : 0);
	date = new Date(yyyy, mm, 01 + (nth - 1) * 7 + dayDiff);
	
	while ( date.getMonth() != mm ) {
		date.setDate(date.getDate() - 7);
	}
	
	return date;
});

// %page% will be replaced with the page number in the href param
Nbcu.Template.Helper.method("getPager", function(currentPage, maxPages, maxRecordsPerPage, totalRecords, href, onclick, firstText, lastText, previousText, nextText)
{
	var firstPage = 1;
	var lastPage = Math.ceil(totalRecords / maxRecordsPerPage);
	var previousPage = (currentPage == 1) ? 1 : currentPage - 1;
	var nextPage = (lastPage != currentPage) ? currentPage + 1 : currentPage;
	var pager = "";
	var currentClass = "";
	
	if (!lastPage || lastPage == 1) return "";
	
	firstText = firstText || "&lt;&lt;";
	lastText = lastText || "&gt;&gt;"
	previousText = previousText || "Prev";
	nextText = nextText || "Next";
	href = href || "?page=%page%";
	onclick = onclick || "";

    if (document.domain.indexOf('moreyouknow') != -1) {
      reverseOrder = true;
    } else {
      reverseOrder = false;
    }

	pager += '<div class="nbcu_pager">';
    
    if (reverseOrder) {
	  pager += '  <a href="' + href.replace(/%page%/g, lastPage) + '" onclick="' + onclick.replace(/%page%/g, lastPage) + '" class="nbcu_pager_last">' + lastText + '</a>';
	  pager += '  <a href="' + href.replace(/%page%/g, nextPage) + '" onclick="' + onclick.replace(/%page%/g, nextPage) + '" class="nbcu_pager_next">' + nextText + '</a>';
    } else {
	  pager += '  <a href="' + href.replace(/%page%/g, firstPage) + '" onclick="' + onclick.replace(/%page%/g, firstPage) + '" class="nbcu_pager_first">' + firstText + '</a>';
	  pager += '  <a href="' + href.replace(/%page%/g, previousPage) + '" onclick="' + onclick.replace(/%page%/g, previousPage) + '" class="nbcu_pager_previous">' + previousText + '</a>';
    }
	
	var pageStart = ((start = currentPage - Math.floor(maxPages / 2)) > 0) ? start : 1;
	pageStart = ((pageStart + maxPages - 1) <= lastPage || maxPages > lastPage) ? pageStart : lastPage - maxPages + 1;
	var pageEnd = ((end = pageStart + maxPages - 1) <= lastPage) ? end : lastPage;
	
    if (reverseOrder) {
	  for (var i = pageEnd; i >= pageStart; i--)
	  {
		(currentPage != i) ? currentClass = "nbcu_pager_page" : currentClass = "nbcu_pager_page nbcu_pager_active";
		pager += '  <a href="' + href.replace(/%page%/g, i) + '" onclick="' + onclick.replace(/%page%/g, i) + '" class="' + currentClass + '">' + i + '</a>';
	  }
    } else {
      for (var i = pageStart; i <= pageEnd; i++)
      {
		(currentPage != i) ? currentClass = "nbcu_pager_page" : currentClass = "nbcu_pager_page nbcu_pager_active";
		pager += '  <a href="' + href.replace(/%page%/g, i) + '" onclick="' + onclick.replace(/%page%/g, i) + '" class="' + currentClass + '">' + i + '</a>';
	  }
    }

    if (reverseOrder) {
	  pager += '  <a href="' + href.replace(/%page%/g, previousPage) + '" onclick="' + onclick.replace(/%page%/g, previousPage) + '" class="nbcu_pager_previous">' + previousText + '</a>';
	  pager += '  <a href="' + href.replace(/%page%/g, firstPage) + '" onclick="' + onclick.replace(/%page%/g, firstPage) + '" class="nbcu_pager_first">' + firstText + '</a>';
    } else {
	  pager += '  <a href="' + href.replace(/%page%/g, nextPage) + '" onclick="' + onclick.replace(/%page%/g, nextPage) + '" class="nbcu_pager_next">' + nextText + '</a>';
	  pager += '  <a href="' + href.replace(/%page%/g, lastPage) + '" onclick="' + onclick.replace(/%page%/g, lastPage) + '" class="nbcu_pager_last">' + lastText + '</a>';
    }
	pager += '</div>';
	
	return pager;
});

Namespace("nbcu.template.helper");
nbcu.template.helper = new Nbcu.Template.Helper();
// END NBCU.TEMPLATE.HELPER

