﻿$(function() {
	$.extend({
		/*
		Utiliser un Mapping de la forme :
		var mapping = [{ "id": "#ID", "property": "PropertyId", "defaultValue": "", "validationsRules" :[RULES]}];
		avec [RULES] : 
		"required"
		"emails"
		"date"
		{"equals": "#ID"}
		*/
		FormHelper: {
			"GetObjectFromQueryString": function(mapping) {
				var urlParams = {};
				var e,
					q = window.location.search.substring(1),
					r = /([^&=]+)=([^&]+)/g;
				if (rewritedPathSearch) q = rewritedPathSearch.substring(1)

				while (e = r.exec(q))
					urlParams[decodeURIComponent(e[1])] = decodeURIComponent(e[2]);
				return urlParams;
			},
			"Get": function(mapping, options, property) {
				var settings = { "AddEmptyValues": true };
				settings = $.extend(settings, options);
				var result = {};
				for (var i = 0; i < mapping.length; i++)
				{ if (mapping[i].id && mapping[i].property && (!property || mapping[i].property == property) && $(mapping[i].id) && (settings.AddEmptyValues || (!$(mapping[i].id).isEmpty()) && $("option:selected", this).val() != '')) result[mapping[i].property] = $(mapping[i].id).getSingleValue(); };
				return result;
			},
			"GetQueryString": function(mapping, options, property) {
				var obj = this.Get(mapping, options, property);
				return $.param(obj);
			},
			"Bind": function(mapping, sourceObject, property) {
				for (var i = 0; i < mapping.length; i++) {
					if (mapping[i].id && $(mapping[i].id) && mapping[i].property && (!property || mapping[i].property == property) && sourceObject[mapping[i].property] != undefined)
						$(mapping[i].id).setSingleValue(sourceObject[mapping[i].property]);
				};
			},
			"BindFromQueryString": function(mapping, property) {
				var sourceObject = this.GetObjectFromQueryString(mapping);
				return this.Bind(mapping, sourceObject, property);
			},
			"Clear": function(mapping) {
				for (var i = 0; i < mapping.length; i++) {
					if (mapping[i].id && $(mapping[i].id)) {
						$(mapping[i].id).setSingleValue(mapping[i].defaultValue ? mapping[i].defaultValue : "");
					}
				};
			},
			"Validate": function(mapping) {
				var emailpattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
				var result = {
					"ErrorFields": [],
					isValid: function() { return this.ErrorFields.length == 0; },
					getMessages: function(separator) {
						if (!separator) separator = ', ';
						var messages = '';
						for (var i = 0; i < this.ErrorFields.length; i++) {
							messages += (i == 0 ? "" : separator) + this.ErrorFields[i].message;
						}
						return messages;
					},
					getErrorFields: function() { return this.ErrorFields },
					getSelectors: function() {
						var fields = '';
						for (var i = 0; i < this.ErrorFields.length; i++) {
							fields += (i == 0 ? "" : ", ") + this.ErrorFields[i].field;
						}
						return fields;
					}
				};
				if (mapping) {
					for (var i = 0; i < mapping.length; i++) {
						if (mapping[i] && mapping[i].validationsRules) {
							var mappingId = mapping[i].id;
							var valMessages = mapping[i].validationsMessages
							for (var j = 0; j < mapping[i].validationsRules.length; j++) {
								var validationsRule = mapping[i].validationsRules[j];
								if (validationsRule) {
									//required
									if (validationsRule == 'required' && $(mappingId) && $(mappingId).isEmpty()) {
										result.ErrorFields.push({ "field": mappingId, "message": (valMessages && valMessages[j] ? valMessages[j] : ""), "errorType": "required" })
									}
									//emails
									if (validationsRule == 'email' && $(mappingId) && $(mappingId).val() != "" && !emailpattern.test($(mappingId).val())) {
										result.ErrorFields.push({ "field": mappingId, "message": (valMessages && valMessages[j] ? valMessages[j] : ""), "errorType": "email" })
									}
									//date
									if (validationsRule == 'date' && $(mappingId) && $(mappingId).val() != "" && !$(mappingId).isValidDate()) {
										result.ErrorFields.push({ "field": mappingId, "message": (valMessages && valMessages[j] ? valMessages[j] : ""), "errorType": "date" })
									}
									//equals
									if (validationsRule && validationsRule.equals && $(validationsRule.equals) && $(mappingId) && $(validationsRule.equals).val() != $(mappingId).val()) {
										result.ErrorFields.push({ "field": mappingId, "message": (valMessages && valMessages[j] ? valMessages[j] : ""), "errorType": "equals" })
									}
									//number
									if (validationsRule == 'number' && $(mappingId) && $(mappingId).val() != "" && isNaN($(mappingId).val())) {
										result.ErrorFields.push({ "field": mappingId, "message": (valMessages && valMessages[j] ? valMessages[j] : ""), "errorType": "number" })
									}
								}
							}
						}
					}
				}
				return result;
			}
		}
	});
	$.fn.extend({

		//*********************************
		// Indique si le champ de formulaire est "checkable"
		//*********************************
		isCheckable: function() {
			return /radio|checkbox/i.test(this[0].type);
		},
		isValidDate: function() {
			return $.IsDateValid($(this).val());
		},
		isValidTime: function() {
			return $.IsTimeValid($(this).val());
		},

		//*********************************
		// Indique si une valeur est séléctionnée/saisie
		//*********************************
		isEmpty: function() {
			if (!this.exists()) return true;
			switch (this[0].nodeName.toLowerCase()) {
				case 'select':
					return $("option:selected", this).val().length == 0;
				case 'input':
					if (this.isCheckable())
						return $("input[name='" + this[0].name + "']").filter(':checked').length == 0;
			}
			return this.val().length == 0;
		},
		getSingleValue: function() {
			if (!this.exists()) return null;
			var value='';
			switch (this[0].nodeName.toLowerCase()) {
				case 'select':
					value=this.val();
					break;
				case 'input':
					switch (this[0].type.toLowerCase()) {
						case 'checkbox':
							value=this.is(":checked");
							break;
						case 'radio':
							var checkedItem = $(this).filter(':checked');
							if (!checkedItem.exists()) return null;
							value=checkedItem.val();
							break;
						default:
							value=this.val();
							break;
					}
					break;
				default:
					value=this.val();
					break;
			}
			var forbiddenStrings=['<' ,'%3C','&lt','&lt;','&LT','&LT;','&#60','&#060','&#0060','&#00060','&#000060','&#0000060','&#60;' ,'&#060;' ,'&#0060;' ,'&#00060;' ,'&#000060;' ,'&#0000060;' ,'&#x3c' ,'&#x03c' ,'&#x003c' ,'&#x0003c' ,'&#x00003c' ,'&#x000003c' ,'&#x3c;' ,'&#x03c;' ,'&#x003c;' ,'&#x0003c;' ,'&#x00003c;' ,'&#x000003c;' ,'&#X3c' ,'&#X03c' ,'&#X003c' ,'&#X0003c' ,'&#X00003c' ,'&#X000003c' ,'&#X3c;' ,'&#X03c;' ,'&#X003c;' ,'&#X0003c;' ,'&#X00003c;' ,'&#X000003c;' ,'&#x3C' ,'&#x03C' ,'&#x003C' ,'&#x0003C' ,'&#x00003C' ,'&#x000003C' ,'&#x3C;' ,'&#x03C;' ,'&#x003C;' ,'&#x0003C;' ,'&#x00003C;' ,'&#x000003C;' ,'&#X3C' ,'&#X03C' ,'&#X003C' ,'&#X0003C' ,'&#X00003C' ,'&#X000003C' ,'&#X3C;' ,'&#X03C;' ,'&#X003C;' ,'&#X0003C;' ,'&#X00003C;' ,'&#X000003C;' ,'\x3c' ,'\x3C' ,'\u003c' ,'\u003C' ,'>' ,'%3E' ,'&gt' ,'&gt;' ,'&GT' ,'&GT;' ,'&#62' ,'&#062' ,'&#0062' ,'&#00062' ,'&#000062' ,'&#0000062' ,'&#62;' ,'&#062;' ,'&#0062;' ,'&#00062;' ,'&#000062;' ,'&#0000062;' ,'&#x3E' ,'&#x03E' ,'&#x003E' ,'&#x0003E' ,'&#x00003E' ,'&#x000003E' ,'&#x3E;' ,'&#x03E;' ,'&#x003E;' ,'&#x0003E;' ,'&#x00003E;' ,'&#x000003E;' ,'&#X3E' ,'&#X03E' ,'&#X003E' ,'&#X0003E' ,'&#X00003E' ,'&#X000003E' ,'&#X3E;' ,'&#X03E;' ,'&#X003E;' ,'&#X0003E;' ,'&#X00003E;' ,'&#X000003E;' ,'&#x3E' ,'&#x03E' ,'&#x003E' ,'&#x0003E' ,'&#x00003E' ,'&#x000003E' ,'&#x3E;' ,'&#x03E;' ,'&#x003E;' ,'&#x0003E;' ,'&#x00003E;' ,'&#x000003E;' ,'&#X3E' ,'&#X03E' ,'&#X003E' ,'&#X0003E' ,'&#X00003E' ,'&#X000003E' ,'&#X3E;' ,'&#X03E;' ,'&#X003E;' ,'&#X0003E;' ,'&#X00003E;' ,'&#X000003E;' ,'\x3E' ,'\x3E' ,'\u003E' ,'\u003E' ,/script(.*)/gi ,/eval\((.*)\)/gi];
			value = value
				.replace(/</g, "&lt;")
				.replace(/>/g, "&gt;")
				.replace(/[\"\'][\s]*javascript:(.*)[\"\']/gi, "\"\"")
				.replace(/script(.*)/gi, "")
				.replace(/eval\((.*)\)/gi, "");
			for (var i=0;i<forbiddenStrings.length;i++) value = value.replace(forbiddenStrings[i], "");
			return value;
		},
		setSingleValue: function(value) {
			if (!this.exists()) return null;
			var forbiddenStrings=['<' ,'%3C','&lt','&lt;','&LT','&LT;','&#60','&#060','&#0060','&#00060','&#000060','&#0000060','&#60;' ,'&#060;' ,'&#0060;' ,'&#00060;' ,'&#000060;' ,'&#0000060;' ,'&#x3c' ,'&#x03c' ,'&#x003c' ,'&#x0003c' ,'&#x00003c' ,'&#x000003c' ,'&#x3c;' ,'&#x03c;' ,'&#x003c;' ,'&#x0003c;' ,'&#x00003c;' ,'&#x000003c;' ,'&#X3c' ,'&#X03c' ,'&#X003c' ,'&#X0003c' ,'&#X00003c' ,'&#X000003c' ,'&#X3c;' ,'&#X03c;' ,'&#X003c;' ,'&#X0003c;' ,'&#X00003c;' ,'&#X000003c;' ,'&#x3C' ,'&#x03C' ,'&#x003C' ,'&#x0003C' ,'&#x00003C' ,'&#x000003C' ,'&#x3C;' ,'&#x03C;' ,'&#x003C;' ,'&#x0003C;' ,'&#x00003C;' ,'&#x000003C;' ,'&#X3C' ,'&#X03C' ,'&#X003C' ,'&#X0003C' ,'&#X00003C' ,'&#X000003C' ,'&#X3C;' ,'&#X03C;' ,'&#X003C;' ,'&#X0003C;' ,'&#X00003C;' ,'&#X000003C;' ,'\x3c' ,'\x3C' ,'\u003c' ,'\u003C' ,'>' ,'%3E' ,'&gt' ,'&gt;' ,'&GT' ,'&GT;' ,'&#62' ,'&#062' ,'&#0062' ,'&#00062' ,'&#000062' ,'&#0000062' ,'&#62;' ,'&#062;' ,'&#0062;' ,'&#00062;' ,'&#000062;' ,'&#0000062;' ,'&#x3E' ,'&#x03E' ,'&#x003E' ,'&#x0003E' ,'&#x00003E' ,'&#x000003E' ,'&#x3E;' ,'&#x03E;' ,'&#x003E;' ,'&#x0003E;' ,'&#x00003E;' ,'&#x000003E;' ,'&#X3E' ,'&#X03E' ,'&#X003E' ,'&#X0003E' ,'&#X00003E' ,'&#X000003E' ,'&#X3E;' ,'&#X03E;' ,'&#X003E;' ,'&#X0003E;' ,'&#X00003E;' ,'&#X000003E;' ,'&#x3E' ,'&#x03E' ,'&#x003E' ,'&#x0003E' ,'&#x00003E' ,'&#x000003E' ,'&#x3E;' ,'&#x03E;' ,'&#x003E;' ,'&#x0003E;' ,'&#x00003E;' ,'&#x000003E;' ,'&#X3E' ,'&#X03E' ,'&#X003E' ,'&#X0003E' ,'&#X00003E' ,'&#X000003E' ,'&#X3E;' ,'&#X03E;' ,'&#X003E;' ,'&#X0003E;' ,'&#X00003E;' ,'&#X000003E;' ,'\x3E' ,'\x3E' ,'\u003E' ,'\u003E' ,/script(.*)/gi ,/eval\((.*)\)/gi];
			var newvalue = (""+value).replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/[\"\'][\s]*javascript:(.*)[\"\']/gi, "\"\"").replace(/script(.*)/gi, "").replace(/eval\((.*)\)/gi, "");
			for (var i = 0; i < forbiddenStrings.length; i++) newvalue = newvalue.replace(forbiddenStrings[i], "");
			if (this[0].nodeName.toLowerCase() == 'input' && /checkbox|radio/i.test(this[0].type.toLowerCase())) {
				this.each(function(position) { $(this).attr("checked", ($(this).val() == newvalue)); });
			}
			else {
				return this.val(newvalue);
			}
		}
	});

});

