﻿/**
* 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]) } } } } })() };
