function FormValidator_checkRequiredField(field)
{
  if (field == null) return false;
  if (field.type == 'hidden') return true;
  if ((field.type == 'text') || (field.type == 'password') || (field.type == 'textarea'))
  {
     if ((field.value == '') || (field.value == ' ')) return false;
     return true;
  }
  if (field.type == 'radio')
  {
    var field2 = field.form.elements[field.name];
    if (field2.length)
    {
      for (var i = 0; i < field2.length; i++)
      {
        if (field2[i].checked) return true;
      }
      return false;
    }
    return field2.checked;
  }
  if (field.type == 'select-one')
  {
     var val = field.options[field.selectedIndex].value;
     if (val == '') return false;
     return true;
  }
  return false;
}
function FormValidator_highlightMissingField(field)
{
   if (field == null) return;
   if (field.length != null) this.highlightMissingField(field[0]);
   if (field.style != null)
   {
      this.oldcolor = field.style.backgroundColor;
      field.style.backgroundColor = this.highlightcolor;
   }
   this.highlightedfield = field;
   try
   {
      if (TABBEDPAGE) focusParentTab(field);
   }
   catch (e)
   {
      // Tabs.js was not included so ignore it!
   }
      
   if (!field.disabled) field.focus();
}

function FormValidator_clearHighlights()
{
  if (this.highlightedfield != null)
  {
   if (this.highlightedfield.style != null)
   {
      this.highlightedfield.style.backgroundColor = this.oldcolor;
   }
  }
  this.highlightedfield = null;
}


function FormValidator_makeRequired(fieldname)
{
  if (!this.requiredfields.contains(fieldname)) 
  {
    this.requiredfields.add(fieldname);
    for (var i = 0; i < document.forms.length; i++)
    {
       var f = document.forms[i];
       for (var j = 0; j < f.elements.length; j++)
       {
          var el = f.elements[j];
          if (el.name == fieldname)
          {
            if (el.className.indexOf('REQ') == -1) el.className = el.className + 'REQ';
            var star = document.getElementById(el.name + '_star');
            if (star != null)
               star.className = 'STAR';
          }
       }
    }
  }
}

function FormValidator_makeUnRequired(fieldname)
{
  if (this.requiredfields.contains(fieldname)) 
  {
    this.requiredfields.remove(fieldname);
    for (var i = 0; i < document.forms.length; i++)
    {
       var f = document.forms[i];
       for (var j = 0; j < f.elements.length; j++)
       {
          var el = f.elements[j];
          if (el.name == fieldname)
          {
            if (el.className.indexOf('REQ') != -1) el.className = el.className.replace('REQ', '');
            var star = document.getElementById(el.name + '_star');
            if (star != null) 
              star.className = 'NOSTAR';
          }
       }
    }
  }
}

function FormValidator_enableField(fieldname)
{
    for (var i = 0; i < document.forms.length; i++)
    {
       var f = document.forms[i];
       for (var j = 0; j < f.elements.length; j++)
       {
          var el = f.elements[j];
          if (el.name == fieldname)
          {
             el.disabled = false;
             if ((el.type == 'text') || (el.type == 'password') || (el.type == 'textarea'))
             {
               if (this.requiredfields.contains(fieldname))
                 el.style.backgroundColor = this.requiredbackgroundcolor;
               else
                 el.style.backgroundColor = '#FFFFFF';
             }
             if (el.type == 'checkbox')
             {
               el.offsetParent.style.color='#000000';
             }
             if (el.type == 'select-one')
             {
               if (this.requiredfields.contains(fieldname))
                 el.style.backgroundColor = this.requiredbackgroundcolor;
               else
                 el.style.backgroundColor = '#FFFFFF';
             }
          }
       }
    }
}

function FormValidator_disableField(fieldname, clearit)
{
    for (var i = 0; i < document.forms.length; i++)
    {
       var f = document.forms[i];
       for (var j = 0; j < f.elements.length; j++)
       {
          var el = f.elements[j];
          if (el.name == fieldname)
          {
             el.disabled = true;
             if ((el.type == 'text') || (el.type == 'password') || (el.type == 'textarea'))
             {
               if (clearit) el.value = '';
               el.style.backgroundColor = '#DDDDDD';               
             }
             else if (el.type == 'checkbox')
             {
                 el.offsetParent.style.color='#888888';
                 if (clearit) el.checked = false;
             }
             if (el.type == 'select-one')
             {
               if (clearit) el.selectedIndex = 0;
               el.style.backgroundColor = '#DDDDDD';               
             }
          }
       }
    }
}

var DISALLOWED_CHARACTERS = new Array( '<', '>', '=', '%', ';', '^' );
var CHECK_FOR_DISALLOWED = true;

function FormValidator_validateForm(f)
{
	this.clearHighlights();
	for (var i = 0; i < f.elements.length; i++)
	{
		var el = f.elements[i];
		if ((CHECK_FOR_DISALLOWED) && (el.type) && (el.type == 'text'))
		{
			var val = el.value;
			if (val.indexOf('http') != 0)
			{
				for (var j = 0; j < DISALLOWED_CHARACTERS.length; j++)
				{
					if (val.indexOf(DISALLOWED_CHARACTERS[j]) != -1)
					{
						this.highlightMissingField(el);
						alert(this.invalidcharactermessage + DISALLOWED_CHARACTERS[j]);
						return false;
					}
				}
			}
		}
		
		// Check for required fields
		if (this.requiredfields.contains(el.name))
		{
			if (!this.checkRequiredField(el))
			{
				this.highlightMissingField(el);
				alert(this.missingfieldmessage);
				return false;
			}
		}
		var formatter = this.formatters.get(el.name);
		if ((formatter != null) && (el.value != ''))
		{
			if (!formatter.validateField(el))
			{
				alert(formatter.getErrorMessage());
				this.highlightMissingField(el);
				return false;
			}
		}
	}
  return true;
}

function FormValidator_enableAll(f)
{
	var disablesubmit = ((f.target == null) || (f.target == ''));
	for (var i = 0; i < f.elements.length; i++)
	{
		var el = f.elements[i];
		if ((el.type == 'submit') && (disablesubmit))
			el.disabled = true;
		else
			el.disabled = false;
	}
}
function FormValidator_setHighlightColor(val)
{
  this.highlightcolor = val;
}

function FormValidator_setRequiredBackgroundColor(val)
{
  this.requiredbackgroundcolor = val;
}

function FormValidator_addToGroup(fieldname, group)
{
  if (this.groups.get(group) == null) this.groups.put(group, new Vector());
  if (!this.groups.get(group).contains(fieldname)) this.groups.get(group).add(fieldname);
}

function FormValidator_enableGroup(group)
{
  var names = this.groups.get(group);
  if (names == null) return;
  for (var i = 0; i < names.size(); i++)
  {
    var name = names.elementAt(i);
    this.enableField(name);
  }
}
function FormValidator_disableGroup(group, clearit)
{
  var names = this.groups.get(group);
  if (names == null) return;
  for (var i = 0; i < names.size(); i++)
  {
    var name = names.elementAt(i);
    this.disableField(name, clearit);
  }
}
function FormValidator_makeGroupRequired(group)
{
  var names = this.groups.get(group);
  if (names == null) return;
  for (var i = 0; i < names.size(); i++)
  {
    var name = names.elementAt(i);
    this.makeRequired(name);
  }
}
function FormValidator_makeGroupUnRequired(group, clearit)
{
  var names = this.groups.get(group);
  if (names == null) return;
  for (var i = 0; i < names.size(); i++)
  {
    var name = names.elementAt(i);
    this.makeUnRequired(name);
  }
}

function FormValidator_updateForm(f, sender)
{
  this.clearHighlights();
  // Validate formats on all of the fields
  if (sender != null)
  {
     var formatter = this.formatters.get(sender.name);
     if ((formatter != null) && (sender.value != ''))
     {
        if (!formatter.validateField(sender))
        {
          alert(formatter.getErrorMessage());
          this.highlightMissingField(sender);
          return false;
        }
     }
  }
  
  // Copy the address fields
  if ((f.elements['sameaddress'] != null) && (f.elements['sameaddress'].checked))
  {
     for (var i = 0; i < f.elements.length; i++)
     {
        var el1 = f.elements[i];
        if ((el1.name) && (el1.name.indexOf('billto') != -1))
        {
           var el2 = f.elements[el1.name.replace('billto', 'shipto')];
           if (el2 != null)
           {
              var val = "";
              if ((el1.type == 'text') || (el1.type == 'hidden') || (el1.type == 'textarea'))
                val = el1.value;
              else if (el1.type == 'select-one')
                val = el1.options[el1.selectedIndex].value;

              if ((el2.type == 'text') || (el2.type == 'hidden') || (el2.type == 'textarea'))
                 el2.value = val;
              else if (el2.type == 'select-one')
              {
                 for (var j = 0; j < el2.options.length; j++)
                 {
                   if (el2.options[j].value == val) el2.selectedIndex = j;
                 }
              }
          }
      }
    }
  }
  return true;
}

function FormValidator_addFormatValidator(fieldname, validator, msg)
{
  validator.setErrorMessage(msg);
  this.formatters.put(fieldname, validator);
}

function FormValidator_checkFormat(field, event)
{
  var formatter = this.formatters.get(field.name);
  if (formatter == null) return true;
  return formatter.updateField(field, event);
}

function FormValidator_getSrcElement(e)
{
  var el = null;
  if (window.event)
  {
    el = window.event.srcElement;
  }
  else if (e)
  {
    el = e.target;
  }
  var res = '';
  if (el != null) res = el.name;
  return res;
}
function FormValidator_error(msg, field)
{
  alert(msg);
  this.highlightMissingField(field);
  return false;
}

function getRadioValue(f, fieldname)
{
	var el = f.elements[fieldname];
	if (!el) return -1;
	if (!el.length) return el.value;
	for (var i = 0; i < el.length; i++)
	{
		if (el[i].checked) return el[i].value;
	}
	return -1;
}
function setRadioValue(f, fieldname, val)
{
	var el = f.elements[fieldname];
	if (!el) return -1;
	if (!el.length) return el.value;
	for (var i = 0; i < el.length; i++)
	{
		if (el[i].value == val) el[i].checked = true;
	}
	return -1;
}

function FormValidator(missingfieldmessage)
{
  this.missingfieldmessage = missingfieldmessage;
  this.invalidcharactermessage = 'Invalid character: ';
  this.requiredfields = new Vector();
  this.groups = new Hashtable();
  this.formatters = new Hashtable();
  this.highlightedfield = null;
  this.validateForm = FormValidator_validateForm;
  this.highlightMissingField = FormValidator_highlightMissingField;
  this.clearHighlights = FormValidator_clearHighlights;
  this.checkRequiredField = FormValidator_checkRequiredField;
  this.makeRequired = FormValidator_makeRequired;
  this.makeUnRequired = FormValidator_makeUnRequired;
  this.enableField = FormValidator_enableField;
  this.disableField = FormValidator_disableField;
  this.highlightcolor = '#FFFF77';
  this.requiredbackgroundcolor = '#FAF8D7';
  this.setHighlightColor = FormValidator_setHighlightColor;
  this.setRequiredBackgroundColor = FormValidator_setRequiredBackgroundColor;
  this.enableAll = FormValidator_enableAll;
  this.addToGroup = FormValidator_addToGroup;
  this.enableGroup = FormValidator_enableGroup;
  this.disableGroup = FormValidator_disableGroup;
  this.makeGroupRequired = FormValidator_makeGroupRequired;
  this.makeGroupUnRequired = FormValidator_makeGroupUnRequired;
  this.updateForm = FormValidator_updateForm;
  this.addFormatValidator = FormValidator_addFormatValidator;
  this.checkFormat = FormValidator_checkFormat;
  this.getSrcElement = FormValidator_getSrcElement;
  this.error = FormValidator_error;
  this.oldcolor = '#FFFFFF';
  return this;
}

function saveCheckBoxes(f, realname, fieldname)
{
	var els = f.elements[fieldname];
	var val = '-';
	if (els.length)
	{
		for (var i = 0; i < els.length; i++)
		{
			if (els[i].checked)
				val += ":" + els[i].value;
		}
	}
	else if (els.checked)
		val += ":" + els.value;
		
	val += ":";
	f.elements[realname].value = val;
}