/**
 * SWFAddress 2.3: Deep linking for Flash and Ajax <http://www.asual.com/swfaddress/>
 *
 * SWFAddress is (c) 2006-2009 Rostislav Hristov and contributors
 * This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
 *
 */
 
 
if(typeof asual=="undefined")
{
	var asual={}
}
if(typeof asual.util=="undefined"){
	asual.util={}
}
asual.util.Browser=new function(){
	var b=navigator.userAgent.toLowerCase(),
	a=/webkit/.test(b),
	e=/opera/.test(b),
	c=/msie/.test(b)&&!/opera/.test(b),
	d=/mozilla/.test(b)&&!/(compatible|webkit)/.test(b),
	f=parseFloat(c?b.substr(b.indexOf("msie")+4):(b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1]);
	
	this.toString=function(){ 	return"[class Browser]"};
	this.getVersion=function(){return f};
	this.isMSIE=function(){return c};
	this.isSafari=function(){return a};
	this.isOpera=function(){return e};
	this.isMozilla=function(){return d}
};
	
asual.util.Events=new function(){
	var c="DOMContentLoaded",j="onstop",k=window,h=document,b=[],a=asual.util,e=a.Browser,d=e.isMSIE(),g=e.isSafari();
	this.toString=function(){return"[class Events]"};
	this.addListener=function(n,l,m){ 
		b.push({o:n,t:l,l:m});
		if(!(l==c&&(d||g))){
			if(n.addEventListener){
				n.addEventListener(l,m,false)
			}else{
				if(n.attachEvent){
					n.attachEvent("on"+l,m)
				}
			}
		}
	};
	
	this.removeListener=function(p,m,n){
		for(var l=0,o;o=b[l];l++){
			if(o.o==p&&o.t==m&&o.l==n){
				b.splice(l,1);
				break
			}
		}
		if(!(m==c&&(d||g))){
			if(p.removeEventListener){
				p.removeEventListener(m,n,false)
			}else{
				if(p.detachEvent){
					p.detachEvent("on"+m,n)
				}
			}
		}
	};
	
	var i=function(){
		for(var m=0,l;l=b[m];m++){
			if(l.t!=c){
				a.Events.removeListener(l.o,l.t,l.l)
			}
		}
	};
	var f=function(){
		if(h.readyState=="interactive"){
			function l(){
				h.detachEvent(j,l);
				i()
			}
			h.attachEvent(j,l);
			k.setTimeout(function(){h.detachEvent(j,l)},0)
		}
	};
	
	if(d||g){
		(
			function(){
				try{
					if((d&&h.body)||!/loaded|complete/.test(h.readyState)){
						h.documentElement.doScroll("left")
					}
				}catch(m){
				return setTimeout(arguments.callee,0)
				}
				for(var l=0,m;m=b[l];l++){
					if(m.t==c){
						m.l.call(null)
					}
				}
			}
		)()
	}
	if(d){
		k.attachEvent("onbeforeunload",f)
	}
	this.addListener(k,"unload",i)};
	
	asual.util.Functions=new function(){
		this.toString=function(){
			return"[class Functions]"
		};
		this.bind=function(f,b,e){
			for(var c=2,d,a=[];d=arguments[c];c++)
			{
				a.push(d)
			}
			return function(){ return f.apply(b,a) }
		}
	};
	
	var SWFAddressEvent=function(d){
		this.toString=function(){return"[object SWFAddressEvent]"};
		this.type=d;
		this.target=[SWFAddress][0];
		this.value=SWFAddress.getValue();
		this.path=SWFAddress.getPath();
		this.pathNames=SWFAddress.getPathNames();
		this.parameters={};
		
		var c=SWFAddress.getParameterNames();
		for(var b=0,a=c.length;b<a;b++)
		{
			this.parameters[c[b]]=SWFAddress.getParameter(c[b])
		}
		this.parameterNames=c
	};
	
	SWFAddressEvent.INIT="init";
	SWFAddressEvent.CHANGE="change";
	
	var SWFAddress=new function(){
		var _getHash=function(){
				var index=_l.href.indexOf("#");
				return index!=-1?_ec(_dc(_l.href.substr(index+1))):""
		};
		
		var _getWindow=function(){
			try{
				top.document;
				return top
			}catch(e){
				return window
			}
		};
		
		var _strictCheck=function(value,force){
			if(_opts.strict){
				value=force?(value.substr(0,1)!="/"?"/"+value:value):(value==""?"/":value)
			}
			return value
		};
		
		var _ieLocal=function(value,direction){
			return(_msie&&_l.protocol=="file:")?(direction?_value.replace(/\?/,"%3F"):_value.replace(/%253F/,"?")):value
		};
		
		var _searchScript=function(el){
			for(var i=0,l=el.childNodes.length,s;i<l;i++){
				if(el.childNodes[i].src){
					_url=String(el.childNodes[i].src)
				}
				if(s=_searchScript(el.childNodes[i])){return s}
			}
		};
		
		var _titleCheck=function(){
			if(_d.title!=_title&&_d.title.indexOf("#")!=-1){
				_d.title=_title
			}
		};
				
		var _listen=function(){
			if(!_silent){
				var hash=_getHash();
				var diff=!(_value==hash);
				if(_safari&&_version<523){
					if(_length!=_h.length){
						_length=_h.length;
						if(typeof _stack[_length-1]!=UNDEFINED){
							_value=_stack[_length-1]
						}
						_update.call(this)
					}
				}else{
					if(_msie&&diff){
						if(_version<7){
							_l.reload()
						}else{
							this.setValue(hash)
						}
					}else{
						if(diff){
							_value=hash;
							_update.call(this)
						}
					}
				}
				
				if(_msie){
					_titleCheck.call(this)
				}
			}
		};
		
		var _bodyClick=function(e){
			if(_popup.length>0){
				var popup=window.open(_popup[0],_popup[1],eval(_popup[2]));
				if(typeof _popup[3]!=UNDEFINED){
					eval(_popup[3])
				}
			}
			_popup=[]
		};
		
		var _swfChange=function(){
			for(var i=0,id,obj,value=SWFAddress.getValue(),setter="setSWFAddressValue";id=_ids[i];i++)
			{
				obj=document.getElementById(id);
				if(obj){
					if(obj.parentNode&&typeof obj.parentNode.so!=UNDEFINED){
						obj.parentNode.so.call(setter,value)
					}else{
						if(!(obj&&typeof obj[setter]!=UNDEFINED)){
							var objects=obj.getElementsByTagName("object");
							var embeds=obj.getElementsByTagName("embed");
							obj=((objects[0]&&typeof objects[0][setter]!=UNDEFINED)?objects[0]:((embeds[0]&&typeof embeds[0][setter]!=UNDEFINED)?embeds[0]:null))
						}
						if(obj){
							obj[setter](value)	
						}
					}
				}else{
					if(obj=document[id]){
						if(typeof obj[setter]!=UNDEFINED){
							obj[setter](value)
						}
					}
				}
			}
		};
		
		var _jsDispatch=function(type){
			this.dispatchEvent(new SWFAddressEvent(type));
			type=type.substr(0,1).toUpperCase()+type.substr(1);
			if(typeof this["on"+type]==FUNCTION){
				this["on"+type]()
			}
		};
		
		var _jsInit=function(){
			if(_util.Browser.isSafari()){
				_d.body.addEventListener("click",_bodyClick)
			}
			_jsDispatch.call(this,"init")
		};
		var _jsChange=function(){
			_swfChange();
			_jsDispatch.call(this,"change")
		};
		var _update=function(){
			_jsChange.call(this);
			_st(_functions.bind(_track,this),10)
		};
		var _track=function(){
			var value=(_l.pathname+(/\/$/.test(_l.pathname)?"":"/")+this.getValue()).replace(/\/\//,"/").replace(/^\/$/,"");
			var fn=window[_opts.tracker];
			if(typeof fn==FUNCTION){
				fn(value)
			}else{
				if(typeof pageTracker!=UNDEFINED&&typeof pageTracker._trackPageview==FUNCTION){
					pageTracker._trackPageview(value)
				}else{
					if(typeof urchinTracker==FUNCTION){
						urchinTracker(value)
					}
				}
			}
		};
		var _htmlWrite=function(){
			var doc=_iframe.contentWindow.document;
			doc.open();
			doc.write("<html><head><title>"+_d.title+"</title><script>var "+ID+' = "'+_getHash()+'";<\/script></head></html>');
			doc.close()
		};
		var _htmlLoad=function(){
			var win=_iframe.contentWindow;var src=win.location.href;
			_value=(typeof win[ID]!=UNDEFINED?win[ID]:"");
			if(_value!=_getHash()){
				_update.call(SWFAddress);
				_l.hash=_ieLocal(_value,true)
			}
		};
		var _load=function(){
			if(!_loaded){
				_loaded=true;
				if(_msie&&_version<8){
					var iframe='<iframe id="'+ID+'" src="javascript:false;" width="0" height="0"></iframe>';
					_d.body.innerHTML=iframe+_d.body.innerHTML;
					_iframe=_d.getElementById(ID);
					_st(function(){
							_events.addListener(_iframe,"load",_htmlLoad);
							if(typeof _iframe.contentWindow[ID]==UNDEFINED){
								_htmlWrite()
							}
						},50)
				}else{
					if(_safari){
						if(_version<418){
							_d.body.innerHTML+='<form id="'+ID+'" style="position:absolute;top:-9999px;" method="get"></form>';
							_form=_d.getElementById(ID)
						}
						if(typeof _l[ID]==UNDEFINED){
							_l[ID]={}
						}
						if(typeof _l[ID][_l.pathname]!=UNDEFINED){
							_stack=_l[ID][_l.pathname].split(",")
						}
					}
				}
				_st(_functions.bind(function(){_jsInit.call(this);_jsChange.call(this);_track.call(this)},this),1);
				if(_msie&&_version>=8){
					_d.body.onhashchange=_functions.bind(_listen,this);
					_si(_functions.bind(_titleCheck,this),50)
				}else{
					_si(_functions.bind(_listen,this),50)
				}
			}
		};
		var ID="swfaddress",
			FUNCTION="function",
			UNDEFINED="undefined",
			_util=asual.util,
			_browser=_util.Browser,
			_events=_util.Events,
			_functions=_util.Functions,
			_version=_browser.getVersion(),
			_msie=_browser.isMSIE(),
			_mozilla=_browser.isMozilla(),
			_opera=_browser.isOpera(),
			_safari=_browser.isSafari(),
			_supported=false,
			_t=_getWindow(),
			_d=_t.document,
			_h=_t.history,
			_l=_t.location,
			_si=setInterval,
			_st=setTimeout,
			_dc=decodeURI,
			_ec=encodeURI,
			_iframe,_form,_url,_title=_d.title,
			_length=_h.length,
			_silent=false,
			_loaded=false,
			_justset=true,
			_juststart=true,
			_ref=this,
			_stack=[],
			_ids=[],
			_popup=[],
			_listeners={},
			_value=_getHash(),
			_opts={history:true,strict:true};
			_supported=(_mozilla&&_version>=1)||(_msie&&_version>=6)||(_opera&&_version>=9.5)||(_safari&&_version>=312);
		
		if(_supported){
			for(var i=1;i<_length;i++){
				_stack.push("")
			}
			_stack.push(_getHash());
			if(_msie&&_l.hash!=_getHash()){
				_l.hash="#"+_ieLocal(_getHash(),true)
			}
			if(_opera){
				history.navigationMode="compatible"
			}
			_searchScript(document);
			var _qi=_url.indexOf("?");
			if(_url&&_qi>-1){
				var param,params=_url.substr(_qi+1).split("&");
				for(var i=0,p;p=params[i];i++){
					param=p.split("=");
					if(/^(history|strict)$/.test(param[0])){
						_opts[param[0]]=(isNaN(param[1])?/^(true|yes)$/i.test(param[1]):(parseInt(param[1])!=0))
					}
					if(/^tracker$/.test(param[0])){
						_opts[param[0]]=param[1]
					}
				}
			}
					
			if(_msie){
				_titleCheck.call(this)
			}
			if(window==_t){
				_events.addListener(document,"DOMContentLoaded",_functions.bind(_load,this))
			}
			_events.addListener(_t,"load",_functions.bind(_load,this))
		}else{
			if((!_supported&&_l.href.indexOf("#")!=-1)||(_safari&&_version<418&&_l.href.indexOf("#")!=-1&&_l.search!="")){
				_d.open();
				_d.write('<html><head><meta http-equiv="refresh" content="0;url='+_l.href.substr(0,_l.href.indexOf("#"))+'" /></head></html>');
				_d.close()
			}else{
				_track()
			}
		}
		
		this.toString=function(){return"[class SWFAddress]"};
		this.back=function(){_h.back()};
		this.forward=function(){_h.forward()};
		this.up=function(){
			var path=this.getPath();
			this.setValue(path.substr(0,path.lastIndexOf("/",path.length-2)+(path.substr(path.length-1)=="/"?1:0)))
		};
		this.go=function(delta){
			_h.go(delta)
		};
		this.href=function(url,target){
			target=typeof target!=UNDEFINED?target:"_self";
			if(target=="_self"){
				self.location.href=url
			}else{
				if(target=="_top"){
					_l.href=url
				}else{
					if(target=="_blank"){
						window.open(url)
					}else{
						_t.frames[target].location.href=url
					}
				}
			}
		};
		this.popup=function(url,name,options,handler){
			try{
				var popup=window.open(url,name,eval(options));
				if(typeof handler!=UNDEFINED){
					eval(handler)
				}
			}catch(ex){}
			
			_popup=arguments
		};
		this.getIds=function(){
			return _ids
		};
		this.getId=function(index){
			return _ids[0]
		};
		this.setId=function(id){
			_ids[0]=id
		};
		this.addId=function(id){
			this.removeId(id);
			_ids.push(id)
		};
		this.removeId=function(id){
			for(var i=0;i<_ids.length;i++){
				if(id==_ids[i]){
					_ids.splice(i,1);break
				}
			}
		};
		this.addEventListener=function(type,listener){
			if(typeof _listeners[type]==UNDEFINED){
				_listeners[type]=[]
			}
			_listeners[type].push(listener)
		};
		this.removeEventListener=function(type,listener){
			if(typeof _listeners[type]!=UNDEFINED){
				for(var i=0,l;l=_listeners[type][i];i++){
				if(l==listener){break}
				}
				_listeners[type].splice(i,1)
			}
		};
		this.dispatchEvent=function(event){
			if(this.hasEventListener(event.type)){
				event.target=this;
				for(var i=0,l;l=_listeners[event.type][i];i++){
					l(event)
				}
				return true
			}
			return false
		};
		
		this.hasEventListener=function(type){
			return(typeof _listeners[type]!=UNDEFINED&&_listeners[type].length>0)
		};
		this.getBaseURL=function(){
			var url=_l.href;
			if(url.indexOf("#")!=-1){
				url=url.substr(0,url.indexOf("#"))
			}
			if(url.substr(url.length-1)=="/"){
				url=url.substr(0,url.length-1)
			}
			return url
		};
		
		this.getStrict=function(){return _opts.strict};
		this.setStrict=function(strict){_opts.strict=strict};
		this.getHistory=function(){return _opts.history};
		this.setHistory=function(history){_opts.history=history};
		this.getTracker=function(){return _opts.tracker};
		this.setTracker=function(tracker){_opts.tracker=tracker};
		this.getTitle=function(){return _d.title};
		this.setTitle=function(title){
			if(!_supported){return null}
			if(typeof title==UNDEFINED){return}
			if(title=="null"){title=""}
			title=_dc(title);
			_st(function(){
				_title=_d.title=title;
				if(_juststart&&_iframe&&_iframe.contentWindow&&_iframe.contentWindow.document){
					_iframe.contentWindow.document.title=title;
					_juststart=false
				}
				if(!_justset&&_mozilla){
					_l.replace(_l.href.indexOf("#")!=-1?_l.href:_l.href+"#")
				}
				_justset=false
			},50)
		};
		this.getStatus=function(){return _t.status};
		this.setStatus=function(status){
			if(!_supported){return null}
			if(typeof status==UNDEFINED){return}
			if(status=="null"){status=""}
			status=_dc(status);
			if(!_safari){
				status=_strictCheck((status!="null")?status:"",true);
				if(status=="/"){status=""}
				if(!(/http(s)?:\/\//.test(status))){
					var index=_l.href.indexOf("#");
					status=(index==-1?_l.href:_l.href.substr(0,index))+"#"+status
				}
				_t.status=status
			}
		};
		this.resetStatus=function(){_t.status=""};
		this.getValue=function(){
			if(!_supported){return null}
			return _dc(_strictCheck(_ieLocal(_value,false),false))
		};
		
		this.setValue=function(value){
			if(!_supported){return null}
			if(typeof value==UNDEFINED){return}
			if(value=="null"){value=""}
			value=_ec(_dc(_strictCheck(value,true)));
			if(value=="/"){value=""}
			if(_value==value){return}
			_justset=true;
			_value=value;
			_silent=true;
			_update.call(SWFAddress);
			_stack[_h.length]=_value;
			if(_safari){
				if(_opts.history){
					_l[ID][_l.pathname]=_stack.toString();
					_length=_h.length+1;
					if(_version<418){
						if(_l.search==""){
							_form.action="#"+_value;_form.submit()
						}
					}else{
						if(_version<523||_value==""){
							var evt=_d.createEvent("MouseEvents");
							evt.initEvent("click",true,true);
							var anchor=_d.createElement("a");
							anchor.href="#"+_value;
							anchor.dispatchEvent(evt)
						}else{
							_l.hash="#"+_value
						}
					}
				}else{
					_l.replace("#"+_value)
				}
			}else{
				if(_value!=_getHash()){
					if(_opts.history){
						_l.hash="#"+_ieLocal(_value,true)
					}else{
						_l.replace("#"+_value)
					}
				}
			}
			if((_msie&&_version<8)&&_opts.history){
				_st(_htmlWrite,50)
			}
			if(_safari){
				_st(function(){_silent=false},1)
			}else{
				_silent=false
			}
		};
		this.getPath=function(){
			var value=this.getValue();
			var value=SWFAddress.getValue();
			if(value.indexOf("?")!=-1){
				return value.split("?")[0]
			}else{
				if(value.indexOf("#")!=-1){
					return value.split("#")[0]
				}else{
					return value
				}
			}
		};
		this.getPathNames=function(){
			var path=this.getPath();
			var names=path.split("/");
			if(path.substr(0,1)=="/"||path.length==0){
				names.splice(0,1)
			}
			if(path.substr(path.length-1,1)=="/"){
				names.splice(names.length-1,1)
			}
			return names
		};
		this.getQueryString=function(){
			var value=this.getValue();
			var index=value.indexOf("?");
			return(index!=-1&&index<value.length)?value.substr(index+1):""
		};
		this.getParameter=function(param){
			var value=this.getValue();
			var index=value.indexOf("?");
			if(index!=-1){
				value=value.substr(index+1);
				var params=value.split("&");
				var p,i=params.length;
				while(i--){
					p=params[i].split("=");
					if(p[0]==param){
						return p[1]
					}
				}
			}
		};
		this.getParameterNames=function(){
			var value=this.getValue();
			var index=value.indexOf("?");
			var names=[];
			if(index!=-1){
				value=value.substr(index+1);
				if(value!=""&&value.indexOf("=")!=-1){
					var params=value.split("&");
					var i=0;
					while(i<params.length){
						names.push(params[i].split("=")[0]);
						i++
					}
				}
			}
			return names
		};
		this.onInit=null;
		this.onChange=null;
		(function(){
			var _args;
			if(typeof FlashObject!=UNDEFINED){
				SWFObject=FlashObject
			}
			if(typeof SWFObject!=UNDEFINED&&SWFObject.prototype&&SWFObject.prototype.write){
				var _s1=SWFObject.prototype.write;
				SWFObject.prototype.write=function(){
					_args=arguments;
					if(this.getAttribute("version").major<8){
						this.addVariable("$swfaddress",SWFAddress.getValue());
						((typeof _args[0]=="string")?document.getElementById(_args[0]):_args[0]).so=this
					}
					var success;if(success=_s1.apply(this,_args)){
						_ref.addId(this.getAttribute("id"))
					}
					return success
				}
			}
			if(typeof swfobject!=UNDEFINED){
				var _s2r=swfobject.registerObject;
				swfobject.registerObject=function(){
					_args=arguments;
					_s2r.apply(this,_args);
					_ref.addId(_args[0])
				};
				var _s2c=swfobject.createSWF;
				swfobject.createSWF=function(){
					_args=arguments;
					_s2c.apply(this,_args);
					_ref.addId(_args[0].id)
				};
				var _s2e=swfobject.embedSWF;
				swfobject.embedSWF=function(){
					_args=arguments;
					if(typeof _args[8]==UNDEFINED){
						_args[8]={}
					}
					if(typeof _args[8].id==UNDEFINED){
						_args[8].id=_args[1]
					}
					_s2e.apply(this,_args);
					_ref.addId(_args[8].id)
				}
			}
			if(typeof UFO!=UNDEFINED){
				var _u=UFO.create;UFO.create=function(){
					_args=arguments;
					_u.apply(this,_args);
					_ref.addId(_args[0].id)
				}
			}
			if(typeof AC_FL_RunContent!=UNDEFINED){
				var _a=AC_FL_RunContent;
				AC_FL_RunContent=function(){
					_args=arguments;
					_a.apply(this,_args);
					for(var i=0,l=_args.length;i<l;i++){
						if(_args[i]=="id"){
							_ref.addId(_args[i+1])
						}
					}
				}
			}
		}
		)()
	};
