/*
Script: Element.Form.js
        Contains Element prototypes to deal with Forms and their elements.

License:
        MIT-style license.
*/

/*
Class: Element
        Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
*/

Element.extend({

        /*
        Property: getValue
                Returns the value of the Element, if its tag is textarea, select or input. getValue called on a multiple select will return an array.
        */

        getValue: function(){
                switch(this.getTag()){
                        case 'select':
                                var values = [];
                                $each(this.options, function(option){
                                        if (option.selected) values.push($pick(option.value, option.text));
                                });
                                return (this.multiple) ? values : values[0];
                        case 'input': if (!(this.checked && ['checkbox', 'radio'].contains(this.type)) && !['hidden', 'text', 'password'].contains(this.type)) break;
                        case 'textarea': return this.value;
                }
                return false;
        },

        getFormElements: function(){
                return $$(this.getElementsByTagName('input'), this.getElementsByTagName('select'), this.getElementsByTagName('textarea'));
        },

        checkAll: function(checked)
        {
           var elements = $$(this.getElementsByTagName('input'));
           for (var i = 0; i < elements.length; i++)
           {
              if (elements[i].type == 'checkbox') elements[i].checked = checked;
           }        },

        getFormValues: function(pref)
        {
           var values = new Array();
           var elements = this.getFormElements();
           for (var i = 0; i < elements.length; i++)
           {
              if (elements[i].type && (elements[i].type == 'radio' || elements[i].type == 'checkbox') && elements[i].checked == false) continue;
              var name = elements[i].name || elements[i].id;
              if (pref)
              {
                 var k = name.indexOf(pref);
                 if (k != -1) name = name.substr(0, k);
              }
              if (name)
              {
                 if (elements[i].type == 'select-multiple')
                 {
                    for (var j = 0; j < elements[i].length; j++)
                    {
                       if (elements[i].options[j].selected == true)
                         if (name.substr(name.length - 2) == '[]')
                         {
                  	        name = name.substr(0, name.length - 2);
                  	        if (typeof(values[name]) == 'undefined') values[name] = new Array();
                  	        values[name][values[name].length] = elements[i].options[j].value;
                         }
                         else values[name][j] = elements[i].options[j].value;
                    }
                 }
                 else
                 {
                    if (name.substr(name.length - 2) == '[]')
                    {
                  	   name = name.substr(0, name.length - 2);
                  	   if (typeof(values[name]) == 'undefined') values[name] = new Array();
                  	   values[name][values[name].length] = elements[i].value;
                    }
                    else
                    {
                       if (elements[i].type == 'textarea' && typeof(tinyMCE) != 'undefined' && tinyMCE.get(elements[i].id))
                         values[name] = tinyMCE.get(elements[i].id).getContent();
                       else
                       {
                          var k = name.indexOf('_');
                          var subname = ''; if (k != -1) subname = name.substr(k + 1);
                          if (subname == 'countryid' || subname == 'stateid' || subname == 'cityid' || subname == 'year' || subname == 'month' || subname == 'day' || subname == 'date')
                          {
                             name = name.substr(0, k);
                             if (typeof(values[name]) == 'undefined') values[name] = new Array();
                             values[name][subname] = elements[i].value;
                          }
                          else values[name] = elements[i].value;
                       }
                    }
                 }
              }
           }
           return values;
        },


        /*
        Property: toQueryString
                Reads the children inputs of the Element and generates a query string, based on their values. Used internally in <Ajax>

        Example:
                (start code)
                <form id="myForm" action="submit.php">
                <input name="email" value="bob@bob.com">
                <input name="zipCode" value="90210">
                </form>

                <script>
                 $('myForm').toQueryString()
                </script>
                (end)

                Returns:
                        email=bob@bob.com&zipCode=90210
        */

        toQueryString: function(){
                var queryString = [];
                this.getFormElements().each(function(el){
                        var name = el.name;
                        var value = el.getValue();
                        if (value === false || !name || el.disabled) return;
                        var qs = function(val){
                                queryString.push(name + '=' + encodeURIComponent(val));
                        };
                        if ($type(value) == 'array') value.each(qs);
                        else qs(value);
                });
                return queryString.join('&');
        },

        megaFormStart: function(fadeid)
        {           var fade = $(fadeid);
           var size = window.getPageSize();
           if (typeof(hideBadElement) == 'function') hideBadElement();
           if (fade)
           {
              fade.style.position = 'absolute';
              fade.style.top = 0;
              fade.style.left = 0;
              fade.style.width = size[0] + 'px';
              fade.style.height = size[1] + 'px';
              fade.style.display = '';
           }
           var size = this.getSize()['size'];
           var psize = window.getSize()['size'];
           var left = (psize['x'] - size['x']) / 2;
           var top = (psize['y'] - size['y']) / 2 + window.getSize()['scroll']['y'];
           if (left < 0) left = 0;
           if (top < 0) top = 0;
           this.style.position = 'absolute';
           this.style.top = top + 'px';
           this.style.left = left + 'px';        },

        megaFormFinish: function(fadeid)
        {           var fade = $(fadeid);
           if (fade) fade.style.display = 'none';
           this.style.top = -1000000 + 'px';
           if (typeof(showBadElement) == 'function') showBadElement();        },

        cleanFormValues: function()
        {           var els = this.getFormElements();
           for (var i=0; i < els.length; i++)
           {           	  switch (els[i].type)
           	  {           	     case 'text':
           	     case 'hidden':
           	       els[i].value = '';
           	       break;
           	     case 'select-one':
           	       els[i].value = 0;
           	       break;
           	     case 'textarea':
           	       if (typeof(tinyMCE) != 'undefined' && tinyMCE.get(els[i].id)) tinyMCE.get(els[i].id).setContent('');
           	       else els[i].value = '';
           	       break;           	  }           }        }
});
