/*
Script: Element.Extension.js
        Contains useful Element prototypes, to be used with the ajax.

License:
        MIT-style license.
*/

/*compatibility*/

if (window.gecko && window.Node && window.XMLSerializer)
{
   Node.prototype.__defineGetter__('outerHTML', function()
   {
      return new XMLSerializer().serializeToString(this);
   });
}

if (window.gecko && window.Node)
{
   Node.prototype.__defineGetter__('innerText', function()
   {
      if (this.nodeType == 3) return this.nodeValue;
      else
	  {
         var result = '';
         for (var child = this.firstChild; child; child = child.nextSibling) result += child.innerText;
         return result;
      }
   });
}

/*end compatibility*/

Element.implement(
{
   setHTML: function()
   {
   	  this.innerHTML = Array.flatten(arguments).join('');
   },

   replaceElement: function()
   {
      var el = new Element('span');
      el.innerHTML = $A(arguments).join('');
      if ($type(el.childNodes[0]) == 'element') $(el.childNodes[0]).replaces(this);
      else el.replaces(this);
   },

   display: function(disp)
   {
      if (disp != undefined) this.style.display = disp;
   	  else
   	  {
   	     if (this.style.display == 'none') this.style.display = '';
   	     else this.style.display = 'none';
   	  }
   },

   checkAll: function(checked, pref)
   {
      var elements = $$(this.getElementsByTagName('input'));
      for (var i = 0; i < elements.length; i++)
      {
         if (elements[i].type == 'checkbox' && (!pref || elements[i].name.substr(0, pref.length) == pref))
         {
            elements[i].checked = checked;
         }
      }
   },

   getFormElements: function()
   {
   	  return this.getElements('input,select,textarea');
   },

   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;
                  }
               }
            }
         }
      }
      if (arguments.length > 1 && typeof(arguments[1]) == 'object')
	  {
	     for (i in arguments[1]) values[i] = arguments[1][i];
	  }
      return values;
   },

   megaFormStart: function(fadeid, isalert)
   {
      var fade = $(fadeid);
      var psize = window.getSize();
      if (typeof(hideBadElement) == 'function') hideBadElement();
      if (fade)
      {
         fade.style.position = 'absolute';
         fade.style.top = 0;
         fade.style.left = 0;
         fade.style.width = psize['x'] + 'px';
         fade.style.height = psize['y'] + 3000 + 'px';
         fade.style.display = '';
         this.style.zIndex = 100000;
         fade.style.zIndex = 10000;
         if (isalert == 'alert')
         {
           fade.style.opacity = 1;
         }
      }
      var size = this.getSize();
      var left = (psize['x'] - size['x']) / 2;
      var top = (psize['y'] - size['y']) / 2 + window.getScroll()['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;
           	case 'checkbox':
           	  els[i].checked = false;
           	  break;
         }
      }
      //if ($type(validators) == 'object') validators.clean();
   }
});