/*
Form Validator
Author: Peter Tornstrand <peter[at]tornstrand[dot]com>
Homepage: http://www.tornstrand.com/scripts/javascript-form-validation/
Date: 2006-07-02
Version: 1.21
*/

/*
Set to false if you don't want the error messages
*/
var err = true;

/*
Set to true if you want modal javascript dialogues instead of DOM messages
*/
var modal = true;

/*
To keep track of number of errors
*/
var numErrors = 0;

/*
Browser detect, need's a little work
*/
var ie;
if (navigator.appVersion.indexOf("MSIE")!=-1) {
	ie = true; 
} else {
	ie = false;
}

function addCookie()
{
  if(typeof getEmailAddress!="undefined")
  {
    //adds the cookie so that the login information is remembered
    var days = 1;
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    document.cookie = "email="+getEmailAddress()+expires+"; path=/";
    return true;
  }
}

function getCookie()
{
  var value = null;
  var cookieName = "email=";
  var ca = document.cookie.split(';');
  for(var i=0; i<ca.length; i++)
  {
    var c = ca[i];
    // take out leading spaces
    while (c.charAt(0)==' ')
      c = c.substring(1,c.length);
    // find the right cookie
    if (c.indexOf(cookieName) == 0)
      value = c.substring(cookieName.length,c.length);
  }
  return value;
}

function eraseCookie()
{
  // "Delete" any saved email cookie by setting it to expire -1 days ago
  var date = new Date();
  date.setTime(date.getTime()-(24*60*60*1000));
  var expires = "; expires="+date.toGMTString();
  document.cookie = "email="+expires+"; path=/";
}

/**
* Loops through the page forms and add's onSubmit events to forms
* with the class name 'validate'.
**/
var addOnSubmitEvent = function() {
    var frms = document.getElementsByTagName('form');
    for (var i=0; i<frms.length; i++) {
        if (frms[i].className.indexOf('validate') != -1) {
            frms[i].onsubmit = function() {
              if(!validate(this))
                return false;
              if(!checkCaptcha(this))
                return false;
              addCookie();
              return true;
            }
        }
    }
}

/**
* Function for displaying error message to user.
* @param frm [Object HTMLFormElement] The form
* @param el [Object HTMLInputElement] Source of the error message
**/
var displayErrorMessage = function(frm, el) {
    var labels = document.getElementsByTagName('label');
    var errorMsg = '';
   
    if (el.type=='radio'||el.type=='checkbox') {
        for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor== el.name) {
                errorMsg = 'You must enter a value for ' + labels[i].innerHTML.replace('*','').replace(':','');
                if(numErrors>0)
                    errorMsg = errorMsg + ', you got ' + (numErrors-1) + ' additional errors';
            }
        }
    } else {
        for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor==el.id) {
                errorMsg = 'You must enter a value for ' + labels[i].innerHTML.replace('*','').replace(':','');
                if(numErrors>0)
                    errorMsg = errorMsg + ', you got ' + (numErrors-1) + ' additional errors';
            }
        }
    }
   
    if (err) {
        if (modal) {
            alert(errorMsg);
            el.focus();
        }
        else {
            if (document.getElementById(frm.id+'_errorMessage')) {
                frm.removeChild( document.getElementById (frm.id+'_errorMessage'));
            }
            var errorDiv = document.createElement('div');
            errorDiv.id = frm.id+'_errorMessage';
            errorDiv.className = 'errorMessage';
            errorDiv.innerHTML = errorMsg;
            frm.insertBefore(errorDiv, frm.childNodes[0]);
            el.focus();
        }
    }
}

/**
* Function called to validate form elements.
* @param frm [Object HTMLFormElement] The form to validate
* @return [Boolean] Did the form validate or not
**/
var validate = function(frm) {
	var el = frm.elements;
    var error = false;
    numErrors = 0;
    addedRadioError = false;
    addedCheckboxError = false;
	for (var i=0; i<el.length; i++) {
          
    	if (el[i].className.indexOf('req') != -1) {
			
			// Text, Textarea, File
			if (el[i].type=='text'||el[i].type=='textarea'||el[i].type=='file') {
				if (el[i].value=="") {
					el[i].className = el[i].className + ' error';
                    if (!error)
 					    err == true ? errEl = Array(frm, el[i]) : null;
                    error = true;
                    numErrors++;
 				} else {
					el[i].className = el[i].className.replace('error','');
				}
			}

			// Radio
			else if (el[i].type=='radio') {
				var radiogroup = el[el[i].name];
		        var itemchecked = false;
		        for(var j = 0 ; j < radiogroup.length ; ++j) {
					if(radiogroup[j].checked) {
						itemchecked = true;
						break;
					}
		        }
		        if(!itemchecked) { 
					el[i].className = el[i].className + ' error';
                    if (!error)
 					    err == true ? errEl = Array(frm, el[i]) : null;
                    error = true;
                    if(!addedRadioError)
                        numErrors++;
                    addedRadioError = true;
		        }
			}
			
			// Checkbox
			else if (el[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==el[i].name) {
		        		if(elems[j].checked) {
		        			itemchecked = true;
		        			break;
		        		}
		        	}
		        }
		        if(!itemchecked) { 
					el[i].className = el[i].className + ' error';
                    if (!error)
 					    err == true ? errEl = Array(frm, el[i]) : null;
                    error = true;
                    if(!addedCheckboxError)
                        numErrors++;
                    addedCheckboxError = true;
				}
			}
			
			// Select-one
			else if (el[i].type=='select-one') {
				if (el[i].selectedIndex==0) {
					el[i].className = el[i].className + ' error';
                    if (!error)
 					    err == true ? errEl = Array(frm, el[i]) : null;
                    error = true;
                    numErrors++;
		        } else {
		        	el[i].className = el[i].className.replace('error','');
		        }
			}
			
			// Select-multiple
			else if (el[i].type=='select-multiple') {
				var optionselected = false;
		      	for(var j=0;j<el[i].options.length; ++j) {
		      		if (el[i].options[j].selected) {
		      			optionselected = true;
		      			break;
		      		}
		      	}
		      	if (!optionselected) {
					el[i].className = el[i].className + ' error';
                    if (!error)
 					    err == true ? errEl = Array(frm, el[i]) : null;
                    error = true;
                    numErrors++;
		        } else {
		        	el[i].className = el[i].className.replace('error','');
		        }
			}
		}
	}
    if(error) {
        displayErrorMessage(errEl[0], errEl[1]);
        return false;
    } else
	    return true;
}


/**
* Function called when a element changes it's value.
**/
var evaluate = function() {
	for (i=0; i<conds.length; i++) {
		var element = document.getElementsByName(conds[i][0]);
		var elemVal = conds[i][1];
		var elements = document.getElementsByName(conds[i][2]);
		var bol = conds[i][3];
		
		if (ie) {
		/* For Internet Explorer */
			for (var k=0; k<element.length; k++) {
				if (element[k].name==event.srcElement.name) {
					if (event.srcElement.type=='select-one') {
						if(event.srcElement[event.srcElement.selectedIndex].value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else if (event.srcElement.type=='select-multiple') {
						var optionselected = false;
						for(var j=0; j<event.srcElement.options.length; j++) {
		      				if (event.srcElement.options[j].value==elemVal&&event.srcElement.options[j].selected) {
		      					optionselected = true;
		      					break;
		      				}
		      			}
						if (optionselected) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else {
						if(event.srcElement.value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					}
				}
			}
		} else {
		/* For other browsers */
			for (var k=0; k<element.length; k++) {
				if (element[k].name==this.name) {
					if (this.type=='select-one') {
						if(this[this.selectedIndex].value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else if (this.type=='select-multiple') {
						var optionselected = false;
						for(var j=0; j<this.options.length; j++) {
		      				if (this.options[j].value==elemVal&&this.options[j].selected) {
		      					optionselected = true;
		      					break;
		      				}
		      			}
						if (optionselected) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else {
						if(this.value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					}
				}
			}
		}
	}
}

/**
* Set a single or a group of elements to required or not required.
* @param elements [Object HTMLCollection] The elements to set required states on
* @param bol [Boolean] Set elements required or not required
**/
var setState = function(elements, bol) {
	if (bol) {
		for (var j=0; j<elements.length; j++) {
			if (elements[j].className.indexOf('req')==-1) {
				elements[j].className += ' req';
			}
		}
	} else {
		for (var j=0; j<elements.length; j++) {
			newClassName = elements[j].className.replace('req','');
			elements[j].className = newClassName;
		}
	}
}

/**
* Attach conditions to form elements.
**/
var attachConditions = function() {
	attachBlurs(document.getElementsByTagName('input'));
	attachBlurs(document.getElementsByTagName('select'));
}

/**
* Attach onBlur or onClick to elements depending on element type.
* @param elements [Object HTLMCollection] The elements to attach onBlur events to
**/
var attachBlurs = function(elements) {
	for (var i=0; i<elements.length; i++) {
		if (elements[i].type=='checkbox'||elements[i].type=='radio') {
			if (ie) {
				elements[i].attachEvent('onclick', evaluate, false);
			} else {
				elements[i].addEventListener('click', evaluate, false);
			}
		} else {
			if (ie) {
				elements[i].attachEvent('onblur', evaluate, false);
			} else {
				elements[i].addEventListener('blur', evaluate, false);
			}
		}
	}
}

/*
Conditions
Syntax: conds.push(Array('element name','element value','element name', false));
You should put your conditions in a seperate file and include in the page.
*/
var conds = Array();

/*
Add onLoad events to start the whole thing
*/
if (ie) {
	window.attachEvent("onload", addOnSubmitEvent, false);
	window.attachEvent("onload", attachConditions, false);
} else {
	window.addEventListener("load", addOnSubmitEvent, false);
	window.addEventListener("load", attachConditions, false);
}

/*
Captcha handler
Author: Gabe and some other dude
Homepage: http://www.crackajax.net/captchaform.php#

To make this work on your form, the form must have the validation class
and contain a text inpu twith the id 'captcha' and an image similar to this:

<img width="100" height="30" boarder="0" alt="Verification Image" src="captcha.php"/>

When the user submits the form, it will verify the image code matches the
text inputs code, if it does'nt it will pop up an alert, otherwise it
will submit the form.
*/
var url = '../scripts/captcheck.php?code=';
var captchaOK = 2;  // 2 - not yet checked, 1 - correct, 0 - failed
        
function getHTTPObject()
{
  try {
    req = new XMLHttpRequest();
  } catch (err1)
  {
    try {
      req = new ActiveXObject("Msxml12.XMLHTTP");
    } catch (err2)
    {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (err3)
      {
	req = false;
      }
    }
  }
  return req;
}
var captchaForm = 0;
var http = getHTTPObject(); // We create the HTTP Object        
        
function handleHttpResponse() {
  if (http.readyState == 4) {
    captchaOK = http.responseText;
    if(captchaOK != 1) {
      alert('The verification code you entered was not correct. Please try again\nNote: Click on the image for a different code');
      var codeInput = document.getElementById('captcha');
      codeInput.value='';
      codeInput.focus();
      updateCaptchaImage()
      return false;
    }
    addCookie();
    captchaForm.submit();
  }
}

function checkcode(thecode) {
  http.open("GET", url + escape(thecode), true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}

function updateCaptchaImage() {
  var codeImg = document.getElementById('captcha-img');
  var imgSrc = codeImg.src;
  if(imgSrc.lastIndexOf('?') != -1)
  {
    imgSrc = imgSrc.substring(0,imgSrc.lastIndexOf('?'));
  }
  codeImg.src=imgSrc + '?'+Math.floor(Math.random()*1000);
}
        
function checkCaptcha(frm) {
  // First the normal form validation
  var codeInput = document.getElementById('captcha');
  if(!codeInput)
    return true;
  // Now the Ajax CAPTCHA validation
  captchaForm = frm;
  checkcode(codeInput.value);
  return false;
}

