/**********************************************************/
/*        Thematic maps Multitab handler                  */
/*        Requires: Yui librabries						  */
/*		  Wisdom 2008	                                  */
/**********************************************************/

/* global tab object */
var chartTabs;

YAHOO.bosatlas.tabHandler = {
	settings : {
		tabSet					: null,
		useCache				: false,
		tabSetId				: "appTabs",
		tabPrefix				: "appTab_",
		tabContentPrefix		: "tabContent_",
		tabContentClass			: "appRight",
		tabContentContainerId	: "appContentHolder",
		newTabLinkId			: "newAppTabLink",
		templateUrlCloseMap		: "closeMapN.do",
		templateUrlMapIntro		: "thematicMapChoicesN.do",
		templateUrlTooManyTabs	: "tooManyTabsN.do",
		templateUrlCountryIntro	: "listCountriesN.do",
		clearSessionTabUrl		: "clearSessionN.do",
		ajaxLoadRegionId		: "ajaxLoadRegion",
		ajaxLoaderClass			: "showAjaxTabLoader"
	},
	init : function() {
		var tabSet = Dom.get(this.settings.tabSetId);
		if(!tabSet) {
			return false; /* no tab context, aborting tab init*/
		}

		// set global tab object
		chartTabs = new YAHOO.widget.TabView("appHolder");
		var renderedTabs = tabSet.getElementsByTagName("li");
		var numRenderedTabs = renderedTabs.length;

		//	set stored datasource & refresh tabs

		for(var i=0; i<numRenderedTabs; i++) {
			var tabLink = renderedTabs[i].getElementsByTagName("a")[0];
			var tabLinkDataSource = tabLink.getAttribute("rev");
			var currentTab = chartTabs.getTab(i);

			if(this.settings.useCache) {
				currentTab.set("cacheData" , true); /* this seems not to be working when building from markup */
			}
			currentTab.set("dataSrc" , tabLinkDataSource);
			currentTab.loadHandler.failure = function(e) {
				drawSessionErrorNotification(null,LANG_SESSION_ERROR,"canvas", false);
			}
			// adding tabContent init function on tabContent refresh
			currentTab.removeListener("contentChange", this.initTabContent);
			currentTab.addListener("contentChange", this.initTabContent, currentTab);
			currentTab.addListener("activeChange", function(){YAHOO.bosatlas.tabHandler.setAjaxLoader(1);});
			
			currentTab.refresh();
		}

		if(typeof(chartTabs) != "undefined") {
			this.settings.tabSet = chartTabs;
		}
	},
	initTabContent : function(e,currentTab) {
		// js functions that need to execute after the content of a tab is changed
		var tabId = currentTab.getAttributeConfig('element').value.id.split("_")[1];
		var tabContext = Dom.get("tabContent_" + tabId);
		
		// clean inactive tab contents
		YAHOO.bosatlas.tabHandler.cleanInactiveTabs(tabId);

		if(tabContext) {
			var mapContext = Dom.getElementsByClassName("map", "div", tabContext)[0];
			if(mapContext) {
				YAHOO.bosatlas.SVGMap.initMapView(tabId, "map");
			}

			// tooltip init
			YAHOO.bosatlas.tooltip.init();

			// country doc init
			YAHOO.bosatlas.countryDocumentation.init();
			
			// disable ajax loader
			YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
		}
	},
	cleanInactiveTabs : function(activeTabId) {
		if(!this.settings.useCache) {
			var allTabContents = Dom.getElementsByClassName(this.settings.tabContentClass);
			for(var i=0; i<allTabContents.length; i++) {
				if(allTabContents[i].id != "tabContent_" + activeTabId) {
					allTabContents[i].innerHTML = "";
				}
			}
		}
	},
	addTab: function(activateTab, tabType) {
		var tabIdentifier = randomString(8);
		var allTabs = Dom.get(this.settings.tabSetId).getElementsByTagName("li");

		// exit if there are already 5 tabs present
		if(allTabs.length > 4) {
			// draw notification lightbox
			drawLightbox(LANG_ATTENTION,this.settings.templateUrlTooManyTabs,'600px','120px');
			return false;
		}

		/* context setup */

		if(tabType == "map") {
			var labelText = LANG_DEFAULT_MAP_TAB_NAME;
			var contextIntro = this.settings.templateUrlMapIntro + "?tabId=" + tabIdentifier;
		} else {
			var labelText = LANG_DEFAULT_COUNTRYTAB;
			var contextIntro = this.settings.templateUrlCountryIntro;
		}

		var newTab =  new YAHOO.widget.Tab({label: labelText , id:this.settings.tabPrefix + tabIdentifier  , dataSrc: contextIntro, cacheData:this.settings.useCache});
		newTab.loadHandler.failure = function(e) {
			drawSessionErrorNotification(tabIdentifier,LANG_SESSION_ERROR,"canvas", false);
		}
		this.settings.tabSet.addTab( newTab );
		var allTabs = Dom.get(this.settings.tabSetId).getElementsByTagName("li");
		var newTabIndex = allTabs.length-1;

		// activate the new tab
		if(activateTab) {
			this.settings.tabSet.set('activeIndex', newTabIndex);
		}

		// set datasource reference
		var activeTabLink = allTabs[newTabIndex].getElementsByTagName("a")[0];
		activeTabLink.setAttribute("rev", this.settings.templateUrlMapIntro);

		// add close button

		var removeTabLinkDiv = document.createElement("div")
		Dom.addClass(removeTabLinkDiv, "closeTab");
		var removeTabLink = document.createElement("a");
		removeTabLink.setAttribute("title", LANG_CLOSE_MAP);
		removeTabLinkDiv.appendChild(removeTabLink);
		if(tabType == "map") {
			removeTabLink.setAttribute("href", this.settings.templateUrlCloseMap+ "?tabId=" + tabIdentifier);
		}

		var tabLinkText = document.createTextNode("X");
		removeTabLink.appendChild(tabLinkText);

		Event.addListener(removeTabLink, "click", function(e){Event.preventDefault(e)});

		// dialog removal for map tabs
		var removeTabDialog = function() {
			YAHOO.bosatlas.tabHandler.removeTabWizard(this);
		}
		// direct removal for country tabs and future tabs context
		var removeActiveTab = function() {
			YAHOO.bosatlas.tabHandler.removeActiveTab();
		}

		if(tabType == "map") {
			Event.addListener(removeTabLink, "click", removeTabDialog);
		} else {
			Event.addListener(removeTabLink, "click", removeActiveTab);
		}

		allTabs[newTabIndex].appendChild(removeTabLinkDiv);

		// configure the new tabcontext
		var newTabContent = Dom.get(this.settings.tabContentContainerId).lastChild;
		Dom.addClass(newTabContent, this.settings.tabContentClass);
		newTabContent.setAttribute("id", this.settings.tabContentPrefix + tabIdentifier);

		var allTabContents = Dom.getElementsByClassName(this.settings.tabContentClass, "div", this.settings.tabContentContainer);
		// hide all tab content
		for(var i=0; i<allTabContents.length; i++) {
			Dom.setStyle(allTabContents[i], "display", "none");
		}
		// activate new (last) tab content
		Dom.setStyle(allTabContents[i-1], "display", "block");

		if(allTabs.length > 4) {
			// disable the newTab link
			this.toggleAddTabLink();
		}
		if(tabType == "map" || tabType == "country") {
			newTab.addListener("contentChange", this.initTabContent, newTab);
		}
	},

	toggleAddTabLink : function() {
		var newTabLink = Dom.get(this.settings.newTabLinkId);
		if(Dom.hasClass(newTabLink, "greyed")) {
			Dom.removeClass(newTabLink, "greyed");
		}
	},

	removeTab: function(targetObj,rObj) {
		var allTabs = Dom.get(rObj.settings.tabSetId).getElementsByTagName("li");
		var selectedTab = targetObj.parentNode.parentNode;

		for(var i=0; i<allTabs.length; i++) {
			if(allTabs[i] == selectedTab) {
				break;
			}
		}
		rObj.settings.tabSet.removeTab(rObj.settings.tabSet.getTab(i));
		if(allTabs.length == 4) {
			// 5th tab was removed so we can enable new tab button again
			this.toggleAddTabLink();
		}

		//this.removeTabFormSession();
	},

	removeActiveTab: function() {
		var allTabs = Dom.get(this.settings.tabSetId).getElementsByTagName("li");
		for(var i=0; i<allTabs.length; i++) {
			if(allTabs[i].title == "active") {
				var tabId = this.settings.tabSet.getTab(i).getAttributeConfig('element').value.id.split("_")[1];
				this.settings.tabSet.removeTab(this.settings.tabSet.getTab(i));
				break;
			}
		}

		if(allTabs.length == 4) {
			// 5th tab was removed so we can enable new tab button again
			this.toggleAddTabLink();
		}

		if(allTabs.length == 0) {
			// add default tab
			if(Dom.hasClass(document.body, "tk")) {
				YAHOO.bosatlas.tabHandler.addTab(true, 'map');
			}
			if(Dom.hasClass(document.body, "ld")) {
				YAHOO.bosatlas.tabHandler.addTab(true, 'country');
			}
		}
		// JSP callback
		this.removeTabFromSession(tabId);

	},
	removeTabFromSession : function(tabId) {
		var callback =  {

			cache:false,

			success: function(o) {

			},

			failure: function(o) {
				// add feedback
			},

			argument : {tabHandler:this}
		}
		// get attributes
		var transaction = YAHOO.util.Connect.asyncRequest('GET', this.settings.clearSessionTabUrl + "?tabId=" + tabId, callback, null);
	},
	exportTabName : function(targetObj) {
		var selectedTab = this.getActiveTab();
		var tabName = selectedTab.getAttributeConfig('label').value;
		targetObj.innerHTML = tabName;
	},

	removeTabWizard : function(refObj) {
		var selectedTab = this.getActiveTab();
		var tabId = selectedTab.getAttributeConfig('element').value.id.split("_")[1];
		var activeTabContent = Dom.get("tabContent_" + tabId );
		var mapContext = Dom.getElementsByClassName("map", "div", activeTabContent)[0];

		if(mapContext) {
			// draw lightbox wizard
			drawLightbox(refObj.title,refObj.href,'700px','160px');
		}
		else {
			// close active tab
			this.removeActiveTab();
		}
	},

	getActiveTab : function() {
		var allTabs = Dom.get(this.settings.tabSetId).getElementsByTagName("li");
		for(var i=0; i<allTabs.length; i++) {
			if(allTabs[i].title == "active") {
				return this.settings.tabSet.getTab(i);
				break;
			}
		}
	},
	setAjaxLoader : function(state) {
		var ajaxLoadRegion = Dom.get(this.settings.ajaxLoadRegionId);
		
		if(state == 1) {
			Dom.addClass(ajaxLoadRegion, this.settings.ajaxLoaderClass);
		} else {
			Dom.removeClass(ajaxLoadRegion, this.settings.ajaxLoaderClass);	
		}
	}
}
