/*
* 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);

