// Package Netopa.Validate
var Netopa;
if (!Netopa) Netopa = {};

// ------ //
Netopa.ValidateSubForm = function()
{
   this.listOfValidateForm = new Object();
}

Netopa.ValidateSubForm.prototype.addSubForm = function(name, validateForm)
{
   this.listOfValidateForm[name] = validateForm;
}

Netopa.ValidateSubForm.prototype.removeSubForm = function(name)
{
   delete this.listOfValidateForm[name];
}

Netopa.ValidateSubForm.prototype.isValid = function()
{
   var returnValue = true;
   
   for (element in this.listOfValidateForm) {
      if (this.listOfValidateForm[element].isValid() == false) {
         returnValue = false;
      }
   }
   
   return returnValue;
}

// ------ //
Netopa.ValidateForm = function()
{
   this.listOfFields = new Array();
}

Netopa.ValidateForm.prototype.addField = function(field)
{
   this.listOfFields.push(field);
}

Netopa.ValidateForm.prototype.isValid = function()
{
   var returnValue = true;
   
   for (var i = 0; i < this.listOfFields.length; i++) {
      if (this.listOfFields[i].isValid() == false) {
         returnValue = false;
      }
   }
   
   return returnValue;
}

// ------ //
Netopa.Validate = function(field) {
   this.field = document.getElementsByName(field);
   
   if (this.field.length == 1) {
      this.field = this.field[0];
   }
   
   this.chainOfValidators = new Array();
   this.fieldMessage = document.getElementById(field + 'Message');
}

Netopa.Validate.prototype.addValidator = function(validator) {
   this.chainOfValidators.push(validator);
}

Netopa.Validate.prototype.isValid = function()
{
   for (var i = 0; i < this.chainOfValidators.length; i++) {
      try {
         if (this.chainOfValidators[i].isValid(this.field) == false) {
            this.field.className = 'formError';
            if (this.fieldMessage) {
               this.fieldMessage.style.display = '';
            }
            return false;
         } else {
            this.field.className = 'formOk';
            if (this.fieldMessage) {
               this.fieldMessage.style.display = 'none';
            }
         }
      } catch (e) {
         alert(e.message);  
      }
   }
   return true;
}

// ------ //
Netopa.ValidateAlwaysTrue = function() {
}

Netopa.ValidateAlwaysTrue.prototype.isValid = function(field)
{  
   return true;
}

// ------ //
Netopa.ValidateNotEmpty = function(value) {
	this.value = (value) ? value : '';
}

Netopa.ValidateNotEmpty.prototype.isValid = function(field)
{
   if (field.value.length > 0 && this.value != field.value) {
      return true
   }
   
   return false;
}

// ------ //
Netopa.ValidateEmail = function() {
}

Netopa.ValidateEmail.prototype.isValid = function(field)
{  
   if (field.value.search(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i)  != -1) {
      return true
   }
   
   return false;
}

// ------ //
Netopa.ValidateDate = function(dateString)
{
   this.dateString = dateString;
}

Netopa.ValidateDate.prototype.isValid = function(field)
{  
   var s1 = this.dateString;
   var s2 = field.value;
   
   var day = new Array();
   var month = new Array();
   var year = new Array();
   var separator = '';
   var yearLengthCheck = 0;
   
   for (var i = 0, j = 0; i < s1.length; i++, j++) {
      if (s1.charAt(i) == 'd') {
         if (isNaN(s2.charAt(j))) {
            day.unshift(0);
            j--;
         } else {
            day.push(s2.charAt(j));
         }
      } else if(s1.charAt(i) == 'm') {
         if (isNaN(s2.charAt(j))) {
            month.unshift(0);
            j--;
         } else {
            month.push(s2.charAt(j));
         }
      } else if(s1.charAt(i) == 'y') {
         yearLengthCheck++;
         if (isNaN(s2.charAt(j))) {
            year.unshift(0);
            j--;
         } else {
            year.push(s2.charAt(j));
         }
      } else {
         separator = s1.charAt(i);
      }
   }
   
   day = day.join('');
   month = month.join('');
   year = year.join('');
   
   var dateObj = new Date(year, month - 1, day);
   
   var dayCheck = dateObj.getDate();
   var monthCheck = dateObj.getMonth() + 1;
   var yearCheck = dateObj.getFullYear();
   
   if (this.yearLength < 4) {
      yearCheck = dateObj.getYear();
   }
   
   if (yearLengthCheck != year.length || (dayCheck != day) || (monthCheck != month) || (yearCheck != year)) {
      return false
   }
   
   // Fix separators
   field.value = s2.replace(/[^\d]/g, separator);
   
   return true;
}

// ------ //
Netopa.ValidateChecked = function() {
   this.fieldValue = null;
   
   if (arguments.length == 1) {
      this.fieldValue = arguments[0];
   }
}

Netopa.ValidateChecked.prototype.isValid = function(field)
{
   if (field.length) {
      for (var i = 0; i < field.length; i++) {
         if (field[i].checked == true || (field[i].selected && field.selectedIndex > 0)) {
            if (this.fieldValue != null) {
               return  (this.fieldValue == field[i].value) ? true : false;
            }
            return true;
         }
      }
   } else {
      if (field.checked == true) {
         if (this.fieldValue != null) {
            return  (this.fieldValue == field[i].value) ? true : false;
         }
         return true;
      }
   }
   
   return false;
}

// ------ //
Netopa.ValidateSelectedIndexNot = function(index) {
   this.index = index;
}

Netopa.ValidateSelectedIndexNot.prototype.isValid = function(field)
{
   if (field.selectedIndex == this.index) {
      return false;
   }
   
   return true;
}

// ------ //
Netopa.ValidateIfFieldHasValue = function(parentField, value, validator) {
   this.parentField = document.getElementsByName(parentField);
   
   if (this.parentField.length == 1) {
      this.parentField = this.parentField[0];
   }
   
   this.value = value;
   this.validator = validator;
}

Netopa.ValidateIfFieldHasValue.prototype.isValid = function(field)
{
   
   if (! isNaN(this.parentField.selectedIndex)) {  // HTMLSelectElement
      selectedOption = this.parentField[this.parentField.selectedIndex];
   } else if (this.parentField.length > 0) { // HTMLCollection
      selectedOption = new Object;
      selectedOption.value = null;
      
      for (var i = 0; i < this.parentField.length; i++) {
         if (this.parentField[i].checked == true) {
            selectedOption.value = this.parentField[i].value;
            break;
         }
      }
   } else {
      selectedOption = this.parentField;
   }
   
   if (selectedOption.value == this.value) {
      return this.validator.isValid(field);
   }
   
   return true;
}

// ------ //
Netopa.ValidateEqualTo = function(parentField) {
   this.parentField = document.getElementById(parentField);
}

Netopa.ValidateEqualTo.prototype.isValid = function(field)
{
   if (this.parentField.value == field.value) {
      return true;
   }
   
   return false;
}

// ------ //
Netopa.ValidateMinLength = function(minLength) {
   this.minLength = minLength;
}

Netopa.ValidateMinLength.prototype.isValid = function(field)
{
   if (this.minLength <= field.value.length) {
      return true;
   }
   
   return false;
}

// ------ //
Netopa.ValidateMaxLength = function(maxLength) {
   this.maxLength = maxLength;
}

Netopa.ValidateMaxLength.prototype.isValid = function(field)
{
   if (field.value.length <= this.maxLength) {
      return true;
   }
   
   return false;
}


// ------ //
Netopa.ValidateCodiceFiscale = function() {
}

Netopa.ValidateCodiceFiscale.prototype.isValid = function(field)
{
   var validi, i, s, set1, set2, setpari, setdisp;
   
   cf = field.value;
	
	if (! cf.length) {
		return false;
   }
   
   if (cf.length != 16) {
      return false;
   }
   
   cf = cf.toUpperCase();
   
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	
	for (i = 0; i < 16; i++) {
		if (validi.indexOf(cf.charAt(i)) == -1) {
			return false;
	   }
	}
	
	set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	s = 0;
	
	for (i = 1; i <= 13; i += 2) {
		s += setpari.indexOf(set2.charAt(set1.indexOf(cf.charAt(i))));
   }
   
	for (i = 0; i <= 14; i += 2 ) {
		s += setdisp.indexOf(set2.charAt(set1.indexOf(cf.charAt(i))));
   }
   
	if (s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0)) {
		return false;
	}
		
	return true;
}


// ------ //
Netopa.ValidatePartitaIva = function() {
}

Netopa.ValidatePartitaIva.prototype.isValid = function(field)
{
	pi = field.value;
	
	if (pi.length != 11) {
		return false;
	}
	
	validi = "0123456789";
	
	for (i = 0; i < 11; i++) {
		if( validi.indexOf( pi.charAt(i) ) == -1 )
			return false;
	}
	
	s = 0;
	
	for (i = 0; i <= 9; i += 2) {
		s += pi.charCodeAt(i) - '0'.charCodeAt(0);
   }
   
	for( i = 1; i <= 9; i += 2 ) {
		c = 2 * (pi.charCodeAt(i) - '0'.charCodeAt(0));
		if (c > 9) {
		   c = c - 9;
		}
		s += c;
	}
	
	if ((10 - s%10) % 10 != pi.charCodeAt(10) - '0'.charCodeAt(0)) {
		return false;
   }
   
	return true;
}
