// JavaScript Document
jQuery.url = function() {
    var segments = {};
    var parsed = {};
    var options = {
        url: window.location,
        strictMode: false,
        key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"],
        q: {
            name: "queryKey",
            parser: /(?:^|&)([^&=]*)=?([^&]*)/g
        },
        parser: {
            strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
            loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
        }
    };
    var parseUri = function() {
        str = decodeURI(options.url);
        var m = options.parser[options.strictMode ? "strict": "loose"].exec(str);
        var uri = {};
        var i = 14;
        while (i--) {
            uri[options.key[i]] = m[i] || ""
        }
        uri[options.q.name] = {};
        uri[options.key[12]].replace(options.q.parser, function($0, $1, $2) {
            if ($1) {
                uri[options.q.name][$1] = $2
            }
        });
        return uri
    };
    var key = function(key) {
        if (!parsed.length) {
            setUp()
        }
        if (key == "base") {
            if (parsed.port !== null && parsed.port !== "") {
                return parsed.protocol + "://" + parsed.host + ":" + parsed.port + "/"
            } else {
                return parsed.protocol + "://" + parsed.host + "/"
            }
        }
        return (parsed[key] === "") ? null: parsed[key]
    };
    var param = function(item) {
        if (!parsed.length) {
            setUp()
        }
        return (parsed.queryKey[item] === null) ? null: parsed.queryKey[item]
    };
    var setUp = function() {
        parsed = parseUri();
        getSegments()
    };
    var getSegments = function() {
        var p = parsed.path;
        segments = [];
        segments = parsed.path.length == 1 ? {}: (p.charAt(p.length - 1) == "/" ? p.substring(1, p.length - 1) : path = p.substring(1)).split("/")
    };
    return {
        setMode: function(mode) {
            strictMode = mode == "strict" ? true: false;
            return this
        },
        setUrl: function(newUri) {
            options.url = newUri === undefined ? window.location: newUri;
            setUp();
            return this
        },
        segment: function(pos) {
            if (!parsed.length) {
                setUp()
            }
            if (pos === undefined) {
                return segments.length
            }
            return (segments[pos] === "" || segments[pos] === undefined) ? null: segments[pos]
        },
        attr: key,
        param: param
    }
} ();
