/**
 * SWFAddress 2.4: 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";
SWFAddressEvent.INTERNAL_CHANGE = "internalChange";
SWFAddressEvent.EXTERNAL_CHANGE = "externalChange";
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) {
		if (el.childNodes) {
			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, false)
				}
			} else {
				if (_msie && diff) {
					if (_version < 7) {
						_l.reload()
					} else {
						this.setValue(hash)
					}
				} else {
					if (diff) {
						_value = hash;
						_update.call(this, false)
					}
				}
			}
			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(internal) {
		_jsChange.call(this);
		if (internal) {
			_jsDispatch.call(this, "internalChange")
		} else {
			_jsDispatch.call(this, "externalChange")
		}
		_st(_functions.bind(_track, this), 10)
	};
	var _track = function() {
		var value = (_l.pathname + (/\/$/.test(_l.pathname) ? "" : "/") + this
				.getValue()).replace(/\/\//, "/").replace(/^\/$/, "");
		var fn = _t[_opts.tracker];
		if (typeof fn == FUNCTION) {
			fn(value)
		} else {
			if (typeof _t.pageTracker != UNDEFINED
					&& typeof _t.pageTracker._trackPageview == FUNCTION) {
				_t.pageTracker._trackPageview(value)
			} else {
				if (typeof _t.urchinTracker == FUNCTION) {
					_t.urchinTracker(value)
				}
			}
		}
	};
	var _htmlWrite = function() {
		var doc = _frame.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 = _frame.contentWindow;
		var src = win.location.href;
		_value = (typeof win[ID] != UNDEFINED ? win[ID] : "");
		if (_value != _getHash()) {
			_update.call(SWFAddress, false);
			_l.hash = _ieLocal(_value, TRUE)
		}
	};
	var _load = function() {
		if (!_loaded) {
			_loaded = TRUE;
			if (_msie && _version < 8) {
				var frameset = _d.getElementsByTagName("frameset")[0];
				_frame = _d.createElement((frameset ? "" : "i") + "frame");
				if (frameset) {
					frameset.insertAdjacentElement("beforeEnd", _frame);
					frameset[frameset.cols ? "cols" : "rows"] += ",0";
					_frame.src = "javascript:false";
					_frame.noResize = true;
					_frame.frameBorder = _frame.frameSpacing = 0
				} else {
					_frame.src = "javascript:false";
					_frame.style.display = "none";
					_d.body.insertAdjacentElement("afterBegin", _frame)
				}
				_st(function() {
					_events.addListener(_frame, "load", _htmlLoad);
					if (typeof _frame.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", TRUE = true, FALSE = false, _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, _frame, _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
	};
	if (_msie && _d.documentMode && _d.documentMode != _version) {
		_version = _d.documentMode != 8 ? 7 : 8
	}
	_supported = (_mozilla && _version >= 1) || (_msie && _version >= 6)
			|| (_opera && _version >= 9.5) || (_safari && _version >= 312);
	if (_supported) {
		if (_opera) {
			history.navigationMode = "compatible"
		}
		for ( var i = 1; i < _length; i++) {
			_stack.push("")
		}
		_stack.push(_getHash());
		if (_msie && _l.hash != _getHash()) {
			_l.hash = "#" + _ieLocal(_getHash(), TRUE)
		}
		_searchScript(document);
		var _qi = _url ? _url.indexOf("?") : -1;
		if (_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 && _frame && _frame.contentWindow
					&& _frame.contentWindow.document) {
				_frame.contentWindow.document.title = title;
				_juststart = FALSE
			}
			if (!_justset && _mozilla) {
				_l
						.replace(_l.href.indexOf("#") != -1 ? _l.href : _l.href
								+ "#")
			}
			_justset = FALSE
		}, 10)
	};
	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, true);
		_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 = "#" + _dc(_ieLocal(_value, TRUE))
				} else {
					_l.replace("#" + _dc(_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();
		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(), 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(), index = value.indexOf("?");
		if (index != -1 && index < value.length) {
			return 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 p, params = value.split("&"), i = params.length, r = [];
			while (i--) {
				p = params[i].split("=");
				if (p[0] == param) {
					r.push(p[1])
				}
			}
			if (r.length != 0) {
				return r.length != 1 ? r : r[0]
			}
		}
	};
	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("&"), i = 0;
				while (i < params.length) {
					names.push(params[i].split("=")[0]);
					i++
				}
			}
		}
		return names
	};
	this.onInit = null;
	this.onChange = null;
	this.onInternalChange = null;
	this.onExternalChange = 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;
				var swf = _s2c.apply(this, _args);
				if (swf) {
					_ref.addId(_args[0].id)
				}
				return swf
			};
			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])
					}
				}
			}
		}
	})()
};
