// Copyright(c)2005 Daniel Pupius - http://pupius.co.uk/
var Browser = {
	targets: ["target1", "target2"],
	container: "container",
	currentTarget: -1,
	targetWidth: 305,
	targetHeight: 400,
	
	xh: null,
	slideLeft: null,
	slideRight: null,

	httpCache: new Array(),
	currentRequest: "",


	init: function() {

		this.xh = new XMLHttpHandler();
		this.xh.onrecieve = this.onrecievehttprequest;

		this.slideLeft = new Toolkit.Drawing.Animation(new Toolkit.Drawing.Curves.Line([0],[-this.targetWidth]), 500, 0.9999);
		this.slideRight = new Toolkit.Drawing.Animation(new Toolkit.Drawing.Curves.Line([-this.targetWidth],[0]), 500, 0.9999);

		this.slideLeft.onanimate = this.onslideleft;
		this.slideRight.onanimate = this.onslideright;

		StateMonitor.onstatechange = this.onstatemonitorchanged;
		StateMonitor.init();
		
		if(location.href.indexOf("#")==-1) Browser.go("/");
	},

	go: function(s) {
		if(!this.slideLeft.active && !this.slideRight.active && !this.xh.isBusy()) {
			StateMonitor.setState(s);
		}
		return false;
	},

	show: function(url) {
		var id = this.urlToId(url);
		
		if(Browser.currentTarget!=-1) {
			var last = StateMonitor.getLastState();
			var next = StateMonitor.getState();

			if(last.toLowerCase()<next.toLowerCase()) Browser.slideLeft.start();
			else Browser.slideRight.start(); 
		}
		Browser.currentTarget = Browser.currentTarget?0:1;
		document.getElementById(Browser.targets[Browser.currentTarget]).innerHTML = this.httpCache[id];
	},

	up: function() {
		var trimmed = StateMonitor.getState().replace(/^\//,"").replace(/\/$/,"");
		var parts = trimmed.split("/");
		parts.pop();
		var back = parts.join("/");
		if(back != "") back = "/" + back + "/";
		else back = "/";
		StateMonitor.setState(back);
		return false;
	},

	refreshCurrent: function() {
		var url = StateMonitor.getState();

		Browser.currentRequest = url;
		Browser.xh.send("request-handler.php?p=" + url + "&" + new Date().valueOf());

		var curl = location.href;
		window.location = curl.substr(0,curl.indexOf("#")>=0?curl.indexOf("#"):curl.length) + '#' + url;

		return false;
	},

	startScroll: function(amount) {
		if(!this.scrolling) {
			this.scrollAmount = amount;
			this.scrolling = setInterval("Browser.scroll();", 10);
		}
	},
	
	scroll: function() {
		var y = parseInt(document.getElementById(Browser.targets[Browser.currentTarget]).style.top);
		var h = parseInt(document.getElementById(Browser.targets[Browser.currentTarget]).offsetHeight);
		if(isNaN(y)) y = 0;
		y+=this.scrollAmount;
		this.scrollAmount += this.scrollAmount/40;
		if(y>0) y = 0;
		var max = h - this.targetHeight;
		if(y < -max) y = -max;
		if(h<this.targetHeight) y = 0;
		document.getElementById(Browser.targets[Browser.currentTarget]).style.top = parseInt(y) + "px";
	},

	stopScroll: function() {
		clearInterval(this.scrolling);
		this.scrolling = null;
		this.scrollAmount = 0;
	},

	onstatemonitorchanged: function() {
		var url = StateMonitor.getState();
		var id = Browser.urlToId(url);

		if(Browser.httpCache[id]) {
			Browser.show(url);
		} else {
			Browser.currentRequest = url;
			Browser.xh.send("request-handler.php?p=" + url + "&" + new Date().valueOf());
		}
	},

	onrecievehttprequest: function(e) {
		Browser.httpCache[Browser.urlToId(Browser.currentRequest)] = e.content;
		Browser.show(Browser.currentRequest);

		Browser.currentRequest = "";
	},

	onslideleft: function(e) {
		var pos = e.coordinates[0];
		if(!isNaN(pos)) {
			document.getElementById(Browser.targets[Browser.currentTarget?0:1]).style.left = pos + "px";
			document.getElementById(Browser.targets[Browser.currentTarget]).style.left = (pos+Browser.targetWidth) + "px";
		}
	},

	onslideright: function(e) {
		var pos = e.coordinates[0];
		if(!isNaN(pos)) {
			document.getElementById(Browser.targets[Browser.currentTarget]).style.top = "0px";
			document.getElementById(Browser.targets[Browser.currentTarget]).style.left = pos + "px";
			document.getElementById(Browser.targets[Browser.currentTarget?0:1]).style.left = (pos+Browser.targetWidth) + "px";
		}
	},

	urlToId: function(url) {
		return unescape(url).replace(/[^a-zA-Z0-9]/g,"-");	
	}
}