// JavaScript Document
// 说明：一个非常健全的 Javascript 链接(URL)解析类 
// 整理：http://www.CodeBit.cn   
/** 
* @projectDescription   Poly9's polyvalent URLParser class 
* 
* @author   Denis Laprise - denis@poly9.com - http://poly9.com 
* @version  0.1 
* @namespace    Poly9 
* 
* See the unit test file for more examples. 
* URLParser is freely distributable under the terms of an MIT-style license. 
*/

if (typeof Poly9 == 'undefined') {
    var Poly9 = {};
}

/**  
* Creates an URLParser instance  
*  
* @classDescription    Creates an URLParser instance  
* @return {Object} return an URLParser object  
* @param {String} url  The url to parse  
* @constructor  
* @exception {String}  Throws an exception if the specified url is invalid  
*/

Poly9.URLParser = function (url) {
    this._fields = {
        'Username': 4,
        'Password': 5,
        'Port': 7,
        'Protocol': 2,
        'Host': 6,
        'Pathname': 8,
        'URL': 0,
        'Querystring': 9,
        'Fragment': 10
    };

    this._values = {};
    this._regex = null;
    this.version = 0.1;
    this._regex = /^((\w+):\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/;
    for (var f in this._fields) {
        this['get' + f] = this._makeGetter(f);
    }

    if (typeof url != 'undefined') {
        this._parse(url);
    }
}

/**  
* @method  
* @param {String} url  The url to parse  
* @exception {String}  Throws an exception if the specified url is invalid  
*/
Poly9.URLParser.prototype.setURL = function (url) {
    this._parse(url);
}

Poly9.URLParser.prototype._initValues = function () {
    for (var f in this._fields) {
        this._values[f] = '';
    }
}

Poly9.URLParser.prototype._parse = function (url) {
    this._initValues();
    var r = this._regex.exec(url);
    if (!r) throw "DPURLParser::_parse -> Invalid URL";
    for (var f in this._fields) if (typeof r[this._fields[f]] != 'undefined') {
        this._values[f] = r[this._fields[f]];
    }
}

Poly9.URLParser.prototype._makeGetter = function (field) {
    return function () {
        return this._values[field];
    }
}

Poly9.URLParser.prototype.getParameter = function (sName) {
    if (this.getURL().match(new RegExp("(&|\\u003F)" + sName + "=([^&]*)(&|$)"))) {
        return RegExp.$2;
    } else {
        return null;
    }
}  
