/*
  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.

  <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:
  070418 - ja - Added support for grouped fields, identified by unique tags
  070410 - rj - Rewrite, added support for select-one
  070226 - rj - Added to codelib

  Todo:
  Add support for minimum characters / field
*/

var idents = new Array();

function validateForm(currentForm) {
  var blnvalidate = true;
  var elementsInputs;
  var error = "";
  idents.length = 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")){    
        
          if(currentForm.elements[intCounter].getAttribute("type") == "text") {
            if(!validText(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 + ' 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")) {
          if(validText(currentForm.elements, intCounter)) {
            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);
          }
        
        
      	}
      
    }
  }

	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 validText(elementsInputs, intCounter) {
  if(elementsInputs[intCounter].value == "") {
    return false;
  }
  else {
  	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);