/**
 *  @version $Id: formLib.js 305 2008-08-29 23:03:53Z peter $
 *  @package Attend Events
 *  @subpackage formLib
 *  @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
 */

if ( formLib )
{
    alert( 'formLib Error: formLib already loaded!' );
    throw( 'formLib already loaded' );
}
if ( !Prototype )
{
    alert( 'formLib Error: Prototype not loaded!' );
    throw( 'Prototype not loaded! ');
}

var formLib = {
    language: 'english',
    nullValues: {},
    
    _requiredFields: new Array(),
    
    blurTextGUI: function() {
            
        var guiNode = this;
        if ( !guiNode || !guiNode.id ) return;
             
        var nodeName = guiNode.id.substring( 0, guiNode.id.length - 4 );
        var valueNode = $( nodeName );
        if ( !valueNode ) return;
        
        if ( ( guiNode.value == formLib.nullValues[nodeName] ) || ( guiNode.value.length == 0 ) ) {
            guiNode.value = formLib.nullValues[nodeName];
            formLib.showingNULLValue( guiNode );
        } else {
            valueNode.value = guiNode.value;
            formLib.showingRealValue( guiNode );
        }
    },
    
    focusTextGUI: function() {
    
        var guiNode = this;
        if ( !guiNode || !guiNode.id ) return;

        var nodeName = guiNode.id.substring( 0, guiNode.id.length - 4 );
        var valueNode = $( nodeName );
        if ( !valueNode ) return;
        
        if ( guiNode.value == formLib.nullValues[nodeName] ) {
            guiNode.value = '';
        }
        formLib.showingRealValue( guiNode );
    },
    
    showingRealValue: function( node ) {
        node.style.color = '#000000';
    },
    
    showingNULLValue: function( node ) {
        node.style.color = '#A0A0A0';
    },
    
    
    
    registerRequiredField: function( requiredFieldId )
    {
        // ensure the field exists
        if ( !$( requiredFieldId ) ) return false;
        
        // ensure it is not registered already
        if ( formLib._requiredFields.indexOf( requiredFieldId ) != -1 ) return false;
        
        // add it
        formLib._requiredFields.push( requiredFieldId );
        
        return true;
    },
    
    unregisterRequiredField: function( requiredFieldId )
    {
        if ( !$( requiredFieldId ) ) return false;
        
        if ( formLib._requiredFields.indexOf( requiredFieldId ) == -1 ) return false;
        
        alert( 'unregisterRequiredField unimplemented!' );
    },
    


    _labelForRequiredField: function( fieldNode )
    {
        var errorResponse = 'Unknown Field';
    
        // Parameter Checking
        if ( !fieldNode || !( ( fieldNode.nodeName.toLowerCase() == 'input' ) ||
                              ( fieldNode.nodeName.toLowerCase() == 'textarea' ) ) )
        {
            alert('[labelForRequiredField] Error:  fieldNode is undefined or non INPUT/TEXTAREA type element!');
            return errorResponse;
        }
                    
        // Traverse up the DOM tree to the TD cell containing the field
        var found = false;
        var tableCellContainingField = fieldNode;
        while ( !found && tableCellContainingField.parentNode ) {
            tableCellContainingField = tableCellContainingField.parentNode;
            found = ( tableCellContainingField.nodeName.toLowerCase() == 'td' );
        }
        if ( !found ) {
            alert('[labelForRequiredField] Error: Failed to find TD element enclosing INPUT!');
            return errorResponse;
        }
        
        // get the TD node containing the label
        var tableCellContainingLabel = tableCellContainingField;
        found = false;
        while ( !found && tableCellContainingLabel ) {
            tableCellContainingLabel = tableCellContainingLabel.previousSibling;
            found = ( tableCellContainingLabel.nodeName.toLowerCase() == 'td' );
        }
        if ( !found ) {   
            alert('[labelForRequiredField] Error: Failed to find TD element enclosing label SPAN!');
            return errorResponse;
        }
        
        // Label text should be contained within a 'span' element
        found = false;
        var labelSpan = tableCellContainingLabel.firstChild;
        while ( !found && labelSpan ) {
            if ( labelSpan.nodeName.toLowerCase() == 'span' ) {
                found = true;
            } else {
                labelSpan = labelSpan.nextSibling;
            }
        }
        if ( !found ) {
            alert('[labelForRequiredField] Error: Failed to find enclosing SPAN element!');
            return errorResponse;
        }
        
        // Get the label text
        var labelText = labelSpan.innerHTML;
        
        // Remove the trailing colon (if there is one)
        if ( labelText.substring( labelText.length - 1, labelText.length ) == ':' ) labelText = labelText.substring( 0, labelText.length - 1 );
        
        return labelText;
    },



    ensureAllRegexFiltersWereSatisfied: function()
    {
         // @todo Hash object which contains the fields we need to check, and the regex to use
        var emailInputNode = $( 'email_registrant{0}' );
        if ( !emailInputNode || !emailInputNode.value || !$( 'email_registrant{0}_gui') ) return '';
        
        var emailRegex = /^.+@.+\..{2,4}$/;
        var illegalCharsRegex = /[\(\)\<\>\,\;\:\\\"\[\]]/;
        if ( !( emailRegex.test( emailInputNode.value ) ) || emailInputNode.value.match( illegalCharsRegex ) ) return 'Email address <?php echo _AE_JSERROR_INVALID_REGEX; ?>\n';
        
        return '';
    },

    
    
    _ensureAllRequiredFieldsWereAnswered: function()
    {
        var response = '';
    
        for ( var i=0; i < formLib._requiredFields.length; i++ )
        {
            var fieldNode = $(formLib._requiredFields[i]);	
        
            switch ( fieldNode.type || fieldNode.nodeName.toLowerCase() )
            {
                case 'text':
                case 'textarea':                       
                    if (fieldNode.value.length == 0) {
                        response += formLib._labelForRequiredField( fieldNode ) + formLib.translations.textFor( 'MISSING_REQUIRED_FIELD' ) + '\n';
                    }
                    break;
                                            
                case 'checkbox':
                    if (!fieldNode.checked) {
                        response += formLib._labelForRequiredField( fieldNode ) + formLib.translations.textFor( 'MISSING_REQUIRED_FIELD' ) + '\n';
                    }
                    break;				
                
                case 'hidden':
                    // is there a gui front-end?
                    if ( $( fieldNode.id + '_gui' ) && ( fieldNode.value.length == 0 ) ) {
                        response += formLib._labelForRequiredField( fieldNode ) + formLib.translations.textFor( 'MISSING_REQUIRED_FIELD' ) + '\n';
                    }
                    break;
                
                default:
                    alert('[ensureAllRequiredFieldsWereAnswered] Unknown field type');
                    break;
            
            }	
        }
        return response;    
    },
    
    translations: {    
    	textFor: function (langConstant)
    	{
			try {
				if (formLib.translations[formLib.language][langConstant]) {
					return formLib.translations[formLib.language][langConstant];
				} else {
					if (formLib.translations[formLib.language][langConstant] == '') {
						return '';
					} else {
						throw('');
					}
				}
			} catch (errorObj) {
				return langConstant;
			}
		}
    }
};
