//
//  This script was created
//  by Mircho Mirev
//  mo /mo@momche.net/
//
//	:: feel free to use it BUT
//	:: if you want to use this code PLEASE send me a note
//	:: and please keep this disclaimer intact
//

function getSize( hLayer, sParam )
{
	nPos = 0
	while( ( hLayer != null ) && ( hLayer.tagName ) && !( /(body|html)/i.test( hLayer.tagName ) ) )
	{
		nPos += eval( 'hLayer.' + sParam )
		hLayer = hLayer.offsetParent
	}
	return nPos
}

//mo form tester
cFormTester =
{
	name : 'FormTester',
	sEmailFormat : "/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/",
	sDateFormat : "/^[\s]*[0-9]{2}.[0-9]{2}.[0-9]{4}$/",
	sMoneyFormat : "/^[\s]*[\-+]?[0-9\.\-]/",
	sFromNotValidMessage : "Form not valid! Please check marked fields!"
}

//an object holding validation rules
cFormTester.validationRules = {}
cFormTester.addRule = function( sFormName, sFieldName, sRule )
{
	if( typeof( cFormTester.validationRules[ sFormName ] ) == 'undefined' )
	{
		cFormTester.validationRules[ sFormName ] = {}
	}
	cFormTester.validationRules[ sFormName ][ sFieldName ] = sRule
}

cFormTester.getRule = function( sFormName, sFieldName )
{
	if( typeof( cFormTester.validationRules[ sFormName ] ) == 'undefined' )
	{
		return null
	}
	if( typeof( cFormTester.validationRules[ sFormName ][ sFieldName ] ) == 'undefined' )
	{
		return null
	}
	return cFormTester.validationRules[ sFormName ][ sFieldName ]
}

cFormTester.doCheckSubmit = function( hEvent )
{
	if( hEvent == null ) hEvent = window.event
	var hF = ( hEvent.srcElement ) ? hEvent.srcElement : hEvent.originalTarget
	if( hF != null && hF.form )
	{
		hF = hF.form
	}
        if ( hF == null && typeof(hEvent) == 'object') {
            hF = hEvent;
        }
	var nEL = hF.elements.length
	for( var nJ = 0; nJ < nEL; nJ ++ )
	{
		var hField = hF.elements.item( nJ )
		var hEVExp = hField.getAttribute( 'movexp' )
		if( hEVExp )
		{
			if( !cFormTester.checkField( hField ) )
			{
				alert( cFormTester.sFromNotValidMessage )
				if( hEvent.preventDefault )
				{
					hEvent.preventDefault()
				}
				hEvent.cancelBubble=true
				hEvent.returnValue=false
				return false
			}
		}
	}
	return true;
}

cFormTester.doCheck = function( hEvent )
{
	if( hEvent == null ) hEvent = window.event
	var hFE = ( hEvent.srcElement ) ? hEvent.srcElement : hEvent.originalTarget
	if( !cFormTester.checkField( hFE ) )
	{
		cFormTester.markField( hFE )
	}
	else
	{
		cFormTester.removeMark( hFE )
	}
}

cFormTester.doCheckObj = function( hFE )
{
	if( document.vhostform.homedir.nodeName != 'INPUT' ) return;
	if( !cFormTester.checkField( hFE ) )
	{
		cFormTester.markField( hFE )
	}
	else
	{
		cFormTester.removeMark( hFE )
	}
}

cFormTester.checkField = function( hField )
{
	var sFVexp
	if( hField.form && cFormTester.getRule(  hField.form.name, hField.name ) != null )
	{
		sFVexp = cFormTester.getRule(  hField.form.name, hField.name )
	}
	else
	{
		sFVexp = hField.getAttribute( 'movexp' ).toString()
	}
	if (hField.getAttribute('movcheckpass') == 'true') {
	    cFormTester.checkPass(hField);
	}
	var testval = hField.value.replace( '\\', '\\\\','g');
    //testval = testval.replace( '\$', '\$','g');
    //hField.value = hField.value.replace( '^', '');
	sFVexp = sFVexp.replace( 'gte', ' >= ' )
	sFVexp = sFVexp.replace( /[^n]gt/i, '>' )
	sFVexp = sFVexp.replace( 'lte', ' <= ' )
	sFVexp = sFVexp.replace( 'lt', ' < ' )
	sFVexp = sFVexp.replace( /\$\./, '"'+testval+'".' )
	sFVexp = sFVexp.replace( '#THISVAL', '"'+testval+'"', 'g' )
	sFVexp = sFVexp.replace( '#DIGITS', '/^[\-+]?[0-9]*$/.test( "' + testval + '" )' )
	sFVexp = sFVexp.replace( '#NUMBER', '/^[\-+]?[0-9\.]*$/.test( "' + testval + '" )' )
	sFVexp = sFVexp.replace( '#EMAIL', cFormTester.sEmailFormat+'.test( "' + testval + '" )' )
	sFVexp = sFVexp.replace( '#DATE', cFormTester.sDateFormat+'.test( "' + testval + '" )' )
	sFVexp = sFVexp.replace( '#LENGTH', testval.length )
	sFVexp = sFVexp.replace( /#EMPTY/g, '('+hField.value.length+'==0)' )
	if( eval( sFVexp ) )
	{
		return true
	}
	else
	{
		return false
	}
}

cFormTester.markField = function ( hField )
{
	var hMatt = hField.getAttribute( 'movm' )

	if( hMatt == null || hMatt == '' )
	{
		if( !cFormTester.onMarkField( hField ) )
		{
		    var movmsg = hField.getAttribute( 'movmsg' );
		    if (movmsg && movmsg.length > 0 && hField.getAttribute('movcheckpass') != 'true') {
		        hField.title = movmsg;
                cFormTester.setMsg(hField, movmsg);
		    }
			//hField.style.backgroundColor = '#f9acac'
			//hField.setAttribute('oldBgColor',hField.currentStyle.backgroundColor);
			//hField.style.color = '#ffffff'
			//hField.setAttribute('oldColor',hField.currentStyle.color);
			//hField.style.backgroundUrl = '';
			var clName = hField.getAttribute('mfmark');
			//alert(clName);
			hField.className = clName===null?'moformmark':clName;
		}
		hField.setAttribute( 'movm', 'true' )
	}
}

cFormTester.removeMark = function( hField )
{
	var hMatt = hField.getAttribute( 'movm' )
	if( hMatt != null && hMatt.length > 0  )
	{
		if( !cFormTester.onRemoveMarkField( hField ) )
		{
		    var movmsg = hField.getAttribute( 'movmsg' );
			//hField.style.backgroundColor = hField.getAttribute('oldBgColor');//'#ffffff'
			//hField.style.backgroundColor = '#ffffff'
			//hField.style.color = hField.getAttribute('oldColor');//'#000000'
			//hField.style.color = '#000000'
			var clName = hField.getAttribute('mfunmark');
			//alert(clName);
			hField.className = clName===null?'moformunmark':clName;
		  if (movmsg && movmsg.length > 0 && hField.getAttribute('movcheckpass') != 'true') {
			cFormTester.setMsg(hField,false);
			hField.title = ''
		  }
		}
		hField.removeAttribute( 'movm' )
	}
}

//if those callback funtions return false then the default behaviour is used
cFormTester.onMarkField = function( hField ) { return false }
cFormTester.onRemoveMarkField = function( hField ) { return false }

cFormTester.removeMarks = function()
{
	var nFL = document.forms.length
	for( var nI = 0; nI < nFL; nI++ )
	{
		hF = document.forms[ nI ]
		var hVAtt = hF.getAttribute( 'validator' )
		if( hVAtt != null )
		{
			var nEL = hF.elements.length
			for( var nJ = 0; nJ < nEL; nJ ++ )
			{
				var hField = hF.elements.item( nJ )
				var hEVExp = hField.getAttribute( 'movexp' )
				if( hEVExp )
				{
					cFormTester.removeMark( hField )
				}
			}
		}
	}
	delete hVAtt
	delete hEVatt
}

cFormTester.checkForms = function()
{
	var nFL = document.forms.length
	for( var nI = 0; nI < nFL; nI++ )
	{
		hF = document.forms[ nI ]
		var hVAtt = hF.getAttribute( 'validator' )
		var bVClass = hF.className.indexOf( 'validator' ) >=0
		if( hVAtt != null || bVClass )
		{
			var nEL = hF.elements.length
			for( var nJ = 0; nJ < nEL; nJ ++ )
			{
				var hField = hF.elements.item( nJ )
				var bEVExp = hField.getAttribute( 'movexp' ) != null
				if( bEVExp || cFormTester.getRule(  hF.name, hField.name ) != null )
				{
					if( !cFormTester.checkField( hField ) )
					{
						cFormTester.markField( hField )
					}

					if( hField.attachEvent )
					{
						hField.attachEvent( 'onchange', cFormTester.doCheck )
						hField.attachEvent( 'onkeyup', cFormTester.doCheck )
					}
					else if( hField.addEventListener )
					{
						hField.addEventListener( 'change', cFormTester.doCheck, false )
						hField.addEventListener( 'keyup', cFormTester.doCheck, false )
					}
				}
				delete hField
				delete hEVExp
			}

			if( hVAtt == 'force' )
			{
				if( hF.attachEvent )
				{
					hF.attachEvent( 'onsubmit', cFormTester.doCheckSubmit )
				}
				else if( hF.addEventListener )
				{
					hF.addEventListener( 'submit', cFormTester.doCheckSubmit, false )
				}
			}
		}

	}
	delete hVAtt
	delete hEVatt
}

cFormTester.checkPass = function(pwd)
{
    var oMsgs = {
        'nopass': { 'regex': '', 'text': '', 'color': '' },
        'weak': { 'regex': '', 'text': '', 'color': ''},
        'enough': { 'regex': '', 'text': '', 'color': ''},
        'medium': { 'regex': '', 'text': '', 'color': ''},
        'strong': { 'regex': '', 'text': '', 'color': ''}
    };
    defmsg = {
        'nopass': {
            'text': 'Type Password', 'color': 'red'
        },
        'weak': {
            'text': 'Weak', 'color': 'cyan'
        },
        'enough': {
            'regex': '(?=.{6,}).*',
            'text': 'Too short', 'color': 'red'
        },
        'medium': {
            'regex': "^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$",
            'text': 'Medium', 'color': 'orange'
        },
        'strong': {
            'regex': "^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$",
            'text': 'Strong', 'color': 'blue' }
    };
    for(msg in defmsg) {
        if(typeof(passwdMsgs[msg].text)=='undefined' || passwdMsgs[msg].text.length < 1) {
            oMsgs[msg].text = defmsg[msg].text;
        } else {
            oMsgs[msg].text = passwdMsgs[msg].text;
        }
        if(typeof(passwdMsgs[msg].regex)=='undefined' || passwdMsgs[msg].regex.length < 5) {
            oMsgs[msg].regex = defmsg[msg].regex;
        } else {
            oMsgs[msg].regex = passwdMsgs[msg].regex;
        }
        if(typeof(passwdMsgs[msg].regex)=='undefined' || passwdMsgs[msg].regex.length < 5) {
            oMsgs[msg].color = defmsg[msg].color;
        } else {
            oMsgs[msg].color = passwdMsgs[msg].color;
        }
    }
    //var strength = document.getElementById('strength');
    var strongRegex = new RegExp(oMsgs.strong.regex, "g");
    var mediumRegex = new RegExp(oMsgs.medium.regex, "g");
    var enoughRegex = new RegExp(oMsgs.enough.regex, "g");
    //var pwd = document.getElementById("password");
    if (pwd.value.length==0) {
        //strength.innerHTML = passwdMsgs.nopass;
        cFormTester.setMsg(pwd, oMsgs.nopass.text);
        return false;
    } else if (false == enoughRegex.test(pwd.value)) {
        //strength.innerHTML = '<span style="color:blue">'+passwdMsgs.short+'</span>';
        cFormTester.setMsg(pwd, oMsgs.enough.text, oMsgs.enough.color);
    } else if (strongRegex.test(pwd.value)) {
        //strength.innerHTML = '<span style="color:green">'+passwdMsgs.strong+'</span>';
        cFormTester.setMsg(pwd, oMsgs.strong.text, oMsgs.strong.color);
    } else if (mediumRegex.test(pwd.value)) {
        //strength.innerHTML = '<span style="color:orange">'+passwdMsgs.medium+'</span>';
        cFormTester.setMsg(pwd, oMsgs.medium.text, oMsgs.medium.color);
    } else {
        //strength.innerHTML = '<span style="color:red">'+passwdMsgs.weak+'</span>';
        cFormTester.setMsg(pwd, oMsgs.weak.text, oMsgs.weak.color);
    }
    return true;
}

cFormTester.setMsg = function(obj, msg)
{
    var omname = obj.name+'_pwinfo';
    var omsg = obj.nextSibling;
    if ((omsg == null || omsg.id != omname) && msg != false) {
        var spanEl = document.createElement('span');
        spanEl.setAttribute('class','movmsg');
        //spanEl.setAttribute('id',omname);
        spanEl.id = omname;
        if(omsg != null)
        var omsg = omsg.parentNode.insertBefore(spanEl, omsg);
        else
        var omsg = obj.parentNode.appendChild(spanEl);
    }
    if (omsg != null && omsg.id == omname && msg === false) {
        omsg.parentNode.removeChild(omsg);
    }
    if (omsg == null && msg === false) {
        alert('Error clearing error msg.');
    }
    if(arguments.length > 2) {
        omsg.style.color = arguments[2];
    }
    omsg.innerHTML = msg;
    return omsg;
}













if( window.attachEvent )
{
	window.attachEvent( 'onload', cFormTester.checkForms )
}
else if( window.addEventListener )
{
	window.addEventListener( 'load', cFormTester.checkForms, false )
}

