/*
 * jQuery Address Plugin v1.4
 * http://www.asual.com/jquery/address/
 *
 * Copyright (c) 2009-2010 Rostislav Hristov
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * Date: 2011-05-04 14:22:12 +0300 (Wed, 04 May 2011)
 */
(function(c) {
    c.address = function() {
        var v = function(a) {
            c(c.address).trigger(c.extend(c.Event(a), function() {
                for (var b = {},e = c.address.parameterNames(),f = 0,p = e.length; f < p; f++)b[e[f]] = c.address.parameter(e[f]);
                return{value:c.address.value(),path:c.address.path(),pathNames:c.address.pathNames(),parameterNames:e,parameters:b,queryString:c.address.queryString()}
            }.call(c.address)))
        },w = function() {
            c().bind.apply(c(c.address), Array.prototype.slice.call(arguments));
            return c.address
        },r = function() {
            return M.pushState &&
                    d.state !== k
        },s = function() {
            return("/" + g.pathname.replace(new RegExp(d.state), "") + g.search + (D() ? "#" + D() : "")).replace(U, "/")
        },D = function() {
            var a = g.href.indexOf("#");
            return a != -1 ? B(g.href.substr(a + 1), l) : ""
        },u = function() {
            return r() ? s() : D()
        },ha = function() {
            return"javascript"
        },N = function(a) {
            a = a.toString();
            return(d.strict && a.substr(0, 1) != "/" ? "/" : "") + a
        },B = function(a, b) {
            if (d.crawlable && b)return(a !== "" ? "!" : "") + a;
            return a.replace(/^\!/, "")
        },x = function(a, b) {
            return parseInt(a.css(b), 10)
        },V = function(a) {
            for (var b,
                         e,f = 0,p = a.childNodes.length; f < p; f++) {
                try {
                    if ("src"in a.childNodes[f] && a.childNodes[f].src)b = String(a.childNodes[f].src)
                } catch(J) {
                }
                if (e = V(a.childNodes[f]))b = e
            }
            return b
        },F = function() {
            if (!K) {
                var a = u();
                if (h != a)if (y && q < 7)g.reload(); else {
                    y && q < 8 && d.history && t(O, 50);
                    h = a;
                    E(l)
                }
            }
        },E = function(a) {
            v(W);
            v(a ? X : Y);
            t(Z, 10)
        },Z = function() {
            if (d.tracker !== "null" && d.tracker !== null) {
                var a = c.isFunction(d.tracker) ? d.tracker : j[d.tracker],b = (g.pathname + g.search + (c.address && !r() ? c.address.value() : "")).replace(/\/\//, "/").replace(/^\/$/,
                        "");
                if (c.isFunction(a))a(b); else if (c.isFunction(j.urchinTracker))j.urchinTracker(b); else if (j.pageTracker !== k && c.isFunction(j.pageTracker._trackPageview))j.pageTracker._trackPageview(b); else j._gaq !== k && c.isFunction(j._gaq.push) && j._gaq.push(["_trackPageview",decodeURI(b)])
            }
        },O = function() {
            var a = ha() + ":" + l + ";document.open();document.writeln('<html><head><title>" + n.title.replace("'", "\\'") + "</title><script>var " + C + ' = "' + encodeURIComponent(u()) + (n.domain != g.hostname ? '";document.domain="' + n.domain :
                    "") + "\";<\/script></head></html>');document.close();";
            if (q < 7)m.src = a; else m.contentWindow.location.replace(a)
        },aa = function() {
            if (G && $ != -1) {
                var a,b = G.substr($ + 1).split("&");
                for (i = 0; i < b.length; i++) {
                    a = b[i].split("=");
                    if (/^(autoUpdate|crawlable|history|strict|wrap)$/.test(a[0]))d[a[0]] = isNaN(a[1]) ? /^(true|yes)$/i.test(a[1]) : parseInt(a[1], 10) !== 0;
                    if (/^(state|tracker)$/.test(a[0]))d[a[0]] = a[1]
                }
                G = null
            }
            h = u()
        },ca = function() {
            if (!ba) {
                ba = o;
                aa();
                var a = function() {
                    ia.call(this);
                    ja.call(this)
                },b = c("body").ajaxComplete(a);
                a();
                if (d.wrap) {
                    c("body > *").wrapAll('<div style="padding:' + (x(b, "marginTop") + x(b, "paddingTop")) + "px " + (x(b, "marginRight") + x(b, "paddingRight")) + "px " + (x(b, "marginBottom") + x(b, "paddingBottom")) + "px " + (x(b, "marginLeft") + x(b, "paddingLeft")) + 'px;" />').parent().wrap('<div id="' + C + '" style="height:100%;overflow:auto;position:relative;' + (H && !window.statusbar.visible ? "resize:both;" : "") + '" />');
                    c("html, body").css({height:"100%",margin:0,padding:0,overflow:"hidden"});
                    H && c('<style type="text/css" />').appendTo("head").text("#" +
                            C + "::-webkit-resizer { background-color: #fff; }")
                }
                if (y && q < 8) {
                    a = n.getElementsByTagName("frameset")[0];
                    m = n.createElement((a ? "" : "i") + "frame");
                    if (a) {
                        a.insertAdjacentElement("beforeEnd", m);
                        a[a.cols ? "cols" : "rows"] += ",0";
                        m.noResize = o;
                        m.frameBorder = m.frameSpacing = 0
                    } else {
                        m.style.display = "none";
                        m.style.width = m.style.height = 0;
                        m.tabIndex = -1;
                        n.body.insertAdjacentElement("afterBegin", m)
                    }
                    t(function() {
                        c(m).bind("load", function() {
                            var e = m.contentWindow;
                            h = e[C] !== k ? e[C] : "";
                            if (h != u()) {
                                E(l);
                                g.hash = B(h, o)
                            }
                        });
                        m.contentWindow[C] ===
                                k && O()
                    }, 50)
                }
                t(function() {
                    v("init");
                    E(l)
                }, 1);
                if (!r())if (y && q > 7 || !y && "on" + I in j)if (j.addEventListener)j.addEventListener(I, F, l); else j.attachEvent && j.attachEvent("on" + I, F); else ka(F, 50)
            }
        },ia = function() {
            var a,b = c("a"),e = b.size(),f = -1,p = function() {
                if (++f != e) {
                    a = c(b.get(f));
                    a.is('[rel*="address:"]') && a.address();
                    t(p, 1)
                }
            };
            t(p, 1)
        },la = function() {
            if (h != u()) {
                h = u();
                E(l)
            }
        },ma = function() {
            if (j.removeEventListener)j.removeEventListener(I, F, l); else j.detachEvent && j.detachEvent("on" + I, F)
        },ja = function() {
            if (d.crawlable) {
                var a =
                        g.pathname.replace(/\/$/, "");
                c("body").html().indexOf("_escaped_fragment_") != -1 && c('a[href]:not([href^=http]), a[href*="' + document.domain + '"]').each(function() {
                    var b = c(this).attr("href").replace(/^http:/, "").replace(new RegExp(a + "/?$"), "");
                    if (b === "" || b.indexOf("_escaped_fragment_") != -1)c(this).attr("href", "#" + b.replace(/\/(.*)\?_escaped_fragment_=(.*)$/, "!$2"))
                })
            }
        },k,C = "jQueryAddress",I = "hashchange",W = "change",X = "internalChange",Y = "externalChange",o = true,l = false,d = {autoUpdate:o,crawlable:l,history:o,
            strict:o,wrap:l},z = c.browser,q = parseFloat(c.browser.version),da = z.mozilla,y = z.msie,ea = z.opera,H = z.webkit || z.safari,P = l,j = function() {
            try {
                return top.document !== k ? top : window
            } catch(a) {
                return window
            }
        }(),n = j.document,M = j.history,g = j.location,ka = setInterval,t = setTimeout,U = /\/{2,9}/g;
        z = navigator.userAgent;
        var m,G = V(document),$ = G ? G.indexOf("?") : -1,Q = n.title,K = l,ba = l,R = o,fa = o,L = l,h = u();
        if (y) {
            q = parseFloat(z.substr(z.indexOf("MSIE") + 4));
            if (n.documentMode && n.documentMode != q)q = n.documentMode != 8 ? 7 : 8;
            var ga = n.onpropertychange;
            n.onpropertychange = function() {
                ga && ga.call(n);
                if (n.title != Q && n.title.indexOf("#" + u()) != -1)n.title = Q
            }
        }
        if (P = da && q >= 1 || y && q >= 6 || ea && q >= 9.5 || H && q >= 523) {
            if (ea)history.navigationMode = "compatible";
            if (document.readyState == "complete")var na = setInterval(function() {
                if (c.address) {
                    ca();
                    clearInterval(na)
                }
            }, 50); else {
                aa();
                c(ca)
            }
            c(window).bind("popstate", la).bind("unload", ma)
        } else!P && D() !== "" ? g.replace(g.href.substr(0, g.href.indexOf("#"))) : Z();
        return{bind:function(a, b, e) {
            return w(a, b, e)
        },init:function(a) {
            return w("init",
                    a)
        },change:function(a) {
            return w(W, a)
        },internalChange:function(a) {
            return w(X, a)
        },externalChange:function(a) {
            return w(Y, a)
        },baseURL:function() {
            var a = g.href;
            if (a.indexOf("#") != -1)a = a.substr(0, a.indexOf("#"));
            if (/\/$/.test(a))a = a.substr(0, a.length - 1);
            return a
        },autoUpdate:function(a) {
            if (a !== k) {
                d.autoUpdate = a;
                return this
            }
            return d.autoUpdate
        },crawlable:function(a) {
            if (a !== k) {
                d.crawlable = a;
                return this
            }
            return d.crawlable
        },history:function(a) {
            if (a !== k) {
                d.history = a;
                return this
            }
            return d.history
        },state:function(a) {
            if (a !==
                    k) {
                d.state = a;
                var b = s();
                if (d.state !== k)if (M.pushState)b.substr(0, 3) == "/#/" && g.replace(d.state.replace(/^\/$/, "") + b.substr(2)); else b != "/" && b.replace(/^\/#/, "") != D() && t(function() {
                    g.replace(d.state.replace(/^\/$/, "") + "/#" + b)
                }, 1);
                return this
            }
            return d.state
        },strict:function(a) {
            if (a !== k) {
                d.strict = a;
                return this
            }
            return d.strict
        },tracker:function(a) {
            if (a !== k) {
                d.tracker = a;
                return this
            }
            return d.tracker
        },wrap:function(a) {
            if (a !== k) {
                d.wrap = a;
                return this
            }
            return d.wrap
        },update:function() {
            L = o;
            this.value(h);
            L = l;
            return this
        },
            title:function(a) {
                if (a !== k) {
                    t(function() {
                        Q = n.title = a;
                        if (fa && m && m.contentWindow && m.contentWindow.document) {
                            m.contentWindow.document.title = a;
                            fa = l
                        }
                        if (!R && da)g.replace(g.href.indexOf("#") != -1 ? g.href : g.href + "#");
                        R = l
                    }, 50);
                    return this
                }
                return n.title
            },value:function(a) {
                if (a !== k) {
                    a = N(a);
                    if (a == "/")a = "";
                    if (h == a && !L)return;
                    R = o;
                    h = a;
                    if (d.autoUpdate || L) {
                        E(o);
                        if (r())M[d.history ? "pushState" : "replaceState"]({}, "", d.state.replace(/\/$/, "") + (h === "" ? "/" : h)); else {
                            K = o;
                            if (H)if (d.history)g.hash = "#" + B(h, o); else g.replace("#" +
                                    B(h, o)); else if (h != u())if (d.history)g.hash = "#" + B(h, o); else g.replace("#" + B(h, o));
                            y && q < 8 && d.history && t(O, 50);
                            if (H)t(function() {
                                K = l
                            }, 1); else K = l
                        }
                    }
                    return this
                }
                if (!P)return null;
                return N(h)
            },path:function(a) {
                if (a !== k) {
                    var b = this.queryString(),e = this.hash();
                    this.value(a + (b ? "?" + b : "") + (e ? "#" + e : ""));
                    return this
                }
                return N(h).split("#")[0].split("?")[0]
            },pathNames:function() {
                var a = this.path(),b = a.replace(U, "/").split("/");
                if (a.substr(0, 1) == "/" || a.length === 0)b.splice(0, 1);
                a.substr(a.length - 1, 1) == "/" && b.splice(b.length -
                        1, 1);
                return b
            },queryString:function(a) {
                if (a !== k) {
                    var b = this.hash();
                    this.value(this.path() + (a ? "?" + a : "") + (b ? "#" + b : ""));
                    return this
                }
                a = h.split("?");
                return a.slice(1, a.length).join("?").split("#")[0]
            },parameter:function(a, b, e) {
                var f,p;
                if (b !== k) {
                    var J = this.parameterNames();
                    p = [];
                    b = b ? b.toString() : "";
                    for (f = 0; f < J.length; f++) {
                        var S = J[f],A = this.parameter(S);
                        if (typeof A == "string")A = [A];
                        if (S == a)A = b === null || b === "" ? [] : e ? A.concat([b]) : [b];
                        for (var T = 0; T < A.length; T++)p.push(S + "=" + A[T])
                    }
                    c.inArray(a, J) == -1 && b !== null &&
                            b !== "" && p.push(a + "=" + b);
                    this.queryString(p.join("&"));
                    return this
                }
                if (b = this.queryString()) {
                    e = [];
                    p = b.split("&");
                    for (f = 0; f < p.length; f++) {
                        b = p[f].split("=");
                        b[0] == a && e.push(b.slice(1).join("="))
                    }
                    if (e.length !== 0)return e.length != 1 ? e : e[0]
                }
            },parameterNames:function() {
                var a = this.queryString(),b = [];
                if (a && a.indexOf("=") != -1) {
                    a = a.split("&");
                    for (var e = 0; e < a.length; e++) {
                        var f = a[e].split("=")[0];
                        c.inArray(f, b) == -1 && b.push(f)
                    }
                }
                return b
            },hash:function(a) {
                if (a !== k) {
                    this.value(h.split("#")[0] + (a ? "#" + a : ""));
                    return this
                }
                a =
                        h.split("#");
                return a.slice(1, a.length).join("#")
            }}
    }();
    c.fn.address = function(v) {
        if (!c(this).attr("address")) {
            var w = function(r) {
                if (r.shiftKey || r.ctrlKey || r.metaKey)return true;
                if (c(this).is("a")) {
                    var s = v ? v.call(this) : /address:/.test(c(this).attr("rel")) ? c(this).attr("rel").split("address:")[1].split(" ")[0] : c.address.state() !== undefined && c.address.state() != "/" ? c(this).attr("href").replace(new RegExp("^(.*" + c.address.state() + "|\\.)"), "") : c(this).attr("href").replace(/^(#\!?|\.)/, "");
                    c.address.value(s);
                    r.preventDefault()
                }
            };
            c(this).click(w).live("click", w).live("submit",
                    function(r) {
                        if (c(this).is("form")) {
                            var s = c(this).attr("action");
                            s = v ? v.call(this) : (s.indexOf("?") != -1 ? s.replace(/&$/, "") : s + "?") + c(this).serialize();
                            c.address.value(s);
                            r.preventDefault()
                        }
                    }).attr("address", true)
        }
        return this
    }
})(jQuery);

