Subversion-Projekte lars-tiefland.ci

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

/*! jQuery Address v.1.6 | (c) 2009, 2013 Rostislav Hristov | jquery.org/license */
(function ($) {

        $.address = (function () {

                var _trigger = function(name) {
                                var e = $.extend($.Event(name), (function() {
                                        var parameters = {},
                                                parameterNames = $.address.parameterNames();
                                        for (var i = 0, l = parameterNames.length; i < l; i++) {
                                                parameters[parameterNames[i]] = $.address.parameter(parameterNames[i]);
                                        }
                                        return {
                                                value: $.address.value(),
                                                path: $.address.path(),
                                                pathNames: $.address.pathNames(),
                                                parameterNames: parameterNames,
                                                parameters: parameters,
                                                queryString: $.address.queryString()
                                        };
                                }).call($.address));
                                $($.address).trigger(e);
                                return e;
                        },
                        _array = function(obj) {
                                return Array.prototype.slice.call(obj);
                        },
                        _bind = function(value, data, fn) {
                                $().bind.apply($($.address), Array.prototype.slice.call(arguments));
                                return $.address;
                        },
                        _unbind = function(value,  fn) {
                                $().unbind.apply($($.address), Array.prototype.slice.call(arguments));
                                return $.address;
                        },
                        _supportsState = function() {
                                return (_h.pushState && _opts.state !== UNDEFINED);
                        },
                        _hrefState = function() {
                                return ('/' + _l.pathname.replace(new RegExp(_opts.state), '') +
                                        _l.search + (_hrefHash() ? '#' + _hrefHash() : '')).replace(_re, '/');
                        },
                        _hrefHash = function() {
                                var index = _l.href.indexOf('#');
                                return index != -1 ? _l.href.substr(index + 1) : '';
                        },
                        _href = function() {
                                return _supportsState() ? _hrefState() : _hrefHash();
                        },
                        _window = function() {
                                try {
                                        return top.document !== UNDEFINED && top.document.title !== UNDEFINED && top.jQuery !== UNDEFINED &&
                                                top.jQuery.address !== UNDEFINED && top.jQuery.address.frames() !== false ? top : window;
                                } catch (e) {
                                        return window;
                                }
                        },
                        _js = function() {
                                return 'javascript';
                        },
                        _strict = function(value) {
                                value = value.toString();
                                return (_opts.strict && value.substr(0, 1) != '/' ? '/' : '') + value;
                        },
                        _cssint = function(el, value) {
                                return parseInt(el.css(value), 10);
                        },
                        _listen = function() {
                                if (!_silent) {
                                        var hash = _href(),
                                                diff = decodeURI(_value) != decodeURI(hash);
                                        if (diff) {
                                                if (_msie && _version < 7) {
                                                        _l.reload();
                                                } else {
                                                        if (_msie && !_hashchange && _opts.history) {
                                                                _st(_html, 50);
                                                        }
                                                        _value = hash;
                                                        _update(FALSE);
                                                }
                                        }
                                }
                        },
                        _update = function(internal) {
                                _st(_track, 10);
                                return _trigger(CHANGE).isDefaultPrevented() ||
                                        _trigger(internal ? INTERNAL_CHANGE : EXTERNAL_CHANGE).isDefaultPrevented();
                        },
                        _track = function() {
                                if (_opts.tracker !== 'null' && _opts.tracker !== NULL) {
                                        var fn = $.isFunction(_opts.tracker) ? _opts.tracker : _t[_opts.tracker],
                                                value = (_l.pathname + _l.search +
                                                                ($.address && !_supportsState() ? $.address.value() : ''))
                                                                .replace(/\/\//, '/').replace(/^\/$/, '');
                                        if ($.isFunction(fn)) {
                                                fn(value);
                                        } else if ($.isFunction(_t.urchinTracker)) {
                                                _t.urchinTracker(value);
                                        } else if (_t.pageTracker !== UNDEFINED && $.isFunction(_t.pageTracker._trackPageview)) {
                                                _t.pageTracker._trackPageview(value);
                                        } else if (_t._gaq !== UNDEFINED && $.isFunction(_t._gaq.push)) {
                                                _t._gaq.push(['_trackPageview', decodeURI(value)]);
                                        }
                                }
                        },
                        _html = function() {
                                var src = _js() + ':' + FALSE + ';document.open();document.writeln(\'<html><head><title>' +
                                        _d.title.replace(/\'/g, '\\\'') + '</title><script>var ' + ID + ' = "' + encodeURIComponent(_href()).replace(/\'/g, '\\\'') +
                                        (_d.domain != _l.hostname ? '";document.domain="' + _d.domain : '') +
                                        '";</' + 'script></head></html>\');document.close();';
                                if (_version < 7) {
                                        _frame.src = src;
                                } else {
                                        _frame.contentWindow.location.replace(src);
                                }
                        },
                        _options = function() {
                                if (_url && _qi != -1) {
                                        var i, param, params = _url.substr(_qi + 1).split('&');
                                        for (i = 0; i < params.length; i++) {
                                                param = params[i].split('=');
                                                if (/^(autoUpdate|history|strict|wrap)$/.test(param[0])) {
                                                        _opts[param[0]] = (isNaN(param[1]) ? /^(true|yes)$/i.test(param[1]) : (parseInt(param[1], 10) !== 0));
                                                }
                                                if (/^(state|tracker)$/.test(param[0])) {
                                                        _opts[param[0]] = param[1];
                                                }
                                        }
                                        _url = NULL;
                                }
                                _value = _href();
                        },
                        _load = function() {
                                if (!_loaded) {
                                        _loaded = TRUE;
                                        _options();
                                        $('a[rel*="address:"]').address();
                                        if (_opts.wrap) {
                                                var body = $('body'),
                                                        wrap = $('body > *')
                                                                .wrapAll('<div style="padding:' +
                                                                        (_cssint(body, 'marginTop') + _cssint(body, 'paddingTop')) + 'px ' +
                                                                        (_cssint(body, 'marginRight') + _cssint(body, 'paddingRight')) + 'px ' +
                                                                        (_cssint(body, 'marginBottom') + _cssint(body, 'paddingBottom')) + 'px ' +
                                                                        (_cssint(body, 'marginLeft') + _cssint(body, 'paddingLeft')) + 'px;" />')
                                                                .parent()
                                                                .wrap('<div id="' + ID + '" style="height:100%;overflow:auto;position:relative;' +
                                                                        (_webkit && !window.statusbar.visible ? 'resize:both;' : '') + '" />');
                                                $('html, body')
                                                        .css({
                                                                height: '100%',
                                                                margin: 0,
                                                                padding: 0,
                                                                overflow: 'hidden'
                                                        });
                                                if (_webkit) {
                                                        $('<style type="text/css" />')
                                                                .appendTo('head')
                                                                .text('#' + ID + '::-webkit-resizer { background-color: #fff; }');
                                                }
                                        }
                                        if (_msie && !_hashchange) {
                                                var frameset = _d.getElementsByTagName('frameset')[0];
                                                _frame = _d.createElement((frameset ? '' : 'i') + 'frame');
                                                _frame.src = _js() + ':' + FALSE;
                                                if (frameset) {
                                                        frameset.insertAdjacentElement('beforeEnd', _frame);
                                                        frameset[frameset.cols ? 'cols' : 'rows'] += ',0';
                                                        _frame.noResize = TRUE;
                                                        _frame.frameBorder = _frame.frameSpacing = 0;
                                                } else {
                                                        _frame.style.display = 'none';
                                                        _frame.style.width = _frame.style.height = 0;
                                                        _frame.tabIndex = -1;
                                                        _d.body.insertAdjacentElement('afterBegin', _frame);
                                                }
                                                _st(function() {
                                                        $(_frame).bind('load', function() {
                                                                var win = _frame.contentWindow;
                                                                _value = win[ID] !== UNDEFINED ? win[ID] : '';
                                                                if (_value != _href()) {
                                                                        _update(FALSE);
                                                                        _l.hash = _value;
                                                                }
                                                        });
                                                        if (_frame.contentWindow[ID] === UNDEFINED) {
                                                                _html();
                                                        }
                                                }, 50);
                                        }
                                        _st(function() {
                                                _trigger('init');
                                                _update(FALSE);
                                        }, 1);
                                        if (!_supportsState()) {
                                                if ((_msie && _version > 7) || (!_msie && _hashchange)) {
                                                        if (_t.addEventListener) {
                                                                _t.addEventListener(HASH_CHANGE, _listen, FALSE);
                                                        } else if (_t.attachEvent) {
                                                                _t.attachEvent('on' + HASH_CHANGE, _listen);
                                                        }
                                                } else {
                                                        _si(_listen, 50);
                                                }
                                        }
                                        if ('state' in window.history) {
                                                $(window).trigger('popstate');
                                        }
                                }
                        },
                        _popstate = function() {
                                if (decodeURI(_value) != decodeURI(_href())) {
                                        _value = _href();
                                        _update(FALSE);
                                }
                        },
                        _unload = function() {
                                if (_t.removeEventListener) {
                                        _t.removeEventListener(HASH_CHANGE, _listen, FALSE);
                                } else if (_t.detachEvent) {
                                        _t.detachEvent('on' + HASH_CHANGE, _listen);
                                }
                        },
                        _uaMatch = function(ua) {
                                ua = ua.toLowerCase();
                                var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
                                        /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
                                        /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
                                        /(msie) ([\w.]+)/.exec( ua ) ||
                                        ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
                                        [];
                                return {
                                        browser: match[ 1 ] || '',
                                        version: match[ 2 ] || '0'
                                };
                        },
                        _detectBrowser = function() {
                                var browser = {},
                                        matched = _uaMatch(navigator.userAgent);
                                if (matched.browser) {
                                        browser[matched.browser] = true;
                                        browser.version = matched.version;
                                }
                                if (browser.chrome) {
                                        browser.webkit = true;
                                } else if (browser.webkit) {
                                        browser.safari = true;
                                }
                                return browser;
                        },
                        UNDEFINED,
                        NULL = null,
                        ID = 'jQueryAddress',
                        STRING = 'string',
                        HASH_CHANGE = 'hashchange',
                        INIT = 'init',
                        CHANGE = 'change',
                        INTERNAL_CHANGE = 'internalChange',
                        EXTERNAL_CHANGE = 'externalChange',
                        TRUE = true,
                        FALSE = false,
                        _opts = {
                                autoUpdate: TRUE,
                                history: TRUE,
                                strict: TRUE,
                                frames: TRUE,
                                wrap: FALSE
                        },
                        _browser = _detectBrowser(),
                        _version = parseFloat(_browser.version),
                        _webkit = _browser.webkit || _browser.safari,
                        _msie = !$.support.opacity,
                        _t = _window(),
                        _d = _t.document,
                        _h = _t.history,
                        _l = _t.location,
                        _si = setInterval,
                        _st = setTimeout,
                        _re = /\/{2,9}/g,
                        _agent = navigator.userAgent,
                        _hashchange = 'on' + HASH_CHANGE in _t,
                        _frame,
                        _form,
                        _url = $('script:last').attr('src'),
                        _qi = _url ? _url.indexOf('?') : -1,
                        _title = _d.title,
                        _silent = FALSE,
                        _loaded = FALSE,
                        _juststart = TRUE,
                        _updating = FALSE,
                        _listeners = {},
                        _value = _href();

                if (_msie) {
                        _version = parseFloat(_agent.substr(_agent.indexOf('MSIE') + 4));
                        if (_d.documentMode && _d.documentMode != _version) {
                                _version = _d.documentMode != 8 ? 7 : 8;
                        }
                        var pc = _d.onpropertychange;
                        _d.onpropertychange = function() {
                                if (pc) {
                                        pc.call(_d);
                                }
                                if (_d.title != _title && _d.title.indexOf('#' + _href()) != -1) {
                                        _d.title = _title;
                                }
                        };
                }

                if (_h.navigationMode) {
                        _h.navigationMode = 'compatible';
                }
                if (document.readyState == 'complete') {
                        var interval = setInterval(function() {
                                if ($.address) {
                                        _load();
                                        clearInterval(interval);
                                }
                        }, 50);
                } else {
                        _options();
                        $(_load);
                }
                $(window).bind('popstate', _popstate).bind('unload', _unload);

                return {
                        bind: function(type, data, fn) {
                                return _bind.apply(this, _array(arguments));
                        },
                        unbind: function(type, fn) {
                                return _unbind.apply(this, _array(arguments));
                        },
                        init: function(data, fn) {
                                return _bind.apply(this, [INIT].concat(_array(arguments)));
                        },
                        change: function(data, fn) {
                                return _bind.apply(this, [CHANGE].concat(_array(arguments)));
                        },
                        internalChange: function(data, fn) {
                                return _bind.apply(this, [INTERNAL_CHANGE].concat(_array(arguments)));
                        },
                        externalChange: function(data, fn) {
                                return _bind.apply(this, [EXTERNAL_CHANGE].concat(_array(arguments)));
                        },
                        baseURL: function() {
                                var url = _l.href;
                                if (url.indexOf('#') != -1) {
                                        url = url.substr(0, url.indexOf('#'));
                                }
                                if (/\/$/.test(url)) {
                                        url = url.substr(0, url.length - 1);
                                }
                                return url;
                        },
                        autoUpdate: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.autoUpdate = value;
                                        return this;
                                }
                                return _opts.autoUpdate;
                        },
                        history: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.history = value;
                                        return this;
                                }
                                return _opts.history;
                        },
                        state: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.state = value;
                                        var hrefState = _hrefState();
                                        if (_opts.state !== UNDEFINED) {
                                                if (_h.pushState) {
                                                        if (hrefState.substr(0, 3) == '/#/') {
                                                                _l.replace(_opts.state.replace(/^\/$/, '') + hrefState.substr(2));
                                                        }
                                                } else if (hrefState != '/' && hrefState.replace(/^\/#/, '') != _hrefHash()) {
                                                        _st(function() {
                                                                _l.replace(_opts.state.replace(/^\/$/, '') + '/#' + hrefState);
                                                        }, 1);
                                                }
                                        }
                                        return this;
                                }
                                return _opts.state;
                        },
                        frames: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.frames = value;
                                        _t = _window();
                                        return this;
                                }
                                return _opts.frames;
                        },
                        strict: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.strict = value;
                                        return this;
                                }
                                return _opts.strict;
                        },
                        tracker: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.tracker = value;
                                        return this;
                                }
                                return _opts.tracker;
                        },
                        wrap: function(value) {
                                if (value !== UNDEFINED) {
                                        _opts.wrap = value;
                                        return this;
                                }
                                return _opts.wrap;
                        },
                        update: function() {
                                _updating = TRUE;
                                this.value(_value);
                                _updating = FALSE;
                                return this;
                        },
                        title: function(value) {
                                if (value !== UNDEFINED) {
                                        _st(function() {
                                                _title = _d.title = value;
                                                if (_juststart && _frame && _frame.contentWindow && _frame.contentWindow.document) {
                                                        _frame.contentWindow.document.title = value;
                                                        _juststart = FALSE;
                                                }
                                        }, 50);
                                        return this;
                                }
                                return _d.title;
                        },
                        value: function(value) {
                                if (value !== UNDEFINED) {
                                        value = _strict(value);
                                        if (_value == value && !_updating) {
                                                return;
                                        }
                                        _value = value;
                                        if (_opts.autoUpdate || _updating) {
                                                if (_update(TRUE)) {
                                                        return this;
                                                }
                                                if (_supportsState()) {
                                                        _h[_opts.history ? 'pushState' : 'replaceState']({}, '',
                                                                        _opts.state.replace(/\/$/, '') + (_value === '' ? '/' : _value));
                                                } else {
                                                        _silent = TRUE;
                                                        if (_webkit) {
                                                                if (_opts.history) {
                                                                        _l.hash = '#' + _value;
                                                                } else {
                                                                        _l.replace('#' + _value);
                                                                }
                                                        } else if (_value != _href()) {
                                                                if (_opts.history) {
                                                                        _l.hash = '#' + _value;
                                                                } else {
                                                                        _l.replace('#' + _value);
                                                                }
                                                        }
                                                        if ((_msie && !_hashchange) && _opts.history) {
                                                                _st(_html, 50);
                                                        }
                                                        if (_webkit) {
                                                                _st(function(){ _silent = FALSE; }, 1);
                                                        } else {
                                                                _silent = FALSE;
                                                        }
                                                }
                                        }
                                        return this;
                                }
                                return _strict(_value);
                        },
                        path: function(value) {
                                if (value !== UNDEFINED) {
                                        var qs = this.queryString(),
                                                hash = this.hash();
                                        this.value(value + (qs ? '?' + qs : '') + (hash ? '#' + hash : ''));
                                        return this;
                                }
                                return _strict(_value).split('#')[0].split('?')[0];
                        },
                        pathNames: function() {
                                var path = this.path(),
                                        names = path.replace(_re, '/').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;
                        },
                        queryString: function(value) {
                                if (value !== UNDEFINED) {
                                        var hash = this.hash();
                                        this.value(this.path() + (value ? '?' + value : '') + (hash ? '#' + hash : ''));
                                        return this;
                                }
                                var arr = _value.split('?');
                                return arr.slice(1, arr.length).join('?').split('#')[0];
                        },
                        parameter: function(name, value, append) {
                                var i, params;
                                if (value !== UNDEFINED) {
                                        var names = this.parameterNames();
                                        params = [];
                                        value = value === UNDEFINED || value === NULL ? '' : value.toString();
                                        for (i = 0; i < names.length; i++) {
                                                var n = names[i],
                                                        v = this.parameter(n);
                                                if (typeof v == STRING) {
                                                        v = [v];
                                                }
                                                if (n == name) {
                                                        v = (value === NULL || value === '') ? [] :
                                                                (append ? v.concat([value]) : [value]);
                                                }
                                                for (var j = 0; j < v.length; j++) {
                                                        params.push(n + '=' + v[j]);
                                                }
                                        }
                                        if ($.inArray(name, names) == -1 && value !== NULL && value !== '') {
                                                params.push(name + '=' + value);
                                        }
                                        this.queryString(params.join('&'));
                                        return this;
                                }
                                value = this.queryString();
                                if (value) {
                                        var r = [];
                                        params = value.split('&');
                                        for (i = 0; i < params.length; i++) {
                                                var p = params[i].split('=');
                                                if (p[0] == name) {
                                                        r.push(p.slice(1).join('='));
                                                }
                                        }
                                        if (r.length !== 0) {
                                                return r.length != 1 ? r : r[0];
                                        }
                                }
                        },
                        parameterNames: function() {
                                var qs = this.queryString(),
                                        names = [];
                                if (qs && qs.indexOf('=') != -1) {
                                        var params = qs.split('&');
                                        for (var i = 0; i < params.length; i++) {
                                                var name = params[i].split('=')[0];
                                                if ($.inArray(name, names) == -1) {
                                                        names.push(name);
                                                }
                                        }
                                }
                                return names;
                        },
                        hash: function(value) {
                                if (value !== UNDEFINED) {
                                        this.value(_value.split('#')[0] + (value ? '#' + value : ''));
                                        return this;
                                }
                                var arr = _value.split('#');
                                return arr.slice(1, arr.length).join('#');
                        }
                };
        })();

        $.fn.address = function(fn) {
                $(this).each(function(index) {
                        if (!$(this).data('address')) {
                                $(this).on('click', function(e) {
                                        if (e.shiftKey || e.ctrlKey || e.metaKey || e.which == 2) {
                                                return true;
                                        }
                                        var target = e.currentTarget;
                                        if ($(target).is('a')) {
                                                e.preventDefault();
                                                var value = fn ? fn.call(target) :
                                                        /address:/.test($(target).attr('rel')) ? $(target).attr('rel').split('address:')[1].split(' ')[0] :
                                                        $.address.state() !== undefined && !/^\/?$/.test($.address.state()) ?
                                                                        $(target).attr('href').replace(new RegExp('^(.*' + $.address.state() + '|\\.)'), '') :
                                                                        $(target).attr('href').replace(/^(#\!?|\.)/, '');
                                                $.address.value(value);
                                        }
                                }).on('submit', function(e) {
                                        var target = e.currentTarget;
                                        if ($(target).is('form')) {
                                                e.preventDefault();
                                                var action = $(target).attr('action'),
                                                        value = fn ? fn.call(target) : (action.indexOf('?') != -1 ? action.replace(/&$/, '') : action + '?') +
                                                                $(target).serialize();
                                                $.address.value(value);
                                        }
                                }).data('address', true);
                        }
                });
                return this;
        };

})(jQuery);