function $E(elm)
{
   return document.getElementById(elm);
};

function $V(elm)
{
    if($E(elm))
    {
        return document.getElementById(elm).value;
    }
    else
    {
        return "";
    }
};
function $defined(obj){
	return (obj != undefined);
};
function $Elem(elm)
{
  var crossobj;
  if($type(elm)=="element")
  {
    crossobj = elm;
  }
  else if($type(elm)=="string")
  {      
    crossobj = $E(elm);
  }
  return crossobj;
};
function $type(obj){
	if (!$defined(obj)) return false;
	if (obj.htmlElement) return 'element';
	var type = typeof obj;
	if (type == 'object' && obj.nodeName){
		switch(obj.nodeType){
			case 1: return 'element';
			case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
		}
	}
	if (type == 'object' || type == 'function'){
		switch(obj.constructor){
			case Array: return 'array';
			case RegExp: return 'regexp';
			case Class: return 'class';
		}
		if (typeof obj.length == 'number'){
			if (obj.item) return 'collection';
			if (obj.callee) return 'arguments';
		}
	}
	return type;
};

var MyValidator =
{
    validationItems:function(){},
    items:[],
    add: function(elem,options,message)
    {                      
        var validationItem = new MyValidator.validationItems();
        validationItem.elem = elem;
        validationItem.options = options;
        validationItem.message = message;        
        MyValidator.items.push(validationItem);
    },
    run: function()
    {        
        var errorCount = 0;
        
        MyValidator.FocusSet = false;
        
        for(var i=0;i<MyValidator.items.length;i++)
        {
            var hasError = MyValidator.Validate(MyValidator.items[i].elem
                                 ,MyValidator.items[i].options
                                 ,MyValidator.items[i].message);
            if(hasError)
            {
                errorCount+=1;
            }
        }
        
        return errorCount==0;
    },
   NullCheck: false,
   EmailCheck : false,
   PhoneCheck : false,
   LengthCheck : false,
   PostalCodeCheck : false,
   MinLength : 0,
   MaxLength : 0,
   ShowElement : "",
   SetErrorMessage : false,
   SetFocus : false,
   FocusSet : false,
   Validate : function(elem,options,message)
   {    
      doptions =
      {
        "NullCheck": MyValidator.NullCheck,
        "EmailCheck" : MyValidator.EmailCheck,
        "PhoneCheck" : MyValidator.PhoneCheck,
        "LengthCheck" : MyValidator.LengthCheck,
        "PostalCodeCheck" : MyValidator.PostalCodeCheck,
        "MinLength" : MyValidator.MinLength,
        "MaxLength" : MyValidator.MaxLength,
        "ShowElement" : MyValidator.ShowElement,
        "SetErrorMessage" : MyValidator.SetErrorMessage,
        "SetFocus" : MyValidator.SetFocus
      };
      
      if (options)
      {
         for (var i in doptions)
         {
            if (!options[i])
            {
               options[i] = doptions[i];
            }
         }
      }
      else
      {
         options = doptions;
      }
      
      var flagValidated = false;
      
      if(options.LengthCheck && flagValidated==false)
      {
        flagValidated = !MyValidator.validateLengthCheck($V(elem),options.MinLength,options.MaxLength);
      }
      
      if(options.NullCheck && flagValidated==false)
      {
        flagValidated = ($V(elem).length==0);
      }
      
      if(options.EmailCheck && flagValidated==false)
      {
        flagValidated = !MyValidator.validateEmail($V(elem));
      }
      if(options.PhoneCheck && flagValidated==false)
      {
        flagValidated = MyValidator.validatePhone($V(elem));
      }
     
      if(options.PostalCodeCheck && flagValidated==false)
      {
        flagValidated = MyValidator.validatePostalCode($V(elem));
      }
      
      if(flagValidated)      
      {
        if(options.ShowElement !="")
        {
            MyValidator.Show(options.ShowElement);
        }
        if(message.length>0)
        {
            $Elem(options.ShowElement).innerHTML = message;
        }
        
        if(options.SetFocus && MyValidator.FocusSet==false)
        {
            $Elem(elem).focus();
            MyValidator.FocusSet = true;            
        }
      }
      else
      {
        if(options.ShowElement !="")
        {
            MyValidator.Hide(options.ShowElement);
        }
      }      
      
      return flagValidated;
   },
   validateEmail: function (email) 
   {
        var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;   
        return reg.test(email)  
   },
   validatePhone: function (Phone) 
   {
       var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;   
       return reg.test(Phone)  
   },
   
   validateLengthCheck: function (value,minLength,maxLength) 
   {
       return value.toString().length>=minLength && value.toString().length<=maxLength;
   },
   
   validatePostalCode: function (Phone) 
   {
       var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;   
       return reg.test(Phone)  
   },
   Hide : function(elm)
   {
     var elm=$Elem(elm);
     if(elm)
     {
        elm.style.display = "none";
     }
     return elm;
   }
   ,

   Show : function(elm)
   {
     var elm=$Elem(elm);
     if(elm)
     {
        elm.style.display = "block";
     }
     return elm;
   }
};