ajaxForm = {

  /**
    Internal id for identifing purps
  */
  id : 0,
  
  /**
    Errors?
  */
  errors : new Object(),
  
  /**
   Debugging?
  */
  debug : false,
  
  /**
    Custom messages array
  */
  messages : new Object(),
  
  /**
    Custom regexp
  */
  regexp : new Object(),

  /**
    Constructor, called on document.ready
  */
  init : function() {
  
    // attach all onBlur events
    $('#ajaxForm :input').blur(function() {
                            
      ajaxForm.onBlur(this);
    
    }); 
    
    // set form submit
    $('#ajaxForm').submit(function() {
    
      // check required fields
      ajaxForm.checkRequired();
      
      // errors?
      return !ajaxForm.hasErrors();
      
    });
  

    
  },
  
  /**
    On blur event for input fields
  */
  onBlur : function(object) {
  
    // do custom regexp
    for ( field in ajaxForm.regexp ) {
    
      if ( field != object.name ) 
        continue;
      
      // field value
      for ( id in ajaxForm.regexp[field] ) {
      
        if ( id != 'required' ) {
        
          if ( ! ajaxForm.regexp[field][id].test(object.value) ) {
          
            // set message
            ajaxForm.setErrorMessage(object, ajaxForm.messages[field][id], id );
            
            // set flag
            ajaxForm.setFlag(object,false);  
                  
          } else {
          
            // remove error msg
            ajaxForm.setErrorMessage(object,'', id);
            
            // set flag
            ajaxForm.setFlag(object,true);
         
          }
          
        }
      
      }
    
    }
    
  },
  
  hasErrors : function() {
  
    for ( field in ajaxForm.errors ) {
    
      for ( id in ajaxForm.errors[field] ) {
      
        if ( ajaxForm.errors[field][id] == true )    {
          
          return true;
      
        }
        
      }
    
    }
                 
    return false;
  
  },
  
  hasError : function(objectName) {
  
    for ( field in ajaxForm.errors[objectName] ) {
    
      if ( ajaxForm.errors[objectName][field] == true )    {
                
        return true;
    
      }
  
    }
    
    return false;
  
  },
  
  checkRequired : function() {
  
    // required field?
    $('#ajaxForm :input' ).each(function() {
    
      if ( $(this).attr('type') != 'select-one' && $(this).attr('type') != 'hidden' && $(this).attr('type') != 'checkbox' ) {
    
      object = this;
      
      if ( ajaxForm.isRequired(object) && object.value.length == 0 ) {
      
        try {

          // custom message set
          msg = ajaxForm.messages[object.name]['required'];
          if ( msg.length == '0' ) err;
        
        } catch ( e ) {
                    
          // no message set
          msg = 'Required field';
        
        }
      
        // set message
        ajaxForm.setErrorMessage(object, msg, 'required' );
        
        // set flag
        ajaxForm.setFlag(object,false);
        
      } else if ( ajaxForm.isRequired(object) && ! ajaxForm.hasError(object.name) ) {
      
        // remove error msg
        ajaxForm.setErrorMessage(object,'', 'required');
        
        // set flag
        ajaxForm.setFlag(object,true);
    
      }   
  
      }
      
    });
  },
  
  /**
    Set the flag ( cross / tick )
  */
  setFlag : function(object,flag) {
    
    try {
    
      // set visible
      $(object).parent('p').children('.image').show();

      if ( flag ) {

        $(object).parent('p').children('.image').attr('src', 'images/tick.png');
      
      } else {
      
        $(object).parent('p').children('.image').attr('src', 'images/cross.png');
      
      }
      
    } catch (e) {
    
    
    }
  
  },  
  
  /**
    Set error message for field object with message msg
  */
  setErrorMessage : function(object,msg, id) {
  
    // try to set message
    try {
    
      if ( typeof ( ajaxForm.errors[object.name] ) != Object )
        ajaxForm.errors[object.name] = new Object();

      if ( msg == '' ) {
      
        ajaxForm.errors[object.name][id] = false;
      
      } else {
        
        ajaxForm.errors[object.name][id] = true;
    
      }
      
      $(object).parent('p').children('.error').text(msg);
    
    } catch ( e ) {
    
      if ( ajaxForm.debug )
        alert ( e.message );
                            
    } 
  
  },
  
  /**
    Check if a field is required
  */
  isRequired : function(object) {
  
    // check if there is a span with class 'required' in the parent P tag
    if ( $(object).parent().find(".required").length != 0 )
      return true;
  
  },
  
  /**
    Set a custom regexp for a field
  */
  setRegexp : function(field,regexp,msg) {
  
    // id
    ajaxForm.id = ajaxForm.id + 1;
    id = ajaxForm.id;
        
    // set regexp
    if ( typeof ( ajaxForm.regexp[field] ) != Object )
      ajaxForm.regexp[field] = new Object();

    ajaxForm.regexp[field][id] = regexp;
    
    // set msg
    if ( typeof ( ajaxForm.messages[field] ) != Object )
      ajaxForm.messages[field] = new Object();
  
    ajaxForm.messages[field][id] = msg;

  }
  
};