// USAGE: 
// -to make an item required---------
// <label for='address1'>Address1:</label>
// <input type='text' id='address1' name='address1' size=30 class='req'>
// <span id='address1-err' class='formErrMsg'></span><
//
// validateForm( form ) <-- will return true if all filled in else false
//
// -how to word count-----------------
// <input type="hidden" name="form_settings" value="field10 : wordcount field10_count 10 black red;" />
// <label for="field10">Bla bla:</label>
// <input id="field10" name="field10" class="wordcount">
// <small><span id="field10_count">0</span> out of 10 words</small><BR>
// <span id='field10-err' name='field10-err'></span>
//
// call initForms();

// Based off of Ilya S. Lyubinskiy's SmartForm Code // temporarly

function form_behave(control, key, rules){
  rules = forms_rulesToArray(rules);

  for (var i = 0; i < rules.length; i++)
  {
    var rule = rules[i].split(/\s*:\s*/);

    if (rule.length < 2) continue;
    if (!forms_instring(' '+rule[0]+' ', control.name)) continue;

    rule[1] = rule[1].split(/\s+/);

    switch (rule[1][0])
    {
      // ----- wordcount -----

      case 'wordcount':
        var formcontent = control.value;
        while(formcontent.indexOf("  ") > 0){
          formcontent = formcontent.replace("  "," ");
        }       

        formcontent = formcontent.split(" ");
        
        document.getElementById(rule[1][1]).innerHTML = formcontent.length;
        if (rule[1].length >= 5)
          if (formcontent.length <= rule[1][2]){
               document.getElementById(rule[1][1]).style.color = rule[1][3];
               control.className = control.className.replace('overflow','');
               control.className = control.className.replace('formErr','');
          }else{
               document.getElementById(rule[1][1]).style.color = rule[1][4];
               if(control.className.indexOf('overflow') != 1){
                  control.className = control.className + ' overflow formErr';
               }
          }
         

        break;

      // ----- next -----

      case 'next':
        if (control.value.length == rule[1][1]) smartforms_focusNext(control);
        break;

      // ----- prev -----

      case 'prev':
        if (control.value.length == 0 && key == 8) smartforms_focusPrev(control);
        break;
    }
  }

  return true;
}


// ----- getElement ------------------------------------------------------------

function formGetSettings(tag, name)
{
  var settings = "";
  for (var i = 0; i < tag.elements.length; i++){ //for each formsetting hidden tag
     if (tag.elements[i].name.substr(0,tag.elements[i].name.length) == name){
	  	  settings = settings + tag.elements[i].value;
     }
  }
  return settings;
}


// ----- inString --------------------------------------------------------------

function forms_instring(str, val)
{
  return str.indexOf(' '+val+' ') >= 0;
}


// ----- focusNext -------------------------------------------------------------

function smartforms_focusNext(tag)
{
  for (var i = 0; i < tag.form.elements.length; i++)
    if (tag.form.elements[i] == tag)
      for (var j = i+1; j < tag.form.elements.length; j++)
        if (forms_instring(smartforms_edit, tag.form.elements[j].type))
        {
          if (forms_instring(smartforms_type, tag.form.elements[j].type))
               smartforms_setSelection(tag.form.elements[j], 0, 0, 'frEnd');
          else tag.form.elements[j].focus();
          return false;
        }

  return true;
}


// ----- focusPrev -------------------------------------------------------------

function smartforms_focusPrev(tag)
{
  for (var i = 0; i < tag.form.elements.length; i++)
    if (tag.form.elements[i] == tag)
      for (var j = i-1; j >= 0; j--)
        if (forms_instring(smartforms_edit, tag.form.elements[j].type))
        {
          if (forms_instring(smartforms_type, tag.form.elements[j].type))
               smartforms_setSelection(tag.form.elements[j], 0, 0, 'frEnd');
          else tag.form.elements[j].focus();
          return false;
        }

  return true;
}


function forms_rulesToArray(rules)
{
  rules = rules.replace(/^(\s*)(\S.*)/, "$2");
  rules = rules.replace(/(.*\S)(\s*)$/, "$1");
  return rules.split(/\s*;\s*/);
}


// ----- Initialize ------------------------------------------------------------

function formActivate(control, rules)
{
  rules = forms_rulesToArray(rules);

  for (var i = 0; i < rules.length; i++)
  {
    var rule = rules[i].split(/\s*:\s*/);

    if (rule.length < 2) continue;
    if (!forms_instring(' '+rule[0]+' ', control.name)) continue;

    rule[1] = rule[1].split(/\s+/);

    switch (rule[1][0])
    {

      case 'wordcount':

        var formcontent = control.value;
        while(formcontent.indexOf("  ") > 0){
          formcontent = formcontent.replace("  "," ");
        }       

        formcontent = formcontent.split(" ");
        
        document.getElementById(rule[1][1]).innerHTML = formcontent.length;
        if (rule[1].length >= 5)
          if (formcontent.length <= rule[1][2]){
               document.getElementById(rule[1][1]).style.color = rule[1][3];
               control.className = control.className.replace('overflow','');
               control.className = control.className.replace('formErr','');
          }else{
               document.getElementById(rule[1][1]).style.color = rule[1][4];
               if(control.className.indexOf('overflow') != 1){
                  control.className = control.className + ' overflow formErr';
               }
          }
        
        break;


    }
  }

  return true;
}


// ----- onChange --------------------------------------------------------------

function forms_onchange(e)
{
  var ie  = navigator.appName == "Microsoft Internet Explorer";
  var tag = ie ? window.event.srcElement : e.target;

  return true;
}


// ----- onKeypress ------------------------------------------------------------

function forms_onkeypress(e)
{
  var ie  = navigator.appName == "Microsoft Internet Explorer";
  var tag = ie ? window.event.srcElement : e.target;
  var key = ie ? window.event.keyCode    : e.which;

    if (key == 8) //over rise both backspace and enter
      return forms_instring(smartforms_type, tag.type);

    if (key == 13 && tag.type != 'textarea')
      return smartforms_focusNext(tag);

  return true;
}


// ----- onKeyup ---------------------------------------------------------------

function forms_onkeyup(e)
{
  var ie  = navigator.appName == "Microsoft Internet Explorer";
  var tag = ie ? window.event.srcElement : e.target;
  var key = ie ? window.event.keyCode    : e.which;

  var settings = formGetSettings(tag.form, 'form_settings');

  if (settings !== "") form_behave(tag, key, settings);
}



// ----- Register --------------------------------------------------------------

function initForms()
{
  for (var i = 0; i < document.forms.length; i++){
    with (document.forms[i]){
    
      settings = formGetSettings(document.forms[i], 'form_settings');

      for (var j = 0; j < elements.length; j++)
      {
        if (settings != "") formActivate(elements[j], settings);

        elements[j].onchange   = forms_onchange;
        elements[j].onkeypress = forms_onkeypress;
        elements[j].onkeyup    = forms_onkeyup;
      }
    }
	 
  }
}




 var modal_msg = "";
 var modal = false; // popup error
 var err = true; // on page errors
	
	var displayErrorMessage = function(form, field, first) {
		
		var labels = document.getElementsByTagName('label');
		var errorMsg = '';
		

		
		if (field.type=='radio'||field.type=='checkbox'||field.type=='select-one') {
			for (var i = 0; i<labels.length; i++) {
				if (labels[i].htmlFor==field.name) {
					    errorMsg = 'You must select a value for ' + labels[i].innerHTML.replace('*','').replace(':','');

				}
			}
		} else {
			for (var i = 0; i<labels.length; i++) {
				if (labels[i].htmlFor==field.id) {
               if (field.className.indexOf('overflow') != -1){ //a count overflow
                   errorMsg = 'You have exceeded the allowed number of words for ' + labels[i].innerHTML.replace('*','').replace(':','');
               }else{
					    errorMsg = 'You must enter a value for ' + labels[i].innerHTML.replace('*','').replace(':','');
			      }
				}
			}
		}
		
		
		if (modal) {
			modal_msg += errorMsg;

		}
		
		if (err) {
		   errorDiv = document.getElementById(field.id + '-err');
			if (document.getElementById(field.id + '-err')) {
					errorDiv.innerHTML = errorMsg;
			}
		}
		
		if(first){
			field.focus();
		}
	}


	function validateForm(form){

		//get all the form fields
		var fields = form.elements;
		
		var passedCheck = true;
		
		for (var i=0; i<fields.length; i++) {
         if (fields[i].className.indexOf('wordcount') != -1){
            if(fields[i].className.indexOf('overflow') != -1){
				   err == true ? displayErrorMessage(form, fields[i], passedCheck) : null;
				   passedCheck = false;           
            }else{
						fields[i].className = fields[i].className.replace('formErr','');
						errorDiv = document.getElementById(fields[i].id + '-err');
						if (errorDiv) {
							errorDiv.innerHTML = '';
						}
            }

			}else if (fields[i].className.indexOf('req') != -1) {
				
				// Text, Textarea, File
				if (fields[i].type=='text'||fields[i].type=='textarea'||fields[i].type=='file') {
					if (fields[i].value=="") {
						fields[i].className = fields[i].className + ' formErr';
						err == true ? displayErrorMessage(form, fields[i], passedCheck) : null;
						passedCheck = false;
					} else if(fields[i].className.indexOf('validemail') != -1 ){ //validate email
						var dot = fields[i].value.lastIndexOf('.');
						var at = fields[i].value.indexOf('@');
						if( (dot - at) > 0 && at > 0 ){ //valid
							fields[i].className = fields[i].className.replace('formErr','');
							errorDiv = document.getElementById(fields[i].id + '-err');
							if (errorDiv) {
								errorDiv.innerHTML = '';
							}	
						} else {
							errorDiv = document.getElementById(fields[i].id + '-err');
							if (document.getElementById(fields[i].id + '-err')) {
								errorDiv.innerHTML = "This is not a valid email address";
							}
							passedCheck = false;
						}
					
					} else { //no error
						fields[i].className = fields[i].className.replace('formErr','');
						errorDiv = document.getElementById(fields[i].id + '-err');
						if (errorDiv) {
							errorDiv.innerHTML = '';
						}
					}
	
				}
	
				// Radio
				else if (fields[i].type=='radio') {
					var radiogroup = el[fields[i].name];
					  var itemchecked = false;
					  for(var j = 0 ; j < radiogroup.length ; ++j) {
						if(radiogroup[j].checked) {
							itemchecked = true;
							break;
						}
					  }
					  if(!itemchecked) { 
						fields[i].className = fields[i].className + ' formErr';
						err == true ? displayErrorMessage(form, fields[i], passedCheck) : null;
						passedCheck = false;
					  } else {
						errorDiv = document.getElementById(fields[i].id + '-err');
						if (errorDiv) {
							errorDiv.innerHTML = '';
						}
					  }
				}
				
				// Checkbox
				else if (fields[i].type=='checkbox') {
					var itemchecked = false;
					  var elems = document.getElementsByTagName("input");
					  for(var j=0; j<elems.length; j++) {
						if(elems[j].type=='checkbox'&&elems[j].name==fields[i].name) {
							if(elems[j].checked) {
								itemchecked = true;
								break;
							}
						}
					  }
					  if(!itemchecked) { 
						fields[i].className = fields[i].className + ' formErr';
						err == true ? displayErrorMessage(form, fields[i], passedCheck) : null;
						passedCheck = false;
					  } else {
						errorDiv = document.getElementById(fields[i].id + '-err');
						if (errorDiv) {
							errorDiv.innerHTML = '';
						}
					  }
				}
				
				// Select-one
				else if (fields[i].type=='select-one') {
					if (fields[i].selectedIndex==0) {
						fields[i].className = fields[i].className + ' formErr';
						err == true ? displayErrorMessage(form, fields[i], passedCheck) : null;
						passedCheck = false;
					  } else {
						fields[i].className = fields[i].className.replace('formErr','');
						errorDiv = document.getElementById(fields[i].id + '-err');
						if (errorDiv) {
							errorDiv.innerHTML = '';
						}
					  }
				}
				
				// Select-multiple
				else if (fields[i].type=='select-multiple') {
					var optionselected = false;
						for(var j=0;j<fields[i].options.length; ++j) {
							if (fields[i].options[j].selected) {
								optionselected = true;
								break;
							}
						}
						if (!optionselected) {
						fields[i].className = fields[i].className + ' formErr';
						err == true ? displayErrorMessage(form, fields[i], passedCheck) : null;
						passedCheck = false;
					  } else {
						fields[i].className = fields[i].className.replace('formErr','');
						errorDiv = document.getElementById(fields[i].id + '-err');
						if (errorDiv) {
							errorDiv.innerHTML = '';
						}
					  }
				}
			}
		}
		if(passedCheck == true){
			return true;
		} else {
			if(modal == true){
				alert(modal_msg);
			}
			return false;
		}
	}


function submitThis(aform){
   if(validateForm(aform)){
      aform.submit();
   }
   

   
}