
function ewGetTypePadsprop7() {
	var url = document.location + '';

	
	
	var re = new RegExp( '\/comments\/page\/' );

	var qsParamValue = tiiGetQueryParamValue( 'cid' );	
		

	if ( re.test(url) || qsParamValue != null  ) {
		
		url = '';
	} else {
		url = url.split( '#', 1 );
		url = url + '';
		

		url = url.split( '?', 1 );		
		url = url + '';
		
	}

	

	return url;
}
function handleInitError() {

}

function tiiQuigoSetEnabled(b) {
	_tiiQuigoEnabled = b;
}

function tiiQuigoIsEnabled() {
	if (typeof(_tiiQuigoEnabled) == "boolean") {
		return _tiiQuigoEnabled;
	}
	return true;
}

function tiiQuigoWriteAd(pid, placementId, zw, zh, ps) {
	if (tiiQuigoIsEnabled()) {
		qas_writeAd(placementId, pid, ps, zw, zh, 'ads.adsonar.com');
	}
}

 // ### Array Helper Functions ###

function tiiArrayContains (array, value) {
	if (array != null) {
		var al = array.length;
		for (var i = 0; i < al; i++) {
			if (array[i] == value) return true;
		}
	}
	return false;
}

// ### Key=Value; Functions ###

function tiiHashKeys(string) {
	var keys = null;
	if (string != null) {
		var hash = string.split(';');
		var hl = hash.length - 1;
		if(hl > 0){
			keys = new Array();
			for(var i = 0; i < hl; i++){
				var data = hash[i].split('=');
				keys[i] = data[0].replace(' ', '');
			}
		}
	}
	return keys;
}

function tiiHashGet(string, key) {
	var value = null;
	if (string != null) {
		var keyStart = key + '=';
		var offset = string.indexOf(keyStart);
		if (offset != -1) {
			offset += keyStart.length;
			var end = string.indexOf(';', offset);
			if (end == -1) {
				end = string.length;
			}
			value = string.substring(offset, end);
		}
	}
	return value;
}

function tiiHashSet(string, key, value) {
	var string = tiiHashDelete(string, key);
	var newValue = key + '=' + value + ';';
	if (string != null) newValue = newValue + string;
	return newValue;
}

function tiiHashDelete(string, key) {
	var oldValue = tiiHashGet(string, key);
	var newString = string;
	if (oldValue != null) {
		var search = key + '=';
		var start = string.indexOf(search);
		var offset = start + search.length;
		var end = string.indexOf(';', offset) + 1;
		if (end == -1) end = string.length;
		newString = string.slice(0,start) + string.slice(end,string.length);
		return newString;

	}
	return newString;
}

function tiiGetQueryParamValue(param) {
	var startIndex;
	var endIndex;
	var valueStart;

	var qs = document.location.search;
	var detectIndex = qs.indexOf( "?" + param + "=" );
	var detectIndex2 = qs.indexOf( "&" + param + "=" );
	var key = "&" + param + "=";
	var keylen = key.length;

	if (qs.length > 1) {
		if (detectIndex != -1) {
			startIndex = detectIndex;
		} else if (detectIndex2 != -1) {
			startIndex = detectIndex2;
		} else {
			return null;
		}

		valueStart = startIndex + keylen;

		if (qs.indexOf("&", valueStart) != -1) {
			endIndex = qs.indexOf("&", startIndex + 1)
		} else {
			endIndex = qs.length
		}

		return (qs.substring(qs.indexOf("=", startIndex) + 1, endIndex));
	}

	return null;
}

function RightslinkPopUp( title, date, author, contentid)
{       
	var url = "https://s100.copyright.com/AppDispatchServlet"; 
    var location = url 
    + "?publisherName=" + escape("TIME")
    + "&publication=" + escape("EW")
    + "&title=" + title
    + "&publicationDate=" + escape(date)
    + "&author=" + author
    + "&contentID=" + escape(contentid)
    + "&orderBeanReset=true"
    PopUp = window.open( location,'Rightslink','location=no,toolbar=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=650,height=550');
}

// ### Date/Time Functions ###

function tiiDateGetOffsetMinutes(minutes)	{ var today = new Date(); return today.getTime() + (60000) * minutes;}
function tiiDateGetOffsetHours(hours)		{ var today = new Date(); return today.getTime() + (3600000) * hours; }
function tiiDateGetOffsetDays(days)			{ var today = new Date(); return today.getTime() + (86400000) * days; }
function tiiDateGetOffsetWeeks(weeks)		{ var today = new Date(); return today.getTime() + (604800000) * weeks; }
function tiiDateGetOffsetMonths(months)		{ var today = new Date(); return today.getTime() + (259200000) * months; }
function tiiDateGetOffsetYears(years)		{ var today = new Date(); return today.getTime() + (31536000000) * years; }
 var adConfig = new TiiAdConfig("3475.enw");
adConfig.setCmSitename("cm.enw");



adConfig.setRevSciTracking(true);

function adSetTarget() {}

function htmlAdWH() {}

function adSetType() {} 


function openLink(url,target) {
	if (target) {
		new_window= window.open(url);
	} else {
		location.href = url;
	}
}

var daysArray = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
var monthsArray = new Array("January","February","March","April","May","June","July","August","September","October","November","December");


function getDateCurrent() {	
	var today = new Date();
	var monthNumber = (today.getMonth());
	var monthName = monthsArray[monthNumber].substr(0,3);
	var weekDayNumber = (today.getDay());
	var weekDayName = daysArray[weekDayNumber];
	var dayNumber=today.getDate();
	if (dayNumber < 10){
		dayNumber="0" + dayNumber;
	}
	var yearNumber = today.getYear();
	if (yearNumber < 1000) {
		yearNumber+=1900;
	}
	document.write(weekDayName + ", " + monthName + ". " + dayNumber + ", " + yearNumber);
}

function getHeaderDateCurrent () {	
	var today = new Date();
	var monthNumber = (today.getMonth());
	var monthName = monthsArray[monthNumber];
	var weekDayNumber = (today.getDay());
	var weekDayName = daysArray[weekDayNumber];
	var dayNumber=today.getDate();	
	var yearNumber = today.getYear();
	if (yearNumber < 1000) {
		yearNumber+=1900;
	}
	document.write(weekDayName + ", " + monthName + " " + dayNumber + ", " + yearNumber);
}

function highLightHeaderOld (channelID) {	
	var tab;
	
	switch (channelID.toLowerCase()) {
		case "books": 
			tab=document.getElementById('books');		
			break;
		case "inside":
		case "services":
		case "inside ew":
			tab=document.getElementById('inside');
			break;
		case "dvd": 
			tab=document.getElementById('dvd'); 	
			break;
		case "music": 
			tab=document.getElementById('music');
			break;
		case "tv": 
			tab=document.getElementById('tv');
			break;
		case "movies":
		case "movie":
		case "movieheadlines": 
			tab=document.getElementById('movies');
			break;
		case "newsandnotes":
		case "news":
		case "charts":
		case "news + notes":
			tab=document.getElementById('news');
			break;			
		case "home": 
			tab=document.getElementById('home');
			break;			
		case "video": 
			tab=document.getElementById('video');
			break;
	}	
	if (tab != null ) {
		tab.className = "selectedpage";
	}
}

function highLightHeaderTab (channelID) {	
	var prefix = (document.getElementById('nav-main')) ? 'nav-' : 'pn';
	var channelMap = {
		'services':       'inside',
		'inside ew':      'inside',
		'movie':          'movies',
		'movieheadlines': 'movies',
		'newsandnotes':   'news',
		'charts':         'news',
		'news + notes':   'news'
	};
	var channel = channelID.toLowerCase();
	var tabId = prefix.concat(channelMap[channel] || channel);
	var tab = document.getElementById(tabId);
	if (tab) {
		tab.className = 'selectedpage';
	}
}

function getReleaseDateDiff(releaseDate,mtype) {	
	var now = new Date();	
	var release = new Date(releaseDate);
	var difference = release.getTime() - now.getTime(); 
	difference = Math.floor(difference / (1000 * 60 * 60 * 24)) + 1;
	if (difference > 0 && difference != 1) {
		document.write('<div class="release clear"><span class="txt">'+mtype+' Release</span><span class="days"><b>'+difference+'</b> Days</span></div>');
	} else if (difference == 1) {
		document.write('<div class="release clear"><span class="txt">'+mtype+' Release</span><span class="days"><b>'+difference+'</b> Day</span></div>');
	} else if (difference == 0) {
		document.write('<div class="release clear"><span class="txt">'+mtype+' Release</span><span class="days"><b>today</b></span></div>');
	}	
}

function getComingSoonReleaseDateDiff(releaseDate) {	
	var now = new Date();	
	var release = new Date(releaseDate);
	var difference = release.getTime() - now.getTime(); 
	difference = Math.floor(difference / (1000 * 60 * 60 * 24)) + 1;
	if (difference > 0 && difference != 1) {
		document.write('<div class="remind"><span class="num">'+difference+'</span><br /><span class="days"> Days</span></div>');
	} else if (difference == 1) {
		document.write('<div class="remind"><span class="num">'+difference+'</span><br /><span class="days"> Day</span></div>');
	} else if (difference == 0) {
		document.write('<div class="remind"><span class="num">'+difference+'</span><br /><span class="days"> today</span></div>');
	}	
}

// used to send aol message
var IM_global_title;
var IM_global_url;
var IM_default_text_IE = "Here's%20something%20that%20may%20interest%20you%20from%20EW.com:";
var IM_default_text_OT = "Here's something that may interest you from EW.com:";

function openPrintWin(which) {
	which.setAttribute('href', '?print');
	return true;
}

function popMailWin() {
    var pageURL = document.URL;
	if (pageURL.substring(pageURL.length-1)=="#") {
		pageURL = pageURL.substring(0, pageURL.length-1);
	}
		
	var pageTitle = escape(self.document.title);
	var formURL   = "https://cgi.timeinc.net/cgi-bin/mail/secure/mailurl2friend.cgi?path=/ew/static/cgi/mail/mailurl2friend/&url="  + pageURL + "&group=ew&title=" + pageTitle; 
	showCenteredPopup('emailpop', formURL, 'scrollbars=1', 540, 450);
    return false;
}

function popGameMailWin(gameUrl, gameTitle) {
    var pageURL = gameUrl;
	if (pageURL.substring(pageURL.length-1)=="#") {
		pageURL = pageURL.substring(0, pageURL.length-1);
	}
	var pageTitle = gameTitle;
	var formURL   = "https://cgi.timeinc.net/cgi-bin/mail/secure/mailurl2friend.cgi?path=/ew/static/cgi/mail/mailurl2friend/&url="  + pageURL + "&group=ew_games&title=" + pageTitle; 
	showCenteredPopup('emailpop', formURL, 'scrollbars=1', 540, 450);
    return false;
}

function showCenteredPopup(name, url, features, width, height) {
	var top = (window.screen.height / 2) - height / 2;
	var left = (window.screen.width / 2) - width / 2;
	if (features == null || features == '') {
		features = "scrollbars=yes,toolbar=no,menubar=no,status=no,location=no";
	}
	window.open (url, name.replace (' ', '_'), features + ",top=" + top + ",left=" + left + ",width=" + width + ",height=" + height);
}

function sendAIM() {
    var url   = document.URL;
	if (url.substring(url.length-1)=="#") {
		url = url.substring(0, url.length-1);
	}
		
	
	
	var title_OT = self.document.title;
    var title = escape(self.document.title);    
    title = title.replace(" ", "+")
	var uAgt = navigator.userAgent.toLowerCase();
	var isIE = uAgt.indexOf(" msie ") !=  - 1;
	var isAOLBrowser = uAgt.indexOf(" america online browser ") !=  - 1;
	if (!isIE){
		var message = IM_default_text_OT + '<br><a href="' + url + '">' + title_OT + '</a>';
	} else if (isAOLBrowser){
		var message = IM_default_text_OT + '<br><a href="' + url + '">' + title + '</a>';
	} else {
		var message = escape(IM_default_text_IE) + "%3cbr%3e%3ca+href=%22" + escape(url) + "%22%3e" + escape(title) + "%3c%2fa%3e";
	}
	try {
		location.replace("aim:goIM?message=" + message);
	}
	catch (e){
		AIMExpress.start();
		location.replace("aim:goIM?message=" + message);
	}
	return false;
}


function sendIM(title, url) {
	if (title == ''){
		title = 'Click here to checkout';
	}
	IM_global_title = title;
	IM_global_url = url;
	var uAgt = navigator.userAgent.toLowerCase();
	var isAOL = uAgt.indexOf(" aol ") !=  - 1;
	var isIE = uAgt.indexOf(" msie ") !=  - 1;
	if (!isAOL) {
		if (!isIE) {
			sendAIM();
		} else {
			if (!canRunAIM()) {
				AIMExpress.start();
			} else {
				sendAIM();
			}
		}
	}
	else {
		sendAOLCLNT();
	}
}

// To launch the STAF User Console
function openstaf(title, url, channel) {
	window.open("http://sendtoafriend.aol.com?type=disp&channelurl=" + url + "&title=" + title + "&channel=" + channel + "&url=" + url + "", null, "height=420,width=296,statusbar=0,toolbar=no,menubar=no,location=no")
}

// To send IM through AOL Client Messenger
function sendAOLCLNT() {
	var title = IM_global_title;
	var url = IM_global_url;
	var uAgt = navigator.userAgent.toLowerCase();
	var isAOL = uAgt.indexOf(" aol ") !=  - 1;
	var isIE = uAgt.indexOf("msie") !=  - 1;
	try {
		if (!isAOL){
			if (!isIE){
				document.location = "aol://9293::" + IM_default_text_OT + "<br><a href='" + url + "'>" + title + "</a>";
			} else {
				document.location = "aol://9293::" + IM_default_text_IE + "%3cbr%3e%3ca href='" + url + "'%3e" + title + "%3c%2fa%3e";
			}
		} else {
			document.location = 'aol://9293::' + IM_default_text_OT + '<br><a href="' + url + '">' + title + '</a>'
		}
	}
	catch (e){
		AIMExpress.start();
	}
}

// To check AOL Client install in the local machine or not
function canRunAOLClient() {
	var agt = navigator.userAgent.toLowerCase();
	var isIE = (agt.indexOf("msie") !=  - 1);
	if (isIE){
		var a = document.anchors;
		for (var i = 0; i < a.length; i++){
			if (a[i].name == "aolclientnotfound"){
				return false;
			}
		}
	}
	return true;
}

// To check AIM install in the local machine or not
function canRunAIM() {
	var agt = navigator.userAgent.toLowerCase();
	var isIE = (agt.indexOf("msie") !=  - 1);
	if (isIE){
		var a = document.anchors;
		for (var i = 0; i < a.length; i++){
			if (a[i].name == "aimnotfound"){
				return false;
			}
		}
	}
	return true;
}

ewMagicNumberObject = function(adWidth,adHeight,magicNumber){
	this.adWidth=adWidth;
	this.adHeight=adHeight;
	this.magicNumber=magicNumber;
	this.placementKey=adWidth + "x" + adHeight;
	this.placements=new Array();
	this.placements[this.placementKey]=magicNumber;
}

ewMagicNumberObject.prototype.getMagicNumber = function(adWidth,adHeight) {
	return this.placements[this.placementKey];
}

var ewMagicNumberObj = new ewMagicNumberObject('','','');
var ewHeaderMagicNumberObj = new ewMagicNumberObject(365,104,93223283);


var printable = false;
if (document.location.href.indexOf("?") != -1) {
	var params = document.location.href.split("?")[1];
	printable = (params.indexOf("print") != -1);
}
if (printable) {
	document.writeln('<link rel="stylesheet" type="text/css" href="/ew/css/print/0,,,00.css" />');
}


function ewGetThreadedCommentsPage () {
	
	var result = 1;
	
	if ( ew_queryVariableExists( 'page' ) == 1 ) {
		result = tiiGetQueryParamValue( 'page' );
	}

	return result;
}	



function ewGetSTIScribbleboardPage () {
	// Important to intialize to 1 
	var result = 1;
	
	if ( ew_queryVariableExists( 'commentsPage' ) == 1 ) {
		
		var temp = tiiGetQueryParamValue( 'commentsPage' );
		temp = parseInt( temp );
		if ( isNaN( temp ) == 0 && temp > 1 ) {
			result = temp;
		}
		
	}
	return result;
}	



function ewWriteSTIScribbleboardPagination (articleCurl) {
	//kc: Navigation to comments on Gallery pages only
	var commentsAnchor = ""
	 if (document.location.href.indexOf("/gallery/") != -1) {
	 	commentsAnchor = "&#pagecomments"
	 }
	 
	 if ( sti_scribbleboardPages > 1 && commentsPage > 1  ) {
		var previousPage = commentsPage - 1;
		//document.write('<a href="?commentsPage=1">[First]</a> ');
		document.write ('<a href="'+ articleCurl +'" class="retMain">Back to Main</a>');
		document.write('<a href="?commentsPage=' + previousPage + commentsAnchor + '" class="prev">Previous</a>');

	} 
	if ( sti_scribbleboardPages > 0 && commentsPage >= 1 ) {
		document.write( ' Page ' + commentsPage + ' of ' + sti_scribbleboardPages + '  ' );
	}
	
	if ( sti_scribbleboardPages > 1 && commentsPage < sti_scribbleboardPages ) {
		var nextPage = commentsPage + 1;
		document.write( '<a href="?commentsPage=' + nextPage +  commentsAnchor + '" class="next">Next</a>' );
	}
} 

function ewWriteSTIScribbleboardTopHeader (articleCurl) {

	if ( sti_scribbleboardPages > 0 ) {
		document.write('<div class="commPagi">'); 	
		ewWriteSTIScribbleboardPagination(articleCurl);
		document.write( '</div><!--/commPagi-->' );
	}
}

function ewWriteSTIScribbleboardBottomHeader (articleCurl) {
	
	if ( sti_scribbleboardPages > 0  ) {
		document.write('<div class="commPagi cpBottom">'); 
		ewWriteSTIScribbleboardPagination(articleCurl); 
		document.write( '</div><!--/commPagi-->' );
	}
}

function ewNextRandomNumber()  
{ var hi   = this.seed / this.Q;
  var lo   = this.seed % this.Q;
  var test = this.A * lo - this.R * hi;
  if (test > 0) this.seed = test;
  else          this.seed = test + this.M;
  return (this.seed * this.oneOverM);
}

function ewRandomNumberGenerator() 
{ var d = new Date();
  this.seed = 2345678901 
            + (d.getSeconds() * 0xFFFFFF) 
            + (d.getMinutes() * 0xFFFF);
  this.A = 48271;
  this.M = 2147483647;
  this.Q = this.M / this.A;
  this.R = this.M % this.A;
  this.oneOverM = 1.0 / this.M;
  this.next = ewNextRandomNumber;
  return this;
}

function ewCreateRandomNumber(Min, Max) 
{ var rand = new ewRandomNumberGenerator();
  return Math.round( (Max-Min) * rand.next() + Min );
}




(function() {



  /**
   * DEPLOYMENT INSTRUCTIONS:
   * Before deploying, verify the JavaScript code using JSLint: http://jslint.com
   * Then compress using YUI Compressor: http://compressorrater.thruhere.net/
   * NOTE: Packer compresses slightly further but requires eval to execute so 
   * stick with YUI.
   */



  /**
   * Declare EWPicks namespace
   */
  var EWPicks = {};
  
  /**
   * Add EWPicks to global namespace
   */
  window.EWPicks = EWPicks;

function getPeriodOffset( targetDate, pagePeriod ) {
 	
   // Establish a reference date for first day of EW week. Happy B-Day! w
   var referenceDate = new Date( 'Mon Mar 30 2009' );
 
   // Calculate the size of the period in ms
   var msPerDay = 1000 * 60 * 60 * 24;
   var msPerPeriod = msPerDay;
   if ( pagePeriod === 'week' ) {
   	 	msPerPeriod = 7 * msPerDay;
   }
      
   // Remove any time component from day
   targetDate.setHours( 0, 0, 0, 0 );
   
   // Compute the delta, rounding down
   var ms = targetDate.getTime() - referenceDate.getTime();
   var mod = ms % msPerPeriod;
   ms = ms - mod;
   var perc = mod / msPerPeriod;
   var timePeriods = ms / msPerPeriod;
   
   // Floating point slop. This seems to only be a problem with MSIE6.
   if ( perc > 0.98 && perc < 1 ) { 
   	  timePeriods = timePeriods + 1;
   }
      
   /*
   alert( 'getPeriodOffset: pagePeriod -> ' + pagePeriod + 
   			', referenceDate -> ' + referenceDate.toDateString() + ' ' + referenceDate.getTime() +
			', targetDate -> ' + targetDate.toDateString() + ' ' + targetDate.getTime() +
			', timePeriods -> ' + timePeriods +
			', ms -> ' + ms +
			', mod -> ' + mod +
			', perc -> ' + perc );
   */
   
   return timePeriods;
}
 
  /**
  * Add getPeriodOffset to EWPicks namespace
  */
EWPicks.getPeriodOffset = getPeriodOffset;



  /** ==================================================================== **/



  /**
   * Parses a query string into an associative array object
   *
   * @method parseQueryString
   * @param {String} q (optional) URL query string or value of location.search
   *                 if none provided
   * @return {returnType} Return description
   */
  var parseQueryString = function(/* q */) {

    var params = {};
    var q = arguments[0] || location.search;

    if (q.length > 0) {
      var pairs = q.substring(q.indexOf('?') + 1).split('&');
      for (var i = pairs.length - 1; i >= 0; --i) {
        var pair = pairs[i].split('=');
        params[pair[0]] = (typeof pair[1] === 'string') ? unescape(pair[1]) : pair[1];
      }
    }
    
    return params;
  };

  /**
   * Add parseQueryString to EWPicks namespace
   */
  EWPicks.parseQueryString = parseQueryString;



  /**
   * Creates a regular expression for finding/replacing a particular DOM class
   * in an element's className attribute. (Used in the hasClass and 
   * removeClass methods.)
   *
   * @method getClassNameRegExp
   * @param {String} className Name of DOM class to find/replace
   * @return {RegExp} Regular expression used to find/replace DOM class
   */
  var getClassNameRegExp = function(className) {
    return new RegExp('\\s+' + className + '\\s+');
  };



  /**
   * Removes white space (or specified characters) from the beginning and end
   * of a string
   *
   * @method trim
   * @param {String} str String to trim
   * @return {String} Trimmed string
   */
  var trim = function(str) {
    var chr = arguments[1] || '\\s';
    var re = new RegExp('^'+chr+'+|'+chr+'+$', 'g');
    return str.replace(re, '');
  };



  /**
   * Evaluates if a DOM element is of a specified CSS class
   *
   * @method hasClass
   * @param {DOMElement} el DOM element to evaluate
   * @param {String} className CSS class name to look for
   * @return {Boolean} True if className of DOM element contains CSS class
   */
  var hasClass = function(el, className) {
    if (el && className) {
      return getClassNameRegExp(className).test(' ' + el.className + ' ');
    } else {
      throw new Error('hasClass called with invalid arguments');
    }
  };



  /**
   * Adds a CSS class to a DOM element
   *
   * @method addClass
   * @param {DOMElement} el DOM element to modify
   * @param {String} className Name of CSS class to add to element
   * @return
   */
  var addClass = function(el, className) {
    if (el && className) {
      if (!hasClass(el, className)) {
	  	var y = el.className + ' ' + className;
		el.className = y;
        /*
		//Gets rid of the S for some reason.
		el.className = trim(el.className + ' ' + className);
      	*/
	  }
    } else {
      throw new Error('addClass called with invalid arguments');
    }
  };



  /**
   * Removes a CSS class from a DOM element
   *
   * @method removeClass
   * @param {DOMElement} el DOM element to modify
   * @param {String} className Name of CSS class to remove from element
   * @return
   */
  var removeClass = function( el, targetClassName ) {
		/* IE Is lame! */
		var classes = '';
		var cleaned_classes = '';
		if (el.getAttribute('className') !== null) {
			classes = el.getAttribute('className');
			cleaned_classes = classes.replace(targetClassName, ' ');
			el.setAttribute('className', cleaned_classes);
		} else {
			classes = el.getAttribute('class');
			cleaned_classes = classes.replace(targetClassName, ' ');
			el.setAttribute('class', cleaned_classes);
        }
  };


  /**
   * Converts a string to a CSS class name
   *
   * Example:
   * "Beans and Rice" converts to 'beans-and-rice'
   *
   * @method toCSSClassName
   * @param {String} str String to modify
   * @return {String} Hyphenated, lowercased string 
   */
  var toCSSClassName = function(str) {
    return trim(str.toLowerCase().replace(/W+/g, '-'), '-');
  };



  /**
   * Description of method
   *
   * @method extend
   * @param {Function} subclass Parameter description
   * @param {Function} superclass Parameter description
   * @param {Object} overrides Parameter description
   * @return {returnType} Return description
   */
  var extend = function(subclass, superclass, overrides) {
    if (!superclass || !subclass) {
      throw new Error('extend failed, please check that all dependencies are included.');
    }
    var F = function() {};
    F.prototype = superclass.prototype;
    subclass.prototype = new F();
    subclass.prototype.constructor = subclass;
    subclass.superclass = superclass.prototype;
    if (superclass.prototype.constructor == Object.prototype.constructor) {
      superclass.prototype.constructor = superclass;
    }

    if (overrides) {
      for (var i in overrides) {
        if (overrides.hasOwnProperty(i)) {
          subclass.prototype[i] = overrides[i];
        }
      }
      // L._IEEnumFix(subclass.prototype, overrides);
    }
  };



  /** ==================================================================== **/



  /**
   * BaseCalendarApp class
   *
   * BaseCalendarApp is an abstract class. It is currently extended by
   * DailyCalendarApp, HomepageCalendarApp, ChannelCalendarApp, and
   * WeeklyCalendarApp.
   *
   * BaseCalendarApp contains many of the methods necessary for constructing
   * a Google Calendar widget. It uses the GData API for loading calendar
   * data.
   *
   * @method BaseCalendarApp
   * @param {String} elementId Name of container DOM element
   * @param {Array|Object} calendars Calendar configuration object or array of
                           calendar configuration objects
   * @param {Date} startDate (optional) Parameter description
   * @param {Date} endDate (optional) description
   * @return {Object} Instance of BaseCalendarApp
   */
  var BaseCalendarApp = function(elementId, calendars /*, startDate, endDate */) {

    /**
     * The DOM element which contains the EW Picks application
     */
    this.element = document.getElementById(elementId);

    /**
     * BaseCalendarApp requires an existing DOM element
     */
    if (this.element === null) {
      throw new Error('EWPicks.BaseCalendarApp: Unable to locate element ' + elementId);
    }

    /**
     * A calendar or array of calendars to populate the EW Picks application
     */
    this.calendars = (calendars instanceof Array) ? calendars : [calendars];

    /**
     * BaseCalendarApp requires one or multiple calendars.
     */
    if (this.calendars.length === 0) {
      throw new Error('EWPicks.BaseCalendarApp: Requires calendars.');
    }

    /**
     * BaseCalendarApp accepts an optional start date. Without a start date, the
     * Google Calendar API will retrieve all events from the end date back.
     */
    if (arguments.length > 2 && arguments[2]) {
      this.startDate = arguments[2];
    }

    /**
     * BaseCalendarApp accepts an optional end date, Without an end date, the Google
     * Calendar API will retrieve all events from the start date forward.
     */
    if (arguments.length > 3 && arguments[3]) {
      this.endDate = arguments[3];
    }

    /**
     * Memoize the scope for use in the Google API callback
     */
    var scope = this;

    /**
     * Load the Google Data API
     */
    google.load('gdata', '1');
    google.setOnLoadCallback(function() {
	google.gdata.client.init(handleInitError);
      scope.calendarService = new google.gdata.calendar.CalendarService(scope.appName);
      scope._init.apply(scope);
    });

  };

  /**
   * Prototoype for the BaseCalendarApp class
   */
  BaseCalendarApp.prototype = {



    appName: 'EWPicks-BaseCalendarApp',



    /**
     * Callback method for the gdata onload event.
     *
     * @method _init
     * @return {returnType} Return description
     */
    _init: function() {
    },



    /**
     * Parses event data from the Google Calendar Event object
     *
     * @method _parseCalendarEntry
     * @param {Object} entry Parameter description
     * @return {Object} Simplified event object
     */
    _parseCalendarEntry: function(entry) {
      var linkData = entry.getLocations()[0].getValueString().split('#');

      return {
        summary:     entry.getTitle().getText(),
        description: entry.getContent().getText(),
        link:        linkData[0],
        linkText:    linkData[1] || BaseCalendarApp.DEFAULT_LINK_TEXT,
        date:        entry.getTimes()[0].getStartTime().getDate()
      };
    },



    /**
     * Description of method
     *
     * @method _parseCalendarEventFeed
     * @param {Object} eventFeed Parameter description
     * @return {Array} Array of simplified event objects
     */
    _parseCalendarEventFeed: function(eventFeed, moreLinkText, moreLinkUrl) {

      var entries = eventFeed.getEntries();
      var events = [];

      for (var i = 0, len = entries.length; i < len; ++i) {
        var entry = this._parseCalendarEntry(entries[i]);
        entry.moreLink = moreLinkUrl;
        entry.moreLinkText = moreLinkText;
        events.push(entry);
      }

      return events;
    },



    /**
     * Sets the time of a date object to 00:00:00.000. Along with the
     * setTimeToEndOfDay method, this method is used to bracket the date range
     * supplied to the Google Calendar API query.
     *
     * NOTE: This method modifies the original object.
     *
     * @method setTimeToStartOfDay
     * @param {Date} date Date object to modify
     */
    setTimeToStartOfDay: function(date) {
      date.setHours(0);
      date.setMinutes(0);
      date.setSeconds(0);
      date.setMilliseconds(0);
    },



    /**
     * Sets the time of a date object to 23:59:59.999. Along with the
     * setTimeToStartOfDay method, this method is used to bracket the date
     * range supplied to the Google Calendar API query.
     *
     * NOTE: This method modifies the original object.
     *
     * @method setTimeToEndOfDay
     * @param {Date} date Date object to modify
     */
    setTimeToEndOfDay: function(date) {
      date.setHours(23);
      date.setMinutes(59);
      date.setSeconds(59);
      date.setMilliseconds(999);
    },



    /**
     * Adds a leading zero to a numeric value less than 10.
     *
     * @method addLeadingZero
     * @param {String|Number} val A string or number object representing a 
     *                        numerical value
     * @return {String} The original value preceded by a zero (if numeric
     *                  value is less than 10)
     */
    addLeadingZero: function(val) {
      return (parseInt(val, 10) < 10) ? '0' + val : val;
    },



    /**
     * Description of method
     *
     * @method _fetchEvents
     * @param {String} calendarId Parameter description
     * @param {Function} callback Parameter description
     * @param {Object} scope (optional) Parameter description
     * @param {Date} startDate (optional) Parameter description
     * @param {Date} endDate (optional) Parameter description
     * @return {returnType} Return description
     */
    _fetchEvents: function(calendarId, callback /*, scope, startDate, endDate */) {

      var uri = BaseCalendarApp.URI_TEMPLATE.replace(BaseCalendarApp.URI_REG_EXP, calendarId);
      var query = new google.gdata.calendar.CalendarEventQuery(uri);

      /**
       *
       */
      var scope = arguments[2] || window;

      /**
       *
       */
      if (arguments.length > 3 && typeof arguments[3] !== 'undefined') {

        var startDate = arguments[3];
        var startMin = new google.gdata.DateTime(startDate);

        query.setMinimumStartTime(startMin);

        /**
         *
         */
        if (arguments.length > 4 && typeof arguments[4] !== 'undefined') {

          var endDate = arguments[4];
          var startMax = new google.gdata.DateTime(endDate);

          query.setMaximumStartTime(startMax);
        }
      }

      query.setOrderBy('starttime');
      query.setSortOrder('ascending');
      query.setSingleEvents('true');

      /**
       *
       */
      var handleSuccess = function(result) {
        if (typeof callback !== 'undefined' && typeof callback.success === 'function') {
          callback.success.apply(scope, [result]);
        }
      };

      /**
       *
       */
      var handleFailure = function(error) {
        if (typeof callback !== 'undefined' && typeof callback.failure === 'function') {
          callback.failure.apply(scope, [error]);
        }
      };

      this.calendarService.getEventsFeed(query, handleSuccess, handleFailure);

    },



    /**
     * Description of method
     *
     * @method _renderErrorElement
     * @param {String} error Parameter description
     * @return {DOMElement} Return description
     */
    _renderErrorElement: function(error) {
      var el = document.createElement('div');
      el.className = 'error';
      el.appendChild(document.createTextNode(error));
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderHeaderElement
     * @param {String} text Parameter description
     * @param {String} url Parameter description
     * @return {DOMElement} Return description
     */
    _renderHeaderElement: function(text, url) {
      var el = document.createElement('h3');
      var a = document.createElement('a');
      a.href = url;
      a.appendChild(document.createTextNode(text));
      el.appendChild(a);
      return el;
    },



    /**
     * Renders a DOM element representing an event's date
     *
     * @method _renderDtElement
     * @param {Date} date Parameter description
     * @param {String} className Parameter description
     * @return {DOMElement} Return description
     */
        _renderDtElement: function(date, className) {

      var yyyy = date.getFullYear();
      var m    = date.getMonth();
      var mm   = this.addLeadingZero(m + 1);
      var d    = date.getDate();
      var dd   = this.addLeadingZero(d);

      var el = document.createElement('div');
      el.className = 'dtstart';
      el.title = [yyyy, mm, dd].join('-');

      var weekday = document.createElement('span');
      weekday.className = 'weekday';
      weekday.appendChild(document.createTextNode(BaseCalendarApp.WEEKDAYS[date.getDay()]));
      el.appendChild(weekday);

      el.appendChild(document.createTextNode(' '));

      var month = document.createElement('abbr');
      month.className = 'month';
      month.title = BaseCalendarApp.MONTHS[m];
      month.appendChild(document.createTextNode(BaseCalendarApp.MONTHS_ABBREVIATED[m]));
      el.appendChild(month);

      el.appendChild(document.createTextNode(' '));

      var day = document.createElement('span');
      day.className = 'day';
      day.appendChild(document.createTextNode(d));
      el.appendChild(day);

      return el;
    },


    /**
     * Renders a DOM element representing an event's date for What's New
     *
     * @method _renderDtElement
     * @param {Date} date Parameter description
     * @param {String} className Parameter description
     * @return {DOMElement} Return description
     */
	_renderWNDtElement: function(date, className) {

      var yyyy = date.getFullYear();
      var m    = date.getMonth();
      var mm   = this.addLeadingZero(m + 1);
      var d    = date.getDate();
      var dd   = this.addLeadingZero(d);

      var el = document.createElement('div');
      el.className = 'dateHolder';
      el.title = [yyyy, mm, dd].join('-');

      var weekday = document.createElement('span');
      weekday.className = 'dayOfWeek';
      weekday.appendChild(document.createTextNode(BaseCalendarApp.WNWEEKDAYS[date.getDay()]));
      el.appendChild(weekday);

      el.appendChild(document.createTextNode(' '));

      el.appendChild(document.createTextNode(' '));

      var day = document.createElement('span');
      day.className = 'date';
      day.appendChild(document.createTextNode(d));
      el.appendChild(day);

      return el;
    },

	/**
     * Renders a DOM element representing an event's date for Looking Ahead
     *
     * @method _renderLADtElement
     * @param {Date} date Parameter description
     * @param {String} className Parameter description
     * @return {DOMElement} Return description
     */
	_renderLADtElement: function(date, className) {

      var yyyy = date.getFullYear();
      var m    = date.getMonth();
      var mm   = this.addLeadingZero(m + 1);
      var d    = date.getDate();
      var dd   = this.addLeadingZero(d);

      var el = document.createElement('div');
      el.className = 'dateHolder';
      el.title = [yyyy, mm, dd].join('-');

      var month = document.createElement('span');
      month.className = 'month';
      month.appendChild(document.createTextNode(BaseCalendarApp.MONTHS_ABBREVIATED[date.getMonth()]));
      el.appendChild(month);

      el.appendChild(document.createTextNode(' '));

      el.appendChild(document.createTextNode(' '));

      var day = document.createElement('span');
      day.className = 'date';
      day.appendChild(document.createTextNode(d));
      el.appendChild(day);

      return el;
    },

    /**
     * Renders a DOM element representing an event's summary (title)
     *
     * @method _renderSummaryElement
     * @param {String} summary Parameter description
     * @param {String} url (optional) Parameter description
     * @return {DOMElement} Return description
     */
    _renderSummaryElement: function(summary /*, url*/) {
      var el = document.createElement('h4');
      el.className = 'summary';
      var tn = document.createTextNode(summary);

      if (arguments.length > 1 && arguments[1]) {
        var summaryLink = document.createElement('a');
        summaryLink.href = arguments[1];
        summaryLink.appendChild(tn);
        el.appendChild(summaryLink);
      } else {
        el.appendChild(tn);
      }

      return el;
    },
 	_renderHPSummaryElement: function(summary /*, url*/) {
      var el = document.createElement('h4');
      el.className = 'summary';
      var tn = document.createTextNode(summary);
	  var image = document.createElement('img');
	  image.setAttribute('src', 'http://img2.timeinc.net/ew/i/icon_arrow06.gif');
	  image.setAttribute('alt', 'arrow');
      if (arguments.length > 1 && arguments[1]) {
        var summaryLink = document.createElement('a');
        summaryLink.href = arguments[1];
        summaryLink.appendChild(tn);
		summaryLink.appendChild(image);
        el.appendChild(summaryLink);
      } else {
        el.appendChild(tn);
      }

      return el;
    },
    _renderWNSummaryElement: function(summary /*, url*/) {
      var el = document.createElement('span');
      el.className = 'summary';
      var tn = document.createTextNode(summary);
		/*
      if (arguments.length > 1 && arguments[1]) {
        var summaryLink = document.createElement('a');
        //summaryLink.href = arguments[1];
        summaryLink.appendChild(tn);
        el.appendChild(summaryLink);
      } else {
        el.appendChild(tn);
      }
      */
el.appendChild(tn);
      
      return el;
    },

    /**
     * Renders a DOM element representing an event's description
     *
     * @method _renderDescriptionElement
     * @param {String} description Parameter description
     * @return {DOMElement} Return description
     */
    _renderDescriptionElement: function(description) {
      var el = document.createElement('p');
      el.className = 'description';
      el.appendChild(document.createTextNode(description));
      return el;
    },

    _renderWNDescriptionElement: function(description) {
      var el = document.createElement('p');
      el.className = 'description';
      el.appendChild(document.createTextNode(description));
      return el;
    },

    /**
     * Renders a DOM element containing a link to an event's article URL
     *
     * @method _renderLinkElement
     * @param {String} text Parameter description
     * @param {String} url Parameter description
     * @return {DOMElement} Return description
     */
    _renderLinkElement: function(text, url) {
      var el = document.createElement('a');
      el.href = url;
	  var domain = url.split('/');
	  var split_url = domain[2].split('.');
	  if ((split_url[0] == 'ew') || (split_url[1] == 'ew'))
	  {
	  
	  }
	  else
	  {
	  	el.setAttribute('target', '_NEW');
	  }
      el.className = 'url';
      el.appendChild(document.createTextNode(text));
      return el;
    },
    _renderWNLinkElement: function(text, url) {
      var el = document.createElement('a');
      el.href = url;
      //el.className = 'url';
	  var domain = url.split('/');
	  var split_url = domain[2].split('.');
	  if ((split_url[0] == 'ew') || (split_url[1] == 'ew'))
	  {
	  
	  }
	  else
	  {
	  	el.setAttribute('target', '_NEW');
	  }
      el.appendChild(document.createTextNode(text));
	  var el2 = document.createElement('img');
	  el2.className = 'arrowImage';
	  el2.setAttribute('src', 'http://img2.timeinc.net/ew/i/icon_arrow05.gif');
	  el.className = 'arrow';
	  el.appendChild(el2);
      return el;
    },


    /**
     * Renders a DOM element containing a link to a channel's weekly calendar
     *
     * @method _renderMoreLinkElement
     * @param {String} text Parameter description
     * @param {String} url Parameter description
     * @return {DOMElement} Return description
     */
    _renderMoreLinkElement: function(text, url) {
      var el = document.createElement('a');
      el.href = url;
      el.className = 'more';
      el.appendChild(document.createTextNode(text));
      return el;
    },

    _renderMoreWNLinkElement: function(text, url) {
      var el = document.createElement('a');
      el.href = url;
      el.className = 'more';
      el.appendChild(document.createTextNode(text));
      return el;
    },

    /**
     * Renders a DOM element representing an event
     *
     * @method _renderEventElement
     * @param {Object} event Parameter description
     * @return {DOMElement} Return description
     */
    _renderEventElement: function(event) {
      var el = document.createElement('div');
      el.className = 'vevent';
      el.appendChild(this._renderDtElement(event.date, 'dtstart'));
      el.appendChild(this._renderSummaryElement(event.summary, event.link));
      el.appendChild(this._renderDescriptionElement(event.description));
      if (event.link) {
        el.appendChild(this._renderLinkElement(event.linkText, event.link));
      }
      return el;
    },
    _renderWNEventElement: function(event) {
      var el = document.createElement('div');
      el.className = 'item first-item';
      //if (isFirst == TRUE) {
      //	el.className = 'first-item';
      //}
	  var el2 = document.createElement('div');
	  el2.className = 'descHolder';
	  //el.appendChild(el2);
      el.appendChild(this._renderWNSummaryElement(event.summary, event.link));
      if (event.description) {
	 	 el.appendChild(this._renderWNDescriptionElement(event.description));
      }
	  if (event.link) {
        el.appendChild(this._renderWNLinkElement(event.linkText, event.link));
      }
      return el;
    },
	_renderWNEventElement2: function(event) {
	  //alert('woo');
	  //alert(event.linkText);
      var el = document.createElement('div');
      el.className = 'item';
	  var el2 = document.createElement('div');
	  el2.className = 'descHolder';
	  //el.appendChild(el2);
      //el.appendChild(this._renderWNDtElement(event.date, 'dtstart'));
      el.appendChild(this._renderWNSummaryElement(event.summary, event.link));
      if (event.description) {
	  	el.appendChild(this._renderWNDescriptionElement(event.description));
      }
	  if (event.link) {
        el.appendChild(this._renderWNLinkElement(event.linkText, event.link));
      }
      return el;
    },
	_renderLAEventElement: function(event) {
	  var el = document.createElement('div');
      el.className = 'item';
      el.appendChild(this._renderLADtElement(event.date, 'dtstart'));
	  var el2 = document.createElement('div');
	  el2.className = 'item-description';
      el2.appendChild(this._renderWNSummaryElement(event.summary, event.link));
      if (event.description) {
	  	el2.appendChild(this._renderWNDescriptionElement(event.description));
      }
	  if (event.link) {
        el2.appendChild(this._renderWNLinkElement(event.linkText, event.link));
      }
	  el.appendChild(el2);
      return el;
	},

    /**
     * Renders the "Previous" and "Next" links for a calendar widget (ie.
     * DailyCalendarApp and WeeklyCalendarApp)
     *
     * @method _renderPreviousNextLinksElement
     * @return {DOMElement} Return description
     */
    _renderPreviousNextLinksElement: function() {
      var el = document.createElement('ul');
      el.className = 'previousNextLinks';

      var prev = document.createElement('li');      
      prev.appendChild(this._renderPreviousLink());
      el.appendChild(prev);

      var next = document.createElement('li');      
      next.appendChild(this._renderNextLink());
      el.appendChild(next);

      return el;
    },



    /**
     * Retrieves the head element of a calendar widget having class "hd"
     *
     * @method getHeadElement
     * @return {returnType} Return description
     */
    getHeadElement: function() {
      var hd, divs = this.element.getElementsByTagName('div');
	  var divFound = 0;
      for (var i = 0, len = divs.length; i < len; ++i) {
        var div = divs[i];
        if (hasClass(div, 'hd')) {
		  divFound = 1;
          return div;
        }
      }
	  if (divFound != 1) {
	  	div = document.getElementById('hd-div');
		return div;
	  }
    },

    _getHeadElement: function() {
      var hd, divs = this.element.getElementsByTagName('div');
      for (var i = 0, len = divs.length; i < len; ++i) {
        var div = divs[i];
        if (hasClass(div, 'hd')) {
          return div;
        }
      }
    },

    /**
     * Retrieves the head element of a calendar widget having class "ft"
     *
     * @method getFootElement
     * @return {returnType} Return description
     */
    getFootElement: function() {
      var ft, divs = this.element.getElementsByTagName('div');
	  var divFound = 0;
      for (var i = 0, len = divs.length; i < len; ++i) {
        var div = divs[i];
        if (hasClass(div, 'ft')) {
		  divFound = 1;
          return div;
        }
      }
	  if (divFound != 1) {
	  	div = document.getElementById('ft-div');
		return div;
	  }
    },
    _getFootElement: function() {
      var ft, divs = this.element.getElementsByTagName('div');
      for (var i = 0, len = divs.length; i < len; ++i) {
        var div = divs[i];
        if (hasClass(div, 'ft')) {
          return div;
        }
      }
    }
  };
  
  /**
   * Add BaseCalendarApp to EWPicks namespace
   */
  EWPicks.BaseCalendarApp = BaseCalendarApp;



  /**
   * BaseCalendarApp constants
   */
  BaseCalendarApp.URI_REG_EXP = /#\{calendarId\}/;
  BaseCalendarApp.URI_TEMPLATE = 'http://www.google.com/calendar/feeds/#{calendarId}/public/full';
  BaseCalendarApp.DEFAULT_LINK_TEXT = 'Read more';
  BaseCalendarApp.DEFAULT_MORE_LINK_TEXT = 'See Weekly %s Picks';
  BaseCalendarApp.WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
  BaseCalendarApp.WNWEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
  BaseCalendarApp.MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  BaseCalendarApp.MONTHS_ABBREVIATED = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  BaseCalendarApp.ONE_DAY_IN_MILLISECONDS = 86400000;
  BaseCalendarApp.SIX_DAYS_IN_MILLISECONDS = 518400000;
  BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS = 604800000;



  /** ==================================================================== **/



  /**
   * Description of method
   *
   * @method DailyCalendarApp
   * @param {String} elementId Parameter description
   * @param {Array|Object} calendars Parameter description
   * @param {Date} startDate (optional) Parameter description
   * @param {Boolean} displayNavigation Parameter description
   * @return {Object} Instance of DailyCalendarApp
   */
  var DailyCalendarApp = function(elementId, calendars /*, startDate, displayNavigation */) {
	
    /**
     * Configure dates
     */
    var startDate = (arguments.length > 2 && arguments[2]) ? new Date(arguments[2]) : new Date();
    this.setTimeToStartOfDay(startDate);

    var endDate = new Date(startDate);
    this.setTimeToEndOfDay(endDate);

    /**
     *
     */
    DailyCalendarApp.superclass.constructor.call(this, elementId, calendars, startDate, endDate);
    
    
    var displayNavigation = !!arguments[3];
    
    var hd = this.getHeadElement();
    if (displayNavigation) {
      // Add date to head element
      var ft = this.getFootElement();
	  
      var nav = document.createElement('div');
      nav.className = 'nav';
      nav.appendChild(this._renderDtElement(this.startDate, 'dtstart'));
      nav.appendChild(this._renderPreviousNextLinksElement());
      var nav2 = nav.cloneNode(true);
      hd.appendChild(nav);
      ft.appendChild(nav2);
    } else {
      hd.appendChild(this._renderDtElement(this.startDate, 'dtstart'));
    }
  };

  /**
   * Extend DailyCalendarApp from BaseCalendarApp and augment the 
   * DailyCalendarApp prototype
   */
  extend(DailyCalendarApp, BaseCalendarApp, {


    appName: 'EWPicks-DailyCalendarApp',



    /**
     * Callback method for the gdata onload event. Fetches calendar feed and
     * constructs the callback method for parsing feed and displaying entries.
     *
     * @method _init
     * @return {returnType} Return description
     */
    _init: function() {
      // DailyCalendarApp.superclass._init.call(this);
      for (var i = 0, len = this.calendars.length; i < len; i++) {

        var calendar = this.calendars[i];
		var calendar_name = calendar.el;
		var el = document.getElementById(calendar_name);
        var feed = calendar.feed;
		
		
		addClass(el, toCSSClassName(feed.name));
        /* TODO: throw error or continue if element is undefined */
        var handleSuccess = function(el, feed) {
          return function(result) {

            var h3 = this._renderHeaderElement(feed.name, feed.url);
            el.appendChild(h3);
            
            var moreLinkText = BaseCalendarApp.DEFAULT_MORE_LINK_TEXT.replace('%s', feed.name);
            var moreLinkUrl = feed.url;
            
            var events = this._parseCalendarEventFeed(result.feed, moreLinkText, moreLinkUrl);
            for (var i = 0, len = events.length; i <= len; ++i) {
              var event = events[i];
              if ( event !== null && typeof(event) === 'object' && event.date !== null && typeof(event.date) === 'object' ) {
				  if (event.date >= this.startDate && event.date <= this.endDate) {
	            	removeClass(el, 'loading');
	                el.appendChild(this._renderEventElement(event));
	              }
			  }
            }

          };
        }(el, feed);
        
        var handleFailure = function(el, feed) {
          return function() {
            removeClass(el, 'loading');
            // el.appendChild(this._renderErrorElement('Server error.'));
            el.style.display = 'none';
          };
        }(el, feed);

        //addClass(el, 'loading');

        this._fetchEvents(feed.id, {
          success: handleSuccess,
          failure: handleFailure
        }, this, this.startDate, this.endDate);
		
      }
    },



    /**
     * Description of method
     *
     * @method _renderEventElement
     * @param {Object} event Parameter description
     * @return {DOMElement} Return description
     */
    _renderEventElement: function(event) {
      var el = DailyCalendarApp.superclass._renderEventElement.call(this, event);
      if (event.moreLink) {
        el.appendChild(this._renderMoreLinkElement(event.moreLinkText, event.moreLink));
      }
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderPreviousLink
     * @return {DOMElement} Return description
     */
    _renderPreviousLink: function() {
      var date = new Date(this.startDate.getTime() - BaseCalendarApp.ONE_DAY_IN_MILLISECONDS);
	  var now = new Date();
	  var second_diff = this.startDate.getTime() - now.getTime();
      var el = document.createElement('a');
	  var periodOffsets = getPeriodOffset(this.startDate, 'day') - getPeriodOffset(now, 'day'); 
	  //alert( periodOffsets );
	  if ( periodOffsets >= 1 && periodOffsets <= 14 )
	  {
     	el.className = 'previous';
      	el.href = '?date=' + date.toDateString();
	  }
	  else
	  {
 	  	el.className = 'previous-disabled';
      	el.href = '#';
	  }
      el.appendChild(document.createTextNode('Previous Day'));
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderNextLink
     * @return {DOMElement} Return description
     */
    _renderNextLink: function() {
      var date = new Date(this.startDate.getTime() + BaseCalendarApp.ONE_DAY_IN_MILLISECONDS);
	  var now = new Date();
	  var second_diff = date.getTime() - now.getTime();
	  var two_weeks = BaseCalendarApp.ONE_DAY_IN_MILLISECONDS * 14;
      var el = document.createElement('a');
	  //alert('second diff: ' + second_diff + ' two weeks: ' + two_weeks);
	  var periodOffsets = getPeriodOffset(this.startDate, 'day') - getPeriodOffset(now, 'day'); 
	  //alert( periodOffsets );
	  if ( periodOffsets >= 0 && periodOffsets <= 13 )
	  {
      	el.className = 'next';
      	el.href = '?date=' + date.toDateString();
	  }
	  else
	  {
	  	el.className = 'next-disabled';
		el.href = '#';
	  }
      el.appendChild(document.createTextNode('Next Day'));
      return el;
    }
  });
  
  /**
   * Add DailyCalendarApp to EWPicks namespace
   */
  EWPicks.DailyCalendarApp = DailyCalendarApp;



  /** ==================================================================== **/



  /**
   * Description of method
   *
   * @method HomepageCalendarApp
   * @param {String} elementId Parameter description
   * @param {Array|Object} calendars Parameter description
   * @return {Object} Instance of HomepageCalendarApp
   */
  var HomepageCalendarApp = function(elementId, calendars) {
    var startDate = EWPicks.parseQueryString().date;
    HomepageCalendarApp.superclass.constructor.call(this, elementId, calendars, startDate);
  };

  /**
   * Extend HomepageCalendarApp from DailyCalendarApp and augment the
   * HomepageCalendarApp prototype
   */
  extend(HomepageCalendarApp, DailyCalendarApp, {

    appName: 'EWPicks-HomepageCalendarApp',



    /**
     * Description of method
     *
     * @method _renderEventElement
     * @param {Object} event Parameter description
     * @return {DOMElement} Return description
     */
    _renderEventElement: function(event) {
      var el = document.createElement('div');
      el.className = 'vevent';
      el.appendChild(this._renderHPSummaryElement(event.summary, EWPicks.DAILY_URL));
      if (event.moreLink) {
        el.appendChild(this._renderMoreLinkElement(event.moreLinkText, event.moreLink));
      }
      return el;
    }
    
  });
  
  /**
   * Add HomepageCalendarApp to EWPicks namespace
   */
  EWPicks.HomepageCalendarApp = HomepageCalendarApp;



  /** ==================================================================== **/



  /**
   * Description of method
   *
   * @method ChannelCalendarApp
   * @param {String} elementId Parameter description
   * @param {Array|Object} calendars Parameter description
   * @return {Object} Instance of ChannelCalendarApp
   */
  var ChannelCalendarApp = function(elementId, calendars) {
    var startDate = EWPicks.parseQueryString().date;
    ChannelCalendarApp.superclass.constructor.call(this, elementId, calendars, startDate);
  };

  /**
   * Extend ChannelCalendarApp from DailyCalendarApp and augment the 
   * ChannelCalendarApp prototype
   */
  extend(ChannelCalendarApp, DailyCalendarApp, {

    appName: 'EWPicks-ChannelCalendarApp'
    
  });
  
  /**
   * Add ChannelCalendarApp to EWPicks namespace
   */
  EWPicks.ChannelCalendarApp = ChannelCalendarApp;



  /** ==================================================================== **/



  /**
   * Description of method
   *
   * @method WeeklyCalendarApp
   * @param {String} elementId Parameter description
   * @param {Array|Object} calendars Parameter description
   * @param {Date} startDate Parameter description
   * @param {Boolean} displayNavigation Parameter description
   * @return {Object} Instance of WeeklyCalendarApp
   */
  var WeeklyCalendarApp = function(elementId, calendars /*, startDate, displayNavigation */) {

    /**
     * Configure dates
     */
    var date = (arguments.length > 2 && arguments[2]) ? new Date(arguments[2]) : new Date();
    var millisecondsSinceMonday = (date.getDay() - 1) * BaseCalendarApp.ONE_DAY_IN_MILLISECONDS;

    var startDate = new Date(date.getTime() - millisecondsSinceMonday);   
     /* 20090408. kwiechma. 
		Hack so that users manually entering a date will not be displayed incorrect week data
		for the last days of the week.
     */
	if ( date.getTime() < startDate.getTime() ) {
		startDate.setTime( startDate.getTime() - BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS);
	}
    /* 20090408. kwiechma */       
    this.setTimeToStartOfDay(startDate);

    var endDate = new Date(startDate.getTime() + BaseCalendarApp.SIX_DAYS_IN_MILLISECONDS);
    this.setTimeToEndOfDay(endDate);

    this.todayDateString = (new Date()).toDateString();
    
    /**
     *
     */
    WeeklyCalendarApp.superclass.constructor.call(this, elementId, calendars, startDate, endDate);
    
    var displayNavigation = !!arguments[3];
    
    if (displayNavigation) {
      // Add date to head element
      var hd = this.getHeadElement();
      var ft = this.getFootElement();
      
      var nav = document.createElement('div');
      nav.className = 'nav';
      nav.appendChild(this._renderWeekOfElement());
      nav.appendChild(this._renderPreviousNextLinksElement());
      var nav2 = nav.cloneNode(true);
      hd.appendChild(nav);
      ft.appendChild(nav2);
    }
    
  };

  /**
   * Extend WeeklyCalendarApp from BaseCalendarApp and augment the 
   * WeeklyCalendarApp prototype
   */
  extend(WeeklyCalendarApp, BaseCalendarApp, {


    appName: 'EWPicksWeeklyCalendarApp',



    /**
     * Callback method for the gdata onload event. Fetches calendar feed and
     * constructs the callback method for parsing feed and displaying entries.
     *
     * @method _init
     * @return {returnType} Return description
     */
    _init: function() {
      // WeeklyCalendarApp.superclass._init.call(this);

      // Add date to head element
      var hd = this.getHeadElement();
      var ft = this.getFootElement();      
      
      var handleFailure = function(error) {
        removeClass(el, 'loading');
        // el.appendChild(this._renderErrorElement('Server error.'));
        el.style.display = 'none';
      };

      for (var i = 0, len = this.calendars.length; i < len; ++i) {

        var calendar = this.calendars[i];
        var prefix   = calendar.prefix;
        var feed     = calendar.feed;

        var handleSuccess = function(prefix, feed) {
          return function(result) {
            var moreLinkText = BaseCalendarApp.DEFAULT_MORE_LINK_TEXT.replace('%s', feed.name);
            var moreLinkUrl = feed.url;

            var events = this._parseCalendarEventFeed(result.feed, moreLinkText, moreLinkUrl);

            for (var i = 0, len = events.length; i < len; ++i) {
              var event = events[i];
              var date = event.date;
			  if ( event !== null && typeof(event) === 'object' && event.date !== null && typeof(event.date) === 'object' ) {
	              if (date >= this.startDate && date <= this.endDate) {
	                var pos = (date.getDay() + 6) % 7; // Move Sunday to the end
					var el = document.getElementById(prefix + pos);
					if (el !== null) {
					  removeClass(el, 'loading'); 
	                  el.appendChild(this._renderEventElement(event));
	                }
				}
              }
            }
          };
        }(prefix, feed);
        
        this._fetchEvents(calendar.feed.id, {
          success: handleSuccess,
          failure: handleFailure
        }, this, this.startDate, this.endDate);

      }
    },



    /**
     * Description of method
     *
     * @method _renderEventElement
     * @param {Object} event Parameter description
     * @return {DOMElement} Return description
     */
    _renderEventElement: function(event) {
      var el = WeeklyCalendarApp.superclass._renderEventElement.call(this, event);

      if (event.date.toDateString() === this.todayDateString) {
        el.className += ' today';
      }

      return el;
    },



    /**
     * Description of method
     *
     * @method _renderPreviousLink
     * @return {DOMElement} Return description
     */
    _renderPreviousLink: function() {
      var date = new Date(this.startDate.getTime() - BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS);
      var el = document.createElement('a');
	  var now = new Date();
	  var second_diff = this.startDate.getTime() - now.getTime();
	  //alert( 'second_diff -> ' + second_diff + ', this.startDate.getTime() -> ' + this.startDate.getTime() + ', now.getTime() -> ' + now.getTime() );
	  var periodOffsets = getPeriodOffset(this.startDate, 'week') - getPeriodOffset(now, 'week'); 
	  //alert( periodOffsets );
	  if ( periodOffsets >= 1 && periodOffsets <= 1 )
	  {
      	el.className = 'previous';
      	el.href = '?date=' + date.toDateString();
	  }
	  else
	  {
      	el.className = 'previous-disabled';
      	el.href = '#';
	  }
      el.appendChild(document.createTextNode('Previous Week'));
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderNextLink
     * @return {DOMElement} Return description
     */
    _renderNextLink: function() {
      var date = new Date(this.startDate.getTime() + BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS);
	  var now = new Date();
	  var second_diff = date.getTime() - now.getTime();
      var el = document.createElement('a');
	  //alert( 'second_diff -> ' + second_diff + ', BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS -> ' + BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS );
	  var periodOffsets = getPeriodOffset(this.startDate, 'week') - getPeriodOffset(now, 'week'); 
	  //alert( periodOffsets );
	  if ( periodOffsets >= 0 && periodOffsets <= 0 )
	  {
      	el.className = 'next';
      	el.href = '?date=' + date.toDateString();
	  }
	  else
	  {
	  	el.className = 'next-disabled';
      	el.href = '#';
	  }
      el.appendChild(document.createTextNode('Next Week'));
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderWeekOfElement
     * @return {DOMElement} Return description
     */
    _renderWeekOfElement: function() {
      var el = document.createElement('div');
      el.className = 'dtrange vevent';
      el.appendChild(document.createTextNode('Week of '));
      el.appendChild(this._renderDtElement(this.startDate, 'dtstart'));
      el.appendChild(document.createTextNode(' - '));
      el.appendChild(this._renderDtElement(this.endDate,'dtend'));
      return el;
    }

  });

  /**
   * Add WeeklyCalendarApp to EWPicks namespace
   */
  EWPicks.WeeklyCalendarApp = WeeklyCalendarApp;

  /* This is scary stuff built by Ned so if it doesn't work we are in trouble. */
  
  var LookingAheadApp = function(elementId, calendars) {
  	var startDate = new Date();
  	for (var i = 0, len = calendars.length; i < len; ++i) {
        var calendar = calendars[i];
        var prefix   = calendar.prefix;
        var feed     = calendar.feed;
        var target   = calendar.target;
		}
		LookingAheadApp.superclass.constructor.call(this, elementId, calendars, startDate);
	};
  
  extend(LookingAheadApp, BaseCalendarApp, {

  appName: 'LookingAheadApp',
	_init: function() {
		//alert('init');
		
		var handleFailure = function(error) {
			//alert('failure');
			var loadingHolder = document.getElementById('looking-ahead-loading');
			loadingHolder.className = '';
		};
		for (var i = 0, len = this.calendars.length; i < len; i++) {
			var calendar = this.calendars[i];
			var feed = calendar.feed;
			//alert(feed.name + ' url:' + feed.url + ' id:' + feed.id);
			var handleSuccess = function(feed) {
				return function(result) {
				var el = document.getElementById('looking-ahead-results');
					var events = this._parseCalendarEventFeed(result.feed);
					//alert(events.length);
					if (events.length > 8) {
						len = 8;
					} else {
						len = events.length;
					}
					for (var i = 0; i < len; i++) {
						var event = events[i];
						var date = event.date; 
						if (el !== null) {
							el.appendChild(this._renderLAEventElement(event));
						}
						//alert(event.name);
					}
					var loadingHolder = document.getElementById('looking-ahead-loading');
					loadingHolder.className = '';
					var lookingResults = document.getElementById('looking-ahead-results');
					var last = lookingResults.lastChild;
					last.className = 'item last';
				};
			}(feed);
			var startDate = new Date();
			this._fetchEvents(feed.id, {
			success: handleSuccess,
			failure: handleFailure
			}, this, this.startDate);
			}
		
		}
	});
  EWPicks.LookingAheadApp = LookingAheadApp;
  
  /** ==================================================================== **/


  /** ==================================================================== **/



  /**
   * Description of method
   *
   * @method WhatsNew-WeeklyCalendarApp
   * @param {String} elementId Parameter description
   * @param {Array|Object} calendars Parameter description
   * @param {Date} startDate Parameter description
   * @param {Boolean} displayNavigation Parameter description
   * @return {Object} Instance of WeeklyCalendarApp
   */
  var WhatsNewWeeklyCalendarApp = function(elementId, calendars, startDate, displayNavigation ) {
	//alert('boo');
    /**
     * Configure dates
     */
    var date = (arguments.length > 2 && arguments[2]) ? new Date(arguments[2]) : new Date();
    //alert(date);
    var millisecondsSinceMonday = (date.getDay() - 1) * BaseCalendarApp.ONE_DAY_IN_MILLISECONDS;

    startDate = new Date(date.getTime() - millisecondsSinceMonday); 
     /* 20090408. kwiechma. 
		Hack so that users manually entering a date will not be displayed incorrect week data
		for the last days of the week.
     */
	if ( date.getTime() < startDate.getTime() ) {
		startDate.setTime( startDate.getTime() - BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS);
	}
    /* 20090408. kwiechma */         
    this.setTimeToStartOfDay(startDate);

    var endDate = new Date(startDate.getTime() + BaseCalendarApp.SIX_DAYS_IN_MILLISECONDS);
    this.setTimeToEndOfDay(endDate);

    this.todayDateString = (new Date()).toDateString();
    /**
     *
     */
    WhatsNewWeeklyCalendarApp.superclass.constructor.call(this, elementId, calendars, startDate, endDate);
    
    displayNavigation = !!arguments[3];
    
    if (displayNavigation) {
      // Add date to head element
      var hd = document.getElementById('hd-div');
      var ft = document.getElementById('ft-div');
      var children = hd.getElementsByTagName('div');
      // 20090417. kwiechma. 0 --> 1 Allows navigation on What's New
	  // alert(children.length);
      if (children.length === 1) {
      	var nav = document.createElement('div');
      	nav.className = 'nav';
      	nav.appendChild(this._renderWeekOfElement());
      	nav.appendChild(this._renderPreviousNextLinksElement());
      	var nav2 = nav.cloneNode(true);
      	hd.appendChild(nav);
      	ft.appendChild(nav2);
      }
    }
  };
  
  /**
   * Extend WeeklyCalendarApp from BaseCalendarApp and augment the 
   * WeeklyCalendarApp prototype
   */
  extend(WhatsNewWeeklyCalendarApp, BaseCalendarApp, {


    appName: 'WhatsNewWeeklyCalendarApp',



    /**
     * Callback method for the gdata onload event. Fetches calendar feed and
     * constructs the callback method for parsing feed and displaying entries.
     *
     * @method _init
     * @return {returnType} Return description
     */
    _init: function() {
      //WeeklyCalendarApp.superclass._init.call(this);

      // Add date to head element
      var hd = this.getHeadElement();
      var ft = this.getFootElement();      
      var handleFailure = function(error) {
        removeClass(el, 'loading');
        // el.appendChild(this._renderErrorElement('Server error.'));
        el.style.display = 'none';
      };
      
      for (var i = 0, len = this.calendars.length; i < len; ++i) {

        var calendar = this.calendars[i];
        var prefix   = calendar.prefix;
        var feed     = calendar.feed;
        var target   = calendar.target;
		
		var handleSuccess = function(prefix, feed) {
          return function(result) {

            var moreLinkText = BaseCalendarApp.DEFAULT_MORE_LINK_TEXT.replace('%s', feed.name);
            var moreLinkUrl = feed.url;
            
            var events = this._parseCalendarEventFeed(result.feed, moreLinkText, moreLinkUrl);
            
            var last_date = '';
            //alert(events.length);
            var el = document.getElementById(target);
            var children = el.getElementsByTagName('div');
                
                 if (children.length !== 0) {
                	for (var y = 0; y < children.length; y++) {
                		if (children[y].className == 'loading') {
                			//removeClass(children[y], 'loading');
                			el.removeChild(children[y]);
                		}
                	}
                }
            
            
            for (var i = 0, len = events.length; i < len; ++i) {
              var event = events[i];
              var date = event.date;
              if (date >= this.startDate && date <= this.endDate) {
                var pos = (date.getDay() + 6) % 7; // Move Sunday to the end

                if (date + '' != last_date + '') {
                	//alert('good');
                	//alert('date ' + date + ' last_date: ' + last_date);
                	//Need to render a new day.
                	//var close_day = TRUE;
                	var subEl = document.createElement('div');
      				subEl.className = 'dayHolder';
      				//alert(pos);
      				if (pos == len) {
      					subEl.className = 'dayHolder lastDay';
      				}
      				subEl.appendChild(this._renderWNDtElement(event.date, 'dtstart'));
      				//var is_last = FALSE;
      				//alert('sigh');
      				if (el !== null) {
                		el.appendChild(subEl);
                  		subEl.appendChild(this._renderWNEventElement(event));
                	}

                } else {
                	//alert('no good');
                	//var kiddo = document.createElement('div');
                	//kiddo.className = 'item';
                	//subEl.appendChild(kiddo);
                	//alert(event);
                	subEl.appendChild(this._renderWNEventElement2(event));
                }
              	last_date = date;
              }
            }
			var last_child = el.lastChild;
			last_child.className = 'dayHolder lastDay';
          };
        }(prefix, feed);
        
        this._fetchEvents(calendar.feed.id, {
          success: handleSuccess,
          failure: handleFailure
        }, this, this.startDate, this.endDate);

      }
    },



    /**
     * Description of method
     *
     * @method _renderEventElement
     * @param {Object} event Parameter description
     * @return {DOMElement} Return description
     */
    _renderWNEventElement: function(event) {
    
      var el = WeeklyCalendarApp.superclass._renderWNEventElement.call(this, event);

      if (event.date.toDateString() === this.todayDateString) {
        //el.className += ' today';
      }

      return el;
    },
	_renderWNEventElement2: function(event) {
      var el = WeeklyCalendarApp.superclass._renderWNEventElement2.call(this, event);
      return el;
    },


    /**
     * Description of method
     *
     * @method _renderPreviousLink
     * @return {DOMElement} Return description
     */
    _renderPreviousLink: function() {
      var date = new Date(this.startDate.getTime() - BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS);
	  var now = new Date();
	  var second_diff = this.startDate.getTime() - now.getTime();
	  var el = document.createElement('a');
	  //alert( 'second_diff -> ' + second_diff + ', this.startDate.getTime() -> ' + this.startDate.getTime() + ', now.getTime() -> ' + now.getTime() );
	  var periodOffsets = getPeriodOffset(this.startDate, 'week') - getPeriodOffset(now, 'week'); 
	  //alert( periodOffsets );
	  if ( periodOffsets >= 1 && periodOffsets <= 2 )
	  {
     	el.className = 'previous';
      	el.href = '?date=' + date.toDateString();
	  }
	  else
	  {
 	  	el.className = 'previous-disabled';
      	el.href = '#';
	  }
      el.appendChild(document.createTextNode('Previous Week'));
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderNextLink
     * @return {DOMElement} Return description
     */
    _renderNextLink: function() {
      var date = new Date(this.startDate.getTime() + BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS);
      var now = new Date();
	  var second_diff = date.getTime() - now.getTime();
      var el = document.createElement('a');
	  //alert( 'second_diff -> ' + second_diff + ', BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS -> ' + BaseCalendarApp.ONE_WEEK_IN_MILLISECONDS );
	  var periodOffsets = getPeriodOffset(this.startDate, 'week') - getPeriodOffset(now, 'week'); 
	  //alert( periodOffsets );
	  if ( periodOffsets >= 0 && periodOffsets <= 1 )
	  {
      	el.className = 'next';
      	el.href = '?date=' + date.toDateString();
	  }
	  else
	  {
	  	el.className = 'next-disabled';
      	el.href = '#';
	  }
      el.appendChild(document.createTextNode('Next Week'));
      return el;
    },



    /**
     * Description of method
     *
     * @method _renderWeekOfElement
     * @return {DOMElement} Return description
     */
    _renderWeekOfElement: function() {
      var el = document.createElement('div');
      el.className = 'dtrange vevent';
      el.appendChild(document.createTextNode('Week of '));
      el.appendChild(this._renderDtElement(this.startDate, 'dtstart'));
      el.appendChild(document.createTextNode(' - '));
      el.appendChild(this._renderDtElement(this.endDate,'dtend'));
      return el;
    }

  });

  /**
   * Add WeeklyCalendarApp to EWPicks namespace
   */
  EWPicks.WhatsNewWeeklyCalendarApp = WhatsNewWeeklyCalendarApp;



  /** ==================================================================== **/


  /**
   * Description of method
   *
   * @method GoogleCalendarEventFeedConfig
   * @param {String} id Parameter description
   * @param {String} name Parameter description
   * @param {String} url Parameter description
   * @return {Object} Instance of GoogleCalendarEventFeedConfig
   */
  var GoogleCalendarEventFeedConfig = function(id, name, url) {
    this.id   = id;
    this.name = name;
    this.url  = url;
  };
  
  /**
   * Add GoogleCalendarEventFeedConfig to EWPicks namespace
   */
  EWPicks.GoogleCalendarEventFeedConfig = GoogleCalendarEventFeedConfig;



  /** ==================================================================== **/



})();

  EWPicks.DAILY_URL = '/ew/picks/0,,,00.html';




// alert( 'Picks JS PROD config loading...' );

var GoogleCalendarEventFeedConfig = EWPicks.GoogleCalendarEventFeedConfig;

/*
 * EW Picks feed configurations
 */
EWPicks.MoviesCalendarFeed 			= new GoogleCalendarEventFeedConfig(
										'dk7ni186hjl08opf9pv5673o78@group.calendar.google.com', 
										'Movies', 
										'/ew/picks/movies/0,,,00.html'
									);
EWPicks.TVCalendarFeed     			= new GoogleCalendarEventFeedConfig(
										'g25q1f38jj5au1ie7i72jqkqjk@group.calendar.google.com', 
										'TV', 
										'/ew/picks/tv/0,,,00.html'
									);
EWPicks.MusicCalendarFeed  			= new GoogleCalendarEventFeedConfig(
										'399e1ajetvqfocpqta796fn3as@group.calendar.google.com', 
										'Music', 
										'/ew/picks/music/0,,,00.html'
									);
EWPicks.BooksCalendarFeed  			= new GoogleCalendarEventFeedConfig(
										'vq165ao5ta8vbvpeh22ta0ql5s@group.calendar.google.com', 
										'Books', 
										'/ew/picks/books/0,,,00.html'
									);
EWPicks.TechCalendarFeed   			= new GoogleCalendarEventFeedConfig(
										'3l3l739du9ceins3ip56osun8g@group.calendar.google.com', 
										'Tech', 
										'/ew/picks/tech/0,,,00.html'
									);

/*
 * EW What's New feed configurations 
 */
EWPicks.WhatsNewBooks 				= new GoogleCalendarEventFeedConfig(
										'l038ltlou57a72l43lmddpqn94@group.calendar.google.com',
										"What's New: Books",
										'/ew/picks/also-this-week/0,,,00.html#books'
									);
EWPicks.WhatsNewTech 				= new GoogleCalendarEventFeedConfig(
										'6mcof1kef01p6jp0mr37i8fth8@group.calendar.google.com',
										"What's New: Tech",
										'/ew/picks/also-this-week/0,,,00.html#tech'
									);
EWPicks.WhatsNewMovies 				= new GoogleCalendarEventFeedConfig(
										'm1hrjnvm0i7d95ehipi0046h30@group.calendar.google.com',
										"What's New: Movies",
										'/ew/picks/also-this-week/0,,,00.html#movies'
									);
EWPicks.WhatsNewMusic 				= new GoogleCalendarEventFeedConfig(
										'dq4emhgsg7e59r4h7h4023vm4g@group.calendar.google.com',
										"What's New: Music",
										'/ew/picks/also-this-week/0,,,00.html#music'
									);
EWPicks.WhatsNewTV 					= new GoogleCalendarEventFeedConfig(
										'riaob2rvob17flselb8r2jt5rk@group.calendar.google.com',
										"What's New: TV",
										'/ew/picks/also-this-week/0,,,00.html#tv'
									);
EWPicks.WhatsNewDVD 				= new GoogleCalendarEventFeedConfig(
										'162fqmpr8num14mof0rir75bks@group.calendar.google.com',
										"What's New: DVD",
										'/ew/picks/also-this-week/0,,,00.html#dvd'
									);

/*
 * Looking Ahead configuration
 */
EWPicks.LookingAhead 				= new GoogleCalendarEventFeedConfig(
										'74n5gsne9fbjfo5coh9tr2gnok@group.calendar.google.com',
										"What's New: Looking Ahead",
										''
									);


