/*
 * jQuery superhero form validation plugin 0.1
 *
 * http://www.superherocms.com/superhero/ui/shvalidate
 * http://docs.jquery.com/Plugins/shdatacontrol
 *
 * Copyright (c) 2010 Oscar Emilio Antolinez Collazos
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($) {
	$.widget("ui.shvalidate", {
			 
		_init: function() {
			var element=this.element; var o = this.options;	
			
			//alert(o.properties.fields[0].id);
			//$(o.properties.fields).each(function(){
			//	alert(this.id);
			//});
			
			//this._callURL();
			this._bindEvents();
		},
		
		checkDate: function(val){
						
			var arrayDate = val.split("-")
			//var ano = parseInt(array_fecha[0],10);
			//var mes = parseInt(array_fecha[1],10);
			//var dia = parseInt(array_fecha[2],10);
			var year = parseInt(arrayDate[0],10);
			var month = parseInt(arrayDate[1],10);
			var day = parseInt(arrayDate[2],10);
			var mydate = new Date(year,month-1,day);
			
			year2=(mydate.getYear() < 1000) ? mydate.getYear() + 1900 : mydate.getYear();
			
			//si el array no tiene tres partes, la fecha es incorrecta
			if(arrayDate.length!=3){
				return false;
			}else if(isNaN(year) || year2 != year){
				return false;
			}else if(isNaN(month) || (month > 12) || (month-1) != mydate.getMonth()){
				return false;
			}else if(isNaN(day) || day != mydate.getDate()){
				return false;
			}
			
			return true;
			
		},

		checkEmail: function(val){
			var ck_email = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
			
			if(!ck_email.test(val)) {
			  return false;
			}else{
				return true;
			}
		},

		checkOnlyNumbers: function(evt){
			var charCode = evt.which;
			if (charCode > 31 && (charCode < 48 || charCode > 57)) {
				/*alert("Por favor digiet solo numeros.")*/
				return false;
			}
				return true;
		},
		
		thousands: function(val){
			var valor=val;
			var posdecimal=0;
			var cuenta=0;
			var j=0;
			var cadResultado='';
			var regPunto=new RegExp("\\,","g")
			if(valor.length>0){
				valor=valor.replace(regPunto,'');
				posdecimal=valor.indexOf('.');
				if(posdecimal==-1){posdecimal=valor.length;}
				for(j=posdecimal-1;j>=0;j--){
					if(cuenta<3){
						cadResultado=valor.charAt(j)+cadResultado;
					}else{
						cadResultado=valor.charAt(j)+','+cadResultado;
						cuenta=0;
					}
					cuenta++;
				}
				return cadResultado+valor.substring(posdecimal,valor.length);
			}
		},
		
		
		serializeData: function(){
			var element=this.element; var o = this.options;	var self=this;
			
			return dataString;
		},
		
		_unbindEvents: function(){
			var element=this.element; var o = this.options;	var self=this;
			var pos=element.find("tr.shtableheader").find("th").index(element.find("th#chk"));
			
			
		},
		
		_bindEvents: function() {
			var element=this.element; var o = this.options;	var self=this;
			//alert($(element).find(":password").length);
			
			$(o.fields).each(function(f, field){
			
				/* Chequeo restricciones */
				$(element).delegate("[name="+this.name+"]", "click", function(){$(this).focus()});//movemos el foco por los check que lo tomaban  
				
				$(element).delegate("[name="+this.name+"]", "keypress", function(event){
					if(field.maxlength>0 && /^-?((\d+\.?\d?)|(\.\d+))$/.test(field.maxlength)){
						var maxLength = field.maxlength; //alert(field.maxlength);
						var key = event.which;
						//all keys including return.
						//alert(key);
						if(key > 33 || key == 32 || key == 13) {
							var length = $(this).val().length; //alert($(this).val().length);
							if(parseInt(length,10) >= parseInt(maxLength, 10)) {
								$(this).parent().find(".charcount").html((parseInt(maxLength, 10)-parseInt($(this).val().length)));
								event.preventDefault();
							}
						}
					}
					
					
				});
				
				$(element).delegate("[name="+this.name+"]", "keyup", function(event){
					if(field.maxlength>0 && /^-?((\d+\.?\d?)|(\.\d+))$/.test(field.maxlength)){
						var maxLength = field.maxlength; //alert(field.maxlength);
						$(this).parent().find(".charcount").html((parseInt(maxLength, 10)-parseInt($(this).val().length)));
						
					}
				});
				//alert(field.name);
				
				$(element).delegate("[name="+field.name+"]", "focusout", function(){
																				 
					$(this).siblings("."+o.errorClass+"").remove();		
					if(field.required==true){
						//alert(this.type);
						if(this.type=="select-one"){
							//alert($(this).val().length);
							if($(this).val().length==0){
								$(this).parent().append("<div class='"+o.errorClass+"'>Debe escojer un item de la lista</div>");
							}
						}else if(this.type=="radio"){
							if(!$("[name="+field.name+"]:checked").val()){
								$(this).parent().append("<div class='"+o.errorClass+"'>Debe escojer una opcion</div>");
							}
						}else if(this.type=="checkbox"){
							if(!$("[name="+field.name+"]:checked").val()){
								$(this).parent().append("<div class='"+o.errorClass+"'>Debe escojer al menos una opcion</div>");
							}
						}else{
							if($(this).val().length==0){
								$(this).parent().append("<div class='"+o.errorClass+"'>Debe diligenciar este campo</div>");
							}
						}
					
						if(this.type=="password"){
							if($(element).find(":password").length==2){
								if($(element).find(":password").eq(0).val()!=$(element).find(":password").eq(1).val()){
									$(this).parent().append("<div class='"+o.errorClass+"'>No coinciden las claves</div>");
								}else{
									$(element).find(":password").siblings("."+o.errorClass+"").remove();
								}
							}
						}
						
						if(field.format=="numeric" || field.format=="thousands"){
							//alert(parseInt(($(this).val()).replace(/,/g, ""), 10));
							if(parseInt(field.minvalue, 10)>0 && /^-?((\d+\.?\d?)|(\.\d+))$/.test(field.minvalue)){
								if(parseInt(($(this).val()).replace(/,/g, ""), 10)<parseInt(field.minvalue, 10)){
									$(this).parent().append("<div class='"+o.errorClass+"'>El valor no puede ser inferior a "+field.minvalue+"</div>");
								}
							}
							if(parseInt(field.maxvalue, 10)>0 && /^-?((\d+\.?\d?)|(\.\d+))$/.test(field.maxvalue)){
								if(parseInt(($(this).val()).replace(/,/g, ""), 10)>parseInt(field.maxvalue, 10)){
									$(this).parent().append("<div class='"+o.errorClass+"'>El valor no puede ser mayor de "+field.maxvalue+"</div>");
								}
							}
						}
											
						if(field.minlength>0 && /^-?((\d+\.?\d?)|(\.\d+))$/.test(field.minlength)){
							if($(this).val().length<field.minlength){
								$(this).parent().append("<div class='"+o.errorClass+"'>Digite al menos "+field.minlength+" caracteres</div>");
							}
						}
						
						if(field.maxlength>0 && /^-?((\d+\.?\d?)|(\.\d+))$/.test(field.maxlength)){
							if($(this).val().length>field.maxlength){
								$(this).parent().append("<div class='"+o.errorClass+"'>Digite maximo "+field.maxlength+" caracteres</div>");
							}
						}
						
						
						if(field.format=="email"){
							if(!self.checkEmail($(this).val())){
								$(this).parent().append("<div class='"+o.errorClass+"'>Debe diligenciar un email valido</div>");
							}
						}
	
						if(field.format=="date" || field.format=="datepicker"){
							if(!self.checkDate($(this).val())){
								$(this).parent().append("<div class='"+o.errorClass+"'>Fecha no valida</div>");
							}
						}


					}
				});
				
				
				
				/* Condiciones para entrada de datos */

				if(field.format=="numeric"){
					$(element).delegate("[name="+field.name+"]", "keypress", function(i, name){
						return self.checkOnlyNumbers(i);
					});
					//element.find("#"+this.id+"").bind("keypress",function(i, name){return self.chekOnlyNumbers(i)});
				}
				if(field.format=="thousands"){
					
					$(element).find("[name="+this.name+"]").css("text-align","right");
					
					$(element).delegate("[name="+field.name+"]", "keypress", function(i, name){
						return self.checkOnlyNumbers(i);
					});
					$(element).delegate("[name="+field.name+"]", "keyup", function(){
						$(this).val(self.thousands($(this).val()));
					});
					//element.find("#"+this.id+"").bind("keypress",function(i, name){return self.chekOnlyNumbers(i)});
				}
				if(field.format=="datepicker"){	//requiere pluggin datepicker.js	
					//var now = new Date();
					var mindate = field.minvalue;
					var maxdate = field.maxvalue;
					
					$(element).find('[name='+field.name+']').siblings(".datepicker-area").DatePicker({
						format:'Y-m-d',
						date: field.date,
						current: field.value,
						starts: 1,
						position: 'bottom',
						onRender: function(date) {
							return {
								disabled: (date.valueOf() > maxdate.valueOf() || date.valueOf() < mindate.valueOf()),
							}
						},
						onHide: function(){
							//$(element).find('[name='+field.name+']').siblings("."+o.errorClass+"").remove();	
						},
						onBeforeShow: function(){
							$(element).find('[name='+field.name+']').DatePickerSetDate(field.value, true);
						},
						locale: {
							days: ["Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"],
							daysShort: ["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom"],
							daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"],
							months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
							monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
							weekMin: 'se'
						},
						onChange: function(formated, dates){
							$(element).find('[name='+field.name+']').val(formated);
							$(element).find('[name='+field.name+']').focus();
							$(element).find('[name='+field.name+']').DatePickerHide();
							
						}
					});
					
				}


				/* Asignacion de otros pluggins */
				
				if(field.mask.length>0){
					$(element).find("[name="+field.name+"]").mask(field.mask);
				}
				
				
				/* Adicion de eventos personalizados */
				//alert(field.name);
				$(field.events).each(function(e, ev){
					$(element).find("[name="+field.name+"]").bind("change", function(){ev.code()});
				})
				
			});
						
			
			//Evento para el envio del formulario
			element.submit(function(){
				$(element).find("input, select, textarea").trigger("focusout");
				if(element.find("."+o.errorClass+"").length>0){
					return false;
				}else{
					if(o.beforeSubmit()==false){
						return false;
					}
					if(o.sendType=="nosend"){
						return false;
					}else if(o.sendType=="normal"){
						return true;
					}else if(o.sendType=="ajax"){
						self._callURL();
						return false;
					}else{}
				}
			})
			

		},
		
		
		validateForm: function() {
			var element=this.element; var o = this.options;	var self=this;
			$(element).find("input, select, textarea").trigger("focusout");
			if(element.find("."+o.errorClass+"").length>0){
				this.options.valid = false;
			}else{
				this.options.valid= true;
			}
			
			this._trigger('validateForm', null);
		},
		
		_callURL: function() {
			var element=this.element;
			var o = this.options;
			var self=this;
			//o.beforeSubmit();
						
			$.ajax({
				type: element.attr("method"),
				url: element.attr("action"),
				async: false,
				//dataTypeString: o.dataType,
				beforeSend: function(XMLHttpRequest){
					$(element).find(":submit").attr("disabled", "disabled");
					return o.beforeSend(XMLHttpRequest);
					//return true;
				},
				data: $.param(element.serializeArray())+"&"+o.extraData,
				success: function(response){
					o.completeSubmit(response);
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
					alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown);
				},
				complete: function(){
					$(element).find(":submit").removeAttr("disabled");
				}
			});			
		},
		
		
		destroy: function() {
			//$.widget.prototype.apply(this, arguments); // default destroy
			// now do other stuff particular to this widget
		} 
		
		
	});
	$.extend($.ui.shvalidate, {
		getter: "serializeData",
		defaults: {
			sendType: "ajax",//ajax|normal|nosend
			dataType: "",
			extraData: "",
			valid: true,
			errorClass: "validateError",
			beforeSubmit: function(){},
			beforeSend: function(XMLHttpRequest){},
			completeSubmit: function(response){},
			fields: [] //Sin campos []
		}
	});
})(jQuery);
