/**
 * Return selected value for a radio. Return -1 if no choice has been made
 * Radio is passed by reference, not by name
 */
function getRadioValue(r) {
  if (r.length) {
  	for (i=0;i<r.length;i++)	{
  		if (r[i].checked) {
  			return r[i].value;
  		}
  	}
  } else {
  	if (r.value!=null&&r.checked)	{
  		return r.value;
  	}
  }

	return -1;
}

//Finds nearest radioItem in or above senderNode: used to selected a radio by clicking on its <tr> or <span>-tag
function setCurrentRadio(senderNode) {
	var currNode=senderNode;

	while (currNode!=null) {
		var col= currNode.getElementsByTagName("INPUT");
		if (col.length==0) {
			currNode=currNode.parentNode;
		}	else {
			col[0].checked = true;
			return;
		}
	}
}


/**
 *
 * Stokoude javascript library voor het valideren en initialiseren van formulieren.
 * Gauw eens opfrissen.
 *
 */

//selects an option with value anOptionValue for radiogroup aradioName
function setRadioOption(aradioName,anOptionValue)	{
	var chkArray=MM_findObj(aradioName);

	//exception for a single radiobutton (data is stored as value not as array)
	if (chkArray.value!=null)	{
		if (chkArray.value==anOptionValue) {
			chkArray.checked=true;
		}
	}

	for (i=0;i<chkArray.length;i++) {
		if (chkArray[i].value==anOptionValue) {
			chkArray[i].checked=true;
		}
	}

}

//Retrieves the selected values for aradioName, -1 if none selected
function getSelectedRadio(aradioName) {
	var chkArray = MM_findObj(aradioName);

	//exception for a single radiobutton
	if ((chkArray.value != null) && (chkArray.checked))	{
		return chkArray.value;
	}

	for (i=0;i<chkArray.length;i++)	{
		if (chkArray[i].checked) {
			return chkArray[i].value;
		}
	}

	return -1;
}

function unsetRadio(aradioName) {
  f=document.forms[0];
  r=f[aradioName];
  //r=MM_findObj(aradioName);
  if (!r.value) {
		for (i=0;i<r.length;i++)
    {
		  r[i].checked=false;
		}
  }
}

//Finds nearest radioItem in or above senderNode
function setCurrentRadio(senderNode) {
	var currNode=senderNode;
	while (currNode!=null) {
		var col= currNode.getElementsByTagName("INPUT");
		if (col.length==0) {
			currNode=currNode.parentNode;
		}	else {
			col[0].checked = true;
			return;
		}
	}
}

//Pass a form element (not just the name) and a regular expression pattern
function validateField(formElem,pattern) {
  var re = new RegExp(pattern);
  var fv = formElem.value;

  return re.test(fv);
}

//Pass a value and a regular expression pattern
function validateValue(fv,pattern) {
  var re = new RegExp(pattern);
  return re.test(fv);
}

function getPatternByName(patternName) {
  switch (patternName) {
    case "06nummer":
			return "^06(\\s|-|\\s-\\s)?[0-9]{8}$";
      break;
    case "empty_or_email":
      return "^$|^[0-9a-zA-Z][-_0-9a-zA-Z.]*@[-_0-9a-zA-Z.]+[.][a-zA-Z]+$";
      break;
  	case "empty_or_url":
      return "^$|^http://.{2,}";
      break;
  	case "empty_or_time":
      return "^$|^00:00$|^[012][0-9]:[0-9][0-9]$";
      break;
  	case "empty_or_date":
      return "^$|^0000-00-00$|^[12][0-9]{3}[-][01]?[0-9]-[0-3]?[0-9]$";
      break;
  	case "empty_or_float":
      return "^$|[+-]?[0-9]+([.][0-9]+)?$";
      break;
  	case "notempty":
      return "^.";
      break;
    case "email":
      return "^[0-9a-zA-Z][-_0-9a-zA-Z.]*@[-_0-9a-zA-Z.]+[.][a-zA-Z]+$";
      break;
  	case "pagename":
      return "^[_a-z0-9]{1,50}$";
      break;
  	case "username":
      return "^[_a-z0-9]{1,50}$";
      break;
  	case "pass":
      return "^[a-zA-Z0-9 ]{3,20}$";
      break;
   	//dd-mm-yyyy
   	case "nldate":
      return "^[0-3]?[0-9][-][01]?[0-9][-][12][0-9]{3}$";
      break;
   	//yyyy-mm-dd
   	case "date":
      return "^[12][0-9]{3}[-][01]?[0-9]-[0-3]?[0-9]$";
      break;
  	case "integer":
      return "^[-]?[0-9]+$";
      break;
  	case "posinteger":
      return "^[0-9]+$";
      break;
  	case "float":
      return "^[+-]?[0-9]+([.][0-9]+)?$";
      break;
  	case "nlfloat":
      return "^[+-]?[0-9]+([,][0-9]+)?$";
      break;
		case "url":
      return "^.";
      //return "^http://.{2,}";
      break;
  	default:
   		alert("Unknown validator added to a form element: '" + patternName+"'");
	}
}

function validateForm(aform) {
	var s="";

	//check if form has validator arr
	if (aform.validatorArr)	{

		//Iterate over Form elements
		for (var i=0;i<aform.validatorArr.length;i++)	{
			var anelem=aform[aform.validatorArr[i][1]];
			var pattern=getPatternByName(aform.validatorArr[i][2]);

			if (aform.validatorArr[i][4]=="radio") {
				fv=getRadioValue(anelem);
				if (fv==-1 || !validateValue(fv,pattern))	{
					s+=aform.validatorArr[i][3]+"\n";
				}

			}	else {
				if (!validateField(anelem,pattern))	{
					s+=aform.validatorArr[i][3]+"\n";
				}
			}
		}

		//Report errors
		if (s!="") {
			alert(s);
			return false;
		}

	}

	return true;
}

//addValidator("mainform","naam","notempty","Uw naam mag niet leeg zijn.");
function addValidator(aformname,aformelement,avalidator,anerrormsg)	{
	var anelem=document.forms[aformname][aformelement];

	//Radiogroup or a single element
	if (anelem[0]) {
		atype=anelem[0].type;
	}	else {
		atype=anelem.type;
	}

	//check if validatorArr has been added to the form
	if (!document.forms[aformname].validatorArr) {
		document.forms[aformname].validatorArr= new Array();
	}

	//add new array to a new last position in the array
	document.forms[aformname].validatorArr[document.forms[aformname].validatorArr.length]=new Array(aformname,aformelement,avalidator,anerrormsg,atype);
}

function initForm(formname,formvalues) {
	//parse the formdata field
	var formentries=String(formvalues).split("&");

	for (var i=0;i<formentries.length;i++) {
		var formentry=String(formentries[i]).split("=");

		if ((formentry[0]!=null)&&(formentry[0]!=""))	{
			eval("var comp=document."+formname+"['"+formentry[0]+"']");
			if ((comp!=null)&&(formentry[1]!=null))	{
				if ((comp.type=="text")||(comp.type=="textarea")||(comp.type=="hidden"))	{
					comp.value=unescape(formentry[1]);
				}	else if (comp.type=="checkbox")	{
					if (comp.value==formentry[1])	{
						comp.checked=true;
					}
				}	else if (comp[0].type=="radio")	{
					initRadio(formname,formentry[0],formentry[1]);
				}	else if (comp.type=="select-one")	{
					initSelect(formname,formentry[0],formentry[1]);
				}
			}
		}
	}
}

function initRadio(formname,obj,v) {
	eval("var rd=document.forms['"+formname+"']."+obj);

	if (rd==null)	{
		alert("Error: " + obj + " does not exist on form "+formname+".");
	}

	if (rd.length>1) {
		for (var i=0; i<rd.length; i++)	{
			if (rd[i].value==v)	{
				rd[i].checked=true;
				break;
			}
		}
	}	else {
		//exception for single radiobutton
		if (rd.value==v) {
			rd.checked=true;
		}
	}
}

function initSelect(formname,obj,v)	{
	eval("var rd=document.forms['"+formname+"']."+obj);
	if (rd==null)	{
		alert("Error: " + obj + " does not exist on form "+formname+".");
	}
	if (rd.length>1) {
		for (var i=0; i<rd.length; i++)	{
			if (rd[i].value==v)	{
				rd[i].selected=true;
				break;
			}
		}
	}	else {
		//exception for single radiobutton
		if (rd.value==v) {
			rd.selected=true;
		}
	}
}

function getSelectedSelectOption(sel) {
  if (sel.selectedIndex>=0) {
    return sel[sel.selectedIndex].value;
  } else {
    return "";
  }
}

function isValidEmail(email) {
	return validateValue(email,getPatternByName("email"));
}
