JAME.Package('JAME.ASYNC');

var parse = JAME.CSS.Selector.parse;

JAME.ASYNC = {
	htmlId            : 'website',
    domain            : window.location.hostname,
    baseURI           : '/',
    appendQueryString : 'output=raw&ajax=true',
	Exts        : {'html':1},
	_activeXHR        : undefined,
    _DOMAINREGEX      : function () {
		var reg = new RegExp(JAME.ASYNC.domain);
		JAME.ASYNC._DOMAINREGEX=reg;
	},
	_timer            : undefined,
	_counter          : 0,
	_handleOnClick : function(e) {

		e = JAME.Events.Normalize(e);
		var url = e.target.href;

		if(e.target.nodeName.toLowerCase()=='img') {
			url = e.target.parentNode.href;
		}

		if (! url) return;                          //it s not a link, return soon

		if(!(new RegExp(JAME.ASYNC.baseURI).test(url))) return;

		for(var ext in JAME.ASYNC.Exts) {
			if(!new RegExp('\.'+ext).test(url)) return;
		}

		if(JAME.ASYNC._DOMAINREGEX.test(url)) {       //if this is a same-domain link

			e.preventDefault();                     //do not jump to the page
			var URLElements = getValue(window.location.hostname+''+url);        //get the anchor part
			if(!/send/.test(e.target.id))  {  
				var updateWithUrl=    URLElements[1]; 
				if(updateWithUrl=='' && URLElements[2])  
					updateWithUrl= URLElements[2];
           		SWFAddress.setValue(updateWithUrl);  //and then set the anchor
			}
			else { //links containing an id with '****send****' are considered to be submit button
		   		var form = JAME.ASYNC.Util.getParentForm(e.target);
		   		if(!form) {
					form=null;
					throw new Error('Expecting the link to be within a form but could not find it');
					return false;
				}
		   		var queryString = JAME.Form.serialize(form);
		   		var url         = window.location.hostname+form.action+'?'+queryString;
		   		var URLElements = getValue(url);
				queryString = null;
		   		SWFAddress.setValue(URLElements[1]);
			}  
			URLElements = null;
			url         = null;
		}
	},

	_init     : function() {
		//setting point
		if(JAME.ASC && JAME.ASC.Settings) {
			for(var setting in JAME.ASC.Settings) JAME.ASYNC[setting]=JAME.ASC.Settings[setting];
		};
		JAME.ASYNC._DOMAINREGEX();
		JAME.ASYNC.html   = JAME.$(JAME.ASYNC.htmlId);
 		document.onclick  = JAME.ASYNC._handleOnClick;
	},

    _controller : function() {

		if(JAME.FIRST_LOAD) return;
	
		var address = SWFAddress.getValue();
		window.uri = address;

		if(/\.x(ht)*ml/.test(address)) return;

		if (/\.html/.test(address) || (/\/$/.test(address)) ) {
			JAME.ASYNC.loadContents(address);
			address = null;
			return;
		}

		address = null;
		JAME.ASYNC._counter++;
		if(JAME.ASYNC._counter==1) return;

	},

	_cleanOutXHR : function() {
		if(JAME.ASYNC._activeXHR || JAME.ASYNC._timer)  {
			JAME.ASYNC.abortXHR();
			clearTimeout(JAME.ASYNC._timer);
		}
	},

    loadContents : function (targeturl) {

		JAME.ASYNC._cleanOutXHR();

		targeturl = targeturl.replace('/','');
	
		JAME.ASYNC.Events.dispatch('onPreLoadHTML');

		var sep = (/\?/.test(targeturl)) ? '&amp;' : '?';

		JAME.ASYNC._timer = setTimeout(function() {

	    	JAME.ASYNC._activeXHR =  new JAME.Ajax({
				timeout:8000,
				url : JAME.ASYNC.baseURI+targeturl+sep+JAME.ASYNC.appendQueryString,
				onSuccess : function(resp) {

					JAME.ASYNC.Events.dispatch('onPreInsertLoadHTML',resp);
					JAME.ASYNC.html.innerHTML=resp;
					JAME.ASYNC.Events.dispatch('onPostInsertLoadHTML');

					JAME.ASYNC.Preloader = new JAME.Components.Preloader(JAME.ASYNC.html.getElementsByTagName('img'));

					JAME.ASYNC.Preloader.addListener('onLoadComplete',function() {
						JAME.ASYNC.Events.dispatch('onFullLoad');
					})
					JAME.ASYNC.Preloader.next();					
					clearTimeout(JAME.ASYNC._timer);
					JAME.ASYNC._activeXHR = null;
			    	JAME.ASYNC.showHTML();
				},
				onError : function(){
					JAME.ASYNC.Events.dispatch('onPreInsertLoadHTML',resp);
					JAME.ASYNC.html.innerHTML=resp;
					JAME.ASYNC.Events.dispatch('onPostInsertLoadHTML');

					JAME.ASYNC.Preloader = new JAME.Components.Preloader(JAME.ASYNC.html.getElementsByTagName('img'));
					JAME.ASYNC.Preloader.addListener('onLoadComplete',function() {
						JAME.ASYNC.Events.dispatch('onFullLoad');
					})
					JAME.ASYNC.Preloader.next();					
					clearTimeout(JAME.ASYNC._timer);
					JAME.ASYNC._activeXHR = null;
			    	JAME.ASYNC.showHTML();
				}
	    	})
		},100);
    },

	abortXHR : function() {
		if(JAME.ASYNC._activeXHR) JAME.ASYNC._activeXHR.abortXHR();
	},

	showHTML : function() {
		new JAME.FX.Tween(JAME.ASYNC.html,{opacity:[1],display:['block']},{duration:100});
	}
};


JAME.ASYNC.Events = new JAME.Events.EventDispatcher();
JAME.ASYNC.Preloader = new JAME.Events.EventDispatcher();//will be overwritten
JAME.Package('JAME.ASYNC.Util');

JAME.ASYNC.Util={
	getParentForm : function(elm) {
		do {
			if(elm.nodeName.toLowerCase()=='form') return elm;
			elm=elm.parentNode;
		} while(elm);
		return;
	}
};

window.getValue = function(url) {
	return url.split(window.location.hostname+''+JAME.ASYNC.baseURI);
}
SWFAddress.addEventListener(SWFAddressEvent.CHANGE,JAME.ASYNC._controller);

/*--------------------*/
/*GARBAGE COLLECTOR--*/
/*------------------*/
JAME.ASYNC.stack=[];
function purge(d) {
	if(typeof d!=='object') return;
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') d[n] = null;
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) purge(d.childNodes[i]);
    }
}

JAME.ASYNC.garbageCollect = function() {
		for(var i=0,ln=JAME.ASYNC.stack.length;i<ln;i++) {  (function() { var n=i; purge(JAME.ASYNC.stack[n]); delete JAME.ASYNC.stack[n];})();}
		JAME.ASYNC.stack=null;
		JAME.ASYNC.stack=[];
};

JAME.FIRST_LOAD=true;
JAME.DOM.Ready(function() {
	JAME.ASYNC._init();
});

