/**
 * jQuery.reves
 * 
 * @version 0.4.0
 */

/***** DEBUG *****/

jQuery.debug = {
	trace : function (o) {
		if(window.console) {
			console.debug(o);
		} else {
			alert(o);
		}
	},
	hideError : function (id) {
		if (id === undefined) {
			jQuery('.error').hide();
		} else {
			jQuery('#' + id).hide();
		}
	},
	displayError : function (message, id) {
		if (id === undefined || jQuery('#' + id).length == 0) {
			alert(message);
		} else {
			jQuery('#' + id).html(message).show();
		}
	}
};

/***** WINDOW *****/

jQuery.window = {
	popup : function (url, settings) {
	 	settings = jQuery.extend({
	 		name:'popup',
	 		width:400,
	 		height:300
	 	}, settings);
	 	
	 	var posX = (screen.width - settings.width) / 2;
		var posY = (screen.height - settings.height) / 2;
		
		var options  = 'height=' + settings.height + ',';
		options 	+= 'width=' + settings.width + ',';
		options 	+= 'top=' + posY + ',';
		options 	+= 'left=' + posX + ',';
		options 	+= 'scrollbars=1';
	 	
	 	var popup = window.open(url, settings.name, options);
	 	
	 	if (window.focus) {popup.focus();}
		
		return(false);
	},
	zoom : function (img) {
		if (document.images) {
			var NEWLINE = "\n";
			
			var options = "resizable=yes,"
			options += "width=150,";
			options += "height=150,";
			options += "left=" + ((screen.width / 2) - 75) + ",";
			options += "top=" + ((screen.height / 2) - 75);
			
			var htmlTemp = '<html>' + NEWLINE;
			htmlTemp += '<head>' + NEWLINE;
			htmlTemp += '<title>Zoom Image</title>' + NEWLINE;
			htmlTemp += '</head>' + NEWLINE;
			htmlTemp += '<body style="margin:0;" onload="var myImage = new Image();myImage.src = \'' + img + '\';window.resizeBy((myImage.width - 150), (myImage.height - 150));window.moveBy(-((myImage.width - 150) / 2), -((myImage.height - 150) / 2));" onblur="self.close();">' + NEWLINE;
			htmlTemp += '<a href="javascript:self.close();"><img src="' + img + '" border="0" alt="Fermer" title="Fermer" /></a>' + NEWLINE;
			htmlTemp += '</body>' + NEWLINE;
			htmlTemp += '</html>' + NEWLINE;
			
			var popup = window.open('', 'zoom', options);
			
			popup.document.write(htmlTemp);
			popup.document.close();
			
			if (window.focus) {
				popup.focus();
			}
			
			return false;
		}
		else {
			return true;
		}
	}
};

/***** FORM MANAGER *****/
/* 
Params for validator object :

required : Boolean
type : String ('string', 'email', 'int', 'float')
rangeLength : Array ([beginValue:Number, endValue:Number])
minLength : Number
maxLength : Number
equalTo : Number, String
tipValue : Number, String
defaultValue : Number, String
errorMessage : String
errorContainer : String

Params not yet implemented :

rangeValue : Array ([beginValue:Number, endValue:Number])
minValue : Number
maxValue : Number
lengthEqualTo : Number
*/

var formArray = Array();

jQuery.form = {
	tipField : function (id, value) {
		var o = jQuery('#' + id);
		o.val(value);
		o.focus(function(){
			if (o.val() == value) {
				o.val('');
			}
		});
		o.blur(function(){
			if (o.val() === '') {
				o.val(value);
			}
		});
	},
	initField : function (id, value) {
		var o = jQuery('#' + id);
		o.val(value);
	},
	initSelect : function (id, value) {
		var options = jQuery('option', '#' + id);
		options.each(function(){
			if (this.value == value) {
				this.selected = true;
			}
		});
	},
	getFormManager : function (id) {
		if (formArray[id] === undefined) {
			formArray[id] = Array();
		}
		
		return(formArray[id]);
	},
	addField : function (id_form, id_field, validator) {
		validator = jQuery.extend({
			required:false,
			type:'string',
			errorMessage:'Veuillez saisir ce champs correctement.',
			errorContainer:undefined,
			tipValue:'',
			defaultValue:''
		}, validator);
		
		jQuery.form.tipField(id_field, validator.tipValue);
		
		if (validator.tipValue !== '') {
			jQuery.form.initField(id_field, validator.tipValue);
		}
		
		if (validator.defaultValue !== '') {
			jQuery.form.initField(id_field, validator.defaultValue);
		}
		
		jQuery.form.getFormManager(id_form)[id_field] = validator;
	},
	addSelect : function (id_form, id_field, validator) {
		validator = jQuery.extend({
			required:false,
			type:'string',
			errorMessage:'Veuillez saisir ce champs correctement.',
			errorContainer:undefined,
			tipValue:'',
			defaultValue:''
		}, validator);
		
		if (validator.tipValue !== '') {
			jQuery.form.initSelect(id_field, validator.tipValue);
		}
		
		if (validator.defaultValue !== '') {
			jQuery.form.initSelect(id_field, validator.defaultValue);
		}
		
		jQuery.form.getFormManager(id_form)[id_field] = validator;
	},
	checkField : function (id_form, id_field) {
		var validator = jQuery.form.getFormManager(id_form)[field];
		var value = jQuery('#' + id_field).val();
		
		for (property in validator) {
			switch (property) {
				case 'required':
					if (validator[property] && !jQuery.string.exist(value) ) {
						return(false);
					}
					break;
				case 'type':
					switch (validator[property]) {
						case 'int':
							if (!jQuery.number.isInt(value)) {
								return(false);
							}
							break;
						case 'float':
							if (!jQuery.number.isFloat(value)) {
								return(false);
							}
							break;
						case 'email':
							jQuery('#' + id_field).val(jQuery.string.writeEmail(value));
							if (!jQuery.string.isEmail(value)) {
								return(false);
							}
							break;
					}
					break;
				case 'rangeLength':
					if (!jQuery.string.rangeLength(value, validator[property])) {
						return(false);
					}
					break;
				case 'minLength':
					if ( value.length < validator[property] ) {
						return(false);
					}
					break;
				case 'maxLength':
					if ( value.length > validator[property] ) {
						return(false);
					}
					break;
				case 'equalTo':
					if (value != validator[property]) {
						return(false);
					}
					break;
				case 'rangeValue':
					if (!jQuery.number.rangeValue(value, validator[property])) {
						return(false);
					}
					break;
				case 'tipValue':
					if (value == validator[property]) {
						return(false);
					}
					break;
			}
		}
		
		return(true);
	},
	checkForm : function (id) {
		jQuery.debug.hideError();
		var formManager = jQuery.form.getFormManager(id);
		for (field in formManager) {
			if (!jQuery.form.checkField(id, field)) {
				var jField = jQuery('#' + field);
				jQuery.debug.displayError(formManager[field].errorMessage, formManager[field].errorContainer);
				jField.focus();
				jField.select();
				return(false);
			}
		}
		
		return(true);
	},
	correctSelectWithIE : function (id) {
		var widthSelect = $('select#' + id).width();
		$('select#' + id)
			.css('position', 'absolute')
			.css('top', 0)
			.css('left', 0)
			.parent().css('position', 'relative')
			.children('#' + id).next().css('margin-left', widthSelect);
		
		if ($.browser.msie) {
			$('select#' + id).mouseover(function(){
				$(this).width('auto');
			});
			$('select#' + id).blur(function(){
				$(this).width(widthSelect + 'px');
			});
		}
	}
};

/***** STRING *****/

jQuery.string = {
	exist : function (str) {
		var strstr = str.replace(/ /g, '');
		return ( (strstr !== '') && (strstr.length !== 0) );
	},
	isEmail : function (email) {
		// double caractères interdits
		var doubleCharPasOk = ["..","--","__",".@","-@","_@","@.","@-","@_","-_","_-",".-","-.","._","_."];	
	
		// ecriture normalisée
		email = jQuery.string.writeEmail(email);

		// pas de double caractères interdits
		for (var i = 0 ; i < doubleCharPasOk.length ; i++) {
			if (!(email.indexOf(doubleCharPasOk[i]) == -1)) {
				return(false);
			}
		}
		
		var regexp = new RegExp("^[a-z0-9]{1}[a-z0-9._-]+@[a-z0-9._-]{2,}[.][a-z]{2,}$", "");
		var result = regexp.test(email);
		
		return(result);
	},
	writeEmail : function (email) {
		email = email.toLowerCase();
		email = email.replace(/ /g, "");
		
		var tabAccents 		= 'àáâãäåçèéêëìíîïñòóôõöùúûüýÿ';
		var tabSansAccents 	= 'aaaaaaceeeeiiiinooooouuuuyy';
		var len				= tabAccents.length;
		
		for (var i = 0 ; i < len ; i++) {
			var regexp = new RegExp(tabAccents.charAt(i), 'g');
			email = email.replace(regexp, tabSansAccents.charAt(i));
		}
		
		return(email);
	},
	capitalize : function (str) {
		var firstLetter = str.charAt(0);
		str = firstLetter.toUpperCase() + str.substring(1, str.length);
	
		return(str);
	},
	rangeLength : function (str, range) {
		var len = str.length;
		return( (len >= range[0]) && (len <= range[1]) );
	}
};

/***** NUMBER *****/

jQuery.number = {
	isInt : function (num) {
		var regexp = new RegExp('[0-9]+');
		var result = regexp.test(num);
		
		return(result);
	},
	isFloat : function (num) {
		var regexp = new RegExp("[0-9.]+");
		var result = regexp.test(num);
		
		return(result);
	},
	rangeValue : function (num, range) {
		return( (num >= range[0]) && (num <= range[1]) );
	}
};