/** * SWFAddress 2.4m: Deep linking for Flash and Ajax * * SWFAddress is (c) 2006-2009 Rostislav Hristov and contributors * This software is released under the MIT License * */ if (typeof asual == "undefined") var asual = {}; if (typeof asual.util == "undefined") asual.util = {}; asual.util.Browser = new function() { var _agent = navigator.userAgent.toLowerCase(), _safari = /webkit/.test(_agent), _opera = /opera/.test(_agent), _msie = /msie/.test(_agent) && !/opera/.test(_agent), _mozilla = /mozilla/.test(_agent) && !/(compatible|webkit)/.test(_agent), _version = parseFloat(_msie ? _agent.substr(_agent.indexOf('msie') + 4) : (_agent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [0,'0'])[1]); this.toString = function() { return '[class Browser]'; }; this.getVersion = function() { return _version; }; this.isMSIE = function() { return _msie; }; this.isSafari = function() { return _safari; }; this.isOpera = function() { return _opera; }; this.isMozilla = function() { return _mozilla; }; } asual.util.Events = new function() { var DOM_LOADED = 'DOMContentLoaded', STOP = 'onstop', _w = window, _d = document, _cache = [], _util = asual.util, _browser = _util.Browser, _msie = _browser.isMSIE(), _safari = _browser.isSafari(); this.toString = function() { return '[class Events]'; }; this.addListener = function(obj, type, listener) { _cache.push({o: obj, t: type, l: listener}); if (!(type == DOM_LOADED && (_msie || _safari))) { if (obj.addEventListener) obj.addEventListener(type, listener, false); else if (obj.attachEvent) obj.attachEvent('on' + type, listener); } }; 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 == DOM_LOADED && (_msie || _safari))) { 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 != DOM_LOADED) _util.Events.removeListener(evt.o, evt.t, evt.l); } }; var _unloadFix = function() { if (_d.readyState == 'interactive') { function stop() { _d.detachEvent(STOP, stop); _unload(); }; _d.attachEvent(STOP, stop); _w.setTimeout(function() { _d.detachEvent(STOP, stop); }, 0); } }; if (_msie || _safari) { (function (){ try { if ((_msie && _d.body) || !/loaded|complete/.test(_d.readyState)) _d.documentElement.doScroll('left'); } catch(e) { return setTimeout(arguments.callee, 0); } for (var i = 0, e; e = _cache[i]; i++) if (e.t == DOM_LOADED) e.l.call(null); })(); } if (_msie) _w.attachEvent('onbeforeunload', _unloadFix); this.addListener(_w, 'unload', _unload); } asual.util.Functions = new function() { this.toString = function() { return '[class Functions]'; }; this.bind = function(method, object, param) { for (var i = 2, p, arr = []; p = arguments[i]; i++) arr.push(p); return function() { return method.apply(object, arr); } }; } var SWFAddressEvent = function(type) { this.toString = function() { return '[object SWFAddressEvent]'; }; this.type = type; this.target = [SWFAddress][0]; this.value = SWFAddress.getValue(); this.path = SWFAddress.getPath(); this.pathNames = SWFAddress.getPathNames(); this.parameters = {}; var _parameterNames = SWFAddress.getParameterNames(); for (var i = 0, l = _parameterNames.length; i < l; i++) this.parameters[_parameterNames[i]] = SWFAddress.getParameter(_parameterNames[i]); this.parameterNames = _parameterNames; } 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; }*/ 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('' + _d.title + ''); 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 = _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(''); _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]); } } })(); }