var CMSForms  = function () 
{     
    // protected properties     
     var event_handlers = new Array();
     var response_data = new Array();
        

    // public methods     

     this.add_submit_event = function (form_id, callback_function, type) {
        if (!event_handlers[form_id]) event_handlers[form_id] = new Array();
        event_handlers[form_id][type] = callback_function;
     }
     
     this.run_submit_event = function (form_id, type) {     
       var event_handler = this.get_event_handler(form_id, type);
       return eval(event_handler);
     }
    
     this.clear_submit_event = function (form_id, type) {
       if (!event_handlers[form_id][type]) return false;
       event_handlers[form_id][type] = false; 
       return false;       
     }

     this.get_event_handler = function(form_id, type) {
        if (!event_handlers[form_id] || !event_handlers[form_id][type]) return false;
        return event_handlers[form_id][type];
     }

     this.set_response_data  = function (form_id, response) {
       response_data[form_id] = response;
     }


     this.get_response_data  = function (form_id) {
        return response_data[form_id];
     }
     
     this.formOnSubmit = function(form_id)
     {
        var form = $(form_id);
        var progress = $('form_progress_'+form_id);
        var form_msg = $('form_msg_'+form_id);        
        // 0. hide message block
        if (form_msg) form_msg.style.display = 'none';     
        // 1. run pre_submit functions 
        this.run_submit_event(form_id, 'pre');
        // 2. change onSubmit function to empty value '', save previous & disable Submit
        var onsubmit = form.onsubmit;
        form.onsubmit = '';
        if ($('submit_'+form_id)) $('submit_'+form_id).disabled = true;     
        // 3. show progress bar
        if (progress) progress.style.display = 'block';
        // 4. prepare data to send
        var post_data = new Array();
        for (var i=0; i<form.length; i++) {
          if (form.elements[i].name) {
             if (form.elements[i].type=='checkbox') {
                post_data[form.elements[i].name] = (form.elements[i].checked)?form.elements[i].value:false;
             }
             else
                post_data[form.elements[i].name] = form.elements[i].value;
          }  
        }      

       // ------------------------        
        var req = new XML_JSHttpRequest();
        // Code to call after request
        req.onreadystatechange=function() 
        {            
          response = false;                    
          if(req.readyState==4 && req.status==200)
          {                            
              response=parse_data(req);
             // 6. hide progress bar            
             if (progress) progress.style.display = 'none';
             // 7. if (status = ok) form_reset()             
             if (response.status_form == 'OK') form.reset();                                                                               
             // 8. restore onsubmit event            
             form.onsubmit = onsubmit;
             if ($('submit_'+form_id)) $('submit_'+form_id).disabled = false;                    
             // 9. Show status message
             if (form_msg) {
                 form_msg.innerHTML = response.responseText;
                 form_msg.style.display = 'block';
             }
             CMSForms.set_response_data(form_id,response); 
             // 10. run post_submit functions
             CMSForms.run_submit_event(form_id, 'post');        
          }
          return false;
        }
        // ------------------------        
        // 5. send data
        send_data(req, form._form_dispatcher.value, post_data);        
        return false; 
     }
}

var CMSForms = new CMSForms();

