//===============================================================
//      
var AlgFE_RequiredClassName = 'AlgFERequired'
//     
var AlgFE_AlertMessage = '!\n    ().'

if ( document.getElementById ) SetupEventHandler(window, 'load', AlgFE_Initialize )

//===============================================================
//  onsubmit  form[(input|select)/@algfe:required='true']
function AlgFE_FormEventHandler( oEvent )
{
	var oEvent = window.event ? window.event : oEvent
	var oForm = window.event ? window.event.srcElement : oEvent.currentTarget

	for ( var i=0; i<oForm.elements.length; i++ )
		if ( oForm.elements[i].getAttribute('algfe:required') == 'true' && !AlgFE_CheckValuePresence(oForm.elements[i]) )
		{
			oForm.elements[i].focus()
			alert( AlgFE_AlertMessage )
			if ( oEvent.preventDefault ) oEvent.preventDefault(); return false;
		}
}


//  onchange, onkeyup, onkeydown  form/(input|select)[@algfe:required='true']
function AlgFE_InputEventHandler( oEvent )
{
	var oElement = window.event ? window.event.srcElement : oEvent.currentTarget
	AlgFE_CheckValuePresence(oElement) ? AlgFE_RemoveCssClass(oElement, AlgFE_RequiredClassName) : AlgFE_ApplyCssClass(oElement, AlgFE_RequiredClassName)
}


// 
function AlgFE_Initialize()
{
	var oForm

	//    onsubmit  form[child::./@algfe:required='true']
	for ( var i=0; i<document.forms.length; i++ )
		for ( var j=0; j<document.forms[i].elements.length; j++ )
			if ( document.forms[i].elements[j].getAttribute('algfe:required') == 'true' )
			{
				if ( oForm != document.forms[i] )
				{
					//    ,            
					oForm = document.forms[i]
					SetupEventHandler(document.forms[i], 'submit', AlgFE_FormEventHandler)
				}
				SetupEventHandler(document.forms[i].elements[j], 'change', AlgFE_InputEventHandler)
				SetupEventHandler(document.forms[i].elements[j], 'keyup', AlgFE_InputEventHandler)
				SetupEventHandler(document.forms[i].elements[j], 'keydown', AlgFE_InputEventHandler)
				AlgFE_CheckValuePresence(document.forms[i].elements[j]) ? AlgFE_RemoveCssClass(document.forms[i].elements[j], AlgFE_RequiredClassName) : AlgFE_ApplyCssClass(document.forms[i].elements[j], AlgFE_RequiredClassName)
			}
}


//    
function AlgFE_CheckValuePresence( oElement )
{
	return !
	(
		( oElement && oElement.type && oElement.type == 'select-one'      && !oElement.selectedIndex ) ||
		( oElement && oElement.type && oElement.type == 'select-multiple' && !oElement.selectedIndex ) ||
		( oElement && oElement.type && oElement.type == 'text'            && !oElement.value )
	)
}

//===============================================================
//     
// sEventType --  , ..  onclick,  click
function SetupEventHandler( oElement, sEventType, pHandler )
{
	if ( oElement.attachEvent ) oElement.attachEvent('on'+sEventType, pHandler)
	if ( oElement.addEventListener ) oElement.addEventListener(sEventType, pHandler, false)
}

//  CSS-  
function AlgFE_ApplyCssClass( oElement, sClassName )
{
	if ( oElement ) oElement.className += ' ' + sClassName
}

//  CSS-  
function AlgFE_RemoveCssClass( oElement, sClassName )
{
	if ( oElement ) oElement.className = oElement.className.replace( new RegExp(sClassName, 'g'), '' )
}

