﻿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} } ();