/* This notice must remain at all times.

form_utils.js
Copyright (c) Balamurugan S, 2006. sbalamurugan @ hotmail.com
Development support by Jexp, Inc http://www.jexp.com 

This package is free software. It is distributed under GPL - legalese removed, it means that you can use this for any purpose, but cannot charge for this software. Any enhancements you make to this piece of code, should be made available free to the general public! 

Latest version can be downloaded from http://www.sbmkpm.com

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

see http://www.sbmkpm.com/validate.html for usage details and examples.
*/

/* --------------------------------------------------------------
Utiltiy funcitons. Some are modified from prototype.js
------------------------------------------------------------------*/
function isIE()
{
 return(navigator.userAgent.toLowerCase().indexOf("msie") >= 0);
}

var FES = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'submit':
      case 'hidden':
      case 'password':
      case 'text':
        return FES.textarea(element);
      case 'checkbox':
      case 'radio':
        return FES.inputSelector(element);
    }
    return false;
  },

  inputSelector: function(element) {
    if (element.checked)
      return [element.name, element.value];
  },
textarea: function(element) {
    return [element.name, element.value];
  },

  select: function(element) {
    return FES[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var value = '', opt, index = element.selectedIndex;
    if (index >= 0) {
      opt = element.options[index];
      value = opt.value || opt.text;
    }
    return [element.name, value];
  },

selectMany: function(element) {
    var value = [];
    for (var i = 0; i < element.length; i++) {
      var opt = element.options[i];
      if (opt.selected)
        value.push(opt.value || opt.text);
    }
    return [element.name, value];
  }
}

function fget(element) {
    //element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = FES[method](element);

    if (parameter)
      return parameter[1];
  }

function getElements(form) {
    //form = document.getElementById(form);
    var elements = new Array();

    for (var tagName in FES) {
      var tagElements = form.getElementsByTagName(tagName);
      for (var j = 0; j < tagElements.length; j++)
        elements.push(tagElements[j]);
    }
    return elements;
  }

/* --------------------------------------------------------------
Set all type of form values
-----------------------------------------------------------------*/
function setForm(form_n, key, value){

  if(form_n == null || form_n == "" || key == null || key == "")
     return;

    var elem = eval("document."+form_n+"."+key);
    if(elem == null)
       return;

    if(elem.nodeName == "INPUT" || elem.nodeName=="TEXTAREA")
      {
       var type = elem.getAttribute('type');
       if(type != "checkbox" && type != "radio" && type != "file" && type != "image")
          elem.value = value;
      }
    else if(typeof(elem.length) != "undefined")
      {
       // process lists
       var i;
       for(i=0;i<elem.length;i++) {
              if((elem[i].nodeName == "INPUT") && (elem[i].value == value))
		{
                  elem[i].checked = (elem[i].checked ? false : true); // toggle
	        }
              else if((elem[i].nodeName == "OPTION") && (elem[i].value == value))
	        {
                  elem[i].selected = (elem[i].selected ? false : true);
                  elem[i].defaultSelected = (elem[i].defaultSelected ? false : true);
	        }
              //debug(elem[i].nodeName+":"+elem[i].value+"<br>");
          }
      }
}

/* --------------------------------------------------------------
Validates all elements in a form 
-----------------------------------------------------------------*/
var validation_regex = new Array();
validation_regex['email']         = /^[\w\.\_\-]+?\@\w+?(\.\w+)+$/;
validation_regex['date'] 	  = /^\d\d\/\d\d\/\d\d\d\d$/;
validation_regex['date_mm'] 	  = /^((((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9]))))[\-\/\s]?\d{2}(([02468][048])|([13579][26])))|(((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))[\-\/\s]?\d{2}(([02468][1235679])|([13579][01345789]))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$/;
validation_regex['number']        = /^\d+$/;
validation_regex['text']          = /^[a-zA-Z]+$/;
validation_regex['alpha']         = /^\w+$/;
validation_regex['decimal']       = /^\d+(\.\d+)?$/;

validation_regex['uri']           = /^https?\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?$/;

function checkForm(form_n)
{
    if(form_n == null || form_n == "")
       return;

    var frm = eval("document."+form_n);
    if(frm == null)
       return;

    var nodes = getElements(frm);

    var i;
    for(i=0;i<nodes.length;i++)
       {
        var mandatory  = nodes[i].getAttribute('mandatory');
        var validation = nodes[i].getAttribute('validation');
        var regex      = nodes[i].getAttribute('regex');
        var name       = nodes[i].getAttribute('name');
        var errmsg     = nodes[i].getAttribute('error');

        var value = getValue(form_n, name);
        //debug(nodes[i].name + "=" + value+"<br>");

        if(mandatory == "yes" && (value == null || value == ""))
          {
           alert("Field '"+nodes[i].getAttribute('name')+"' cannot be blank");
	   //Field.focus(nodes[i]);
           return false;
          }

        if(validation != null && validation != "" && value != "" && value != null)
          {
           var expr = (validation == "custom" ? regex : validation_regex[validation]);
           if(expr != null && expr != "")
             {
              var m = (new RegExp(expr)).exec(value);
	      //debug(expr+":"+m);
              if(m==null)
                {
                 if(errmsg == null || errmsg == "")
	            errmsg = "Invalid data format in";
        
                 alert(errmsg + " : '"+nodes[i].getAttribute('name')+"'");
	         //Field.focus(nodes[i]);
                 return false;
                }
             }
          }
       }


   return true;
}

/* --------------------------------------------------------------
Utility function for getting the value of any form element, including
Radio/Checkbox/Select
-----------------------------------------------------------------*/
function getValue(form_n, node_n)
{
  if(form_n == null || form_n == "" || node_n == null || node_n == "")
     return null;

  var node = eval("document."+form_n+"."+node_n);
  if(node == null)
     return null;

  if(typeof(node.type) != "undefined" && node.type != "button" && node.type != "hidden")
     return fget(node);

  if(typeof(node.type) != "undefined" && (node.type == "button" || node.type == "hidden"))
     return node.value;
  
  // process checkbox/radio
  var result = new Array();

  if(typeof(node.length) != "undefined")
    {
      var i;
      for(i=0;i<node.length;i++) 
         {
          if((node[i].nodeName == "INPUT") && (node[i].checked))
            {
             result[result.length] = node[i].value;
            }
          else if((node[i].nodeName == "OPTION") && (node[i].checked))
            {
             result[result.length] = node[i].value;
            }
         }
    }
 return (result.length > 0 ? result : "");
}
