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