
var epgrLib = (function ()
{
	// Private members
	
	var timer;
	var seasonsLoading = false;
	var scrollSpeed = 3;
	var currentShowName = null;
	var cookieId = 'epgr_id';
   
	var processKey = function (event)
	{
		currentShowName = document.getElementById('show_input').value;
		var key = event.keyCode ? event.keyCode : event.which;
		var shows = document.getElementById('shows');
		if (key == 27) // Echap
		{
			setTimeout("document.getElementById('show_input').value = ''", 10);
			clearShows();
		}
		else if (shows.childNodes.length > 0)
		{
			if (key == 40) // Down arrow
			{
				shows.childNodes[0].focus();
				setTimeout("document.getElementById('shows').childNodes[0].selectedIndex = 0", 1);
			}
			else if (key == 38) // Up arrow
			{
				shows.childNodes[0].focus();
				setTimeout("document.getElementById('shows').childNodes[0].selectedIndex = document.getElementById('shows').childNodes[0].childNodes.length-1", 1);
			}
			else if (key == 9) // Tab
			{
				shows.childNodes[0].selectedIndex = 0;		
			}
			else if (key == 13) // Enter
			{
				if (document.getElementById('shows').childNodes[0].childNodes.length == 1)
				{
					document.getElementById('shows').childNodes[0].selectedIndex = 0;
					selectShow(document.getElementById('shows').childNodes[0], event);		
				}
			}
		}
	}
	
	var clearShows = function ()
	{
		timer = setTimeout("document.getElementById('shows').innerHTML = ''", 100);
	}
	
	var cancelTimeout = function ()
	{
		clearTimeout(timer);
	}
	
	var loadShows = function (inputField)
	{
		if (seasonsLoading) return;
		toyoAjaxLib.loadDoc('ajax/getShows.php5', 'get', 'pattern='+escape(inputField.value), processShows);
	}
	
	var processShows = function (xmlRoot)
	{
		if (document.getElementById('shows').firstChild) document.getElementById('shows').removeChild(document.getElementById('shows').firstChild);
		if (xmlRoot.childNodes.length > 0)
		{
			var newSelect = document.createElement("select");
		  	
		  	for (var i = 0; i < xmlRoot.childNodes.length; i++)
		  	{
				var child = xmlRoot.childNodes[i];
				var newOpt = document.createElement("option");
				newOpt.setAttribute('value', child.getAttribute('url'));
				newOpt.innerHTML = child.getAttribute('name');
				newSelect.appendChild(newOpt);
			}
			
			var nb = xmlRoot.childNodes.length;
			if (nb == 1) nb++;
			if (nb > 10) nb = 10;	
		
			addListener(newSelect, 'click', function(event){ selectShow(newSelect, event); });
			addListener(newSelect, 'keyup', function(event){ selectShow(newSelect, event); });
			addListener(newSelect, 'blur', clearShows);
			addListener(newSelect, 'focus', cancelTimeout);
				
			if (newSelect.addEventListener)
			{
			   newSelect.setAttribute('size', nb);
			   newSelect.selectedIndex = -1;
			   document.getElementById('shows').appendChild(newSelect);
			}
			else
			{
				document.getElementById('shows').appendChild(newSelect);
				document.getElementById('shows').childNodes[0].selectedIndex = -1;
				setTimeout("document.getElementById('shows').childNodes[0].setAttribute('size', " + nb + ")", 1);
			}
		}
	}
	
	var selectShow = function (selectInput, event)
	{
		var key = event.keyCode ? event.keyCode : event.which;
		var waitImg;
		if (key == 27) // Echap
		{
			setTimeout("document.getElementById('show_input').value = ''", 100);
			clearShows();
		}
		else if (key == 13 || key == 1 || key == null) // Enter, left click or default
		{
			var showInput = document.getElementById('show_input');
			showInput.readOnly = true;
			showInput.value = selectInput.childNodes[selectInput.selectedIndex].text;
			document.getElementById('wait').style.visibility = 'visible';
			seasonsLoading = true;
			toyoAjaxLib.loadDoc('ajax/getShowSeasons.php5', 'get', 'url='+selectInput.value, processSeasons);
			document.getElementById('shows').innerHTML = '';
		}
	}
	
	var processSeasons = function (xmlRoot)
	{
		document.getElementById('content').innerHTML = '';
		
		if (xmlRoot.childNodes.length == 0 && xmlRoot.getAttribute('showName') == null)
		{
			var newSpan = document.createElement('span');
			newSpan.setAttribute('id', 'nodata');
			newSpan.appendChild(document.createTextNode('Sorry, no data available for this show !'));
			document.getElementById('content').appendChild(newSpan);
		}
		else
		{
			// Show ID card
			var showUrl = xmlRoot.getAttribute('epguidesUrl').substring('http://epguides.com'.length);
			var showName = xmlRoot.getAttribute('showName');
			var isFavoriteShow = xmlRoot.getAttribute('favoriteShow') == 'true';
			
			var summaryTable = document.createElement('table');
			summaryTable.setAttribute('id', 'summary');
			var summuryBody = document.createElement('tbody');
			summaryTable.appendChild(summuryBody);
			
			var newTr = document.createElement('tr');
			
			var newTd = document.createElement('td');
			newTd.setAttribute('rowSpan', '2');
			var newImg = document.createElement('img');
			newImg.setAttribute('id', 'show_fav');
			newImg.src = isFavoriteShow ? 'img/fav_on.png' : 'img/fav_off.png';
			newImg.alt = newImg.title = isFavoriteShow ? 'Remove from my favorite shows' : 'Add to my favorite shows';
			addListener(newImg, 'click', function(event)
			{
				var date = new Date;
				date.setMonth(date.getMonth() + 120);
				var id = readCookie(cookieId);
				if (id == null)
				{
					id = generateId();
					writeCookie(cookieId, id, date);
					var liTags = document.getElementById('toolbox').getElementsByTagName('li')
					liTags[3].firstChild.firstChild.style.display = 'inline';
					addRssListener(liTags[3], id);
				}

				var toggleImg = event.target ? event.target : event.srcElement;
				toggleImg.src = isFavoriteShow ? 'img/fav_off.png' : 'img/fav_on.png';
				toggleImg.alt = toggleImg.title = isFavoriteShow ? 'Add to my favorite shows' : 'Remove from my favorite shows';
				var parameters = 'url=' + showUrl + '&name=' + encodeURIComponent(showName);
				toyoAjaxLib.loadDoc('ajax/updateFavoriteShows.php5', 'get', parameters, null);
				isFavoriteShow = !isFavoriteShow;
			}
			);
			newTd.appendChild(newImg);
			newTr.appendChild(newTd);
			
			newTd = document.createElement('td');
			newTd.setAttribute('rowSpan', '2');
			var newSpan = document.createElement('span');
			newSpan.setAttribute('id', 'show_name');
			newSpan.innerHTML = showName;
			newTd.appendChild(newSpan);
			newTr.appendChild(newTd);
			
			newTd = document.createElement('td');
			newA = document.createElement('a');
			newA.setAttribute('id', 'link_epguides');
			newA.setAttribute('title', 'Show on Epguides');
			newA.setAttribute('target', '_blank');
			newA.setAttribute('href', xmlRoot.getAttribute('epguidesUrl'));
			newImg = document.createElement('img');
			newImg.setAttribute('src', 'img/epg.png');
			newImg.setAttribute('alt', 'Show on Epguides');
			newImg.setAttribute('title', 'Show on Epguides');
			newA.appendChild(newImg);
			newTd.appendChild(newA);
			newTr.appendChild(newTd);
			
			summuryBody.appendChild(newTr);
			newTr = document.createElement('tr');
			
			newTd = document.createElement('td');
			var newA = document.createElement('a');
			newA.setAttribute('id', 'link_imdb');
			newA.setAttribute('title', 'Show on IMDB');
			newA.setAttribute('target', '_blank');
			newA.setAttribute('href', xmlRoot.getAttribute('imdbUrl'));
			newImg = document.createElement('img');
			newImg.setAttribute('src', 'img/imdb.png');
			newImg.setAttribute('alt', 'Show on IMDB');
			newImg.setAttribute('title', 'Show on IMDB');
			newA.appendChild(newImg);
			newTd.appendChild(newA);
			newTr.appendChild(newTd);
			
			summuryBody.appendChild(newTr);
			document.getElementById('content').appendChild(summaryTable);
			
			var seasons = document.createElement('div');
			seasons.setAttribute('id', 'seasons');
			
			for (var i = xmlRoot.childNodes.length; i > 0 ; i--)
		  	{
				var season = xmlRoot.childNodes[i-1];
				if (season.childNodes.length == 0) continue;
				
				var newImg = document.createElement('img');
				if (i == xmlRoot.childNodes.length)
				{
					newImg.alt = newImg.title = 'Collapse...';
					newImg.src = 'img/moins.gif';
				}
				else
				{
					newImg.alt = newImg.title = 'Expand...';
					newImg.src = 'img/plus.gif';
				}
	
				var newSpan = document.createElement('span');
				newSpan.setAttribute('class', 'stitle');
				newSpan.setAttribute('className', 'stitle');
				newSpan.appendChild(newImg);
				newSpan.innerHTML += '&nbsp;' + season.getAttribute('name');
				addListener(newSpan.firstChild, 'click', function(event){ hideMe(event); });
	
				var newPre = document.createElement('pre');
				newPre.setAttribute('id', 's'+i);
				newPre.setAttribute('class', 'scontent');
				newPre.setAttribute('className', 'scontent');
				
				var seasonText = '';
				for (var j = 0; j < season.childNodes.length; j++)
			  	{
					var episode = season.childNodes[j];
					var content;
					switch (episode.getAttribute('today'))
					{
						case '0' :
							content = '<div class="today">' + episode.firstChild.nodeValue + '</div>';
							break;
						case '1' :
							content = '<div class="tomorrow">' + episode.firstChild.nodeValue + '</div>';
							break;
						default :
							content = episode.firstChild.nodeValue  + '<br />';
					}
					seasonText += replaceSpaces(content);
				}
				newPre.innerHTML = seasonText;
				
				seasons.appendChild(newSpan);
				seasons.appendChild(document.createTextNode('\n'));
				seasons.appendChild(newPre);
			}
			
			document.getElementById('content').appendChild(seasons);
				
			for (var i = 1; i < xmlRoot.childNodes.length; i++)
			{
				if (document.getElementById('s'+i) == null) continue;
				document.getElementById('s'+i).style.display = 'none';
				document.getElementById('s'+i).previousSibling.previousSibling.style.display = 'block'
			}
		}
		
		var showInput = document.getElementById('show_input');
		document.getElementById('wait').style.visibility = 'hidden';
		showInput.readOnly = false;
		showInput.value = '';
		seasonsLoading = false;
	}
	
	var replaceSpaces = function (inputString)
	{
		var tmp = '';
		var skipChar = false;
		for(var i = 0; i < inputString.length; i++)
		{
			if (inputString.charAt(i) == '<') skipChar = true;
			if (inputString.charAt(i) == '>') skipChar = false;
			tmp += !skipChar && inputString.charAt(i) == ' ' ? '&nbsp;' : inputString.charAt(i);
		}
		return tmp;
	}
	
	var hideMe = function (event)
	{
		var toggleImg = event.target ? event.target : event.srcElement;
		var season = toggleImg.parentNode.nextSibling.nextSibling;
		if (season.style.display == 'none')
		{
			season.style.display = 'block';
			toggleImg.alt = toggleImg.title = 'Collapse...';
			toggleImg.src = 'img/moins.gif';
			toggleImg.parentNode.style.display = 'inline';
		}
		else
		{
			season.style.display = 'none';
			toggleImg.alt = toggleImg.title = 'Expand...';
			toggleImg.src = 'img/plus.gif';
			toggleImg.parentNode.style.display = 'block';
		}
	}
	
	var loadLastSearches = function ()
	{
		toyoAjaxLib.loadDoc('ajax/getLastSearches.php5', 'get', null, processLastSearches);
	}
		
	var processLastSearches = function (xmlRoot)
	{
		var content = '<ul class="last_searches">';
		for (var i = 0; i < xmlRoot.childNodes.length; i++)
	  	{
			var child = xmlRoot.childNodes[i];
			content += '<li>' + child.getAttribute('date') + '&nbsp;:&nbsp;<a href="#" onclick="return epgrLib.selectShowFromPopup(\''+ child.getAttribute('url') + '\')" title="' + child.getAttribute('name') + '">' + child.getAttribute('name') + '</a></li>';
		}
		content += '</ul>';
		if (xmlRoot.childNodes.length == 0) content = '<span>No search</span>';
		return overlib(content, STICKY, CAPTION, 'My 10 last searches', CLOSECLICK, MOUSEOFF, WIDTH, 350, CLOSETEXT, '<img src="img/close.gif" alt="Close" />');	
	}
	
	var loadTopSearches = function ()
	{
		toyoAjaxLib.loadDoc('ajax/getTopSearches.php5', 'get', null, processTopSearches);		
	}
	
	var processTopSearches = function (xmlRoot)
	{
		var content = '<ul class="top_searches">';
		for (var i = 0; i < xmlRoot.childNodes.length; i++)
	  	{
			var child = xmlRoot.childNodes[i];
			content += '<li><a href="#" onclick="return epgrLib.selectShowFromPopup(\''+ child.getAttribute('url') + '\')" title="' + child.getAttribute('name') + '">' + child.getAttribute('name') + '</a> - ' + child.getAttribute('hits') + ' hits</li>';
		}
		content += '</ul>';
		if (xmlRoot.childNodes.length == 0) content = '<span>No search</span>';
		return overlib(content, STICKY, CAPTION, 'Top 10 most popular searches', CLOSECLICK, MOUSEOFF, WIDTH, 400, CLOSETEXT, '<img src="img/close.gif" alt="Close" />');	
	}
	
	var displayFavoriteShows = function ()
	{
		toyoAjaxLib.loadDoc('ajax/getFavoriteShows.php5', 'get', null, function(jsonText)
		{
			var jsonData = eval('(' + jsonText + ')'), content;
			if (jsonData.shows.length == 0) content = '<span>No favorite shows</span>';
			else
			{
				var content = '<ul class="favorite_shows">';
				for (var url in jsonData.shows)
				{
					var name = jsonData.shows[url];
					content += '<li><img src="img/help.png" alt="Get current episodes of this show" title="Get current episodes of this show" onclick="epgrLib.loadCurrentEpisodes(\''+ url + '\', event)" />&nbsp;<a href="#" onclick="return epgrLib.selectShowFromPopup(\''+ url + '\')" title="' + name + '">' + name + '</a><div id="' + url + '"></div></li>';
				}
				content += '</ul>';
			}
			return overlib(content, STICKY, CAPTION, 'My favorite shows', CLOSECLICK, MOUSEOFF, WIDTH, 400, CLOSETEXT, '<img src="img/close.gif" alt="Close" />');
		}
		);
	}
	
	var processCurrentEpisodes = function (xmlRoot)
	{
		olLoaded = 1;
		var container = document.getElementById(xmlRoot.getAttribute('showUrl'));
		if (container != null)
		{
			container.parentNode.firstChild.src = 'img/help.png';
			container.innerHTML = '';
			if (xmlRoot.childNodes.length == 0) container.innerHTML = 'No episode scheduled at this time';
			else
			{
				for (var i = 0; i < xmlRoot.childNodes.length; i++)
				{
					var child = xmlRoot.childNodes[i];
					var newP = document.createElement('p');
					var season = child.getAttribute('number').match(/^([0-9]+).*/).pop();
					var episode = child.getAttribute('number').match(/([0-9]+)$/).pop();
					episode = episode.length == 1 ? '0' + episode : episode;
					var diffInMillis =  new Date().getTime() - new Date(child.getAttribute('date').substring(6,10), child.getAttribute('date').substring(3,5)-1, child.getAttribute('date').substring(0,2)).getTime();
					var days = Math.floor(diffInMillis / 86400000);
					if (days == 0) 		 newP.innerHTML = child.getAttribute('date') + ' (today) : ';
					else if (days == -1) newP.innerHTML = child.getAttribute('date') + ' (tomorrow) : ';
					else if (days == 1)	 newP.innerHTML = child.getAttribute('date') + ' (yesterday) : ';
					else if (days < 0)	 newP.innerHTML = child.getAttribute('date') + ' (in ' + Math.abs(days) + ' days) : ';
					else if (days > 0)	 newP.innerHTML = child.getAttribute('date') + ' (' + days + ' days ago) : ';
					newP.innerHTML += season + 'x' + episode + ' - ' + child.getAttribute('name');
					container.appendChild(newP);
				}
			}
		}
	}
	
	var addListener = function (targetNode, type, func)
	{
		if (targetNode.addEventListener)
		{
			targetNode.addEventListener(type, func, false);
		} 
		else if (targetNode.attachEvent)
		{
			targetNode.attachEvent('on'+type, func);
		}
	}
	
	var processPing = function (textResp)
	{
		var liTags = document.getElementById('toolbox').getElementsByTagName('li');
		var imgStatus = liTags[0].childNodes[0];
		if (textResp == 0)
		{
			imgStatus.setAttribute('src', 'img/offline.gif');
			imgStatus.setAttribute('title', 'epguides.com is offline');
			liTags[0].replaceChild(document.createTextNode(' epguides.com is offline !'), liTags[0].childNodes[1]);
		}
		else
		{
			imgStatus.setAttribute('src', 'img/online.gif');
			imgStatus.setAttribute('title', 'epguides.com is online');
			liTags[0].replaceChild(document.createTextNode(' epguides.com is online.'), liTags[0].childNodes[1]);
		}
	}
	
	var processLastUpdate = function (textResp)
	{
		var liTags = document.getElementById('toolbox').getElementsByTagName('li');
		liTags[1].replaceChild(document.createTextNode(' Last shows update : '), liTags[1].childNodes[1]);
		var update = document.createElement('i');
		update.appendChild(document.createTextNode(textResp));
		liTags[1].appendChild(update);
	}	
 	
	var processTodaysShows = function (xmlRoot)
	{
		var newP = document.createElement('p');
		newP.appendChild(document.createTextNode('Today on TV : '));
		for (var i = 0; i < xmlRoot.childNodes.length; i++)
	  	{
			var child = xmlRoot.childNodes[i];
			var newSpan = document.createElement('span');
			newSpan.innerHTML = child.getAttribute('name') + ' <span>' + child.getAttribute('episode') + '</span> <b>&bull;</b> ';
			newP.appendChild(newSpan);
		}
		document.getElementById("todays_shows").appendChild(newP);
		document.getElementById("todays_shows").scrollLeft = 0;
		setTimeout("epgrLib.scroll()", 3000);
	}
	
	var writeCookie = function (name, value)
	{
		var argv = writeCookie.arguments;
		var argc = writeCookie.arguments.length;
		var expires = argc > 2 ? argv[2] : null;
		var path = argc > 3 ? argv[3] : null;
		var domain = argc > 4 ? argv[4] : null;
		var secure = argc > 5 ? argv[5] : false;
		document.cookie = name + '=' + encodeURIComponent(value) +
		(expires == null ? '' : '; expires=' + expires.toGMTString()) +
		(path == null ? '' : '; path=' + path) +
		(domain == null ? '' : '; domain=' + domain) +
		(secure ? '; secure' : '');
	}

	var readCookie = function (name)
	{
		var begin = document.cookie.indexOf(name + '=');
		if (begin >= 0)
		{
			begin += name.length + 1;
			var end = document.cookie.indexOf(';', begin);
			return decodeURIComponent(document.cookie.substring(begin, end == -1 ? document.cookie.length : end));
		}
		else return null;
	}

	var generateId = function()
	{
		var string = 'abcdefghijklmnopqrstuvwxyz0123456789';
		var id = '';
		for(var i = 0; i < 25; i++)
		{
			id += string.charAt(Math.floor(Math.random() * string.length));
		}
		return id;
	}
	
	var addRssListener = function(element, id)
	{
		if (id != null)
		{
			addListener(element.firstChild, 'click', function() { document.location = 'rss/' + id + '.xml'; });
			element.firstChild.firstChild.nextSibling.style.display = 'none';
		}
		else element.firstChild.firstChild.style.display = 'none'; 
	}

	// Public members

	return {
		resize : function()
		{
			var headerFooterScroll = 225;
			document.body.style.overflow = 'hidden';
			if ((document.body.offsetHeight) > 200 + headerFooterScroll)
			{
				document.body.style.overflow = 'hidden';
			   	document.getElementById('content').style.height = document.body.offsetHeight - headerFooterScroll + 'px';
			}
			else
			{
			   	document.body.style.overflow = 'auto';
			}
		},
		
		addListeners : function()
		{
			if (document.getElementById && document.createTextNode)
			{
				addListener(window, 'resize', epgrLib.resize);
				
				var liTags = document.getElementById('toolbox').getElementsByTagName('li');
				var id = readCookie(cookieId);
				addListener(liTags[2].firstChild, 'click', loadLastSearches);
				addListener(liTags[3].firstChild.nextSibling, 'click', displayFavoriteShows);
				addRssListener(liTags[3], id);
				addListener(liTags[4].firstChild, 'click', loadTopSearches);
				
				var showInput = document.getElementById('show_input');
				addListener(showInput, 'keydown', processKey);
				addListener(showInput, 'keyup', function(){ if (currentShowName != showInput.value) loadShows(showInput); });
				addListener(showInput, 'focus', function(){ loadShows(showInput); });
				addListener(showInput, 'blur', clearShows);
				showInput.focus();
				
				document.getElementById('news_toggle').firstChild.nextSibling.onclick = function()
				{
					this.innerHTML = this.innerHTML == 'hide archives' ? 'display archives' : 'hide archives';
					var archivedNews = document.getElementById('news').getElementsByTagName('li');
					for (var i = 0; i < archivedNews.length; i++)
					{
						if (archivedNews[i].className == 'archive')
						{
							archivedNews[i].style.display = archivedNews[i].style.display == 'list-item' ? 'none' : 'list-item';
						}
					}
					return false;
				};
			}
		},
		
		selectShowFromPopup : function (showUrl)
		{
			document.getElementById('wait').style.visibility = 'visible';
			toyoAjaxLib.loadDoc('ajax/getShowSeasons.php5', 'get', 'url='+showUrl, processSeasons);
			cClick();
			return false;
		},
		
		loadCurrentEpisodes : function (showUrl, event)
		{
			var toggleImg = event.target ? event.target : event.srcElement;
			toggleImg.src = 'img/wait3.gif';
			// Hack overLib : avoid the popup closing 
			olLoaded = 0;
			toyoAjaxLib.loadDoc('ajax/getCurrentEpisodes.php5', 'get', 'url=' + showUrl, processCurrentEpisodes);
		},
		
		ping : function()
		{
			toyoAjaxLib.loadDoc('ajax/ping.php5', 'get', null, processPing);
		},
		
		getLastUpdate : function()
		{
			toyoAjaxLib.loadDoc('ajax/getLastUpdate.php5', 'get', null, processLastUpdate);
		},
		
		scroll : function()
		{
			var milliseconds = 30;
			var tsDiv = document.getElementById("todays_shows");
			var textWidth = tsDiv.childNodes[0].offsetWidth;
			
			if ((tsDiv.scrollLeft >= textWidth-790) || (tsDiv.scrollLeft <= 0 && scrollSpeed < 0))
			{
				scrollSpeed = -scrollSpeed;
				milliseconds = 3000;
			}
			
			tsDiv.scrollLeft = tsDiv.scrollLeft + scrollSpeed;
			setTimeout('epgrLib.scroll()', milliseconds);
		},
		
		getTodaysShows : function()
		{
			toyoAjaxLib.loadDoc('ajax/getTodaysShows.php5', 'get', null, processTodaysShows);
		}
	};
})();
