var umen = new Object();
var Namespace = function (ns) {
	/*
	ie 8.0- ne supporte pas que les namespaces soient declarés dans window 
	(il oublie les sous-namespaces une fois la page chargée)
	On exige donc ici que tout soit dans le namespace umen
	*/
	var nsParts = ns.split(".");
	if (nsParts[0] != "umen") {
		throw "only supports umen namespaces";
	} else {
		var alreadyDefined = true;
		var root = umen;
		for (var i = 1; i < nsParts.length; i++) {
			var nsi = nsParts[i];
			if (typeof root[nsi] == "undefined") {
				root[nsi] = new Object();
				alreadyDefined = false;
			}

			root = root[nsi];
		}
	}
	return alreadyDefined;
};

Namespace("umen.util");
Namespace("umen.event");

// ajaxInitialize. ajaxBegin, ajaxEnd
jQuery.fn.extend({ ajaxInitialize: function (fn) { if (fn) { return jQuery.event.add(this[0], "ajaxInitialize", fn, null); } else { var ret = jQuery.event.trigger("ajaxInitialize", null, this[0], false, null); if (ret === undefined) ret = true; return ret; } } });
jQuery.fn.extend({ ajaxBegin: function (fn) { if (fn) { return jQuery.event.add(this[0], "ajaxBegin", fn, null); } else { var ret = jQuery.event.trigger("ajaxBegin", null, this[0], false, null); if (ret === undefined) ret = true; return ret; } } });
jQuery.fn.extend({ ajaxEnd: function (fn) { if (fn) { return jQuery.event.add(this[0], "ajaxEnd", fn, null); } else { var ret = jQuery.event.trigger("ajaxEnd", null, this[0], false, null); if (ret === undefined) ret = true; return ret; } } });

$(document).ready(
	function () {

		try {

			var req_mgr = Sys.WebForms.PageRequestManager.getInstance();

			req_mgr.add_initializeRequest(
				function (sender, args) {
					$(document).trigger("ajaxInitialize", { sender: sender, args: args });
				}
			);

			req_mgr.add_beginRequest(
				function (sender, args) {
					$(document).trigger("ajaxBegin", { sender: sender, args: args });
				}
			);

			req_mgr.add_endRequest(
				function (sender, args) {
					$(document).trigger("ajaxEnd", { sender: sender, args: args });
				}
			);
		} catch (e) { }
	}
);

if (!umen.util.elaborateException) {
	umen.util.elaborateException = function (err, full) {
		var el = "";
		if (full) {
			for (var prop in err) {
				el += "property: " + prop + " value: [" + err[prop] + "]\n";
			}
			el += "toString(): " + " value: [" + err.toString() + "]";
		}
		return el;
	};
};

if (!umen.event.onBeforeUnload) {
	umen.event.onBeforeUnloadCalls = [];
	window.onbeforeunload = function (event) {
		var str = "";
		for (var i in umen.event.onBeforeUnloadCalls) {
			var si = umen.event.onBeforeUnloadCalls[i];
			if (si) si = si(event);
			if (str.length > 0 && si) { str += "\n\n"; }
			if (si) str += si;
		}
		if (str) {
			return str;
		}
	};
	umen.event.onBeforeUnload = function (callback) {
		umen.event.onBeforeUnloadCalls.push(callback);
	};
};

if (!umen.util.extractNamedValues) {
	umen.util.extractNamedValues = function (value) {
		var values = null;
		if (typeof value != "undefined" && value != null) {
			values = {};
			value = value.trim();
			var iqm = value.indexOf('?');
			if (iqm >= 0) {
				value = value.substring(iqm + 1);
			}
			var arr = value.split('&');
			if (arr.length == 1) {
				var parts = arr[0].split('=');
				if (parts.length == 1) {
					values = unescape(parts[0]);
				}
				else if (parts.length == 2) {
					values[parts[0]] = unescape(parts[1]);
				}
			}
			else {
				for (var i = 0; i < arr.length; ++i) {
					var item = arr[i];
					var parts = item.split('=');
					if (parts.length == 2) {
						var v = values[parts[0]];
						if (v) {
							if (!(v instanceof Array)) {
								values[parts[0]] = [v];
								v = values[parts[0]];
							}
							v.push(unescape(parts[1]));
						}
						else {
							values[parts[0]] = unescape(parts[1]);
						}
					}
				}
			}
		}
		return values;
	}
}

if (!umen.util.setCookie) {
	umen.util.setCookie = function (name, value, exdays) {
		if (typeof name != "undefined" && name != null && typeof value != "undefined" && value != null) {
			var exdate = new Date();
			exdate.setDate(exdate.getDate() + exdays);
			var values = [];
			if (typeof value === "object") {
				for (var i in value) {
					var v = value[i];
					if (v instanceof Array) {
						for (var a = 0; a < v.length; ++a) {
							values.push([i, escape(v[a])].join('='));
						}
					} else {
						values.push([i, escape(v)].join('='));
					}
				}
			}
			else {
				values.push(escape(value));
			}

			document.cookie = [name, '=', values.join('&'), "; path=/", (exdays == null) ? "" : "; expires=" + exdate.toUTCString()].join('');
		}
	}
}

if (!umen.util.getCookie) {
	umen.util.getCookie = function (name) {
		var value = null;
		if (typeof name === "string" && name.length > 0) {
			var i, x, y, ARRcookies = document.cookie.split(";");
			for (i = 0; i < ARRcookies.length; i++) {
				x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
				y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
				x = x.replace(/^\s+|\s+$/g, "");
				if (x.toLowerCase() == name.toLowerCase()) {
					value = y;
				}
			}
		}
		return umen.util.extractNamedValues(value);
	}
}

if (!umen.util.isString) {
	umen.util.isString = function (str) {
		return typeof str == "string";
	};
};

if (!umen.util.isStringNullOrEmpty) {
	umen.util.isStringNullOrEmpty = function (str) {
		var type = typeof str;
		return type == "undefined" || str == null || (type == "string" && str.length == 0);
	};
};

if (!umen.util.isNullOrEmptyOrNotString) {
	umen.util.isNullOrEmptyOrNotString = function (str) {
		return !(umen.util.isString(str) && !umen.util.isStringNullOrEmpty(str));
	};
};

if (!umen.util.isJQuery) {
	umen.util.isJQuery = function (obj, testSize) {
		return obj && obj instanceof jQuery && (!testSize || obj.size() > 0);
	};
};

if (!umen.util.isNumber) {
	umen.util.isNumber = function (val) {
		return typeof val == "number";
	};
};

if (!umen.util.getNumber) {
	umen.util.getNumber = function (source, defaultValue) {
		return isNaN(source) ? (defaultValue ? defaultValue : null) : Number(source);
	};
};

if (!umen.util.getBoolean) {
	umen.util.getBoolean = function (source, defaultValue) {
		return typeof source == "undefined" ? (defaultValue ? defaultValue : null) : Number(source) > 0 || String(source).toLowerCase() == "true";
	};
};

if (!umen.util.dateValidator) {
	umen.util.dateValidator = function (source, args) {
		args.IsValid = /^(19|20)\d\d([-])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/.test(args.Value)
	}
}

if (!umen.util.validationFunctionWrapper) {
	umen.util.validationFunctionWrapper = function (functions) {
		return function (source, args) {
			if (functions) {
				for (var i in functions) {
					var f = functions[i];
					if (f) {
						f(source, args);
					}
				}
			}
		}
	}
}

if (!umen.util.numberValidationFunction) {
	umen.util.numberValidationFunction = function (integer, min, max, emptyIsZero, emptyIsValid, acceptComma) {
		return function (source, args) {
			try {

				var fixComma = acceptComma == true ? function (v) { return v.replace(",", "."); } : function (v) { return v; };
				var typeSource = typeof source;
				var n = null;

				if (typeSource == "number") {
					n = source;
				}
				else if (typeSource == "string") {
					n = Number(fixComma(source.trim()));
				}
				else {
					n = fixComma(umen.util.getControl(source, true).val().trim());
				}

				var str = !n || n == null ? '' : String(n);
				if (emptyIsValid != true && str == '' && emptyIsZero != true) {
					args.IsValid = false;
				}
				else if (str == '' && emptyIsValid == true) {
					args.IsValid = true;
				}
				else if ((emptyIsZero == true || str != '') && !isNaN(n = Number(str))) {
					var ok = true;
					if (!integer || (integer == true && n == Math.floor(n))) {
						if (typeof min == "number") {
							if (n < min) { ok = false; }
						}
						if (typeof max == "number") {
							if (n > max) { ok = false; }
						}
					}
					else {
						ok = false;
					}
					args.IsValid = ok;
				}
				else {
					args.IsValid = false;
				}
			} catch (e) {
				args.IsValid = false;
				alert(e);
			}
		}
	};
};

if (!umen.util.numberOffset) {
	umen.util.numberOffset = function (control, integer, offset, min, max, emptyIsZero, emptyIsValid, acceptComma) {
		try {
			var $ctrl = umen.util.getControl(control, true);
			var valArgs = new Object();
			valArgs.IsValid = true;
			var valFunct = umen.util.numberValidationFunction(integer, min, max, emptyIsZero, emptyIsValid, acceptComma);
			valFunct($ctrl, valArgs);
			if (valArgs.IsValid == true) {
				var newVal = Number($ctrl.val()) + offset;
				valFunct(newVal, valArgs);
				if (valArgs.IsValid == true) {
					//					var dv = newVal/offset;
					//					var f = Math.floor(dv);
					//					var s = newVal == 0 ? 0 : newVal/Math.abs(newVal);
					//					if(dv != f){
					//						newVal = s < 0 ? Math.ceil(newVal) : Math.floor(newVal);
					//					}
					newVal = newVal == 0 && emptyIsZero == true ? "" : String(newVal);
					$ctrl.val(String(newVal));
				}
			}
		}
		catch (e) {
			alert(e);
		}
	};
};

if (!umen.util.getRadUpload) {
	umen.util.getRadUpload = function (name, target, intrv, timeout) {
		var hndl = null;
		if (target) {
			var i = 0;
			intrv = intrv || 200;
			timeout = typeof timeout == "undefined" ? 30000 : (timeout < 0 ? 0 : timeout);
			var getR = function () {
				var def = typeof getRadUpload == "function";
				if (def) {
					target.radUpload = getRadUpload(name);
				}
				if (!def || target.radUpload || (timeout > 0 && i > timeout)) {
					clearInterval(hndl);
				}
				i += intrv;
			};
			// le rad peux prendre un certain temps apres le document.ready avant d'etre accessible...
			hndl = setInterval(getR, intrv);
		}
	}
}

if (!umen.util.getControl) {
	umen.util.getControl = function (source, jquery) {
		var $ctrl = null;
		if (typeof source == "string") {
			$ctrl = jquery == true ? $(["#", source].join('')) : document.getElementById(source);
		} else if (umen.util.isJQuery(source, true)) {
			$ctrl = jquery == true ? source : source.get(0);
		}
		else if (source && typeof source.controltovalidate == "string") {
			$ctrl = jquery == true ? $(["#", source.controltovalidate].join('')) : document.getElementById(source.controltovalidate);
		}
		else if (source && typeof source.tagName == "string" && source.tagName.length > 0) {
			$ctrl = jquery == true ? $(source) : source;
		}
		return $ctrl;
	};
};

if (!umen.util.queryString) {
	umen.util.queryString = function (data) {
		data = data || { query: window.location.search };
		var origQS = (data.query || window.location.search) || "";
		origQS = origQS.split('?');
		origQS = origQS.length > 1 ? origQS[1] : origQS[0]
		var qs = origQS.toLowerCase();

		var r = "";
		if (data.key) {
			var key = data.key.toLowerCase();
			var i = qs.indexOf("&" + key + "=");
			if (i < 0) { i = (qs.indexOf(key + "=") == 0) ? 0 : -1; }
			if (i >= 0) {
				var j = qs.indexOf("=", i);
				if (j >= 0) {
					var k = qs.indexOf("&", j);
					if (k >= 0) { r = origQS.substring(j + 1, k); }
					else { r = origQS.substring(j + 1); }
				}
			}
			return unescape(decodeURI(r));
		}
	};
};

// Join un array d'objets quelconques. la conversion de chaque item en string est assurée par le callback.
if (!umen.util.arrayJoin) {
	umen.util.arrayJoin = function (separator, arr, callback, removeNullEntries) {
		var strArr = umen.util.arrayConvert(arr, callback, !removeNullEntries);
		return strArr.join(separator);
	};
};

// execute une fonction sur chaque element
if (!umen.util.arrayForEach) {
	umen.util.arrayForEach = function (arr, callback) {
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = 0; i < n; i++) {
				if (callback(arr[i], i) === "break") {
					break;
				}
			}
		}
	};
};

// count les items pour un predicat donne
if (!umen.util.arrayCount) {
	umen.util.arrayCount = function (arr, callback) {
		var count = 0;
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = 0; i < n; i++) {
				if (callback(arr[i], i)) {
					count++;
				}
			}
		}
		return count;
	};
};

// retourne le premier index trouvé grâce au callback
if (!umen.util.arrayFindIndex) {
	umen.util.arrayFindIndex = function (arr, callback, startIndex) {
		var index = -1;
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = startIndex ? startIndex : 0; i < n; i++) {
				var obj = arr[i];
				if (callback(obj, i)) {
					index = i;
					break;
				}
			}
		}
		return index;
	};
};

// retire des objets d'un array
if (!umen.util.arraySplice) {
	umen.util.arraySplice = function (arr, callback) {
		var count = 0;
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = 0; i < n; ) {
				if (callback(arr[i], i)) {
					arr.splice(i, 1);
					++count;
				}
				else {
					++i;
				}
			}
		}
		return count;
	};
};

// retourne le premier objet trouvé grâce au callback
if (!umen.util.arrayFind) {
	umen.util.arrayFind = function (arr, callback, startIndex) {
		var ret = null;
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = startIndex ? startIndex : 0; i < n; i++) {
				var obj = arr[i];
				if (callback(obj, i)) {
					ret = obj;
					break;
				}
			}
		}
		return ret;
	};
};

// retourne tous les objets trouvés grâce au callback
if (!umen.util.arrayFindAll) {
	umen.util.arrayFindAll = function (arr, callback, startIndex) {
		var list = [];
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = startIndex ? startIndex : 0; i < n; i++) {
				var obj = arr[i];
				if (typeof obj != "undefined" && callback(obj, i)) {
					list.push(obj);
				}
			}
		}
		return list;
	};
};

// retourne tous les objets trouvés grâce au callback
if (!umen.util.arrayConvert) {
	umen.util.arrayConvert = function (arr, callback, returnNullEntries) {
		var list = [];
		if (arr && arr.length) {
			var n = arr.length;
			for (var i = 0; i < n; i++) {
				var obj_i = arr[i];
				var obj = callback(obj_i, i);
				if (obj != null) {
					list.push(obj);
				}
				else if (returnNullEntries) {
					list.push(null);
				}
			}
		}
		return list;
	};
};

// enleve une class css d'un element dom, beaucoup plus rapide que jquery (encore plus rapide avec regex)
if (!umen.util.removeClass) {
	umen.util.removeClass = function (node, class_name_or_regex) {
		if (typeof class_name_or_regex == "string") {
			class_name_or_regex = new RegExp(["(^| )", "( |$)"].join(class_name_or_regex), "i");
		}
		node.className = node.className.replace(class_name_or_regex, " ");
	};
};

// verifie si un element du dom contient une classe css, beaucoup plus rapide que jquery (encore plus rapide avec regex)
if (!umen.util.hasClass) {
	umen.util.hasClass = function (node, class_name_or_regex) {
		if (typeof class_name_or_regex == "string") {
			class_name_or_regex = new RegExp(["(^| )", "( |$)"].join(class_name_or_regex), "i");
		}
		return class_name_or_regex.test(node.className);
	};
};

/*PROTOTYPES*/
String.prototype.trim = function () {
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
};

String.prototype.replaceAccents = function () {
	var result = "";
	var length = this.length;
	for (var i = 0; i < length; ++i) {

		var code = this.charCodeAt(i);

		if (339 == code) { result += 'oe'; }
		else if (230 == code) { result += 'ae'; }
		else if (231 == code) { result += 'c'; }
		else if (241 == code) { result += 'n'; }
		else if (224 <= code && 229 >= code) { result += 'a'; }
		else if (232 <= code && 235 >= code) { result += 'e'; }
		else if (236 <= code && 239 >= code) { result += 'i'; }
		else if (240 == code || (242 <= code && 246 >= code)) { result += 'o'; }
		else if (249 <= code && 252 >= code) { result += 'u'; }
		else if (255 == code) { result += 'y'; }

		else if (339 - 32 == code) { result += 'OE'; }
		else if (230 - 32 == code) { result += 'AE'; }
		else if (231 - 32 == code) { result += 'C'; }
		else if (241 - 32 == code) { result += 'N'; }
		else if (224 - 32 <= code && 229 - 32 >= code) { result += 'A'; }
		else if (232 - 32 <= code && 235 - 32 >= code) { result += 'E'; }
		else if (236 - 32 <= code && 239 - 32 >= code) { result += 'I'; }
		else if (240 - 32 == code || (242 - 32 <= code && 246 - 32 >= code)) { result += 'O'; }
		else if (249 - 32 <= code && 252 - 32 >= code) { result += 'U'; }
		else if (255 - 32 == code) { result += 'y'; }

		else { result += this.charAt(i); }
	}

	return result;
}

/*EXTENSIONS*/
String.prototype.format = function () {
	var str = this.toString();
	for (var i = 0; i < arguments.length; i++) {
		var reg = new RegExp("\\{" + i + "\\}", "gm");
		str = str.replace(reg, arguments[i]);
	}
	return str;
};
