var valid;
var controlToValidate;
var checkRequired;

function validate(form, sButton)
{
	valid = true;
	checkRequired = true;
	if (sButton)
		if (sButton.indexOf("Incomplete") >= 0)
			checkRequired = false;
	with (form)
	{
		var _iMax = elements.length;
		for (var i=0; i < _iMax; i++)
		{
			controlToValidate = elements[i];
			var validate = controlToValidate.getAttribute("validate");
			if (typeof(validate) == "string")
				if (validate.length > 0)
					eval(validate);
			if (!valid) return false;
		}
	}
	return true;
}

function required(hideAlert)
{
	if (!checkRequired) return true;

	if (controlToValidate.disabled) return true;
	
	if (controlToValidate.tagName.toLowerCase() == "select")
	{
		if (controlToValidate.selectedIndex > 0)
			return true;
	}
	else if (controlToValidate.getAttribute("type") != null && (controlToValidate.getAttribute("type").toLowerCase() == "radio" || controlToValidate.getAttribute("type").toLowerCase() == "checkbox"))
	{
		if (controlToValidate.form[controlToValidate.name][0])
		{
			for (var i = 0; i < controlToValidate.form[controlToValidate.name].length; i++)
				if (controlToValidate.form[controlToValidate.name][i].checked)
					return true;
		}
		else
		{
			return controlToValidate.checked;
		}
	}
	else if (controlToValidate.value.length > 0)
	{
		return true;
	}

	if (!hideAlert)
	{

		if ((!controlToValidate.readOnly) || (!controlToValidate.disabled))
			controlToValidate.focus();

		if (controlToValidate.getAttribute("alt"))
			alert(controlToValidate.getAttribute("alt") + " is required.");
		else
			alert(controlToValidate.getAttribute("name") + " is required.");
	}

	valid = false;
	return false;
}

function isDate()
{
	var value = controlToValidate.value;
	if (value != "")
	{
		var day;
		var month;
		var year;
		var firstSlash = value.indexOf("/");
		var secondSlash = -1;
		var isvalid = true
				
		if (firstSlash > 0) {
			secondSlash = value.indexOf("/", firstSlash + 1);
		}
		
		if (secondSlash > 0 ) {
			day = value.substring(0, firstSlash);
			if (day.length == 1) {
				day = "0" + day;
			}
			month = value.substring(firstSlash + 1, secondSlash);
			if (month.length == 1) {
				month = "0" + month;
			}
			year = value.substring(secondSlash + 1, value.length);
			if (year.length == 4) {
				year = year.substring(2,4);
			}
			
		} else {
			isvalid = false
		}
		var utc	= Date.parse(day + "/" + month + "/" + year);
		
		if (!isvalid || isNaN(utc))
		{
			controlToValidate.focus();
			if (controlToValidate.getAttribute("alt"))
				alert(controlToValidate.getAttribute("alt")  + " is an invalid date.");
			else
				alert(controlToValidate.getAttribute("name")  + " is an invalid date.");
			valid = false;
			return false;
		}
		var bday = new Date(75, 1, 16);

		var d = new Date(utc);
		var year = d.getYear();
		if (year < 50)
			year += 2000;
		if (year > 50 && year < 100)
			year += 1900;
		controlToValidate.value = (d.getMonth() + 1) + "/" + d.getDate() + "/" + year;
	}
	return true;
}
function isNumber()
{
	var value = controlToValidate.value;
	if (value != "")
	{
		var n = parseFloat(value);
		if (isNaN(n))
		{
			controlToValidate.focus();
			if (controlToValidate.getAttribute("alt"))
				alert(controlToValidate.getAttribute("alt") + " must be a number.");
			else
				alert(controlToValidate.getAttribute("name") + " must be a number.");
			valid = false;
			return false;
		}
		controlToValidate.value = n;
	}
	return true;
}

function requiredIf(fieldName, value)
{
	if (!checkRequired) return true;

	var controlToEval = controlToValidate.form[fieldName];
	if (!controlToEval)
		return true;

	if (controlToEval[0])
		if (controlToEval[0].tagName.toLowerCase() != "option")
			controlToEval = controlToEval[0];

	if (controlToEval.tagName.toLowerCase() == "select")
	{
		if (controlToEval.selectedIndex == -1 && value == "")
			return required();
		else if (controlToEval[controlToEval.selectedIndex].value == value)
			return required();
	}
	else if (controlToValidate.getAttribute("type") != null && controlToEval.getAttribute("type").toLowerCase() == "radio")
	{
		for (var i = 0; i < controlToEval.form[controlToEval.name].length; i++)
		{
			if (controlToEval.form[controlToEval.name][i].checked)
			{
				if (controlToEval.form[controlToEval.name][i].value == value)
					return required();
				else
					return true;
			}
		}
	}
	else if (controlToValidate.getAttribute("type") != null && controlToEval.getAttribute("type").toLowerCase() == "checkbox")
	{
		if (controlToValidate.form[fieldName][0])
		{
			for (var i = 0; i < controlToEval.form[controlToEval.name].length; i++)
			{
				if (controlToEval.form[controlToEval.name][i].checked)
					if (controlToEval.form[controlToEval.name][i].value == value)
						return required();
			}
		}
		else
		{
			if (controlToEval.checked)
				if (controlToEval.value == value)
					return required();
		}
	}
	else if (controlToEval.value == value)
		return required();

	return true;
}

function requiredIfNotBlank(fieldName)
{

	if (!checkRequired) return true;
	var saveControlToValidate = controlToValidate;
	controlToValidate = document.forms[0][fieldName];

	if ((controlToValidate[0]))
		controlToValidate = controlToValidate[0];
		
	if (required(true))
	{
		if (controlToValidate.tagName.toLowerCase() == "input")
		{
			if (controlToValidate.type.toLowerCase() == "text")
			{		
				if (controlToValidate.value == "0")
				{
					controlToValidate = saveControlToValidate;
					valid = true;
					return true;
				}
			}
		}
		controlToValidate = saveControlToValidate;
		return required();
	}
	else
	{
		controlToValidate = saveControlToValidate;
		valid = true;
		return true;
	}
	
}

function isValidMRONumberList() {
	var value = controlToValidate.value;
	if (value != "")
	{
		var tokens = value.tokenize(",", " ", true);
		for(var i=0; i<tokens.length; i++) {
			if (!isValidMRONumber(tokens[i])) {
				controlToValidate.focus();
				if (controlToValidate.getAttribute("alt"))
					alert(controlToValidate.getAttribute("alt") + " is not a invalid list of MRO numbers.");
				else
					alert(controlToValidate.getAttribute("name") + " is not a invalid list of MRO numbers.");
				valid = false;
				return false;	
			}
		}		
	} 
	controlToValidate.value = value;
	return true;
}

function isValidMRONumber(mroNumber) {
	if (mroNumber.length >= 9) {
		prefix = mroNumber.substring(0,3);
		if (prefix == 'MRO') {
			year = parseFloat(mroNumber.substring(3,5));
			if (!isNaN(year)) {
				separator = mroNumber.substring(5,6);
				if (separator == "-") {
					number = mroNumber.substring(6, mroNumber.length);
					if (!isNaN(number)) {
						return true;
					}
				}
			}	
		}
	}
	return false;
}

/*******************************************************************/
/***                                                             ***/
/***   Tokenizer.js - JavaScript String Tokenizer Function       ***/
/***                                                             ***/
/***   Version   : 0.1                                           ***/
/***   Date      : 01.09.2004                                    ***/
/***   Copyright : 2004 Adrian Zentner                           ***/
/***   Website   : http://www.adrian.zentner.name/               ***/
/***                                                             ***/
/***   This library is free software. It can be freely used as   ***/
/***   long as this this copyright notice is not removed.        ***/
/***                                                             ***/
/*******************************************************************/

String.prototype.tokenize = tokenize;

function tokenize()
  {
     var input     = "";
     var separator = " ";
     var trim      = "";
     var ignoreEmptyTokens = true;

     try {
       String(this.toLowerCase());
     }
     catch(e) {
       window.alert("Tokenizer Usage: string myTokens[] = myString.tokenize(string separator, string trim, boolean ignoreEmptyTokens);");
       return;
     }

     if(typeof(this) != "undefined")
       {
          input = String(this);
       }

     if(typeof(tokenize.arguments[0]) != "undefined")
       {
          separator = String(tokenize.arguments[0]);
       }

     if(typeof(tokenize.arguments[1]) != "undefined")
       {
          trim = String(tokenize.arguments[1]);
       }

     if(typeof(tokenize.arguments[2]) != "undefined")
       {
          if(!tokenize.arguments[2])
            ignoreEmptyTokens = false;
       }

     var start = 0;
     var end = 0;
     var token = new Array();
     for(var i=0; i<input.length+1; i++)
       {
          if(input.slice(start, i).indexOf(separator) != -1)
            {
               end = i - separator.length;
               token[token.length] = input.slice(start, end);
               start = i;
            }
          else
            {
               if(i == input.length)
                 token[token.length] = input.slice(start);
            }
       }

    if(trim)
      for(var i=0; i<token.length; i++)
        {
          while(token[i].slice(0, trim.length) == trim)
            token[i] = token[i].slice(trim.length);
          while(token[i].slice(token[i].length-trim.length) == trim)
            token[i] = token[i].slice(0, token[i].length-trim.length);
        }

    var finalToken = new Array();
    if(ignoreEmptyTokens)
      {
         for(var i=0; i<token.length; i++)
           if(token[i] != "")
             finalToken[finalToken.length] = token[i];
      }
    else
      {
         finalToken = token;
      }

     return finalToken;
  }

function isEmail()
{
	var value = controlToValidate.value;
	if (value != "")
	{
		if (!isValidEmail(value, true))
		{
			controlToValidate.focus();
			if (controlToValidate.getAttribute("alt"))
				alert(controlToValidate.getAttribute("alt") + " is an invalid email address.");
			else
				alert(controlToValidate.getAttribute("name") + " is an invalid email address.");
			valid = false;
			return false;
		}
	}
	return true;
}

function isValidEmail(email, required) {
    if (required==undefined) {   // if not specified, assume it's required
        required=true;
    }
    if (email==null) {
        if (required) {
            return false;
        }
        return true;
    }
    if (email.length==0) {  
        if (required) {
            return false;
        }
        return true;
    }
    if (! allValidChars(email)) {  // check to make sure all characters are valid
        return false;
    }
    if (email.indexOf("@") < 1) { //  must contain @, and it must not be the first character
        return false;
    } else if (email.lastIndexOf(".") <= email.indexOf("@")) {  // last dot must be after the @
        return false;
    } else if (email.indexOf("@") == email.length) {  // @ must not be the last character
        return false;
    }
	
    return true;
}

function allValidChars(email) {
  var parsed = true;
  var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
  for (var i=0; i < email.length; i++) {
    var letter = email.charAt(i).toLowerCase();
    if (validchars.indexOf(letter) != -1)
      continue;
    parsed = false;
    break;
  }
  return parsed;
}