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);
   },

   injectHTML: function(html, where)
   {
      var el = new Element('span');
      el.innerHTML = $A(arguments).join('');
      if ($type(el.childNodes[0]) == 'element') eval('$(el.childNodes[0]).inject' + where + '(this)');
      else eval('el.inject' + where + '(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++)
      {
         var id = elements[i].id, name = elements[i].name, key, value;      
         if (name.substr(name.length - 2) == '[]') key = name.substr(0, name.length - 2);
         else key = id;
         if (pref)
         {
            var k = key.indexOf(pref);
            if (k != -1) key = key.substr(0, k);
         }  
         switch (elements[i].type)
         {
            default:
              value = elements[i].value;
              break;
            case 'textarea':
              if (typeof(CKEDITOR) != 'undefined' && CKEDITOR.instances[elements[i].id]) value = CKEDITOR.instances[elements[i].id].getData();
              else value = elements[i].value;
              break;
            case 'radio':
            case 'checkbox':
              value = new Array();
              value['state'] = (elements[i].checked) ? 1 : 0;
              value['value'] = elements[i].value;
              break;
            case 'select-multiple':
              value = new Array();
              for (var j = 0; j < elements[i].length; j++)
              {
                  if (elements[i].options[j].selected == true) value[j] = elements[i].options[j].value;
              }
              break;
         }
         if (name.substr(name.length - 2) == '[]')
         {
            if (typeof(values[key]) == 'undefined') values[key] = new Array();
            values[key][values[key].length] = value;
         }
         else values[key] = 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':
            case 'select-multiple':
              els[i].value = '';
              break;
            case 'textarea':
              if (typeof(CKEDITOR) != 'undefined' && CKEDITOR.instances[elements[i].id]) CKEDITOR.instances[els[i].id].setData('');
              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';
         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);
   },

   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.getScroll()['x'] == 0) ? window.getSize()['x'] : window.getScrollSize()['x'] + 'px';
         this.style.height = (window.getScroll()['y'] == 0) ? window.getSize()['y'] : 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();
   }
});

