var isMoz=(typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined') && (typeof HTMLDocument!='undefined');
var isSaf= navigator.userAgent.toLowerCase().indexOf("safari") != -1;
var isIE = !isMoz && !isSaf;

var createNamespace;
if (!createNamespace || typeof createNamespace != "function") 
{
	createNamespace = function(str)
	{
		var a = str.split(".");
		var o = window;
		for(var i=0; i < a.length; i++)
		{
			if (!o[a[i]])
			{
				o[a[i]] = {};
			}
	            
			o = o[a[i]];
		}	
	}
}
createNamespace("Ninemsn.FixTabbedBox");

String.prototype.truncate = function(num)
{
	if(this.length > num + 3)
		return this.substring(0, num) + "...";
	else
		return this;
}

Ninemsn.FixTabbedBox = function(tabBoxId)
{
	this._container = document.getElementById(tabBoxId);
	this._container.innerHTML = "";
	this._tc = new TabControl('nh_nav_tab');
	this._tc.DisableAutoHide();
	this._tabsData = [{name:"Movie Times"},{name:"TV Guide"}];
	this.TV_SEARCH_INPUT = "theFixTVSearch";
	this.MOVIE_SEARCH_INPUT = "theFixMovieInput";
	this.MOVIE_SELECT = "theFixMoviesSelect";
	this.CINEMA_SELECT = "theFixCinemasSelect";


	this._createTabBody = function(tabBody, tabData)
	{
		if(tabData.name == "Movie Times")
		{
			var jsonPropList = new Ninemsn.Global.ContentManager.JsonProp(null, null, null, "loadMovieJson", Ninemsn.Global.ContentManager.Json.ResponseFunction.Identical);
			var jsonUrl = "http://www.yourmovies.com.au/remote/";
			Ninemsn.Global.ContentManager.GetContent(jsonUrl, this._createThisCallback(this, "_createInnerMovies", tabBody), jsonPropList);
		}
		else if(tabData.name == "TV Guide")
		{
			var jsonPropList = new Ninemsn.Global.ContentManager.JsonProp(null, null, null, "loadTVJson", Ninemsn.Global.ContentManager.Json.ResponseFunction.Identical);
			var jsonUrl = "http://www.yourtv.com.au/remote/";
			Ninemsn.Global.ContentManager.GetContent(jsonUrl, this._createThisCallback(this, "_createInnerTV", tabBody), jsonPropList);
		}
	}

	this._createInnerMovies = function(tabBody, response)
	{
		if(!response)
			return false;
		
		tabBody.innerHTML = "";
		
		var divs = this._createDivs(tabBody, 3);
		
		if(response.cinemas)
		{
			response.movies.push({label:"Any movie...", id:"any", selected:true});
			var moviesSelect = this._createSelect(divs[0], response.movies, "label");
			moviesSelect.id = this.MOVIE_SELECT;

			var allCinemas = "";
			for(var i = 0; i < response.cinemas.length; i++)
			{
				if(i != 0)
					allCinemas += ",";
				allCinemas += response.cinemas[i].id;
			}
			response.cinemas.push({cinema:"All my cinemas...", id:allCinemas, selected:true});

			var cinemaSelect = this._createSelect(divs[1], response.cinemas, "cinema");
			cinemaSelect.id = this.CINEMA_SELECT;
		}
		else
		{
			response.movies.push({label:"Please select a movie...", id:"0", selected:true});
			var moviesSelect = this._createSelect(divs[0], response.movies, "label");
			moviesSelect.id = this.MOVIE_SELECT;

			var searchDivs = this._createDivs(divs[1], 2);
			//var label = divs[1].appendChild(document.createElement("div"));
			searchDivs[0].innerHTML = "OR Search for a movie title:"
			
			var searchIn = searchDivs[1].appendChild(document.createElement("input"));
			searchIn.type = "text";
			searchIn.id = this.MOVIE_SEARCH_INPUT;
			searchIn.value = "Enter movie title";
			this._attachEvent(searchIn, "onkeydown", this._createThisCallback(this, "_movieEnterSubmit"));
			
			searchIn.onfocus = function()
			{
				if(this.value == "Enter movie title")
					this.value = "";
			};

			searchIn.onblur = function()
			{
				if(this.value == "")
					this.value = "Enter movie title";
			};
		}
		
		var searchBtn = divs[1].appendChild(document.createElement("div"));
		searchBtn.innerHTML = "Show session times";
		searchBtn.className = "fixTabBtn";
		this._attachEvent(searchBtn, "onclick", this._createThisCallback(this, "_movieClickSubmit"));
		
		//var bottomDiv = divs[2].appendChild(document.createElement("div"));
		
		var bottomLinks = this._createDivs(divs[2], 2);
		
		for(var i = 0; i < response.links.length; i++)
		{
			var aLink = bottomLinks[i].appendChild(document.createElement("a"));
			aLink.href = response.links[i].url;
			aLink.title = response.links[i].label;
			aLink.innerHTML = response.links[i].label.truncate(20);
		}
		
	}

	this._movieClickSubmit = function()
	{
		var locURL = "http://www.yourmovies.com.au/session/index.cfm?action=session_times";
		var mSel = document.getElementById(this.MOVIE_SELECT);
		if(mSel.value == 0)
		{
			var mInput = document.getElementById(this.MOVIE_SEARCH_INPUT);
			locURL += "&title=" + mInput.value;
		}
		else
		{
			locURL += "&title_id=" + mSel.value;

			var cSel = document.getElementById(this.CINEMA_SELECT);
			if(cSel)
				locURL += "&venue_id=" + escape(cSel.value);
		}

		window.location = locURL;
	}

	this._movieEnterSubmit = function(e)
	{
		var event;
		var e = e || event;
		var code = e.which || e.keyCode;
		if (code == '13')
		{
			this._movieClickSubmit();

			if(e && e.preventDefault)
			{
				e.stopPropagation();
				e.preventDefault();
			}
			return false;
		}
	}
	
	this._createInnerTV = function(tabBody, response)
	{
		if(!response)
			return false;
		
		tabBody.innerHTML = "";
		
		var FTA_SELECT = "theFixFTASelect";
		var PAY_SELECT = "theFixPaySelect";
		
		var divs = this._createDivs(tabBody, 3);
		
		if(response.buttons)
		{
			var whatsOnDivs = this._createDivs(divs[0], 2);
			
			whatsOnDivs[0].innerHTML = "Show me what's on:";

			var nowBtn = whatsOnDivs[1].appendChild(document.createElement("div"));
			nowBtn.innerHTML = response.buttons[0].label;
			nowBtn.className = "fixTabBtn";
			nowBtn.onclick = function()
			{
				window.location = response.buttons[0].url;
			};
			
			var nextBtn = whatsOnDivs[1].appendChild(document.createElement("div"));
			nextBtn.innerHTML = response.buttons[1].label;
			nextBtn.className = "fixTabBtn";
			nextBtn.onclick = function()
			{
				window.location = response.buttons[1].url;
			};
			
			var restBtn = whatsOnDivs[1].appendChild(document.createElement("div"));
			restBtn.innerHTML = response.buttons[2].label;
			restBtn.className = "fixTabBtn";
			restBtn.onclick = function()
			{
				window.location = response.buttons[2].url;
			};

			var searchDivs = this._createDivs(divs[1], 2);
			divs[1].className = "seperator";
			
			searchDivs[0].innerHTML = "OR Search for a show:";
			
			var searchIn = searchDivs[1].appendChild(document.createElement("input"));
			searchIn.type = "text";
			searchIn.id = this.TV_SEARCH_INPUT;
			searchIn.value = "Search a show";
			this._attachEvent(searchIn, "onkeydown", this._createThisCallback(this, "_tvEnterSubmit"));

			searchIn.onfocus = function()
			{
				if(this.value == "Search a show")
					this.value = "";
			};

			searchIn.onblur = function()
			{
				if(this.value == "")
					this.value = "Search a show";
			};

			var searchBtn = searchDivs[1].appendChild(document.createElement("div"));
			searchBtn.id = "tester";
			searchBtn.innerHTML = "Search";
			searchBtn.className = "fixTabBtn";
			this._attachEvent(searchBtn, "onclick", this._createThisCallback(this, "_tvClickSubmit"));
		}
		else
		{
			response.fta.push({region:"Select your free-to-air region...", id:"0", selected:true});
			var ftaSelect = this._createSelect(divs[0], response.fta, "region");
			ftaSelect.id = FTA_SELECT;

			response.pay.push({label:"[none]", id:"0"});
			response.pay.push({label:"Select your subscription TV service...", id:"0", selected:true});
			var paySelect = this._createSelect(divs[1], response.pay, "label");
			paySelect.id = PAY_SELECT;

			var searchBtn = divs[1].appendChild(document.createElement("div"));
			searchBtn.onclick = function()
			{
				var locURL = "http://www.yourtv.com.au/profile/index.cfm?action=saveRegions";
				
				var ftaSel = document.getElementById(FTA_SELECT);
				if(ftaSel && ftaSel.value == 0)
				{
					alert("Please select your region.");
					if(ftaSel) ftaSel.focus();
					return false;
				}
				else if(ftaSel)
				{
					locURL += "&fta_region_id=" + ftaSel.value;

					var paySel = document.getElementById(PAY_SELECT);
					if(paySel && paySel.value != 0)
					{
						locURL += "&pay_region_id=" + paySel.value;
					}

					window.location = locURL;
				}
			};
			searchBtn.innerHTML = "Show TV guide";
			searchBtn.className = "fixTabBtn";
		}
		
		//var bottomDiv = divs[2].appendChild(document.createElement("div"));
		
		var bottomLinks = this._createDivs(divs[2], 2);
		
		for(var i = 0; i < response.links.length; i++)
		{
			var aLink = bottomLinks[i].appendChild(document.createElement("a"));
			aLink.href = response.links[i].url;
			aLink.title = response.links[i].label;
			aLink.innerHTML = response.links[i].label.truncate(20);
		}
	}
	
	this._tvClickSubmit = function()
	{
		var search = document.getElementById(this.TV_SEARCH_INPUT);
		if(search && search.value != "" && search.value != "Search a show")
			window.location = "http://www.yourtv.com.au/guide/index.cfm?action=sessionTimes&search_string=" + search.value;
	}
	
	this._tvEnterSubmit = function(e)
	{
		var event;
		var e = e || event;
		var code = e.which || e.keyCode;
		if (code == '13')
		{
			this._tvClickSubmit();

			if(e && e.preventDefault)
			{
				e.stopPropagation();
				e.preventDefault();
			}
			return false;
		}
	}
	
	this._createSelect = function(container, arr, label)
	{
		var dropDown = document.createElement("select");

		for(var i = 0; i < arr.length; i++)
		{
			var selectNode = document.createElement("option");
			if(arr[i][label] && arr[i].id)
			{
				selectNode.innerHTML = arr[i][label];
				selectNode.value = arr[i].id;
				if(arr[i].selected)
					selectNode.selected = true;
				dropDown.appendChild(selectNode);
			}
		}

		container.appendChild(dropDown);

		return dropDown;
	}

	this._createDivs = function(container, num)
	{
		var divs = [];
		for(var i = 0; i < num; i++)
		{
			var div = container.appendChild(document.createElement("div"));
			div.className = "genDiv" + i;
			divs.push(div);
		}

		return divs;
	}
	
	/**
	 * Same as createCallback except an extra this parameter is passed which is used
	 * to reference the callback function
	 *
	 * @param {object} obj The this reference, on which the strFunc exists
	 * @param {strFunc} strFunc The name of the function on obj to call
	 * @param {params} p Any number of params
	 * @return {Function} The new callback
	 */
	this._createThisCallback = function(obj, strFunc)
	{
		var temp = obj;
		var args = [];
		for(var i=2; i < arguments.length; i++)
			args.push(arguments[i]);
			
		return function()
		{
			var additionalArgs = [];
			for(var i=0; i < args.length; i++)
				additionalArgs.push(args[i]);
			
			// Add args we were passed onto the end
			for(var i=0; i < arguments.length; i++)
				additionalArgs.push(arguments[i]);
			
			if (temp[strFunc])
				return temp[strFunc].apply(obj, additionalArgs);
		};
	};

	/**
	 * Attaches an event to an element in a browser independant way.
	 *
	 * @param {Element} elem Element to to attach event to.
	 * @param {String} evt Name of event which will eb attached. Eg: "onclick".
	 * @param {Function} fnc A function to call back when the event is fired.
	 */
	this._attachEvent = function(elem, evt, fnc)
	{
		if(!elem)
			return false;
		
		if (!isIE)
		{
			if (evt.substr(0,2).toLowerCase() == "on")
				evt = evt.substr(2);
			elem.addEventListener(evt, fnc, false); // Hook the actual event  
		}
		else
			elem.attachEvent(evt, fnc);
	}

	var tabsDiv = this._container.appendChild(document.createElement("div"));
	tabsDiv.className = "fixTBTabs";
	var tabsBodyDiv = this._container.appendChild(document.createElement("div"));
	tabsBodyDiv.className = "fixTBBodies";
	for(var i = 0; i < this._tabsData.length; i++)
	{
		var tabButton = tabsDiv.appendChild(document.createElement("div"));
		tabButton.innerHTML = this._tabsData[i].name;
		tabButton.id = "tabButton" + i;
		tabButton.className = "tab";

		var tabBody = tabsBodyDiv.appendChild(document.createElement("div"));
		this._createTabBody(tabBody, this._tabsData[i]);
		tabBody.innerHTML = "Loading...";
		tabBody.id = "tabBody" + i;
		tabBody.style.display = "none";
		
		var tab = new Tab(tabButton.id, tabBody.id);
		this._tc.RegisterTab(tab);
		
		if(i == 0)
			this._tc.SetDefaultTab(tab);
	}
}

var tabBoxId = "theFixTabbedBox";
document.write("<div id='" + tabBoxId + "'></div>");
var fixTB = new Ninemsn.FixTabbedBox(tabBoxId);





