var ProgramGuide = function() {
	
	var $U = CBC.UTIL;
	var $ = $U.getElementsById;
	var _config = new Object();
	var _query = new Object();
	var _currentDate = new Date();
	var _calendar;
	var _cookieExpiryDays = 365;
	
	
	
	return {
		init: function(initObj) {
			_config = initObj;
			_query = this.queryStringToObj();

			switch (_config.mode) {
				case 'schedule':
					this.initSchedule();
					break;
				case 'index':
					this.initIndex();
					break;
				case 'detail':
					this.initDetail();
					break;
			}
			switch (_config.view) {
				case 'weekly':
					this.initWeekly();
					break;
			}
		},


		/* NAVIGATION & STATE CHANGE */
		
		loadView: function(mode, view, reload) {
			var params = new Array();
			switch (mode) {
				case "schedule":				
					if (_query.startDate == undefined) _query.startDate = this.dateToStr(_currentDate);
					if (_query.startDate != undefined && _query.startDate != "") params[0] = _query.startDate;
					if (_query.networkKey != undefined && _query.networkKey != "") params[1] = _query.networkKey;
					if (_query.genreKey != undefined && _query.genreKey != "") params[2] = _query.genreKey;
					break;
				case "index":
					if (_query.alphabet != undefined && _query.alphabet != "") params[0] = _query.alphabet;
					if (_query.networkKey != undefined && _query.networkKey != "") params[1] = _query.networkKey;
					if (_query.genreKey != undefined && _query.genreKey != "") params[2] = _query.genreKey;
					break;
				case "detail":
					params[0] = _query.key;
					break;
			}
			window.location = _config.pgpath + "/" + view + "/" + this.paramsToPath(params);
			return false;
		},
		
		reloadPage: function() {
			this.loadView(_config.mode, _config.view, true);
		},
		
		paramsToPath: function(params) {
			var path = "";
			for (var i=0; i<params.length; i++) {
				if (params[i] != undefined && params[i] != "") {
					path+= params[i] + "/";
				} else {
					path+= "_/";
				}
			}
			return path;
		},


		/* SCHEDULE PAGES */
		
		initSchedule: function() {
			if (_query.startDate != null) {
				var epoch = Date.parse(_query.startDate);
			} else if ($('sched-date')) {
				var epoch = $('sched-date').className.replace(/dt/g, "");
			}
			if (epoch) {
				_currentDate.setTime(epoch);
				this.updateDaypartNav();
			}
			this.initCalendar();
			this.initGenre();
			this.initNetwork();
			this.initLocation();
			this.initDayPartLinkTracking();

		},
		
		
		initWeekly: function() {
			var tableHeads = $('sched-table').getElementsByTagName('th');
			for (var i=0; i<tableHeads.length; i++) {
				YAHOO.util.Event.on(tableHeads[i], 'click', this.getWeekDay, {index:i}, this);
			}
		},
		
		getWeekDay: function(e, obj) {
			_config.view = 'daily';
			this.changeDay(obj.index);
		},
		
		changeDay: function(offset) {
			_currentDate.setDate(_currentDate.getDate()+offset);
			_query.startDate = this.dateToStr(_currentDate);
			this.reloadPage();
			return false;
		},
				
		changeDaypart: function(targ) {
			$('sched-table').className = targ.className;
			$('nav-dayparts').className = targ.className;
			$('nav-dayparts-bot').className = targ.className;
			return false;
		},
		
		updateDaypartNav: function() {
			$('nav-dayparts').className = _query.startDate != undefined ?  "all" : $('sched-table').className;
			$('nav-dayparts-bot').className = $('nav-dayparts').className;
		},

		
		/* CALENDAR */
		
		initCalendar: function() {
			var historicalDays = $('HistoricalDays').value;
			var futureDays = $('FutureDays').value;
			var today = new Date();
			var minDate = new Date();
			var maxDate = new Date();
			today.setTime(Date.parse(_config.serverdate));
			minDate.setDate(today.getDate() - parseInt(historicalDays));
			maxDate.setDate(today.getDate() + parseInt(futureDays)); 
			var selectedMonthYear = (_currentDate.getMonth()+1) + "/" + _currentDate.getFullYear();
			var selectedDate = (_currentDate.getMonth()+1) + "/" + _currentDate.getDate() + "/" + _currentDate.getFullYear();
			if (_config.view == "weekly") {
				var endDate = new Date(_currentDate);
				endDate.setDate(endDate.getDate()+6);
				selectedDate += "-" + (endDate.getMonth()+1) + "/" + endDate.getDate() + "/" + endDate.getFullYear();
			}
			var initObj = {pagedate:selectedMonthYear,selected:selectedDate};
			if (_config.minDate) initObj.mindate = _config.minDate;
			if (_config.maxDate) initObj.maxdate = _config.maxDate;
			_calendar = new YAHOO.widget.Calendar("cal1","calendar", initObj);
			_calendar.cfg.setProperty("LOCALE_WEEKDAYS", "medium");
			_calendar.cfg.setProperty("mindate", minDate, false);
			_calendar.cfg.setProperty("maxdate", maxDate, false);
			_calendar.selectEvent.subscribe(this.calSelectDay, this, true);
			_calendar.render();
		},
		
		calSelectDay: function(type,args,obj) {
			var selDateArr = args[0][0];
			var selDate = new Date();
			var y = selDateArr[0];
			var m = selDateArr[1]-1;
			var d = selDateArr[2];
			selDate.setFullYear(y,m,d);
			_query.startDate = this.dateToStr(selDate);
			this.reloadPage();
		},
		

		/* INDEX PAGES */
		
		initIndex: function() {
			YAHOO.util.Event.on('index-nav', 'click', this.changeAlphabet, null, this);
			if (_query.alphabet == undefined) {
				var navElem = $('index-nav').getElementsByTagName('a')[0];
			} else {
				var navElem = YAHOO.util.Dom.getElementsByClassName(_query.alphabet, 'a', 'index-nav')[0];
			}
			YAHOO.util.Dom.addClass(navElem, 'active');
			
			this.initNetwork();
			
			// Init for Program Index
			if (_config.view == "programs") {
				this.initGenre();
			}
		},
		
		changeAlphabet: function(e) {
			var targ = YAHOO.util.Event.getTarget(e);
			while (targ.id != "index-nav") {
				if(targ.nodeName.toUpperCase() == "A") {
					if (targ.className.indexOf('active') == -1) {
						_query.alphabet = targ.className;
						this.reloadPage();
					}
					break;
				} else {
					targ = targ.parentNode;
				}
			}
		},


		/* DETAIL PAGES */
		
		initDetail: function() {
			this.initLocation();
		},


		/* LOCATION SWITCHING */
		
		initLocation: function() {
			var mediaType;
						
			if (_config.mode == "schedule") {
				var opts = $('selectnetwork').getElementsByTagName('option');
				for (var i=0; i<opts.length; i++) {
					if (opts[i].value == _query.networkKey) mediaType = opts[i].className;
				}
				if (mediaType == undefined) mediaType = opts[0].className;
			} else if (_config.mode == "detail" && _config.view == "program" && $('sched')) {
				var network = $('sched').getElementsByTagName('h3')[0]; // assume location is for first network in schedule
				mediaType = network.className.split(" ")[0];
			} else {
				mediaType = 'both'; // default
			}
			
			switch (mediaType) {
				case 'television':
					YAHOO.util.Dom.setStyle($('selectlocation-tv').parentNode, 'display', 'block');
					break;
				case 'radio':
					YAHOO.util.Dom.setStyle($('selectlocation-radio').parentNode, 'display', 'block');
					break;
				case 'both':
					YAHOO.util.Dom.setStyle($('selectlocation-tv').parentNode, 'display', 'block');
					YAHOO.util.Dom.setStyle($('selectlocation-radio').parentNode, 'display', 'block');
					break;

			}			
		},
		
		changeLocation: function(targ) {
			var selectedValue = targ.options[targ.selectedIndex].value;
			switch (targ.id) {
				case 'selectlocation-tv':
					var cookieName = 'pgTvLocation';
					break;
				case 'selectlocation-radio':
					var cookieName = 'pgRadioLocation';
					break;
			}
			$U.createCookie(cookieName,selectedValue,_cookieExpiryDays);
			this.reloadPage();
		},
						
		
		/* NETWORK SWITCHING */
		
		initNetwork: function() {
			if ($('selectnetwork')) {
				var opts = $('selectnetwork').getElementsByTagName('option');
				// if a network is specified in query object, make it selected in the dropdown
				if (_query.networkKey != undefined && _query.networkKey != '') {
					for (var i=0; i<opts.length; i++) {
						opts[i].selected = (_query.networkKey == opts[i].value) ? true : false;
					}
				}
			}
		},
		
		changeNetwork: function(targ) {
			var selectedValue = targ.options[targ.selectedIndex].value;
			$U.createCookie('pgNetwork',selectedValue,_cookieExpiryDays);
			_query.networkKey = selectedValue;
			this.reloadPage();
		},
				
		
		/* GENRE SWITCHING */
		
		initGenre: function() {
			if ($('selectgenre')) {
				if (_query.genreKey != undefined && _query.genreKey != '') {
					var opts = $('selectgenre').getElementsByTagName('option');
					for (var i=0; i<opts.length; i++) {
						opts[i].selected = (_query.genreKey == opts[i].value) ? true : false;
					}
				}
			}
		},
		
		changeGenre: function(targ) {
			var selectedValue = targ.options[targ.selectedIndex].value;
			_query.genreKey = selectedValue;
			this.reloadPage();
		},


		/* UTILITIES */
		
		queryStringToObj: function() {
			var pairs = _config.queryString.split(/[;&]/);
			var obj = new Object();
			for (var i=0; i<pairs.length; i++) {
				var pair = pairs[i].split('=');
				var key = unescape(pair[0]);
				var val = unescape(pair[1]).replace(/\+/g, ' ');
				if (key.length > 0 && val.length > 0) {
					obj[key] = val;
				}
			}
			return obj;
		},
		
		objToQueryString: function(obj) {
			var qs = "";
			var i = 0;
			for (var key in obj) {
				if (i>0) qs+="&";
				qs+= (key+"="+obj[key]);
				i++;
			}
			return qs;
		},
		
		dateToStr: function(dateObj) {
			var y = dateObj.getFullYear();
			var m = "0"+(dateObj.getMonth()+1);
			var d = "0"+dateObj.getDate();
			m = m.substr(m.length-2,2);
			d = d.substr(d.length-2,2);
			return y+"/"+m+"/"+d;
		},
		
		showProgramLink: function(){
			
			if ($('programlink')) {
			
				var programLink = $('programlink').innerHTML;
				if (programLink.match(".js") || programLink.match(".asx") || programLink.match("/akamai") || programLink.match("/reflector:")){
				}else{
					$('programlink').style.display="block";
				}
			}
		},

		
		
		/* TRACKING */
		
		convertNetworkKey: function(key) {
		
			switch(key) {
				case 'cbc_television':
					return 'cbc-tv';
					break;
				case 'cbc_news_network':
					return 'cbcnn';
					break;
				case 'cbc_radio_one':
					return 'radio1';
					break;
				case 'cbc_radio_2':
					return 'radio2';
					break;
				case 'documentary':
					return 'documentary';
					break;
				case 'bold':
					return 'bold';
					break;
				default:
					return 'unknown';
					break;
			}
			
		},
		
		convertDayPart: function(dayPart) {
			
			switch(dayPart) {

				case 'em':
					return 'earlymorning';
					break;	
				case 'mo':
					return 'morning';
					break;
				case 'af':
					return 'afternoon';
					break;
				case 'ev':
					return 'evening';
					break;
				case 'all':
					return 'fullday';
					break;
				default:
					return 'unknown';
					break;
			
			}
	
		},
		
		
		initDayPartLinkTracking: function() {
			
			//console.log('initializing dplt');
			var linkList = $('nav-dayparts');
			YAHOO.util.Event.addListener(linkList, "click", function(e,obj) { 
				
				//console.log(e);
				//console.log(_config.view);
				
				//convert the network key into site catalyst format
				var networkKey = _query.networkKey;
				networkKey = obj.convertNetworkKey(networkKey);
				
								
				//get the daypart link and normalize it
				var dayPart = e.originalTarget.innerHTML;
				dayPart = dayPart.toLowerCase();
				dayPart = dayPart.replace(/[^a-zA-Z0-9]+/g,'');
				
				//determine daily or weekly schedule
				var page = _config.view;
				
				var queryString = "contentarea=programguide&amp;contenttype=page&amp;subsection1=schedule&amp;subsection2=" + networkKey + "&amp;subsection3=" + page + "&amp;subsection4=" + dayPart;
							
				CBC.APP.SC.QueryString = queryString;
				CBC.APP.SC.PageTracker.init();
									
			},this);
			
		},		
		
		
		
		getTrackingQueryString: function(page) {
			
			var queryString = "contentarea=programguide&amp;contenttype=page&amp;filename=false&amp;subsection1=schedule";			
			
			var networkKey = _query.networkKey;
			networkKey = this.convertNetworkKey(networkKey);
			
			var dayPart = $('sched-table').className 
			dayPart = this.convertDayPart(dayPart);
					
			queryString += '&amp;subsection2=' + networkKey + '&amp;subsection3=' + page + '&amp;subsection4=' + dayPart;
						
			return queryString;
			
		}			
	

	}
}

