/**
 * 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()
                        this.setValue(hash)
                    } 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 < 6) { //original version was 8 here
                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 = ""
        }
        itle = _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 { //happens in IE6
            if (_value != _getHash()) {
                if (_opts.history) {
                    _l.hash = "#" + _ieLocal(_value, true)
                } else {
                    _l.replace("#" + _value)
                }
            }
        }
        if ((_msie && _version < 8) && _opts.history) { //happens in IE6
            _st(_htmlWrite, 50)
        }
        if (_safari) {
            _st(function () {
                _silent = false
            },
            1)
        } else { //happens in IE6
            _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])
                    }
                }
            }
        }
    })()
};
