function setDefaultSelection(f) {
  var nLen;
  var d_val;
  var f_type; // one of select, radio, and checkbox

  for (var i = 0; i < f.elements.length; i++) {
    f_type = f.elements[i].type;
    d_val = f.elements[i].selected;
    if (d_val != null && f_type == "checkbox") {
      if (f.elements[i].value == d_val)
        f.elements[i].checked = "checked";
      else
        f.elements[i].checked = false;
    }
    else if (d_val != null && f_type == "radio") {
      if (f.elements[i].value == d_val)
        f.elements[i].checked = "checked";
    }
    else if (d_val && f_type == "select-one") { // Select 1 ?? ??
      nLen = f.elements[i].options.length; 
      for (var j = 0; j < nLen; j++) {
        if (f.elements[i].options[j].value == d_val) 
          f.elements[i].options[j].selected = "selected";
      }
    }
    else if (f_type == "select-multiple") {  // Select ?? ??
      nLen = f.elements[i].options.length;
      for (var j = 0; j < nLen; j++) {
        if (f.elements[i].options[j].value == f.elements[i].options[j].d_val)
          f.elements[i].options[j].selected = true;
      }
    }
  }
  return true;
}


function setDefaultSelectionAll() {
  for(var i = 0; i < document.forms.length; i++){
    setDefaultSelection(document.forms[i]);
  }
}


function checkRequiredField(elem) {
  return null != elem.value && elem.value.length > 0;
}

function checkRequiredFields(f) {
  for (var i = 0; i < f.elements.length; i++) {
    r_val = f.elements[i].required;
    if (null!=r_val && !checkRequiredField(f.elements[i])) {
      alert(r_val);
      f.elements[i].focus();
      return false;
    }
  }
  return true;
}

function clearFields(f) {
  for (var i = 0; i < f.elements.length; i++) {
    if ("text"==f.elements[i].type.toLowerCase() || "textarea"==f.elements[i].type.toLowerCase()) {
      f.elements[i].value="";
    }
    else if ("checkbox"==f.elements[i].type.toLowerCase()) {
      f.elements[i].checked=false;
    }
    else if ("radio"==f.elements[i].type.toLowerCase()) {
      f.elements[i].checked=false;
    }
  }
  return true;
}

function getPosition(el, which) {
  var amount = el["offset"+which] 
  var el = el.offsetParent
  while (el!=null) {
    amount+=el["offset"+which]
    el = el.offsetParent
  }
  return amount
}

function markRequiredFields(f) {
  var docBody = document.getElementsByTagName("body").item(0);
  for (var i = 0; i < f.elements.length; i++) {
    var field = f.elements[i];
    if (null != field.required) {
      var markBox = document.createElement("div");
      //var markClass = document.createAttribute("class");
      var markText = document.createTextNode("!");
      markBox.appendChild(markText);
      docBody.appendChild(markBox);

      markBox.setAttribute("className", "required_mark");
      markBox.setAttribute("tip", field.required); 
      markBox.style.pixelTop = getPosition(field, "Top");
      markBox.style.pixelLeft = getPosition(field, "Left") + field.offsetWidth + 10;
    }
  }
  f.onsubmit = onFormSubmit;
}

function onFormSubmit() {
  return checkRequiredFields(event.srcElement);
}

function doLoad() {
  for (i in form_mark_list) {
    setDefaultSelection(form_mark_list[i]);
    markRequiredFields(form_mark_list[i]);
  }
  if (null != form_backup_onload) {
    form_backup_onload();
  }
}

var form_backup_onload = window.onload;
var form_mark_list = [];
window.onload = doLoad;

function extendForm(f) {
  form_mark_list[form_mark_list.length]=f;
}