/**
 * @author msalla
 */
var Pb = Pb ||
{};

Pb.Utils = Pb.Utils ||
{};

(function() {
    if (window.jQuery) {
        (function($) {
            var TUrl = function() {
                /**
                 * private method for UTF-8 encoding
                 * @param {Object} string
                 */
                var _utf8_encode = function(string) {
                    string = string.replace(/\r\n/g, "\n");
                    var utftext = "";
                    
                    for (var n = 0; n < string.length; n++) {
                        var c = string.charCodeAt(n);
                        
                        if (c < 128) {
                            utftext += String.fromCharCode(c);
                        }
                        else 
                            if ((c > 127) && (c < 2048)) {
                                utftext += String.fromCharCode((c >> 6) | 192);
                                utftext += String.fromCharCode((c & 63) | 128);
                            }
                            else {
                                utftext += String.fromCharCode((c >> 12) | 224);
                                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                                utftext += String.fromCharCode((c & 63) | 128);
                            }
                    }
                    return utftext;
                };
                /**
                 * private method for UTF-8 decoding
                 * @param {Object} utftext
                 */
                var _utf8_decode = function(utftext) {
                    var string = "";
                    var i = 0;
                    var c = 0;
                    var c1 = 0;
                    var c2 = 0;
                    var c3 = 0;
                    
                    while (i < utftext.length) {
                    
                        c = utftext.charCodeAt(i);
                        
                        if (c < 128) {
                            string += String.fromCharCode(c);
                            i++;
                        }
                        else 
                            if ((c > 191) && (c < 224)) {
                                c2 = utftext.charCodeAt(i + 1);
                                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                                i += 2;
                            }
                            else {
                                c2 = utftext.charCodeAt(i + 1);
                                c3 = utftext.charCodeAt(i + 2);
                                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                                i += 3;
                            }
                    }
                    return string;
                };
				/**
		        * Devuelve el QueryString de una URL en formato clave-valor
		        * @param {Object} aURL
		        */
		        var getQueryString= function(aURL)
		        {
		            // define an object to contain the parsed query data
		            var result = {};
		            var queryString;
		            aURL = String(aURL);
		
		            if (aURL.length === 0)
		            {
		                return;
		            }
		
		            // Check if there are any variables
		            if (aURL.indexOf('?') != -1)
		            {
		                queryString = String(aURL.substring(aURL.indexOf('?') + 1, aURL.length));
		            }
		            else
		            {
		                // No variables
		                return;
		            }
		
		            // replace plus signs in the query string with spaces
		            //queryString = queryString.replace('+', ' ');
		
		            // split the query string around ampersands and semicolons
		            var queryComponents = queryString.split(/[&;]/g);
		
		            // loop over the query string components
		            for (var i = 0; i < queryComponents.length; i++)
		            {
		
		                // extract this component's key-value pair
		                var keyValuePair = queryComponents[i].split('=');
		                var key = decodeURIComponent(keyValuePair[0]);
		                var value = decodeURIComponent(keyValuePair[1]);
		
		                // update the parsed query data with this component's key-value pair
		                if (!result[key])
		                {
		                    result[key] = [];
		                }
		                result[key].push((keyValuePair.length == 1) ? '' : value);
		            }
		
		            // return the parsed query data
		            return result;
		        };
                        
                var Url = function() {
                };
                
                Url.prototype = {
					/**
					 * Devuelve el idioma de la página.
					 * @param {String} aDefault : Idioma por defecto o en caso de no indicar-se se usará "es-es".
					 * @return {Sstring} - El idioma de la página
					 */
                    getPageLang: function(/* string: */aDefault) {
                        var lGlobal = Pb.Utils.getGlobalRefreshManager();
						var lDefaultLang = aDefault ? aDefault : "es-es";
						// Necesario cuando estamos ejecutando dentro del frame del análisis externo de SEO.
                        try {
                            if (!lGlobal) {
                                return lDefaultLang;
                            }
                        } 
                        catch (e) {
                            return lDefaultLang;
                        }
                        
                        // En caso de BackOffice Manda el selector de idioma
                        if (lGlobal && lGlobal.IsBackOffice) {
                            return lGlobal.CurrentLanguage;
                        }
						// En caso de página on-line extraemos la primera parte de la url como idioma
                        var lLangRegex = new RegExp("[a-z]{2}\\-[a-z]{2}", "i");
                        var lRet = lLangRegex.exec(window.location.pathname);
						if (lRet) {
							lRet = lRet.toString();
						}
                        return lRet;
                    },
                    
                    getCurrentCultureName: function() {
                        var lArguments = $.compactJSON({
                        "aCultureStr": Pb.Utils.Url.getPageLang() 
                        });

                        var lCultureName = "";

                        Pb.Utils.execAjaxSvcMethod("BackOffice.asmx",
                                    "GetDisplayNameCulture",
                                    lArguments,
                                    function(aResult) {
                                        lCultureName = aResult.d
                                    }, null, true);
                                    
                        return lCultureName;
                     },                    
                    
                    /**
                     * Method for uri encoding.
                     * @param {String} aString
                     */
                    encode: function(aString) {
                        return escape(_utf8_encode(aString));
                    },
                    /**
                     * Method for uri decoding.
                     * @param {String} aString
                     */
                    decode: function(aString) {
                        return _utf8_decode(decodeURIComponent(aString));
                    },
					/**
			        * Devuelve una URL con las nuevas clave-valor o, modificada o creada si no existe, en el QueryString
			        * @param {Object} aURL : Url inicial.
			        * @param {Object} aParameters : array de objetos tipo {{key:'key1', value:'value1'},{key:'key2', value:'value2'}}
			        */
			        buildUrl: function(aURL, aParameters)
			        {
			            var lQueryData = getQueryString(aURL);
			            var lPath;
			            var lQueryString = new String();
			            var isNew = true;
			
			            // comprobamos que la url tenga parámetros
			            if (aURL.indexOf('?') != -1)
			            {
			                lPath = String(aURL.substring(0, aURL.indexOf('?')));
			            }
			            else
			            {
			                lPath = aURL;
			            }
			            for (var i = 0; i < aParameters.length; i++)
			            {
			                var lKey = aParameters[i].key;
			                var lValue = aParameters[i].value;
			                // recorremos el QueyString modificando el valor si procede
			                for (var key in lQueryData)
			                {
			                    if (lQueryString.length === 0)
			                    {
			                        lQueryString += "?";
			                    }
			                    else
			                    {
			                        lQueryString += "&";
			                    }
			                    if (key.toString().toLowerCase() == lKey.toString().toLowerCase())
			                    {
			                        isNew = false;
			                        lQueryData[key] = lValue;
			                    }
			                    lQueryString += key + "=" + lQueryData[key];
			                }
			                // sino hemos encontrado la clave requerida, incluimos el nuevo valor
			                if (isNew)
			                {
			                    if (lQueryString.length === 0)
			                    {
			                        lQueryString += "?";
			                    }
			                    else
			                    {
			                        lQueryString += "&";
			                    }
			                    lQueryString += lKey + "=" + lValue;
			                }
			            }
			
			            return (lPath + lQueryString);
			        }					
                };
                
                return {
                    Url: new Url()
                };
            }();
            
            $.extend(Pb.Utils, TUrl);

            $.pbUrl = Pb.Utils.Url;

			//var extensions = {
			//};

			//$.each( extensions, function( i )
			//{
			//	$.fn[i] = this;
			//});
        })(window.jQuery);
    }
})();
