KEYCODE_ENTER = 13
KEYCODE_TAB = 9
KEYCODE_BS = 8
KEYCODE_ESCAPE = 27
ARROW_LEFT = 37
ARROW_UP = 38
ARROW_RIGHT = 39
ARROW_DOWN = 40

Array.prototype.contains = function( element )
{
   for ( var i = 0; i < this.length; ++i )
      if ( element == this[ i ] )
         return true
   return false
}

Array.prototype.indexOf = function( element )
{
   for ( var i = 0; i < this.length; ++i )
      if ( element == this[ i ] )
         return i
   return -1
}

Array.prototype.remove = function( element )
{
	var index = this.indexOf( element )
	if ( index != -1 )
		this.splice( index, 1 )
   return element
}

Array.prototype.last = function() { return this[ this.length - 1 ] }

function elm( id ) {	return document.getElementById( id ) }

function setCssClass( element, className )
{
	if ( !hasCssClass( element, className ) )
		element.className += " " + className
}

function hasCssClass( element, className )
{
   var tester = new RegExp( "\\b" + className + "\\b" )
   return tester.test( element.className )
}

function removeCssClass( element, className )
{
	var matcher = new RegExp( "\\b" + className + "\\b" )
	element.className = element.className.replace( matcher, " " )
}

function firstChildElement( element )
{
   for ( var i=0; i < element.childNodes.length; ++i )
      if ( element.childNodes[ i ].nodeType == document.ELEMENT_NODE )
         return element.childNodes[ i ]
   return null
}

function childByClassName( element, className )
{
   if ( !element || !element.childNodes )
      log( "childByClassName: searching empty element handle for '" + className + "'" )

   for ( var i=0; i < element.childNodes.length; ++i )
      if ( document.ELEMENT_NODE == element.childNodes[ i ].nodeType )
         if ( element.childNodes[ i ].className.split( " " ).contains( className )  )
            return element.childNodes[ i ]
   return null
}

function childByName( element, name )
{
   if ( !element || !element.childNodes )
      log( "childByName: searching empty element handle for '" + name + "'" )

   for ( var i=0; i < element.childNodes.length; ++i )
      if ( document.ELEMENT_NODE == element.childNodes[ i ].nodeType )
         if ( element.childNodes[ i ].name && element.childNodes[ i ].name == name )
            return element.childNodes[ i ]
   return null
}

function childByTagName( element, tagName )
{
   tagName = tagName.toUpperCase()
   if ( !element || !element.childNodes )
      log( "childByTagName: searching empty element handle for '" + tagName + "'" )
      
   for ( var i=0; i < element.childNodes.length; ++i )
      if ( document.ELEMENT_NODE == element.childNodes[ i ].nodeType )
         if ( tagName == element.childNodes[ i ].nodeName.toUpperCase() )
            return element.childNodes[ i ]
   return null
}

function childrenByTagName( element, tagName )
{
   tagName = tagName.toUpperCase()
   if ( !element || !element.childNodes )
      log( "childrenByTagName: searching empty element handle for '" + tagName + "'" )

   children = []
   for ( var i=0; i < element.childNodes.length; ++i )
      if ( document.ELEMENT_NODE == element.childNodes[ i ].nodeType )
         if ( tagName == element.childNodes[ i ].nodeName.toUpperCase() )
            children.push( element.childNodes[ i ] )
   return children
}

function setText( elm, text )
{
    if ( elm.firstChild && elm.firstChild.nodeType == document.TEXT_NODE )
        elm.firstChild.data = text
    else
        elm.appendChild( document.createTextNode( text ) )
    return elm     
}

function getText( elm )
{
    if ( elm.firstChild && elm.firstChild.nodeType == document.TEXT_NODE )
        return elm.firstChild.data
    else if ( elm.nodeType == document.TEXT_NODE )
        return elm.data
    return ""
}

function removeChildNodes( element )
{
	for ( var i = element.childNodes.length-1; i >= 0; --i )
		element.removeChild( element.childNodes[ i ] )
}

function position( element )
{
   return {
      x: element.offsetLeft,
      y: element.offsetTop
   }
}

function sizeOf( element )
{
   return {
      width: element.offsetWidth || parseInt( element.currentStyle.width ),
      height: element.offsetHeight || parseInt( element.currentStyle.height )
   }
}

function show( element )
{
   element.style.display = "block"
}

function hide( element )
{
   element.style.display = "none"
}

init = window.init || []
init.unshift( function() {
   if ( !document.body )
      document.body = document.getElementsByTagName( "body" )[ 0 ]

   if ( document && !document.ELEMENT_NODE ) {
      document.ELEMENT_NODE = 1
      document.ATTRIBUTE_NODE = 2
      document.TEXT_NODE = 3
      document.DOCUMENT_NODE = 9
   }
    
   if ( !window.DEBUG )
      window.log = function() { }, window.error = alert
} )
