/**
 * Copyright (c) 2011 - ShopAlive Licensing Ltd - All rights reserved
 */

/**
 * Adds parameter to the given url. If parameter is already present - its value will be be changed for a new one.
 *
 * @param url url to add parameter to
 * @param paramName parameter name
 * @param paramValue parameter value
 */
function getAppendedParamURLSafe(url, paramName, paramValue, anchor) {
    var splitter = anchor ? '#' : "?";
    if (url.indexOf(splitter) != -1) {
        var splittedUrl = url.split(splitter);
        var paramIndex = splittedUrl[1].indexOf(paramName);
        var newParams;
        if (paramIndex == -1) {
            newParams = splittedUrl[1] + "&" + paramName + '=' + paramValue;
        } else {
            var splittedParams = splittedUrl[1].split(paramName);
            var firstIndex = splittedParams[1].indexOf('&');
            newParams = splittedParams[0] + paramName + '=' + paramValue + (firstIndex != -1 ? splittedParams[1].substr(firstIndex) : '');
        }
        return splittedUrl[0] + splitter + newParams;
    } else {
        return url + splitter + paramName + '=' + paramValue;
    }
}

function AppendParamToURL(urlVars, paramName, paramVal) {
    var present = putParam(urlVars, paramName, paramVal);
    return composeUrlByUrlVars(urlVars, !present);
}

function putParamsToURLQuietly(paramNames, paramValues) {
    var params = getUrlVars();
    for (var i = 0; i < paramNames.length; i++) {
        putParam(params, paramNames[i], [paramValues[i]]);
    }
    var url = composeUrlByUrlVars(params, true);
    if (window.history.replaceState) {
        window.history.replaceState({ state: "state" }, document.title, url);
    }
}

function putParam(urlVars, paramName, paramValue) {
    var present = false;
    for (var i = 0; i < urlVars.length; i++) {
        if (urlVars[i] == paramName) {
            present = true;
        }
    }
    if (!present) {
        urlVars.push(paramName);
    }
    urlVars[paramName] = paramValue;
    return present;
}

function composeUrlByUrlVars(urlVars, removePoundSign) {
    var r = '?';
    for (var j = 0; j < urlVars.length; ++j) {
        if (j != 0) r += '&';
        var varName = urlVars[j];
        if (varName != undefined) {
            var varValue = urlVars[varName];
            if (isArrayObject(varValue)) {
                for (var k = 0; k < varValue.length; k++) {
                    if (k != 0) r += '&';
                    r += varName + '=';
                    r += (!removePoundSign) ? varValue[k] : varValue[k].replace(/#/, '');
                }
            } else {
                r += varName + '=';
                r += (!removePoundSign) ? varValue : varValue.replace(/#/, '');
            }

        }
    }
    return r;
}

function getUrlVars() {
    var vars = [], hash;
    if (window.location.href.indexOf('?') != -1) {
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            if (vars[hash[0]] == undefined) {
                vars.push(hash[0]);
                vars[hash[0]] = [];
            }

            vars[hash[0]].push(hash[1]);
        }
    }
    return vars;
}

function getAnchorVars() {
    var anchor = window.location.hash.substr(1);
    var vars = [], hash;
    var hashes = anchor.split('&');
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }

    return vars;
}

function isArrayObject(obj) {
    if(obj == undefined || obj.constructor.toString().indexOf("Array") == -1) {
        return false;
    }
    return true;
}
