/*
 * History Management JS Library 0.2
 * Copyright(c) 2008, Sony IDC
 * trinceff, trsoztus
 *
 * Dependencies:
 *	yahoo-min-2.5.0.js 
 *	event-min-2.5.0.js
 *	history-min-2.5.0.js
 *	prototype-1.5.*.js
 */

var ODWHistoryManager = Class.create();
ODWHistoryManager.prototype = {
	initialize: function() {
		this.modules = new Array();
		this.name = 'Default History Manager';
	},
	register: function(componentid, modulename, baseUrl, initialstate, allstates, prefunc, postfunc){
		var alreadyregistered = false;
		if (this.modules.length != 0) {
		    this.modules.each(function(item) {
		    	if(item.modulename == modulename)
					alreadyregistered = true;
		    });
        }
		if(!alreadyregistered){
			this.modules[this.modules.length] = new ODWAjaxModule(componentid, modulename, baseUrl, initialstate, allstates, prefunc, postfunc);
		}
	},
	registerChild: function(componentid, modulename, baseUrl, parentmodulename ){
		var parent = null;		
		if (this.modules.length != 0) {
			this.modules.each(function(item) {
			 	if(item.modulename == parentmodulename)
					parent = item;
			});		
			if(parent){
				parent.addChild(componentid, modulename, baseUrl);
			}
		}
	},
	initializeOnLoad: function(){
		//1. get Modules
		var modulesOnPage = this.modules;
		//2. Iterate and register all of modules
		for(var i=0;i<modulesOnPage.length;i++){
			var currentModuleObj = modulesOnPage[i];
			var bookmarkedTabViewState = YAHOO.util.History.getBookmarkedState(currentModuleObj.modulename); 
			currentModuleObj.getContentsForFirstLoad = bookmarkedTabViewState && (bookmarkedTabViewState != currentModuleObj.initialstate);
			var initialTabViewState = bookmarkedTabViewState||currentModuleObj.initialstate; 
			
			//Make Dynamic Here
			YAHOO.util.History.register(currentModuleObj.modulename, initialTabViewState, currentModuleObj.stateChangeHandler, currentModuleObj);
			
			//Create child modules. Exp: Floater changes with tab action. But don't uses seperate state variable.
			//TODO : create child here
		}
		
		// Initialize the browser history management library. 
		try { 
			YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");		
		} catch (e) { }
	},
	onReady: function(){
		//TODO : implement here according to the Initial Screen Preparetation.
		var modulesOnPage = this.modules;
		//2. Iterate and register all of modules
		for(var i=0;i<modulesOnPage.length;i++){
			var currentModuleObj = modulesOnPage[i];
			var currentState = YAHOO.util.History.getCurrentState(currentModuleObj.modulename);
			if(currentState && currentModuleObj.getContentsForFirstLoad) {
				currentModuleObj.stateChangeHandler(currentState);
			}
		}
	},
	click: function(aObj, moduleName, newState, prefunction) {
		try { 
		 	var currentState = YAHOO.util.History.getCurrentState(moduleName);
		 	if (newState != currentState) {
			 	if(prefunction)
					prefunction(aObj);
				
		 		//Update hash
				YAHOO.util.History.navigate(moduleName, newState); 
			}
		} catch (e) {
			return true;
		} 
		return false;
	},
	updateURL: function(targetURL) {
		var URL = targetURL.href;
		var newURL = URL;
		var modulesOnPage = this.modules;
		for(var i=0;i<modulesOnPage.length;i++) {
			var currentModuleObj = modulesOnPage[i];
			var currentModuleName = currentModuleObj.modulename;
			var currentState = YAHOO.util.History.getCurrentState(currentModuleName);
			if(currentState != null) {
				var findString = new RegExp(currentModuleName + "=[\\w]*");
				if(findString.test(newURL)) {
					var newString = currentModuleName + "=" + currentState;
					newURL = newURL.replace(findString, newString);
				}
				else {
					newURL = newURL + "&" + currentModuleName + "=" + currentState;
				}
			}
		}
		targetURL.href = newURL;
	}
};


var ODWAjaxModule = Class.create();
ODWAjaxModule.prototype = {
	initialize: function(componentid, modulename, baseUrl, initialstate, allstates, prefunc, postfunc) {
		this.componentid = componentid;
		this.modulename = modulename;
		this.initialstate = initialstate;
		this.currentstate = initialstate;
		this.getContentsForFirstLoad = false;
		this.baseUrl = baseUrl;
		this.prefunc = prefunc;
		this.postfunc = postfunc;
		this.childs = new Array();
		
		this.allstates = allstates.split(';');
		
	},
	/* Default State change handler for all modules. */
	stateChangeHandler: function(newState, thiz) {
		if(!iframeLoaded){
			if(!thiz)
				thiz = this;			
			thiz.currentstate = newState;
			
			var selectedTabIndex = thiz.getIndex(newState);
			if(selectedTabIndex==-1) return;
			
			if(thiz.prefunc){
				thiz.prefunc(newState, thiz);
			}
			
			//TODO : what about failure calls
			new Ajax.TabUpdater( { success: thiz.componentid }, thiz.baseUrl, {
			  	parameters: { moduleName:thiz.modulename,moduleState: newState },
			  	evalScripts: true,
			  	prefunc: updateIfSelectedTabIsStillActive,
			  	tabIndex: selectedTabIndex,
			  	onComplete: function() {
					if (omTracker){
						omTracker.trackZones(thiz.componentid);
					}
			  	}
			});
			if (omTracker){
				omTracker.trackZones(thiz.componentid);
			}
			//TODO : make it paralel
			if(thiz.childs){
				thiz.childs.each(function(child) {
					new Ajax.Updater(child.componentid, child.baseUrl, {
				  		parameters: { moduleName:child.modulename,moduleState: newState }
					});
				});
			}
			
			if(thiz.postfunc) thiz.postfunc(newState, thiz);
		}
		
	},
	addChild: function(componentid, modulename, baseUrl) {
		var child = new ODWAjaxModule(componentid, modulename, baseUrl, this.initialstate);
		this.childs[this.childs.length] = child;
	},
	getIndex: function(newState){
		if(this.allstates){
			for(var i=0;i<this.allstates.length;i++){
				if(newState==this.allstates[i]) return i;
			}
		}
		return -1;
	}
};

updateIfSelectedTabIsStillActive = function(tabUpdater) {
	var i = tabUpdater.options.tabIndex;
	var j = tabManager.getSelectedTab();
	return i==j?true:false;
}

var historyManager = new ODWHistoryManager();

/* Use to load all modules with onLoad event.
 * Get all modules and register them to HistoryAPI. (We can handle a module with specific style class.)
 */
Event.observe(window, 'load', function(event) {
	historyManager.initializeOnLoad();
});

YAHOO.util.History.onReady(function () { 
	historyManager.onReady();
});

var ODWTabManager = Class.create();
ODWTabManager.prototype = {
	initialize: function(selected) {
		this.selectedTab = selected?selected:0;
	},
	getSelectedTab: function(){
		return this.selectedTab;
	},
	selectTab: function(tabNum) {
		this.selectedTab = tabNum;
		
		var tabTables = this.getTabTables();
	    var c = 0;
	    var mainClassName;
	    if (tabTables.length > 0) {
	        for (var i = tabTables.length-1; i >= 0; i--) {
	            tds = tabTables[i].getElementsByTagName("a");
	            for (var j = 0; j < tds.length; j++) {
	                if (tds[j].className == "" ||
	                    tds[j].className == "currentNav") {
	                    if (c == tabNum) {
	                        mainClassName = "currentNav";
	                    } else {
	                        mainClassName = "";
	                    }
	                    try {
	                        tds[j].className = mainClassName;
	                    } catch (e) {
	                    }
	                    c++;
	                }
	            }
	        }
	    }
	},
	getTabTables : function() {
		var searchClass = "BodyContentNavContainer";
	    var classElements = new Array;
	    var node = document;
	    var tag = "div";
	    try {
	        var els = node.getElementsByTagName(tag);
	        var elsLen = els.length;
	        var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
	        for (i = 0, j = 0; i < elsLen; i++) {
	            if (pattern.test(els[i].className)) {
	            	classElements[j] = els[i];
	                j++;
	            }
	        }
	    } catch (e) {
	    }
	    return classElements;
	},
	updateTitle : function(newtitle) {
		window.document.title = newtitle;
	}
};

var tabManager = new ODWTabManager();

// Utility methods

// Finds and returns the offset top position of a given element.
getOffsetTop = function(element) {
	var topOffset = element.offsetTop;
	while((element = element.offsetParent) != null)
	topOffset += element.offsetTop;
	return topOffset;
}
 