//===============================================================
// Имя класса для обязательных незаполненных элементов
var FEM_RequiredClassName = 'FERequired'
var FEM_AcceptedClassName = 'FEAccepted'
// Текст сообщения о незаполненности полей
var FEM_AlertMessage = 'Ошибка!\nВы не заполнили обязательное поле.'

if ( document.getElementById ) SetupEventHandler(window, 'load', FEM_Initialize )

//===============================================================
// Обработчик onsubmit для form[(input|select)/@algfe:required='true']
function FEM_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('fem:required') == 'true' && !FEM_CheckValuePresence(oForm.elements[i]) )
		{
			oForm.elements[i].focus()
			alert( FEM_AlertMessage )
			if ( oEvent.preventDefault ) oEvent.preventDefault(); return false;
		}
}


// Обработчик onchange, onkeyup, onkeydown для form/(input|select)[@algfe:required='true']
function FEM_InputEventHandler( oEvent )
{
	var oElement = window.event ? window.event.srcElement : oEvent.currentTarget
		if(FEM_CheckValuePresence(oElement)){
			FEM_RemoveCssClass(oElement, FEM_RequiredClassName);
			FEM_ApplyCssClass(oElement, FEM_AcceptedClassName);
		}else{
			FEM_RemoveCssClass(oElement, FEM_AcceptedClassName);
			FEM_ApplyCssClass(oElement, FEM_RequiredClassName);
		}
	//FEM_CheckValuePresence(oElement) ? FEM_ApplyCssClass(oElement, FEM_AcceptedClassName) : FEM_ApplyCssClass(oElement, FEM_RequiredClassName)
}


// Инициализация
function FEM_Initialize()
{
	var oForm

	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('fem:required') == 'true' )
			{
				if ( oForm != document.forms[i] )
				{
					oForm = document.forms[i]
					SetupEventHandler(document.forms[i], 'submit', FEM_FormEventHandler)
				}
				SetupEventHandler(document.forms[i].elements[j], 'change', FEM_InputEventHandler)
				SetupEventHandler(document.forms[i].elements[j], 'keyup', FEM_InputEventHandler)
				SetupEventHandler(document.forms[i].elements[j], 'keydown', FEM_InputEventHandler)
				if(FEM_CheckValuePresence(document.forms[i].elements[j])){
					FEM_ApplyCssClass(document.forms[i].elements[j], FEM_AcceptedClassName);
				}else{
					FEM_ApplyCssClass(document.forms[i].elements[j], FEM_RequiredClassName);
				}
			}
}


// Проверка заполненности обязательного элемента
function FEM_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) ||
		( oElement && oElement.type && oElement.type == 'text'            && oElement.value.length<3)
	)
}

//===============================================================
// Приделать к элементу обработчик события
// 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 FEM_ApplyCssClass( oElement, sClassName )
{
	if ( oElement ) oElement.className += ' ' + sClassName
}

// Удалить CSS-класс у элемента
function FEM_RemoveCssClass( oElement, sClassName )
{
	if ( oElement ) oElement.className = oElement.className.replace( new RegExp(sClassName, 'g'), '' )
}

