String.prototype.trim = function() {
  for(var i = 0; i < this.length; i++) {
    var chr = this.charCodeAt(i)
    if(chr != 10 && chr != 13 && chr != 20 && chr != 32) break
  }
  for(var j = this.length - 1; j > i; j--) {
    var chr = this.charCodeAt(j)
    if(chr != 10 && chr != 13 && chr != 20 && chr != 32) break
  }
  return this.substring(i,j+1)
}

if (!Array.prototype.push) {
	Array.prototype.push = function() {
		var startLength = this.length;
		for (var i = 0; i < arguments.length; i++)
			this[startLength + i] = arguments[i];
		return this.length;
	}
}

Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property]
  }
  return destination
}


function $() {
  var elements = new Array()
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i]
    if (typeof element == 'string')
      element = document.getElementById(element)
    if (arguments.length == 1)
      return element
    elements.push(element)
  }
  return elements
}

if (!window.Element) {
  var Element = new Object()
}

Object.extend(Element, {

  createElement: function(options) {
    if(!options.tag) return
    options.parent = (!options.parent) ? document.body : $(options.parent)
    object = document.createElement(options.tag)
    for (property in options)
      this.setAttribute(object, property, options[property])
    if(options.insertBefore) {
      object = options.parent.insertBefore(object, options.insertBefore)
    } else {
      object = options.parent.appendChild(object)
    }
    return object
  },

  createTextNode: function(text) {
    var object = document.createTextNode(text);
    return object
  },

  setAttribute: function(element, property, value) {
    if(property == "parent" ||
    property == "insertBefore")
      return
    if(property == "style")
      return this.setStyle(element, value)
    if(property == "innerText")
      return element.appendChild(this.createTextNode(value))
    if(property == "className")
      return this.addClassName(element, value)
    if(!this.setProperty(element, property, value))
      element.setAttribute(property, value)
  },

  setProperty: function(element, property, value) {
    if(!Element.propertyInStandard(element.nodeName, property))
      return false
    element[property] = value
    return true
  },

  propertyInStandard: function(nodeName, property) {
    if(property == 'id'
    || property == 'class'
    || property == 'style') return true
      var xhtml = {
        head: ['profile'],
        base: ['href'],
        meta: ['http-equiv', 'name', 'content', 'scheme'],
        link: ['charset', 'href', 'hreflang', 'type', 'rel', 'rev', 'media'],
        style: ['type', 'media', 'title'],
        script: ['charset', 'type', 'src', 'defer'],
        blockquote: ['cite'],
        ins: ['cite', 'datetime'],
        del: ['cite', 'datetime'],
        a: ['charset', 'type', 'name', 'href', 'hreflang', 'rel', 'rev', 'shape', 'coords'],
        bdo: ['lang', 'dir'],
        q: ['cite'],
        object: ['declare', 'classid', 'codebase', 'data', 'type', 'codetype', 'archive', 'standby', 'height', 'width', 'usemap', 'name', 'tabindex'],
        param: ['name', 'value', 'valuetype', 'type'],
        img: ['src', 'alt', 'longdesc', 'height', 'width', 'usemap', 'ismap'],
        map: ['title', 'name'],
        area: ['shape', 'coords', 'href', 'nohref', 'alt'],
        form: ['action', 'method', 'enctype', 'accept', 'accept-charset'],
        label: ['for', 'accesskey'],
        input: ['type', 'name', 'value', 'checked', 'disabled', 'readonly', 'size', 'maxlength', 'src', 'alt', 'usemap', 'accept'],
        select: ['name', 'size', 'multiple', 'disabled', 'tabindex'],
        optgroup: ['disabled', 'label'],
        option: ['selected', 'disabled', 'label', 'value'],
        textarea: ['name', 'rows', 'cols', 'disabled', 'readonly'],
        legend: ['accesskey'],
        button: ['name', 'value', 'type', 'disabled'],
        table: ['summary', 'width', 'border', 'frame', 'rules', 'cellspacing', 'cellpadding'],
        colgroup: ['span', 'width'],
        col: ['span', 'cellvalign'],
        th: ['abbr', 'axis', 'headers', 'scope', 'rowspan', 'colspan'],
        td: ['abbr', 'axis', 'headers', 'scope', 'rowspan', 'colspan']
    }
    if('undefined' == typeof xhtml[nodeName]) return false
    alert(xhtml[nodeName])
  },

  setStyle: function(element, value) {
    element = $(element);
    var a = value.split(';')
    for(var i = 0; i < a.length; i++) {
      a[i] = a[i].trim()
      var b = []
      b[0] = a[i].substr(0, a[i].indexOf(':'))
      b[1] = a[i].substr(a[i].indexOf(':') + 1)
      if(b[0] && b[1])
        element.style[b[0]] = b[1].trim()
      if(b[1].indexOf('png') > -1 &&
      navigator.userAgent.indexOf('MSIE') > -1)
        this.fixPNG(element, b[0], b[1])
    }
  },

  fixPNG: function(element, property, value) {
    element.style.behavior = 'url("/png.htc")'
  },

  hasClassName: function(element, className) {
    element = $(element)
    if(!element) return
    var a = element.className.split(' ')
    for (var i = 0; i < a.length; i++) {
      if (a[i] == className) return true
    }
    return false
  },

  addClassName: function(element, className) {
    element = $(element)
    if (!element) return
    Element.removeClassName(element, className)
    element.className += ' ' + className
  },

  removeClassName: function(element, className) {
    element = $(element)
    if (!element) return
    var newClassName = ''
    var a = element.className.split(' ')
    for (var i = 0; i < a.length; i++) {
      if (a[i] != className) {
        if (i > 0) newClassName += ' '
        newClassName += a[i]
      }
    }
    element.className = newClassName
  }
})



checkBodyLoad = function() {
  if (document.body) {
    window.setTimeout('onBodyLoad()', 500)
  } else {
    window.setTimeout('checkBodyLoad()',100)
  }
}

addBodyLoadHandler = function(handler) {
  var func = onBodyLoad
  func = onBodyLoad.toString()
  func = func.substr(func.search(/{/) + 1)
  func = 'onBodyLoad = function () { '
  + handler + '; ' + func
  eval(func)
}

addEvent = function(object, event, handler) {
  if (event == 'bodyLoad')
    return addBodyLoadHandler(handler)
  if (!object) return
  var b
  if (object.addEventListener) {
    object.addEventListener(event, handler, b)
  } else if (object.attachEvent) {
    object.attachEvent('on' + event, handler)
  }
}

var onBodyLoad = function() { }