

var ajaxPages = {
	aPages: new Array(),
	aRejected: new Array(),
	
	is: {
		loading: false
	},
	
	def: {
		xml: "/xml",
		hfrom: 0
	},
	
	tries: {
		titles: 0
	},

	init: function(){
		this.current = null;
		this.oInfo = $(".information .wrapper").eq(0);
		this.putTo = this.oInfo.find(".content");
		this.timeID = setInterval(function(){
			if(ajaxPages.is.loading)
				ajaxPages.check();
		}, 1000);
		this.gettitles();
	},
	load: function(obj){
		this.is.loading = true;
		var p;
		if(!(p = this.getpage(obj))){
			this.aPages.push((new ajaxPage()).init(obj, this.aPages.length));
			this.current = this.aPages.length-1;
		} else {
			this.current = p.index;
		}
		this.hide();
		this.check();
	},
	check: function(){
		if(this.current != null){
			if(this.aPages[this.current].is.loaded){
				this.show();
			}
		}
	},
	addCurrent: function(obj){
		this.aPages.push((new ajaxPage()).init(obj, this.aPages.length, this.putTo.find("div.content-page")));
		this.current = this.aPages.length-1;
	},
	
	show: function(){
		this.is.loading = false;

//		Create AJAX urls
//		window.location.hash = "#" + this.aPages[this.current].removestatus().putdata(this.putTo).show().rootURL;

		this.aPages[this.current].removestatus().putdata(this.putTo).show();
	},
	hide: function(){
		ajaxPages.def.hfrom = ajaxPages.oInfo.height();
		ajaxPages.oInfo.css({ height: ajaxPages.def.hfrom });

		this.eachShowed(function(){
			this.hide();
		})
		
	},
	remove: function(i){
		this.aPages.splice(i, 1);
		this.is.loading = false;
	},
	
	eachShowed: function(callback){
		this.length = 0;
		for (var i=0; i < this.aPages.length; i++) {
			if(this.aPages[i].is.showed){
				callback.apply(this.aPages[i]);
				this.length++;
			}
		};
	},
	each: function(callback){
		for (var i=0; i < this.aPages.length; i++) {
			callback.apply(this.aPages[i]);
		};
	},
	getpage: function(obj){
		for (var i=0; i < this.aPages.length; i++) {
			if(this.aPages[i].rootURL == ajaxGetURL(obj))
				return {
					index: i,
					page: this.aPages[i]
				};
		};
		return false;
	},
	gettitles: function(){
		if(!this.titles){
			$.ajax({
				url: ajaxPages.def.xml + "/_titles/",
				success: function(data, status){
					ajaxPages.titles = $(data).eq(1);
				},
				error: function(){
					ajaxPages.tries.titles++;
					if(ajaxPages.tries.titles < 3){
						ajaxPages.gettitles();
					}
				}
			})
		}
	}
}

function ajaxGetURL(obj){
	return "/" + $(obj).attr("href").match(/((.*?)\.(.{2,3}))?\/(.*)/)[4];
}

// Page object;
function ajaxPage(){}
ajaxPage.prototype = {
	init: function(obj, index, data){
		this.is = {
			put: false,
			loaded: false,
			showed: false
		};
		
		this.index = index;
		this.tries = 0;
		
		this.ptr = $(obj);
		this.sClass = this.ptr.attr("class");
		this.define();
		this.removestatus();
		this.getdata(data);
		
		return this;
	},
	define: function(){
		this.rootURL = ajaxGetURL(this.ptr);
		this.xmlURL = ajaxPages.def.xml + this.rootURL;
	},
	
	addstatus: function(){
		this.ptr.append("<img class='ajax-loader' src='/i/ajax-loader.gif' />");
		return this;
	},
	removestatus: function(){
		this.ptr.find("img.ajax-loader, sup.ajax-rejected").remove();
		return this;
	},
	markASreject: function(){
		this.ptr.append("<sup class='ajax-rejected'>&times;</sup>");
	},
	setTitle: function(){
		var oThis = this;
		if(ajaxPages.titles){
			var t;
			ajaxPages.titles.find("title").each(function(){
				if(this.getAttribute("for") == oThis.rootURL)
					t = $(this)
			})
			if(t){
				document.title = t.text();
			}
		}
	},
	
	getdata: function(data){
		var oThis = this;
		if(data){
			this.is.loaded = true;
			this.is.put = true;
			this.is.showed = true;
			this.oData = data;
			_prepareData.set(this.oData);
		} else {
			this.addstatus();
			$.ajax({
				url: this.xmlURL,
				success: function(data, status){
					oThis.xData = data;
					oThis.is.loaded = true;
				},
				error: function(){
					oThis.tries++;
					if(oThis.tries < 3){
						oThis.getdata();
					} else {
						oThis.removestatus();
						oThis.markASreject();
						ajaxPages.remove(oThis.index);
					}
				}
			})
		}
	},
	putdata: function(putTo){
		if(!this.is.put){
			this.is.put = true;
			var eq = 1;
			if($.browser.msie) eq = 0;
			this.oData = $(this.xData).eq(eq).appendTo(putTo).hide();
			_prepareData.set(this.oData);
		}
		return this;
	},
	
	show: function(){
//		this.oData.show();
		var oThis = this;

		ajaxPages.oInfo.css({ height: "auto" });
		this.oData.show();
		var h = ajaxPages.oInfo.height();

		ajaxPages.oInfo.css({ height: ajaxPages.def.hfrom }).animate({ height: h }, 800, function(){
			$(this).css({ height: "auto" });
			oThis.is.showed = true;
			$("." + oThis.sClass).addClass("srv-selected");
			oThis.setTitle();
		})
		return this;
	},
	hide: function(){
		this.oData.hide();
		this.is.showed = false;
		$("." + this.sClass).removeClass("srv-selected");
		return this;
	}
	
}


