/**
 * Copyright (c) 2006, Opera Software ASA
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of Opera Software ASA nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY OPERA SOFTWARE ASA AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL OPERA SOFTWARE ASA AND CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

(
  function()
  {
    this.add=function() // node name, text, pairs of attribute name and attribute values
    {
      if(arguments[0])
      {
        var ele=this.ownerDocument.createElement(arguments[0]);
        var prop='', i=2;
        for(; arguments[i] ; i+=2)
        {
          ele[arguments[i]]=arguments[i+1];
        }
        if(arguments[1]) ele.appendChild(this.ownerDocument.createTextNode(arguments[1]));
        this.appendChild(ele);
        return ele;
      }
      else
      {
        this.appendChild(this.ownerDocument.createTextNode(arguments[1]));
      }
      return ele;
    }
    this.addClass=function(name)
    {
      if(!(new RegExp(name)).test(this.className)) this.className=(this.className?this.className+' ':'')+name;
    }
    this.removeClass=function(name)
    {
      var re=new RegExp(name+' ?| ?'+name);
      if(re.test(this.className)) this.className=this.className.replace(re, '');
    }
    this.transform=function(pattern, context)
    {
      var childs=this.childNodes, child=null, i=0;
      for( ; child=childs[i]; i++)
      {
        pattern(child, context);
      }
      return context;
    }

    this.getElementsfirstChildsNodeValue=function(nodeName)
    {
      var value=null;
      var ele=this.getElementsByTagName(nodeName)[0];
      return (ele && (value=ele.firstChild) && value.nodeValue) || null;
    }
    this.getCDATASection=function(nodeName)
    {
      var value=null;
      var ele=this.getElementsByTagName(nodeName)[0];
      //alert(ele.innerHTML);
      return (ele && (value=ele.firstChild) && value.nodeValue) || null;
    }
  }
).apply(Element.prototype);