// JavaScript Document

var HistoryManager = {
	currentIndex:0,
	urlStuck:new Array(),
	historyHash:new Array(),
	topHist:null,
	MAX_HISTORY_NUM:20,
	
	init:function(){
		//console.log("init");
		//document.location.href="/";
		SWFAddress.addEventListener(SWFAddressEvent.CHANGE, HistoryManager.changedURL);
	},
	
	initTop:function(scope, func){
		var params = new Array();
		for(var i = 2; i < arguments.length; i++){
			params.push(arguments[i]);
		}
		
		this.topHist = new History(scope, func, params);
		
		this._pushURLStuck("/");
		this.historyHash["/"] = this.topHist;
	},
	
	changedURL:function(event){
		if(!event.pathNames || !event.pathNames[0]){
			HistoryManager.currentIndex = 0;
			HistoryManager._gotoTop();
			return;
		}
		
		var history = HistoryManager.historyHash[event.pathNames[0]];
		if(history){
			HistoryManager.currentIndex = HistoryManager._getStuckIndex(event.pathNames[0]);
			history.func.apply(history.scope, history.params);
			return;
		}
		
		//HistoryManager._gotoTop();
	},
	
	setTop:function(){
		if(!HistoryManager.topHist) return;
		
		/*HistoryManager._pushURLStuck("/");
		HistoryManager._gotoTop();*/
		var date = new Date();
		var time = date.getTime();
		var url = time.toString(16);
		this.historyHash[url] = this.topHist;
		HistoryManager._pushURLStuck(url);
		SWFAddress.setValue(url);
	},
	
	//change URL to top URL
	_gotoTop:function(){
		HistoryManager.topHist.func.apply(HistoryManager.topHist.scope, HistoryManager.topHist.params);
		SWFAddress.setValue("/");
	},
	
	setURL:function(scope, func){
		var params = new Array();
		for(var i = 2; i < arguments.length; i++){
			params.push(arguments[i]);
		}
		var history = new History(scope, func, params);
		
		var date = new Date();
		var time = date.getTime();
		var url = time.toString(16);
		
		this.historyHash[url] = history;
		
		if(this.currentIndex < this.urlStuck.length - 1){
			var count = 0;
			var len = this.urlStuck.length - this.currentIndex - 1;
			while(count < len){
				var lastUrl = this.urlStuck.pop();
				if(this.historyHash[lastUrl]) delete this.historyHash[lastUrl];
				count++;
			}
		}
		
		//trace(this.historyHash);
		HistoryManager._pushURLStuck(url);
		SWFAddress.setValue(url);
	},
	
	_pushURLStuck:function(url){
		if(this.urlStuck[this.currentIndex] == url) return;
		
		this.urlStuck.push(url);
		//this.currentIndex++;
		
		if(this.urlStuck.length > this.MAX_HISTORY_NUM){
			var url = this.urlStuck.shift();
			if(this.historyHash[url]) delete this.historyHash[url];
		}
		
		//trace(this.urlStuck.length);
		//trace(this.urlStuck);
		//trace(this.historyHash);
	},
	
	_getStuckIndex:function(url){
		var len = this.urlStuck.length;
		for(var i = 0; i < len; i++){
			if(this.urlStuck[i] == url) return i;
		}
		
		return -1;
	}
}


var History = function(scope, func, params){
	this.scope = scope;
	this.func = func;
	this.params = params;
}
