JAME.Package('JAME.ASYNC');

JAME.ASYNC = {

	expanded          : '580px',
	collapsed         : '580px',
	swfId             : 'website-flash',
	htmlId            : 'website',
    domain            : 'salomon.comquest.co.jp',
    baseURI           : '/ski/',
    appendQueryString : 'output=raw',
	displayHTMLEffect : {
		duration:800,
		easing:JAME.FX.Transition.Sine.Out
	},
	caching           : false,
	Exts        : {'html':1},


	_activeXHR        : undefined,
    _DOMAINREGEX      : function () {
		var reg = new RegExp(JAME.ASYNC.domain);
		JAME.ASYNC._DOMAINREGEX=reg;
	},
	_timer            : undefined,
    _loaded           : {},
	_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(url.match('#')){
			url = url.replace('#','');
		}

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

			e.preventDefault();                     //do not jump to the page
			var URLElements = getValue(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         = form.action+'?'+queryString;
		   		var URLElements = getValue(url);
				queryString = null;
		   		SWFAddress.setValue(URLElements[1]);
			}  
			URLElements = null;
			url         = null;
		}
	},

	_init     : function() {

		if(JAME.ASC && JAME.ASC.Settings) {
			for(var setting in JAME.ASC.Settings) JAME.ASYNC[setting]=JAME.ASC.Settings[setting];
		};
		JAME.ASYNC._DOMAINREGEX();
		if(window.attachEvent) JAME.ASYNC.caching=false;

		JAME.ASYNC.swf        = JAME.$(JAME.ASYNC.swfId);
		JAME.ASYNC.html       = JAME.$(JAME.ASYNC.htmlId);

 		document.onclick  = JAME.ASYNC._handleOnClick;

	},

    _controller : function() {

		var address = SWFAddress.getValue();

		window.uri = address;
		if(/\.x(ht)*ml/.test(address)) return;
		if(/\/$/.test(address) && JAME.ASYNC._counter==0) {
			JAME.ASYNC.Events.dispatch('onPreLoadHTML');
			JAME.ASYNC.Events.dispatch('onPreInsertLoadHTML');

			JAME.ASYNC.LOADING=false;
			JAME.ASYNC.closePreLoader();
			JAME.ASYNC._counter++;
			return;
		}
		if (/\.html/.test(address) || (/\/$/.test(address) && JAME.ASYNC._counter>0) ) {
			JAME.ASYNC.loadContents(address);
			address = null;
			return;
		}


		address = null;
		JAME.ASYNC._counter++;

		JAME.ASYNC.showSWF();
		JAME.ASYNC.hideHTML();

		if(JAME.ASYNC._counter==1) return;

		JAME.ASYNC.Events.dispatch('onLoadSWF');
		JAME.ASYNC.Events.dispatch('onLoad','swf');

	},

	_cleanOutXHR : function() {

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

	_getCache : function(targeturl) {

		if(JAME.ASYNC.caching && JAME.ASYNC._loaded[targeturl])  {

   			JAME.DOM.insertAfter(JAME.ASYNC._loaded[targeturl],JAME.ASYNC.html);

				if(JAME.ASYNC.html)
				JAME.ASYNC.html.parentNode.removeChild(JAME.ASYNC.html);		
			JAME.ASYNC.html=JAME.ASYNC._loaded[targeturl];
			JAME.ASYNC._loaded[targeturl]= JAME.ASYNC.html.cloneNode(true); // data get out of sync so synchronize

			JAME.ASYNC.hideSWF();

			JAME.ASYNC.showHTML();

			JAME.ASYNC.Events.dispatch('onLoadHTML',1);
			JAME.ASYNC.Events.dispatch('onLoad',1);

			return true;
		
		}
		return false;

	},

    loadContents : function (targeturl) {

		JAME.ASYNC._cleanOutXHR();

		targeturl = targeturl.replace('/','');

		if(JAME.ASYNC._getCache(targeturl)) return;

	
		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.hideSWF();
					JAME.ASYNC.html.innerHTML=resp;
					var container = JAME.ASYNC.html.getElementsByTagName('div')[0];
					if(container)   JAME.CSS.setStyles(container,{position:'relative',left:-840});
					JAME.ASYNC.PreLoadImages(JAME.ASYNC.html.getElementsByTagName('*'));
					JAME.ASYNC.Events.dispatch('onPreInsertLoadHTML',resp);

					JAME.ASYNC.Events.dispatch('onPostInsertLoadHTML');

					if(JAME.ASYNC.caching)
					      JAME.ASYNC._loaded[targeturl]= JAME.ASYNC.html.cloneNode(true); 

					clearTimeout(JAME.ASYNC._timer);
					JAME.ASYNC._activeXHR = null;
					JAME.ASYNC.LOADING=false;
			    	JAME.ASYNC.showHTML();

					JAME.ASYNC.Events.dispatch('onLoadHTML');
					JAME.ASYNC.Events.dispatch('onLoad');
				},
				onError : function(){
					var resp = JAME.ASYNC._activeXHR.xhr.responseText;
					JAME.ASYNC.hideSWF();
					JAME.ASYNC.html.innerHTML=resp;
					var container = JAME.ASYNC.html.getElementsByTagName('div')[0];
					if(container)   JAME.CSS.setStyles(container,{position:'relative',left:-840});
					JAME.ASYNC.PreLoadImages(JAME.ASYNC.html.getElementsByTagName('*'));
					JAME.ASYNC.Events.dispatch('onPreInsertLoadHTML',resp);

					JAME.ASYNC.Events.dispatch('onPostInsertLoadHTML');

					if(JAME.ASYNC.caching)
					      JAME.ASYNC._loaded[targeturl]= JAME.ASYNC.html.cloneNode(true); 

					clearTimeout(JAME.ASYNC._timer);
					JAME.ASYNC._activeXHR = null;
					JAME.ASYNC.LOADING=false;
			    	JAME.ASYNC.showHTML();

					JAME.ASYNC.Events.dispatch('onLoadHTML');
					JAME.ASYNC.Events.dispatch('onLoad');

				}
	    	})

		},100);

    },


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

	showHTML : function() {
		new JAME.FX({duration:100}).Tween(JAME.ASYNC.html,{opacity:[1],display:['block']});
	},
	hideHTML : function() {
		JAME.ASYNC.html.style.display='none';
	},
	showSWF : function() {
		JAME.$(JAME.ASYNC.swfId).style.display = 'block';
		JAME.$(JAME.ASYNC.swfId).style.height  = JAME.ASYNC.expanded;
	},
	hideSWF : function() {
		//JAME.$(JAME.ASYNC.swfId).style.display = 'none';
		JAME.$(JAME.ASYNC.swfId).style.height  = '0px';
	},
    moveHeight : function(action,from,to) {

		return true;
    }


};
JAME.ASYNC.Events = new JAME.Events.EventDispatcher();
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(JAME.ASYNC.baseURI);
}
SWFAddress.addEventListener(SWFAddressEvent.CHANGE,JAME.ASYNC._controller);

/*--------------------*/
/*PRELOADER----------*/
/*------------------*/


JAME.ASYNC.LOADED     = 0;
JAME.ASYNC.IMG_NUMBER = 0;
JAME.ASYNC.STEP       = 0;
JAME.ASYNC.IMG_LENGTH = 0;
JAME.ASYNC.LOADING    = true;
JAME.ASYNC.IMGloader = function(url,elm) {
			if(!url || (elm && elm.complete)) {
				JAME.ASYNC.LOADED++;
				 JAME.ASYNC.flush();
				 return;
			}

			var img = new Image();

			img.onload=function() {
				JAME.ASYNC.LOADED++;
				setTimeout(function() { JAME.ASYNC.flush(); },80); //ie hangs if too much images too load
				JAME.ASYNC.Events.dispatch('onLoadProgress');
			};

			img.onerror = img.onabort= function() {
				JAME.ASYNC.LOADED++;
				JAME.ASYNC.flush();
				JAME.ASYNC.Events.dispatch('onLoadProgress');
			};
			img.src=url;
};

JAME.ASYNC.Queue = new JAME.Util.Queue();

JAME.ASYNC.getImages = function(elms) {

	for(var i=0,ln=elms.length;i<ln;i++){

			if(elms[i].nodeName.toLowerCase()==='img' && /jpe*g|gif|png/.test(elms[i].src)) {
				(function(n) {
					if(elms[n]) {
						if(elms[n].src) {
							if(elms[n].complete) return;
							var src = elms[n].src;
							JAME.ASYNC.Queue.queue(function() { 
								JAME.ASYNC.IMGloader(src,elms[n]);
							});
						}
					}
				})(i);
			}
			else if(JAME.CSS.getStyle(elms[i],'backgroundImage')!='none') {
				var url = JAME.CSS.getStyle(elms[i],'backgroundImage').substring(4,JAME.CSS.getStyle(elms[i],'backgroundImage').length-1);
				url = url.replace('"','').replace('"','');
				if(url) { 
					JAME.ASYNC.Queue.queue(function() { 
						JAME.ASYNC.IMGloader(url); 
					});
				}
			}
	};
};

JAME.ASYNC.closePreLoader = function() {

	if(JAME.ASYNC.LOADED>=JAME.ASYNC.IMG_NUMBER && !JAME.ASYNC.LOADING) {

		if(JAME.$('jame-loader') && (JAME.CSS.getStyle(JAME.$('jame-loader'),'z-index')>0 || JAME.CSS.getStyle(JAME.$('jame-loader'),'z-index')==='auto'))  {       
			new JAME.FX().Tween(JAME.$('jame-loader'),{opacity:[1,0],zIndex:[10,-1],display:['block','none']});
			if(JAME.$('jame-loader-container')) new JAME.FX({duration:800}).Tween(JAME.$('jame-loader-container'),{opacity:[1,0],zIndex:[10,-1],display:['block','none']});
		}
		JAME.ASYNC.Events.dispatch('onFullLoad');
		clearInterval(JAME.ASYNC.preInter);
	}

};

JAME.ASYNC.flush = function() {
		JAME.ASYNC.Queue.next();
};

JAME.ASYNC.PreLoadImages  = function(elms) {

	clearInterval(JAME.ASYNC.preInter);
	JAME.ASYNC.Queue = new JAME.Util.Queue();
	JAME.ASYNC.getImages(elms);
	JAME.ASYNC.LOADED=0;
	JAME.ASYNC.IMG_NUMBER = JAME.ASYNC.Queue.q.length;

	JAME.ASYNC.STEP = (getWindowWidth()-25)/JAME.ASYNC.IMG_NUMBER;
	setTimeout(function(){
		JAME.ASYNC.flush();
		JAME.ASYNC.preInter =setInterval(function() {
			JAME.ASYNC.closePreLoader();
		},20);
	},100);


};






/*--------------------*/
/*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=[];
};

function abortJAMELoading(val) {
	JAME.ASYNC.abort=val;
}

JAME.DOM.Ready(function() {


	JAME.ASYNC._init();

	//pre-loader
	var loader = JAME.DOM.createNode('div');
	loader.id='jame-loader';
	var loaderContainer = JAME.DOM.createNode('div');
	loaderContainer.id='jame-loader-container';
	JAME.CSS.setStyles(loaderContainer,{
		position:'absolute',
		top:'0px',
		left:'0px',
		backgroundColor:'#FFFFFF',
		width:'100%',
		height:getWindowHeight(),
		color:'#000000',
		zIndex:500000
	});

	document.body.appendChild(loaderContainer);
	document.body.appendChild(loader);

	JAME.ASYNC.PreLoadImages(parse("*"));

});

JAME.ASYNC.Events.addListener('onLoadSWF',function() {

		if(JAME.ASYNC.abort) {
			JAME.ASYNC.hideHTML();
			JAME.ASYNC.abort=undefined;
			return;
		}

		JAME.ASYNC.showSWF();
		JAME.ASYNC.hideHTML();

});

