if (!PHOTOZIG) { var PHOTOZIG = {}; }

PHOTOZIG.Utils = function() {
	var self = {
	
		// BK 10.02.09: using a new method to prevent garbage in browser address bar history
		goToEzpPage: function(pageToGo, paramsToGO) {

			var xscriptToSend = (typeof pageToGo !== 'undefined' && pageToGo)? pageToGo : "ezp_builder.php";
			
			// var x_dataToSend = 'username=' + userName + '&album=' + albumFolder + '&productType=' + params.productType + '&width=' + iframeWidth + '&height=' + iframeHeight;
			var x_dataToSend = (typeof paramsToGO !== 'undefined' && paramsToGO)? paramsToGO : PHOTOZIG.Properties.X_DATA;

			 if (xscriptToSend !== ""){ 
				
				self.setSessionCookie("xrel", pzescape(PHOTOZIG.Properties.RELEASE));
				self.setSessionCookie("xscript", xscriptToSend);
				self.setSessionCookie("x_data", x_dataToSend);
				
				userNameToSend = self.getUrlParameterValueFromXdata('username');
					
				location.href = PHOTOZIG.Properties.MY_ROOT + "/" + userNameToSend + "/i.php?xm=e" ; 
			}
		},
	
		/**
		 * To correct the min-width IE6 bug	
		 */
		fixIE6MinWidthBug: function() {
			var action = function() {
				if ($.browser.msie && parseInt($.browser.version) <= 6) {
					var body = $("body");
					var minWidth = parseInt(body.css("min-width"));
					var width = parseInt(body.attr("clientWidth"));
					var newWidth = width <= minWidth ? minWidth + "px" : width + "px";	
					body.css("width", newWidth);
				}				
			};
			
			$(window).resize(action);
			action();
		},
		
		fixIE6MinHeightBug: function() {
			var action = function() {
				if ($.browser.msie && parseInt($.browser.version) <= 6) {
					var body = $("body");
					var minHeight = parseInt(body.css("min-height"));
					var height = parseInt(body.attr("clientHeight"));
					var newHeight = height <= minHeight ? minHeight + "px" : height + "px";	
					body.css("height", newHeight);
				}
			};
			
			$(window).resize(action);
			action();
		},
	
		/**
		 * Parse a string representation of an associative array
		 * into an object (eg: "name=John&gender=male" will be to object {name: "John", gender: "male"})
		 */ 
		parseKeyValue: function(keyValue, separatorChar, equalsChar, skipUnescape) {
			var separatorChar = separatorChar || "&";
			var equalsChar = equalsChar || "=";
			var skipUnescape = skipUnescape || false;
			
			var parts = keyValue.split(separatorChar);
			var parsedObject = {};

			for (var i = 0, length = parts.length; i < length; i++) {
				var keyValue = parts[i].split(equalsChar);
				var parsedKey = (skipUnescape ? keyValue[0] : pzunescape(keyValue[0]));
				var parsedValue = (skipUnescape ? keyValue[1] : pzunescape(keyValue[1]));
				parsedObject[parsedKey] = parsedValue;
			}				

			return parsedObject;
		},
	
		/**
		 * Get url parameters in array
		 */
		getUrlParametersList: function(fromXdata) {
			var urlParametersList = [];
			var urlParameters = [];
			var urlParts = location.search.split("?");
			
			// In case of getUrlParametersList fromXdata
			if ( typeof fromXdata !== "undefined" && fromXdata ) {urlParts[1] = PHOTOZIG.Properties.X_DATA;}
			
			if (urlParts[1]) urlParameters = urlParts[1].split("&");
			for (var i = 0, l = urlParameters.length; i < l; i++) {
				var paramterKeyValue = urlParameters[i].split("=");
				urlParametersList.push({key: paramterKeyValue[0], value: paramterKeyValue[1]});
			}
	
			return urlParametersList;
		},
	
		/**
		 * Get a specific value from an url parameter
		 */
		getUrlParameterValue: function(key, parameters, raw) {
			if (!parameters) { parameters = self.getUrlParametersList(); }
	
			for (var i = 0, length = parameters.length; i < length; i++) {
				if (parameters[i].key == key) {
					return (raw ? parameters[i].value : pzunescape(parameters[i].value));
				}
			}
		},

		getUrlParameterValueFromXdata: function(key, parameters, raw) {
			var getFromXdata = true;
			if (!parameters) { parameters = self.getUrlParametersList(getFromXdata); }
	
			for (var i = 0, length = parameters.length; i < length; i++) {
				if (parameters[i].key == key) {
					return (raw ? parameters[i].value : pzunescape(parameters[i].value));
				}
			}
		},
		
		/**
		 * Get a cookie value
		 */
		getCookie: function(key) {
			var keyValue = self.parseKeyValue(document.cookie, "; ");
			var value = keyValue[key] ? pzunescape(keyValue[key]) : "";
			return value;
		},
		
		/**
		 * Delete a cookie value (BK 10.02.07: does this work? Changed "key" to "name")
		 */
		// deleteCookie: function(key) {
		deleteCookie: function(name) {
			var expdate = new Date();
			expdate.setTime(expdate.getTime() - 1);
			document.cookie = name += "=; expires=" + expdate.toGMTString();
		},
		
		/**
		 * Set a session cookie value (session cookie)
		 */
		setSessionCookie: function(parameter,value) {		
			var masterDomainParts = location.hostname.split(".").reverse();
			var masterDomain = "." + masterDomainParts[1] + "." + masterDomainParts[0];
			document.cookie = parameter+"=" + value + "; path=/; domain=" + masterDomain;
		},
		
		/**
		 * Load a javascript file dinamically (lazy loading)
		 */
		loadJavascript: function(url, callback) {
			var head = document.getElementsByTagName("head")[0];
			var script = document.createElement('script');
			
			// Events for WebStandards Compliant Browsers
			script.onload = function() {
				if (typeof callback === "function") {
					callback();
				}
			};
			
			// Events for IE
			script.onreadystatechange = function() {
				if (typeof callback === "function") {
					if (this.readyState === 'loaded' || this.readyState === 'complete') {						
						callback();
					}
				}
			};

			script.type = 'text/javascript';
			script.src = url;
			head.appendChild(script);
		},
		
		/**
		 * Redirect to a link by post
		 */
		redirectByPost: function(link, get) {
			var linkParts = link.split("?");
			var host = linkParts[0] || link;
			var params = linkParts[1] ? self.parseKeyValue(linkParts[1]) : {};
			var form = document.createElement("FORM");
			form.method = "post";
			form.action = host + (get ? "?" + get : "");
			
			for (key in params) {
				var input = document.createElement("INPUT");
				input.type = "hidden";
				input.name = key;
				input.value = params[key];
				form.appendChild(input);
			}
			
			var body = document.getElementsByTagName("BODY")[0];
			body.appendChild(form);
			form.submit();
		},

		/**
		 * To add the Array methods no implemented in some browsers
		 */
		fixIEJavascriptMissingMethods: function() {
			if (!Array.prototype.forEach) {
				Array.prototype.indexOf = function(searchElement,fromIndex) {
					var i = (fromIndex < 0) ? this.length + fromIndex : fromIndex || 0;

					for (;i < this.length; i++)
						if (searchElement === this[i]) return i;
					return -1
				}

				Array.prototype.lastIndexOf = function(searchElement,fromIndex) {
					var max = this.length - 1;
					var i = (fromIndex < 0) ? Math.max(max + 1 + fromIndex, 0) :
							(fromIndex > max) ? max :
							max - (fromIndex || 0) || max;

					for (;i >= 0; i--)
						if (searchElement === this[i]) return i;

					return -1
				}
			}
		},

		/**
		 * To add some useful Javascript methods on default objects, like String
		 */
		extendJavascript: function() {		
			Object.factory = function (o) {
				var F = function () {};
				F.prototype = o;
				return new F();
			};
			
			Object.copyValues = function(s, t) {
				for (property in t) {
					if (typeof s[property] !== "undefined") {
						t[property] = s[property];
					}
				}
			};
			
			function typeOf(value) {
			    var s = typeof value;
			    if (s === 'object') {
			        if (value) {
			            if (typeof value.length === 'number' &&
			                    !(value.propertyIsEnumerable('length')) &&
			                    typeof value.splice === 'function') {
			                s = 'array';
			            }
			        } else {
			            s = 'null';
			        }
			    }
			    return s;
			}

			function isEmpty(o) {
			    var i, v;
			    if (typeOf(o) === 'object') {
			        for (i in o) {
			            v = o[i];
			            if (v !== undefined && typeOf(v) !== 'function') {
			                return false;
			            }
			        }
			    }
			    return true;
			}

			String.prototype.entityify = function () {
			    return this.replace(/&/g, "&amp;").replace(/</g,
			        "&lt;").replace(/>/g, "&gt;");
			};

			String.prototype.quote = function () {
			    var c, i, l = this.length, o = '"';
			    for (i = 0; i < l; i += 1) {
			        c = this.charAt(i);
			        if (c >= ' ') {
			            if (c === '\\' || c === '"') {
			                o += '\\';
			            }
			            o += c;
			        } else {
			            switch (c) {
			            case '\b':
			                o += '\\b';
			                break;
			            case '\f':
			                o += '\\f';
			                break;
			            case '\n':
			                o += '\\n';
			                break;
			            case '\r':
			                o += '\\r';
			                break;
			            case '\t':
			                o += '\\t';
			                break;
			            default:
			                c = c.charCodeAt();
			                o += '\\u00' + Math.floor(c / 16).toString(16) +
			                    (c % 16).toString(16);
			            }
			        }
			    }
			    return o + '"';
			};

			String.prototype.supplant = function (o) {
			    return this.replace(/{([^{}]*)}/g,
			        function (a, b) {
			            var r = o[b];
			            return typeof r === 'string' || typeof r === 'number' ? r : a;
			        }
			    );
			};

			String.prototype.trim = function () {
			    return this.replace(/^\s+|\s+$/g, "");
			};

			String.prototype.pad = function(max, replace) {
				replace = replace || "...";
				max = max || this.length;

				if (this.length > max) {
					return (this.substr(0, (max - replace.length)) + replace);
				}

				return this.toString();
			}
			
			String.prototype.decodeHtml = function() {
				var ta = document.createElement("textarea");
				ta.innerHTML = this.replace(/</g, "&lt;").replace(/>/g, "&gt;");
				return ta.value;
			}
			
			String.prototype.br2nl = function() {
				return this.replace(/\<br\>|\<br\/\>|\<br \/\>/, "\n");
			}
		},
	
		init: function() {
			// self.fixIE6MinWidthBug();
			self.fixIEJavascriptMissingMethods();
			self.extendJavascript();
		}
	};
	
	$(self.init);
	return self;
}();