
// Url Helper
function Url(url) {
	if (url == null)
		url = document.location.href;

    var urlBase = String(url).split('?')[0];
    var queryString = String(url).split('?')[1];
    
    if (queryString == null)
        queryString = '';

    //
    //      Private Methods
    //

    // Get parameters collection from url, return string
    var getParams = function(params) {
        this.ToArray = function() {
            return paramsToArray(params);
        }
        
        this.ToString = function() {
            return params;
        }

//        return returnValue;
    }

    // Split parameters collection to Array
    var paramsToArray = function(params) {
        var returnValue = new Array();

        var splitParams = params.split('&');

        for (var i=0; i < splitParams.length; i++) {
            returnValue[returnValue.length] = splitParams[i].split('=');
        }

        return returnValue;
    }

    // Marge parameters Array to string
    var paramsToString = function(params) {
        var returnValue = '';
        
        for (var i=0; i < params.length; i++)
            returnValue += '&' + params[i][0] + '=' + params[i][1];
            
        returnValue = returnValue.substring(1, returnValue.length);
        
        return returnValue;
    }

    // Retrive parameter value
    var getParam = function(source, param) {
        var currentParams = paramsToArray(source);
        for (var i=0; i < currentParams.length; i++)
            if (currentParams[i][0] == param)
                return currentParams[i][1];
                
        return '';
    }

    // Update single parameter in url, add if not exists
    var updateParam = function(source, param, newValue) {
        var returnValue;

        var done = false;
        var currentParams = paramsToArray(source);
        for (var i=0; i < currentParams.length; i++)
            if (currentParams[i][0] == param) {
                currentParams[i][1] = newValue;
                done = true;
                break;
            }
        
        if (!done) {
            if (source != null && source != '')
                returnValue = source + '&' + param + '=' + newValue;
            else
                returnValue = param + '=' + newValue;
        }
        else
            returnValue = paramsToString(currentParams);
            
        return returnValue;
    }

    // Update multiply parameters, add if not exists
    var updateParams = function(source, params) {
        var returnValue = source;
        
        var paramsArray = paramsToArray(params);
        for (var i=0; i < paramsArray.length; i++)
            returnValue = updateParam(returnValue, paramsArray[i][0], paramsArray[i][1]);
            
        return returnValue;
    }

    // Update parameter 'session' with escape value of params
    var updateSessionParams = function(source, params) {
        return updateParam(source, 'session', escape(updateParams(unescape(getParam(source, 'session')), params)));
    }

    // Update parameter 'localsession' with escape value of params
    var updateLocalSessionParams = function(source, params) {
        return updateParam(source, 'localsession', escape(updateParams(unescape(getParam(source, 'localsession')), params)));
    }



    
    //
    //      Public Methods
    //
    
    // Get parameters collection from url, return string
    this.GetParams = function() {
        return new getParams(queryString);
    }
    
    // Split parameters collection to Array
    this.ParamsToArray = function(params) {
        return paramsToArray(params);
    }

    // Marge parameters Array to string
    this.ParamsToString = function(params) {
        return paramsToString(params);
    }
    
    // Retrive parameter value from url
    this.GetParam = function(param) {
        return getParam(queryString, param);
    }
    
    // Update single parameter in url, add if not exists
    this.UpdateParam = function(param, newValue) {
        return new Url(urlBase + '?' + updateParam(queryString, param, newValue));
    }
    
    // Update multiply parameters, add if not exists
    this.UpdateParams = function(params) {
        return new Url(urlBase + '?' + updateParams(queryString, params));
    }
    
    // Update parameter 'session' with escape value of params
    this.UpdateSessionParams = function(params) {
        return new Url(urlBase + '?' + updateSessionParams(queryString, params));
    }
    
    // Update parameter 'localsession' with escape value of params
    this.UpdateLocalSessionParams = function(params) {
        return new Url(urlBase + '?' + updateLocalSessionParams(queryString, params));
    }
    
    // Returns url
    this.ToString = function() {
        return urlBase + '?' + queryString;
    }
    
}