/**
 * Form validator utility
 *
 * <form id="myform" onsubmit="return validateForm('#myform')">
 *   <input type="text" name="name"/> 
 *    <div class="validator" field="name" required="true">Name is required</div>
 *  <input type="text" name="email"/>
 *   <div class="validator" field="email" required="true">Email is required</div>
 *   <div class="validator" field="email" regex="[-0-9A-Za-z_.]+@[-0-9A-Za-z_.]\.\w{2,}+">Email address is invalid</div>
 *  <input type="text" name="age" id="age"/>
 *   <div class="validator" expr="parseInt($('#age').val())>0">Age must be greater than zero</div>
 * </form>
 */

var disableScroll = false;

$(document).ready(prepareValidators);

function prepareValidators() {
	
$("#dateYear").click(function(){  $("#dateYear").addClass("focused");  });
$("#dateMonth").click(function(){  $("#dateMonth").addClass("focused");  });
$("#dateDay").click(function(){  $("#dateDay").addClass("focused");  });

$("#dateYear").blur(function(){  $("#dateYear").removeClass("focused");  });
$("#dateMonth").blur(function(){  $("#dateMonth").removeClass("focused");  });
$("#dateDay").blur(function(){  $("#dateDay").removeClass("focused");  });
	
	$(".property .validator").each(function() {
			var $this = $(this);
			enhanceValidator($this);
			hideValidator($this);
	});
	$(".property").each(enhanceProperty);
	
	
}

function enhanceProperty() {
		var property = $(this);		
		var elem = property.find("input,textarea,select");
		var val= $(this).children(".control").children(".validator.tip-target");	
		elem.bind("focus", function() {
			property.addClass("focused");
		if(property.is(".has-error")){/*
			var pos = val.position();
			var width = val.width();								
			$(".x-tip-body").text(val.attr("ext:qtip"));
			$(".x-tip-body").css ("width","auto")
			$(".x-tip").css( { "left": (pos.left + width+3) + "px", "top":pos.top + "px"  } );
			$(".x-tip").css("visibility","visible");
			$(".x-tip").css("display","block");
			$(".x-tip").css ("width","auto");
			$(".x-tip").css ("max-width","301px");
			
			$(".x-shadow").css ("width",$(".x-tip").width());
			$(".x-shadow").css ("height",$(".x-tip").height()+1);
			
			//
			/*
			$(".xstc").css ({ "height": ($(".x-tip").height()-12) + "px", "width":($(".x-tip").width()-12) + "px"});
			$(".xsc").css ({ "height": ($(".x-tip").height()-12) + "px", "width":($(".x-tip").width()-12) + "px"});
			$(".xsbc").css ({ "height": ($(".x-tip").height()-12) + "px", "width":($(".x-tip").width()-12) + "px"});
			$(".xmc").css ( "width", $(".x-tip").width()-12 );
			*/
			//
			
			/*
			$(".xstc").css ( "width", $(".x-tip").width()-12 );
			$(".xsmc").css ( "width", $(".x-tip").width()-12 );
			$(".xsbc").css ( "width", $(".x-tip").width()-12 );
			$(".xsc").css ( "height", $(".x-tip").height()-12 );
			
			
			$(".x-shadow").css( { "left": (pos.left + width + 3 + 3) + "px", "top":(pos.top + 3) + "px" } );
			$(".x-shadow").css("display","block");
			$(".x-shadow").css("visibility","visible");
			$(".x-tip-anchor").css("visibility","hidden");
				*/		
			}
			//alert("x");
		});

		elem.bind("blur", function(e) {
			property.removeClass("focused");
			//$(".x-tip").css("visibility","hidden");
			//$(".x-shadow").css("visibility","hidden");
			$(".x-tip").css("display","none");
			$(".x-shadow").css("display","none");
			
			if(elem.is(".autocomplete-field")) {
				return;
			}

			var dom_form = property.parents("form").get(0);
			if(dom_form)
				validateProperty(property, dom_form, false);
		});

		property.bind("validate", function(e) {
			var dom_form = property.parents("form").get(0);
			if(dom_form)
				validateProperty(property, dom_form, false);
		});
}

function validateProperty(property, dom_form, scroll) {
	var validator = property.find(".validator");

	var has_error = false;
	for(var i=0;i<validator.length;i++) {
		has_error =  validateValidator(validator.eq(i), scroll, dom_form) || has_error;
	}

	if(has_error) 
		property.addClass("has-error");
	else
		property.removeClass("has-error");

	if(validator.length>1) {
		if(has_error) {
			for(var i=0;i<validator.length;i++) {
				if(validator.eq(i).hasClass("ok")) 
					hideValidator(validator.eq(i), true);
				else {
					validator.eq(i).show();
					validator.eq(i).css("visibility", "visible");
				}
			}
		}
		else {
			validator.eq(0).show();
			hideValidator(validator.eq(0), false);
			for(var i=1;i<validator.length;i++) {
				hideValidator(validator.eq(i), true);
			}
		}
	}
	return has_error;
}


function hideValidator(e, reallyhide) {
	if(reallyhide) {
		e.hide();
		return;
	}

	if(e.hasClass("use-display"))
		e.hide();
	else
		e.css("visibility", "hidden");
}

function showValidator(e) {
	if(e.hasClass("use-display"))
		e.show();
	else
		e.css("visibility", "visible");
}

function enhanceValidator(e) {
	if(!e.ENHANCED) {
		e.error = function(scroll) {
			e.removeClass("ok");
			showValidator(e);
			customIndicator(e, true);

			if(scroll)
				scrollToError(e);
		};

		e.success = function() {
			e.addClass("ok");
			showValidator(e);
			hideValidator(e);
			customIndicator(e, false);
		};

		e.ENHANCED = true;
	}
}

function prepareDates(form) {
	var $form = $(form);

	var e = $form.find("input.hidden-date");
	for(var i=0;i<e.length;i++) {
		var input = e.eq(i);
		var year = input.prev();
		var month = year.prev();
		var day = month.prev();

		var val = year.val() + ' ' + month.val() + ' ' + day.val();
		input.val(val);
	}
}

function scrollToError(elem) {
    if(disableScroll) {
        return;
    }
    else  {
        if(!fkbox_opened)
            $.scrollTo(elem.parent(), 400);
        else
            $(".fkbox.popup .popupContent .content").scrollTo(elem.parent(), 400);
    }
}

function validateValidator(/* validator */ error, scroll, /* dom */ form) {
	enhanceValidator(error);

	var has_error = false;
	var val;
	if (error.attr("date")){
		
			if( isEmpty($("#dateYear").val()) || isEmpty($("#dateMonth").val()) || isEmpty($("#dateDay").val()) ) {
				//alert( $("#dateDay").val() + " " + $("#dateMonth").val() + " " + $("#dateYear").val() );
				
				var t=setTimeout(
				function () {		
				if ( !$("#dateYear").is(".focused") && !$("#dateMonth").is(".focused") && !$("#dateDay").is(".focused") ){
				has_error = true;
				error.error(scroll);} },300);
				
			}
			else {
				error.success();
			}
	
	}
	else if(error.attr("regex")!=null) {
		var reg = new RegExp(error.attr("regex"));
		var exc = error.attr("regexExclude");
		if(!exc) exc = "\n";
		
		var sel = error.attr("selector");
		if(sel)
			val = $(sel).val();
		else {
			var field = error.attr("field");
			val = $(form[field]).val();
		}

		if(!isEmpty(val) && val!=exc && !val.match(reg)) {
			has_error = true;
			error.error(scroll);
			//alert(1);
		}
		else {
			error.success();
			
			if(error.attr("required")=="true") {
				var sel = error.attr("selector");
				var emptyVal = error.attr("emptyValue");
				var delay = error.attr("delay");
				if(emptyVal) 
					emptyVal = new RegExp(emptyVal);
				if(sel) 
					val = $(sel).val();
				else {
					var field = error.attr("field");
					val = $(form[field]).val();
				}
				if(isEmpty(val) || (emptyVal && val.match(emptyVal))) {
					has_error = true;
					error.error(scroll);
				}
				else {
					error.success();
				}
			}
			
			
			
		}
		
		//
	} 	else if(error.attr("expr")!=null) { // return true on error
		var isError = eval(error.attr("expr"));
		if(isError) {
			has_error = true;
			error.error(scroll);
		}
		else {
			error.success();
			
			if(error.attr("required")=="true") {
				var sel = error.attr("selector");
				var emptyVal = error.attr("emptyValue");
				var delay = error.attr("delay");
				if(emptyVal) 
					emptyVal = new RegExp(emptyVal);
				if(sel) 
					val = $(sel).val();
				else {
					var field = error.attr("field");
					val = $(form[field]).val();
				}
				if(isEmpty(val) || (emptyVal && val.match(emptyVal))) {
					has_error = true;
					error.error(scroll);
				}
				else {
					error.success();
				}
			}
		}
	}else if(error.attr("required")=="true") {
				var sel = error.attr("selector");
				var emptyVal = error.attr("emptyValue");
				var delay = error.attr("delay");
				if(emptyVal) 
					emptyVal = new RegExp(emptyVal);
				if(sel) 
					val = $(sel).val();
				else {
					var field = error.attr("field");
					val = $(form[field]).val();
				}
				if(isEmpty(val) || (emptyVal && val.match(emptyVal))) {
					has_error = true;
					error.error(scroll);
				}
				else {
					error.success();
				}
			}		 	
	else if(error.attr("dateCheck")!=null) {
		var field = error.attr("field");
		var day = $(form[field+"Day"]).val();
		day = (day) ? parseInt(day) : -1;
		var month = $(form[field+"Month"]).val();
		month = (month) ? parseInt(month) : -1;
		var year = $(form[field+"Year"]).val();
		year = (year) ? parseInt(year) : -1;
		if ((day >0 && (month <1)) || (month >0 && year <1)){
			has_error = true;
			error.error(scroll);
		}
		else {
			error.success();
		}
	}	
	else if(error.attr("endCheck")!=null) {
		var field = error.attr("field");
		var efield = error.attr("end");
		
		var day = $(form[field+"Day"]).val();
		day = (day) ? parseInt(day) : -1;
		var month =$(form[field+"Month"]).val();
		month = (month) ? parseInt(month) : -1;
		var year = $(form[field+"Year"]).val();
		year = (year) ? parseInt(year) : -1;
		var eday = $(form[efield+"Day"]).val();
		eday = (eday) ? parseInt(eday) : -1;
		var emonth =$(form[efield+"Month"]).val();
		emonth = (emonth) ? parseInt(emonth) : -1;
		var eyear = $(form[efield+"Year"]).val();
		eyear = (eyear) ? parseInt(eyear) : -1;
		
		if ( (!((day >0 && (month <1)) || (month >0 && year <1))) && year>0 && eyear>0 && (!((eday >0 && (emonth <1)) || (emonth >0 && eyear <1))) ) {
			/* Both start and end dates are defined */
			if ( (eyear < year) || (emonth >0 && month >0 && eyear == year && emonth < month) || (eday>0 && day >0 && emonth >0 && month >0 && eyear == year && emonth == month && eday < day) ) {
				/* Start > End */
				has_error = true;
				error.error(scroll);
			}
			else {
				error.success();
			}
		}
	}
	else if(error.attr("startCheck")!=null) {
		var field = error.attr("field");
		var sfield = error.attr("start");
		
		var day = $(form[field+"Day"]).val();
		day = (day) ? parseInt(day) : -1;
		var month = $(form[field+"Month"]).val();
		month = (month) ? parseInt(month) : -1;
		var year = $(form[field+"Year"]).val();
		year = (year) ? parseInt(year) : -1;
		var sday = $(form[sfield+"Day"]).val();
		sday = (sday) ? parseInt(sday) : -1;
		var smonth =$(form[sfield+"Month"]).val();
		smonth = (smonth) ? parseInt(smonth) : -1;
		var syear = $(form[sfield+"Year"]).val();
		syear = (syear) ? parseInt(syear) : -1;
		
		if ( (!((sday >0 && (smonth <1)) || (smonth >0 && syear <1))) && syear>0 && year>0 && (!((day >0 && (month <1)) || (month >0 && year <1))) ){
			/* Both start and end dates are defined */
			if ( (year < syear) || (smonth>0 && month>0 && year == syear && month < smonth) || (sday>0 && day>0 && smonth>0 && month>0 && year == syear && month == smonth && day < sday) ) {
				/* Start > End */
				has_error = true;
				error.error(scroll);
			}
			else {
				error.success();
			}
		}
	}
	else {
		error.success();
	}

	return has_error;
}

function validateForm(formSelector) {
	var form = $(formSelector).get(0);
	var properties =  $(formSelector + " .property");

	//prepareDates(form);
	
	var first = true;
	var has_error = false;
	for(var i=0;i<properties.length;i++) {
		if(validateProperty(properties.eq(i), form, first)) {
			has_error = true;
			first = false;
		}
	}

	return !has_error;
}


function customIndicator(field, error) {
	var par = field.parents(".property");
	//if ( )
	
	//
	//alert(par.is(".property"));
	
	/*
	if(error)
		par.addClass("has-error");
	else
		par.removeClass("has-error");
		*/
}

function isEmpty(e) {
	return e==null || $.trim(e)=="";
}

/*
$(document).ready(function() {
	$("input.hidden-date").each(function() {
		var $this = $(this);
		var year = $this.prev();
		var month = year.prev();
		var day = month.prev(); 

		var pad = function(e) {
			if(e.length==1)
				return "0" + e;
			return e;
		};

		var val = $this.val();
		if(isEmpty(val)) return;

		var parts = val.split("/");
		year.val(parseInt(parts[2])+2000);
		month.val(pad(parts[0]));
		day.val(pad(parts[1]));
	});
});
*/

