
    var Form    =    new Class({
                         Implements:     Options,
                         reference:      null,
                         name:           null,
                         errors:         [],
                         enabled:        true,
                         secured:        false,
                         options:        {
                                             ajax:          false,
                                             secure:        {
                                                                ajax:         {
                                                                                  // when a form is secured for an ajax call
                                                                                  onSuccess:    function(form) {
                                                                                                    form.enable();
                                                                                                    form.reference.getElements('button.cm-b-submit').removeClass('cm-b-disabled');
                                                                                                    form.reference.getElements('button.cm-b-submit').removeClass('cm-b-processing');
                                                                                                }
                                                                              }
                                                            },
                                             validation:    {
                                                                onStart:      function() {},
                                                                onSuccess:    function() {},
                                                                onError:      function() {},
                                                                // when validation fails
                                                                onFail:       function(form) {
                                                                                  form.enable();
                                                                                  form.reference.getElements('button.cm-b-submit').removeClass('cm-b-disabled');
                                                                                  form.reference.getElements('button.cm-b-submit').removeClass('cm-b-processing');
                                                                              }
                                                            }
                                         },
                         schema:         null,
                         initialize:     function(reference,name,options) {
                                             this.reference    =    reference;
                                             this.reference.store('model',this);
                                             this.name         =    name;
                                             this.setOptions(options);
                                             this.setup();
                                         },
                         setup:          function() {
                                             // override form submit event
                                             this.reference.addEvent(
                                                 'submit',
                                                 function(event) {
                                                     event.stop();
                                                     this.retrieve('model').submit();
                                                 }
                                             );

                                             // textareas
                                             this.reference.getElements('textarea').each(function(textarea){
                                                 new Textarea(textarea);
                                             });

                                             // date pickers
                                             this.reference.getElements('.picker').each(function(picker) {
                                                 new DatePicker(picker).show();
                                             });

                                             // placeholders
                                             this.reference.getElements('.placeholder').each(function(field) {
                                                 field.store('placeholder',field.value);
                                             });

                                             // text 'enter' key submission
                                             this.reference.getElements('input[type=text]').addEvent(
                                                 'keydown',
                                                 function(event){
                                                     if(event.key==='enter')
                                                         this.form.fireEvent('submit',event);
                                                 }
                                             );

                                             // submitters
                                             this.reference.getElements('.submit').store('model',this).addEvent(
                                                 'click',
                                                 function(event) {
                                                     this.retrieve('model').reference.fireEvent('submit',event);
                                                 }
                                             );

                                             // input/textarea focus handling
                                             $$('input[type=text],input[type=password],textarea').addEvents({
                                                 'focus':    function(event){
                                                                 if(this.hasClass('placeholder') && $type(this.retrieve('placeholder'))) {
                                                                     this.set('value','');
                                                                     this.removeClass('placeholder');
                                                                 }
                                                             },
                                                 'blur':     function(event){
                                                                 if($type(this.retrieve('placeholder')) && this.get('value').empty()) {
                                                                     this.addClass('placeholder');
                                                                     this.set('value',this.retrieve('placeholder'));
                                                                 }
                                                             }
                                             });
                                         },
                         submit:         function() {
                                             if(this.disabled()===true)
                                                 return false;
                                             this.disable();
                                             if(this.validate()) {
                                                 // get elements that can have a placeholder class on them
                                                 var elements    =    this.reference.getElements('textarea,input');
                                                 for(var x=0,length=elements.length;x<length;x++) {
                                                     if(elements[x].hasClass('cm-placeholder')) {
                                                         // remove the value since it's obviously not required (since the form is about to be secured, and has been validated)
                                                         elements[x].value    =    '';
                                                     }
                                                 }
                                                 this.secure();
                                             }
                                             return this;
                                         },
                         disabled:       function() {
                                             return this.enabled===false;
                                         },
                         disable:        function() {
                                             return this.enabled = false;
                                         },
                         enable:         function() {
                                             return this.enabled = true;
                                         },
                         getParams:      function() {
                                             var elements = this.reference.getElements('textarea,input,select'),
                                                 x = 0,
                                                 length = elements.length,
                                                 element,
                                                 hash = {};
                                             for(x=0;x<length;x++) {
                                                 element = elements[x];
                                                 if(elements.get('type')==='checkbox' && element.get('checked')===false)
                                                     continue;
                                                 if($type(element.hasClass('placeholder')))
                                                     hash[element.name]    =    '';
                                                 else
                                                     hash[element.name]    =    elements[x].value
                                             }
                                             return new Hash(hash);
                                         },
                         validate:       function() {
                                             this.options.validation.onStart.bind(this)();
                                             return Forms.validate(this);
                                         },
                         secure:         function() {
                                             return Forms.secure(this);
                                         }
                         
                     });