//------------ Validacion de formularios ------------

//CAMPOS REQUERIDOS.Indica que todos los campos definidos en esta funcion son obligatorios.
function validateRequired(form) {
	var bValid = true;
	var focusField = null;
	var i = 0;
	var fields = new Array();
	oRequired = new required();
	
	for (x in oRequired) {
	    if ((form[oRequired[x][0]].type == 'text' || form[oRequired[x][0]].type == 'textarea' || form[oRequired[x][0]].type == 'select-one' || form[oRequired[x][0]].type == 'radio' || form[oRequired[x][0]].type == 'password' || form[oRequired[x][0]].type == 'file') && form[oRequired[x][0]].value == '') {
	       if (i == 0)
	          focusField = form[oRequired[x][0]];
	
	       fields[i++] = oRequired[x][1];
	
	       bValid = false;
	    }
	}
	
	if (fields.length > 0) {
	   focusField.focus();
	   alert(fields.join('\n'));
	}
	
	return bValid;
}


//CAMPOS CON FORMATO ESPECIFICO (numericos.....)
function validateMask(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        oMasked = new mask();

        for (x in oMasked) {
            if ((form[oMasked[x][0]].type == 'text' || form[oMasked[x][0]].type == 'textarea' || form[oMasked[x][0]].type == 'password') && form[oMasked[x][0]].value.length > 0) {
               if ((form[oMasked[x][0]].value!=null) && (form[oMasked[x][0]].value!='')) {
                 if (!matchPattern(form[oMasked[x][0]].value, oMasked[x][2]("mask"))) {
                    if (i == 0)
                       focusField = form[oMasked[x][0]];

                    fields[i++] = oMasked[x][1];
                    bValid = false;
                 }
               }
            }
        }

	if (fields.length > 0) {
	   focusField.focus();
	   FinestraMissatges(fields.join('\n'));
	}

        return bValid;
}

function matchPattern(value, mask) {
	var bMatched = mask.exec(value);

	if(!bMatched) {
	  return false;
	}
	
	return true;
}

//VALIDACIONS PER A LES DATES.

//Valida que el camp data tingui un format (dd/MM/aaaa)
function validateDate(form) {
               var bValid = true;
               var focusField = null;
               var i = 0;
               var fields = new Array();
               oDate = new DateValidations();

               for (x in oDate) {
                  var value = form[oDate[x][0]].value;
                  var datePattern = oDate[x][2]("datePatternStrict");
                    if ((form[oDate[x][0]].type == 'text' || form[oDate[x][0]].type == 'textarea') && value.length > 0 && datePattern.length > 0) {
                    if ((form[oDate[x][0]].value!=null) && (form[oDate[x][0]].value!='')) {
                       var MONTH = "MM";
                       var DAY = "dd";
                       var YEAR = "yyyy";
                       var orderMonth = datePattern.indexOf(MONTH);
                       var orderDay = datePattern.indexOf(DAY);
                       var orderYear = datePattern.indexOf(YEAR);

                       if ((orderDay < orderYear && orderDay > orderMonth)) {
                          var iDelim1 = orderMonth + MONTH.length;
                          var iDelim2 = orderDay + DAY.length;
                          var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                          var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);

                          if (iDelim1 == orderDay && iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                          } else if (iDelim1 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                          } else if (iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                          } else {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                          }

                          var matched = dateRegexp.exec(value);

                          if(matched != null) {
                             if (!isValidDate(matched[2], matched[1], matched[3])) {
                                if (i == 0)
                                   focusField = form[oDate[x][0]];

                                fields[i++] = oDate[x][1];
                                bValid =  false;
                             }
                          } else {
                             if (i == 0)
                                focusField = form[oDate[x][0]];

                             fields[i++] = oDate[x][1];
                             bValid =  false;
                          }
                       } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                          var iDelim1 = orderDay + DAY.length;
                          var iDelim2 = orderMonth + MONTH.length;
                          var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                          var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);

                          if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                          } else if (iDelim1 == orderMonth) {
                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                          } else if (iDelim2 == orderYear) {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                          } else {
                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                          }

                          var matched = dateRegexp.exec(value);

                          if(matched != null) {
                             if (!isValidDate(matched[1], matched[2], matched[3])) {
                                if (i == 0)
                                   focusField = form[oDate[x][0]];

                                fields[i++] = oDate[x][1];
                                bValid =  false;
                             }
                          } else {
                             if (i == 0)
                                focusField = form[oDate[x][0]];

                             fields[i++] = oDate[x][1];
                             bValid =  false;
                          }
                       } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                          var iDelim1 = orderYear + YEAR.length;
                          var iDelim2 = orderMonth + MONTH.length;
                          var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                          var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);

                          if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                          } else if (iDelim1 == orderMonth) {
                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                          } else if (iDelim2 == orderDay) {
                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                          } else {
                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                          }

                          var matched = dateRegexp.exec(value);

                          if(matched != null) {

                             if (!isValidDate(matched[3], matched[2], matched[1])) {
                                if (i == 0)
                                   focusField = form[oDate[x][0]];

                                fields[i++] = oDate[x][1];
                                bValid =  false;
                             }
                          } else {
                             if (i == 0)
                                focusField = form[oDate[x][0]];

                             fields[i++] = oDate[x][1];
                             bValid =  false;
                          }
                       } else {
                          if (i == 0)
                             focusField = form[oDate[x][0]];

                          fields[i++] = oDate[x][1];
                          bValid =  false;
                       }
                     }
                  }
               }

               if (fields.length > 0) {
                   focusField.focus();
				   FinestraMissatges(fields.join('\n'));                   
               }

               return bValid;
}

function isValidDate(day, month, year) {
  if (month < 1 || month > 12)
    return false;
  if (day < 1 || day > 31)
    return false;
  if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31)
    return false;
  if (month == 2) {
    var leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    if (day>29 || (day == 29 && !leap))
      return false;
  }
  return true;
}

//DATA. Mirem si 'fec0' ?s posterior o igual a la 'fec1' (ambdues dates amb format dd/mm/yyyy)
function fechaMayorOIgual(fec0, fec1){
  var bRes = false;
  var sDia0 = fec0.substr(0, 2);
  var sMes0 = fec0.substr(3, 2);
  var sAno0 = fec0.substr(6, 4);
  var sDia1 = fec1.substr(0, 2);
  var sMes1 = fec1.substr(3, 2);
  var sAno1 = fec1.substr(6, 4);
  if (sAno0 > sAno1) bRes = true;
  else {
    if (sAno0 == sAno1){
      if (sMes0 > sMes1) bRes = true;
      else {
        if (sMes0 == sMes1)
         if (sDia0 >= sDia1) bRes = true;
      }
    }
  }
  return bRes;
}

 
    /**
     * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
     * http://javascript.internet.com
     */
    function checkEmail(emailStr) {
        if (emailStr.length == 0) {
            return true;
        }
        // TLD checking turned off by default
        var checkTLD=0;
        var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
        var emailPat=/^(.+)@(.+)$/;
        var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
        var validChars="\[^\\s" + specialChars + "\]";
        var quotedUser="(\"[^\"]*\")";
        var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
        var atom=validChars + '+';
        var word="(" + atom + "|" + quotedUser + ")";
        var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
        var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
        var matchArray=emailStr.match(emailPat);
        if (matchArray==null) {
            return false;
        }
        var user=matchArray[1];
        var domain=matchArray[2];
        for (i=0; i<user.length; i++) {
            if (user.charCodeAt(i)>127) {
                return false;
            }
        }
        for (i=0; i<domain.length; i++) {
            if (domain.charCodeAt(i)>127) {
                return false;
            }
        }
        if (user.match(userPat)==null) {
            return false;
        }
        var IPArray=domain.match(ipDomainPat);
        if (IPArray!=null) {
            for (var i=1;i<=4;i++) {
                if (IPArray[i]>255) {
                    return false;
                }
            }
            return true;
        }
        var atomPat=new RegExp("^" + atom + "$");
        var domArr=domain.split(".");
        var len=domArr.length;
        for (i=0;i<len;i++) {
            if (domArr[i].search(atomPat)==-1) {
                return false;
            }
        }
        if (checkTLD && domArr[domArr.length-1].length!=2 && 
            domArr[domArr.length-1].search(knownDomsPat)==-1) {
            return false;
        }
        if (len<2) {
            return false;
        }
        return true;
    }