/*
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)
   {
      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'] + 'px';
         fade.style.display = '';
         fade.style.zIndex = this.style.zIndex - 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();
   },
   
   centre: function()
   {
      var wsize = window.getSize();
      var size = this.getSize();
      var dx = wsize['x'] - size['x'];
      var dy = wsize['y'] - size['y'];
      if (dx < 0) dx = 0;
      if (dy < 0) dy = 0;
      var left = dx / 2 + window.getScroll()['x'];
      var top = dy / 2 + window.getScroll()['y'];
      this.style.top = top + 'px';
      this.style.left = left + 'px';
   },

   cleanFormValues: function(pref, group)
   {
      var els = this.getFormElements(pref);
      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 = '';
             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 (typeof(validators) != 'undefined') validators.clean(group);
   }
});
