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;
      }
   });
}

Element.implement(
{
   replaceHTML: 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,checkbox,radio');
   },

   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;
   },

   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);
   },

   joinUpload: function(upload)
   {
      upload = $(upload);
      this.getParent().onmousemove = function(e)
      {
         e = e || event;
         var coor = this.getCoordinates();
         var scroll = $(document.body).getScroll();
         upload.style.left = e.clientX + scroll.x - 50 + 'px';
         //upload.style.width = '1000px';
         upload.style.width = 'auto';
         if (e.clientX < coor.left - scroll.x || e.clientX > coor.right - scroll.x || e.clientY < coor.top - scroll.y || e.clientY > coor.bottom - scroll.y) upload.style.top = '-5000px';
         else upload.style.top = e.clientY + scroll.y - 10 + 'px';
      }.bind(this);
   },

   joinUpload2: function(upload)
   {
      upload = $(upload);
      this.getParent().onmousemove = function(e)
      {
        e = e || event;
        // TO DO: add tracking code for mouse
      }.bind(this);
   },

   joinBlock: function(el, display, x, y)
   {
      var el = $(el); if (!el) return;
      var scrollsize = {'x': (window.getScroll()['x'] == 0) ? window.getSize()['x'] : window.getScrollSize()['x'], 'y': (window.getScroll()['y'] == 0) ? window.getSize()['y'] : window.getScrollSize()['y']};
      if (display) el.display(display);
      else if (el.style.display != 'none') {el.display('none'); return;}
      else el.display();
      el.style.position = 'absolute';
      var coor = this.getCoordinates();
      var size = el.getSize();
      var y = coor.top - 1  + ((y) ? y : 0);
      var x = coor.left + 26 + ((x) ? x : 0);
      if (x > scrollsize['x'] - size['x']) x = scrollsize['x'] - size['x'];
      if (x < 0) x = 0;
      if (y > scrollsize['y'] - size['y']) y = scrollsize['y'] - size['y'];
      if (y < 0) y = 0;
      el.style.top = y + 'px';
      el.style.left = x + 'px';
   },

   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';
   },

   fade: function(flag, opacity)
   {
      if (!flag) this.display('none');
      else
      {
         if (!opacity) opacity = 0.5;
         this.style.position = 'absolute';
         this.style.top = 0;
         this.style.left = 0;
         this.style.width = window.getScrollSize()['x'] + 'px';
         this.style.height = window.getScrollSize()['y'] + 'px';
         this.setOpacity(opacity);
         this.display('');
      }
   },

   megaFormStart: function(fade, opacity)
   {
      if (typeof(hideBadElement) == 'function') hideBadElement();
      if ($(fade)) $(fade).fade(true, opacity);
      this.style.position = 'absolute';
      this.centre();
   },

   megaFormFinish: function(fadeid)
   {
      if ($(fadeid)) $(fadeid).fade(false);
      this.style.top = -1000000 + 'px';
      if (typeof(showBadElement) == 'function') showBadElement();
   }
});
