//
//  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!"
}

cFormTester.id = 0

cFormTester.getNewId = function(){
	return this.name+( cFormTester.id++ )
}

cFormTester.doCheckSubmit = function( hEvent ){
	if( hEvent == null ) hEvent = window.event
	var hF = ( hEvent.srcElement ) ? hEvent.srcElement : hEvent.originalTarget

	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.returnValue=true
				return false
			}
		}
	}
}

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.checkField = function( hField ){
	var hFVexp = hField.getAttribute( 'movexp' )
	var sFVexp = hFVexp.toString()
	sFVexp = sFVexp.replace( /\$/, "'"+hField.value+"' " )
	sFVexp = sFVexp.replace( 'gte', ' >= ' )
	sFVexp = sFVexp.replace( /[^n]gt/i, '>' )
	sFVexp = sFVexp.replace( 'lte', ' <= ' )
	sFVexp = sFVexp.replace( 'lt', ' < ' )
	sFVexp = sFVexp.replace( '#DIGITS', '/^[\-+]?[0-9]*$/.test( "' + hField.value + '" )' )
	sFVexp = sFVexp.replace( '#NUMBER', '/^[\-+]?[0-9\.]*$/.test( "' + hField.value + '" )' )
	sFVexp = sFVexp.replace( '#EMAIL', cFormTester.sEmailFormat+'.test( "' + hField.value + '" )' )
	sFVexp = sFVexp.replace( '#DATE', cFormTester.sDateFormat+'.test( "' + hField.value + '" )' )
	sFVexp = sFVexp.replace( '#LENGTH', hField.value.length )
	sFVexp = sFVexp.replace( '#EMPTY', '('+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 ) ){
			hField.title = hField.getAttribute( 'movmsg' )
			hField.style.backgroundColor = '#f9acac'
			hField.style.color = '#ffffff'
		}
		hField.setAttribute( 'movm', 'true' )
	}
}

cFormTester.removeMark = function( hField ){
	var hMatt = hField.getAttribute( 'movm' )
	if( hMatt != null && hMatt.length > 0  ){
		if( !cFormTester.onRemoveMarkField( hField ) ){
			hField.title = ''
			hField.style.backgroundColor = '#ffffff'
			hField.style.color = '#000000'
		}
		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' )
		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 ){
					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
}

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