/*
  Checkform - Validate forms
  Automatic applies to all forms on page when javascript is loaded.

  Usage:
  <script type="text/javascript" src="/checkform.js"></script>
  Set class "required" || "requiredemail" on input tag.
  Set class "required" on select tag, first <option> can not be selected, need to be "Select in list"
	Set class "required ident_NUMBER" where NUMBER is a unique number for the required group of fields. 
	At least one of the fields in the group needs to be valid for the form to submit.

  Set attribute minchars="X", where X is the number of characters required on textfield.

  <span> with id = inputtagID_label for labeltext that will be in error message, if not set, it will fall back and display id instead

  Changelog:
  070420 - rj - Added support for minimun characters
  070419 - rj - Added support for matching Swedish personalnumber
  070418 - ja - Added support for grouped fields, identified by unique tags
  070410 - rj - Rewrite, added support for select-one
  070226 - rj - Added to codelib
*/

var idents = new Array();

function validateForm(currentForm) {
  var blnvalidate = true;
  var elementsInputs;
  var error = "";
  idents.length = 0;
  var minchars = 0;

  for(var intCounter = 0; intCounter < currentForm.length; intCounter++) {
    if(currentForm.elements[intCounter].className != "") {
  		if(currentForm.elements[intCounter].className.match("required") && !currentForm.elements[intCounter].className.match("requiredemail") && !currentForm.elements[intCounter].className.match("requiredpnum") && !currentForm.elements[intCounter].className.match("requiredorgnr")){
        if(currentForm.elements[intCounter].tagName == "textarea" || currentForm.elements[intCounter].tagName == "TEXTAREA") {
          if(!validText(currentForm.elements, intCounter, 0)) {
            blnvalidate = false;
            var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
            if(document.getElementById(label)) {
              error += document.getElementById(label).innerHTML + ' saknas\n';
            } else {
              error += currentForm.elements[intCounter].getAttribute("id") + ' saknas\n';
            }
          }
        } else if(currentForm.elements[intCounter].getAttribute("type") == "text") {
          if(currentForm.elements[intCounter].getAttribute("minchars") != "") {
            if(currentForm.elements[intCounter].getAttribute("minchars") > 0) {
              minchars = currentForm.elements[intCounter].getAttribute("minchars");
            } else {
              minchars = 0;
            }
          } else {
            minchars = 0;
          }

          if(!validText(currentForm.elements, intCounter, minchars)) {
           	if(!currentForm.elements[intCounter].className.match("ident_")){
              blnvalidate = false;
              var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
              if(currentForm.elements[intCounter].value != "" && minchars > 0) {
                if(document.getElementById(label)) {
                  error += document.getElementById(label).innerHTML + ' måste vara minst '+minchars+' tecken\n';
                } else {
                  error += currentForm.elements[intCounter].getAttribute("id") + ' måste vara minst '+minchars+' tecken\n';
                }
              } else {
                if(document.getElementById(label)) {
                  error += document.getElementById(label).innerHTML + ' saknas\n';
                } else {
                  error += currentForm.elements[intCounter].getAttribute("id") + ' saknas\n';
                }
              }
            }
            setIdentArray(currentForm.elements[intCounter], 0);
          }
          else {
            setIdentArray(currentForm.elements[intCounter], 1);
          }
        } else if(currentForm.elements[intCounter].getAttribute("type") == "checkbox") {
          if(!validCheckbox(currentForm.elements, intCounter)) {
           	if(!currentForm.elements[intCounter].className.match("ident_")){
              blnvalidate = false;
              var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
              if(document.getElementById(label)) {
                error += document.getElementById(label).innerHTML + ' är ej ikryssad\n';
              } else {
                error += currentForm.elements[intCounter].getAttribute("id") + ' är ej ikryssad\n';
              }
            }
            setIdentArray(currentForm.elements[intCounter], 0);
          }
          else {
            setIdentArray(currentForm.elements[intCounter], 1);
          }
        } else if(currentForm.elements[intCounter].type == "select-one") {
          if(!validSelectOne(currentForm.elements, intCounter)) {
            if(!currentForm.elements[intCounter].className.match("ident_")){
              blnvalidate = false;
              var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
              if(document.getElementById(label)) {
                error += document.getElementById(label).innerHTML + ' är ej vald\n';
              } else {
                error += currentForm.elements[intCounter].getAttribute("id") + ' är ej vald\n';
              }
            }
            setIdentArray(currentForm.elements[intCounter], 0);
          }
  				else {
            setIdentArray(currentForm.elements[intCounter], 1);
    			}
        }
      } else if(currentForm.elements[intCounter].className.match("requiredemail") && !currentForm.elements[intCounter].className.match("requiredpnum")) {
        if(validText(currentForm.elements, intCounter, 0)) {
          if(!validEmail(currentForm.elements, intCounter)) {
            if(!currentForm.elements[intCounter].className.match("ident_")){
              blnvalidate = false;
              var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
              if(document.getElementById(label)) {
                error += document.getElementById(label).innerHTML + ' är felaktig\n';
              } else {
                error += currentForm.elements[intCounter].getAttribute("id") + ' är felaktig\n';
              }
            }
            setIdentArray(currentForm.elements[intCounter], 0);
          }
          else {
            setIdentArray(currentForm.elements[intCounter], 1);
          }
        } else {
          if(!currentForm.elements[intCounter].className.match("ident_")){
            blnvalidate = false;
            var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
            if(document.getElementById(label)) {
              error += document.getElementById(label).innerHTML + ' saknas\n';
            } else {
              error += currentForm.elements[intCounter].getAttribute("id") + ' saknas\n';
            }
          }
          setIdentArray(currentForm.elements[intCounter], 0);
        }
      } else if(currentForm.elements[intCounter].className.match("requiredorgnr")) {
        if(validText(currentForm.elements, intCounter, 0)) {
          if(!validOrgnr(currentForm.elements, intCounter)) {
            if(!currentForm.elements[intCounter].className.match("ident_")){
              blnvalidate = false;
              var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
              if(document.getElementById(label)) {
                error += document.getElementById(label).innerHTML + ' är felaktigt (xxxxxx-xxxx)\n';
              } else {
                error += currentForm.elements[intCounter].getAttribute("id") + ' är felaktigt (xxxxxx-xxxx)\n';
              }
            }
            setIdentArray(currentForm.elements[intCounter], 0);
          }
          else {
            setIdentArray(currentForm.elements[intCounter], 1);
          }
        } else {
          if(!currentForm.elements[intCounter].className.match("ident_")){
            blnvalidate = false;
            var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
            if(document.getElementById(label)) {
              error += document.getElementById(label).innerHTML + ' saknas\n';
            } else {
              error += currentForm.elements[intCounter].getAttribute("id") + ' saknas\n';
            }
          }
          setIdentArray(currentForm.elements[intCounter], 0);
        }
      } else if(currentForm.elements[intCounter].className.match("requiredpnum")) {
        if(validText(currentForm.elements, intCounter, 0)) {
          if(!validPnum(currentForm.elements, intCounter)) {
            if(!currentForm.elements[intCounter].className.match("ident_")){
              blnvalidate = false;
              var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
              if(document.getElementById(label)) {
                error += document.getElementById(label).innerHTML + ' är felaktigt (ååååmmdd-xxxx)\n';
              } else {
                error += currentForm.elements[intCounter].getAttribute("id") + ' är felaktigt (ååååmmdd-xxxx)\n';
              }
            }
            setIdentArray(currentForm.elements[intCounter], 0);
          }
          else {
            setIdentArray(currentForm.elements[intCounter], 1);
          }
        } else {
          if(!currentForm.elements[intCounter].className.match("ident_")){
            blnvalidate = false;
            var label = currentForm.elements[intCounter].getAttribute("id")+'_label';
            if(document.getElementById(label)) {
              error += document.getElementById(label).innerHTML + ' saknas\n';
            } else {
              error += currentForm.elements[intCounter].getAttribute("id") + ' saknas\n';
            }
          }
          setIdentArray(currentForm.elements[intCounter], 0);
        }
    	}
    }
  }

	if(idents.length > 0){
		for(i=0; i<idents.length; i++){
			if(idents[i]){
				parts = idents[i].split(":");
				err = 1;
				identerr = "Något av följande ";
				for(p=0; p<(parts.length - 1); p++){
					subparts = parts[p].split("-");
					if(subparts[1] == 1){
						err = 0;
					}
          if(document.getElementById(subparts[0]+'_label')) {
						identerr += document.getElementById(subparts[0] + '_label').innerHTML ;
          } else {
						identerr += subparts[0];
          }
					if(p < (parts.length -3)){
          	identerr += ", ";
          }
          else if(p < (parts.length - 2)){
          	identerr += " eller ";
          }
				}
				if(err){
					blnvalidate = false;
					error += identerr+" måste vara rätt ifyllt\n";
				}
			}
		}
	}

  if(error != "") {
    alert("Följande fel uppstod när du fylde i formuläret\n\n"+error);
  }

  return blnvalidate;
}

function validEmail(elementsInputs, intCounter) {
  var emailFilter=/^.+@.+\..{2,3}$/;
  if(!emailFilter.test(elementsInputs[intCounter].value)) {
    return false;
  }
  else {
  	return true;
  }
}

function validPnum(elementsInputs, intCounter) {
  var pnumFilter=/^[0-9]{8}-[0-9]{4}$/;
  if(!pnumFilter.test(elementsInputs[intCounter].value)) {
    return false;
  }
  else {
  	return true;
  }
}

function validOrgnr(elementsInputs, intCounter) {
  var pnumFilter=/^[0-9]{6}-[0-9]{4}$/;
  if(!pnumFilter.test(elementsInputs[intCounter].value)) {
    return false;
  }
  else {
  	return true;
  }
}

function validText(elementsInputs, intCounter, minChars) {
  if(elementsInputs[intCounter].value == "") {
    return false;
  }
  else {
    if(minChars > 0) {
      if(elementsInputs[intCounter].value.length >= minChars) {
        return true;
      }
      else {
        return false;
      }
    }
  	return true;
  }
}

function validCheckbox(elementsInputs, intCounter) {
  if(elementsInputs[intCounter].checked == false) {
    return false;
  }
  else {
  	return true;
  }
}

function validSelectOne(elementsInputs, intCounter) {
  if(elementsInputs[intCounter].selectedIndex == 0) {
    return false;
  }
  else {
  	return true;
  }
}

function setIdentArray(element, valid){
	if(element.className.match("ident_")){
  	var classes = element.className.split(" ");
    for(var classCounter = 0; classCounter < classes.length; classCounter++) {
	    if(classes[classCounter].match("ident_")) {
	    	isplit = classes[classCounter].split("_");
	    	if(idents[isplit[1]]){
	        idents[isplit[1]] += element.getAttribute("id") + "-" + valid + ":";
				}
				else {
	        idents[isplit[1]] = element.getAttribute("id") + "-" + valid + ":";				
				}
  		}
  	}         		
	}
}

function applyOnSubmitToForms() {
  elementsForms = document.getElementsByTagName("form");
  for(var intCounter = 0; intCounter < elementsForms.length; intCounter++)	{
    elementsForms[intCounter].onsubmit = function () {
      if(!validateForm(this)) {
        return false;
      }
    }
  }
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if(typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(applyOnSubmitToForms);