//****************************************************************************************
//**  NAME     : Form Validate                                                          **
//**  PURPOSE  : This JavaScript library provides functions to validate HTML Forms.     **
//**             It can also validate keystrokes on live.                               **
//**  AUTHOR   : Sk Moin.                                                               **
//**  DATE     : Oct 10th 2006                                                          **
//**  VERSION  : 1.10                                                                    **
//**                                                                                    **
//****************************************************************************************


function keyValidate(e,obj)
{
	var chars=obj.getAttribute('filter');
	if(chars)
	{
		var charstr='';
		if(chars.split('|')[0].toLowerCase()=='alpha')
			charstr="abcdefghijklmnopqrstuvwxyz";
		else if(chars.split('|')[0].toLowerCase()=='numeric')
			charstr="0123456789";
		else if(chars.split('|')[0].toLowerCase()=='alphanumeric')
			charstr="abcdefghijklmnopqrstuvwxyz0123456789";
		else
			return true;

		if(obj.getAttribute('extrachars')) charstr += obj.getAttribute('extrachars');

		var key;
		var keychar;

		if (!e) var e = window.event;
		key=e.keyCode? e.keyCode : e.which;

		keychar = String.fromCharCode(key);

		if ((key==null) || (key==0) || (key==8) ||
			(key==9) || (key==27))
		   return true;


		if ( !(charstr.indexOf(keychar.toLowerCase()) > -1) )
		{
			if(chars.split('|').length>1)
				alert(chars.split('|')[1]);

			return false;
		}

	}
	return true
}

function validError(obj,msg)
{
    alert(msg);
    obj.focus();
    if (obj.select)
        obj.select();
}

function jsTrim(txt)
{
	return txt.replace(/^\s*|\s*$/g,"");
}


function sameText(txt1, txt2)
{
	if(jsTrim(txt1).toLowerCase()==jsTrim(txt2).toLowerCase())
		return true;
	else
		return false;
}

function formValidate(form)
{


    var inputs=form.getElementsByTagName('input');
    var tas=form.getElementsByTagName('textarea');
    for(var i=0;i<inputs.length + tas.length;i++)
    {
        if (i<inputs.length){
            var obj=inputs[i];
            var type=obj.getAttribute('type');
        }            
        else {
            var obj=tas[i-inputs.length]; 
            var type="textarea";
        }

		//Text element validation starts here
        if(sameText(type,"text") || sameText(type,"password")  || sameText(type,"textarea") || sameText(type,"file") ){
      
            var depend=obj.getAttribute('depend');
            if(depend)
            {
				var depid=jsTrim(depend.split('|')[0]);
				depobj=document.getElementById(depid);
				if(!depobj)
				{
				    objarr=document.getElementsByName(depid);
				    if(objarr && objarr.length >0)
				    {
				        depobj=objarr[0];
				    }
                }
                if(depobj)
                {
                    if(jsTrim(depobj.value)!="" && jsTrim(obj.value)=='')
                    {
                        validError(obj,depend.split('|')[1]?depend.split('|')[1]:'Please enter a value');
                        return false;
                    }
                }
			}

            var optional=obj.getAttribute('optional');
            if(optional && sameText(optional.split('|')[0],'no') && jsTrim(obj.value)=='')
            {
                validError(obj,optional.split('|')[1]?optional.split('|')[1]:'This field is not optional');
                return false;
            }
            
            var chars=obj.getAttribute('filter');
            if(chars)
            {
                var charstr='';
				var emailREG=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
				var tsREG=/^[0-2][0-3]:[0-5][0-9]:[0-5][0-9]$/;
				var mmddyyREG=/^[0-1][0-9]-[0-3][0-9]-[0-1][0-9]$/;
				var filter=chars.split('|')[0];
                if(sameText(filter,'alpha'))
                    charstr="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
                else if(sameText(filter,'lower'))
                    charstr="abcdefghijklmnopqrstuvwxyz";
				else if(sameText(filter,'upper'))
                    charstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                else if(sameText(filter,'numeric'))
                    charstr="0123456789";
                else if(sameText(filter,'alphanumeric'))
                    charstr="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                else if(sameText(filter,'lowernumeric'))
                    charstr="abcdefghijklmnopqrstuvwxyz0123456789";
                else if(sameText(filter,'uppernumeric'))
                    charstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
				else if(sameText(filter,'email') || sameText(filter,'timestamp') || sameText(filter,'mmddyy'))
					{}
                else
                    continue;

				var str=obj.value;
				if(sameText(chars.split('|')[0],'email'))
				{
					if (!(emailREG.test(str)))
					{
						validError(obj,chars.split('|')[1]?chars.split('|')[1]:'Invalid Email Address');
						return false;
					}
				}
				else if(sameText(chars.split('|')[0],'timestamp'))
				{
					if (!(tsREG.test(str)))
					{
						validError(obj,chars.split('|')[1]?chars.split('|')[1]:'Invalid Time Stamp [HH:MM:SS]');
						return false;
					}
				}
				else if(sameText(chars.split('|')[0],'mmddyy'))
				{
					if (!(mmddyyREG.test(str)))
					{
						validError(obj,chars.split('|')[1]?chars.split('|')[1]:'Invalid Date Format [MM-DD-YY]');
						return false;
					}
				}
				else
				{
					if(obj.getAttribute('extrachars')) charstr += jsTrim(obj.getAttribute('extrachars'));

					for(var j=0; j<str.length; j++){
						if ( !(charstr.indexOf(str.charAt(j)) > -1) )
						{
							validError(obj,chars.split('|')[1]?chars.split('|')[1].replace('XCHAR',str.charAt(j)):'Invalid Character : ' + str.charAt(j));
							return false;
						}
					}
				}
            }
            
            var compare=obj.getAttribute('compare');
            if(compare)
            {
				var compid=jsTrim(compare.split('|')[0]);
				compobj=document.getElementById(compid);
				if(!compobj)
				{
				    objarr=document.getElementsByName(compid);
				    if(objarr && objarr.length >0)
				    {
				        compobj=objarr[0];
				    }
                }
                if(compobj)
                {
                    if(compobj.value!=obj.value)
                    {
   						validError(obj,compare.split('|')[1]?compare.split('|')[1]:'Field values are not matching');
						return false;
                    }
                }
			}


            var extension=obj.getAttribute('extension');
            if(sameText(type,"file") && jsTrim(obj.value)!="" && extension)
            {
				var exts=jsTrim(extension.split('|')[0]).split(',');
				var farr=obj.value.split('.');
				if(farr.length!=2)
				{
					validError(obj,extension.split('|')[1]?extension.split('|')[1]:'Invalid File Type.');
					return false;
				}
				var fext=farr[1];
				nomatch=0;
				for(var j=0;j<exts.length;j++)
				{
				    if(!sameText(exts[j],fext)) nomatch++;
				}
				if(exts.length==nomatch)
				{
					validError(obj,extension.split('|')[1]?extension.split('|')[1]:'Invalid File Type.');
					return false;
				}
			}

                   
        }
		//Text elements validation end here

		//Radio button validation starts here
        if(sameText(type,"radio")){
            var radname=obj.getAttribute('name');
			var radgroup=form[radname];
			var radio_choice = false;
			for (var counter = 0; counter < radgroup.length; counter++)
				if (radgroup[counter].checked)
					radio_choice = true; 

			var optional=obj.getAttribute('optional');
            if(optional && sameText(optional.split('|')[0],'no') && !radio_choice)
            {
                validError(obj,optional.split('|')[1]?optional.split('|')[1]:'Please select atleast one option');
                return false;
            }
		}
		//Radio button validation ends here
    }

	//Select box validation starts here
    var selects=form.getElementsByTagName('select');
    for(var i=0;i<selects.length;i++)
    {
        var obj=selects[i];       

        var depend=obj.getAttribute('depend');
        if(depend)
        {
			var depid=jsTrim(depend.split('|')[0]);
			depobj=document.getElementById(depid);
			if(!depobj)
			{
			    objarr=document.getElementsByName(depid);
			    if(objarr && objarr.length >0)
			    {
			        depobj=objarr[0];
			    }
            }
            if(depobj)
            {
                if(jsTrim(depobj.value)!="" && jsTrim(obj.value)=='')
                {
                    validError(obj,depend.split('|')[1]?depend.split('|')[1]:'Please select a value');
                    return false;
                }
            }
		}
        
        var optional=obj.getAttribute('optional');

        if(optional && sameText(optional.split('|')[0],'no') && obj.options[obj.selectedIndex].value=='')
        {
            validError(obj,optional.split('|')[1]?optional.split('|')[1]:'Please select a value');
            return false;
        }
    }
	//Select box validation ends here



    return true;
}

