var ajaxHistory = Class.create({
	init: function(){
		this.links = new Array();
		this.pages = new Array();
		new PeriodicalExecuter(this.observe.bind(this), 50/1000);
		this.started = true;
		this.states = [];
		this.states[this.count] = this.getHash();
		this.state = null;
		this.observe();
		this.justAdded = false;
	},
	addPage: function (id,value){
		var exist = false;
		for(a=0;a<this.links.length;a++){
			if (this.links[a]==id) exist = true; 
		}
		if (exist==false) {
			this.links.push(id);
			this.pages.push(value);
		}
		this.justAdded = true;
	},
	observe: function() {
		if (this.timeout) return;
		var state = this.getState();
		
		if (this.state == state) return;
		if ((Prototype.Browser.IE || Prototype.Browser.WebKit) && (this.state !== null)) this.setState(state, true);
		else this.state = state;
		var index = false;
		if (this.justAdded) {
			this.justAdded = false;
			return;
		}
		for(a=0;a<this.links.length;a++){
			if (this.links[a]==state) index = a;
		}
		if (index!==false) {
			eval(this.pages[index]); 
//			alert (this.pages[index]);
		}
		
/*		this.modules.each(function(data) {
			var bits = state.match(data.value.regexp);
			if (bits) {
				bits.splice(0, 1);
				bits.complement(data.value.defaults);
				if (!bits.isSimilar(data.value.defaults)) data.value.values = bits;
			} else data.value.values = data.value.defaults.clone();
			data.value.onMatch(data.value.values, data.value.defaults);
		});
		//Event.fire(this, 'onStateChange', [state]).
		//Event.fire(this, 'onObserverChange', [state]);
		//this.onStateChange.apply(this, [state]);
		//this.onObserverChange.apply(this, [state]);
*/
	},
	getState: function() {
		var state = this.getHash();
		if (Prototype.Browser.WebKit && history.length != this.count) {
			this.count = history.length;
			return (this.states[this.count - 1] != undefined)?this.states[this.count - 1] != undefined:state;
		}
		return state;
	},
	getHash: function() {
		var href = top.location.href;
		var pos = href.indexOf('#') + 1;
		return (pos) ? href.substr(pos) : '';
	},
	observeTimeout: function() {
		if (this.timeout) this.timeout = clearInterval(this.timeout);
		else this.timeout = this.observeTimeout.bind(this).delay(200/1000);
	},
	setState: function(state, fix) {
	
		state = state!=undefined?state:'';

		if (Prototype.Browser.WebKit) {
			if (!this.form) {
				this.form = new Element('form', {'method': 'post'});
				document.body.appendChild(this.form);;
			}	
			this.count = history.length;
			this.states[this.count] = state;
			this.observeTimeout();
			this.form.setAttribute('action', '#' + state);
			//this.form.submit()
		} else {
			top.location.hash = state || '#';
		}	
		
		if (Prototype.Browser.IE && (!fix || this.istateOld)) {
			if (!this.iframe) {
				this.iframe = new Element('iframe', {
					'src': this.options.iframeSrc,
					'styles': 'display: none;',
					'width': '1',
					'height': '1'
				});
				document.body.appendChild(this.iframe);

				this.istate = this.state;
			}
			try {
				var doc = this.iframe.contentWindow.document;
				doc.open();
				doc.write('<html><body id="state">' + state + '</body></html>');
				doc.close();
				this.istateOld = false;
			} catch(e) {};
		}
		this.state = state;
	}


});