/**
 * 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>
 *
 */
 
 function stripLeadingSlash(value) {
	if( value.substr(0,1) == "/" ) {
		value = value.substr(1,value.length-1);
	}
	return value;
 }
 
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=stripLeadingSlash(_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="#"+stripLeadingSlash(_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="#"+stripLeadingSlash(_value);
					}
				}
			} else {
				_l.replace("#"+_value)
			}
		} else {
			if(_value!=_getHash()) {
				if(_opts.history) {
					_l.hash="#"+stripLeadingSlash(_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])
					}
				}
			}
		}
	}
)
()
};
