
/* add behaviours to a single element identified by id */ 
function addBehaviours(id, behaviours){
	var element = document.getElementById(id);

	for (var action in behaviours)
		eval("element." + action + "= function(event){" + behaviours[action] + "};");
}

/* add behaviours to all elements of type element, optionally 
	restricted to children of the element identified by parent */
function addElementBehaviours(element, behaviours, parent){
	if (typeof parent != 'undefined')
		var elements = document.getElementById(parent).getElementsByTagName(element);
	else
		var elements = document.getElementsByTagName(element);
		
	for (var action in behaviours){
		for (var i=0; i<elements.length; i++)
			eval("elements[i]." + action + "= function(event){" + behaviours[action] + "};");
	}
}

function createHTMLElement(strElement, objAttributes){
  var newElement = document.createElement(strElement);
  
  if (typeof objAttributes != 'undefined'){
    for (var strAttribute in objAttributes){
      switch (strAttribute){
        case 'class':
          // setAttribute() doesn't work with 'class' in IE
          newElement.className = objAttributes[strAttribute];
        break;
        default:
          newElement.setAttribute(strAttribute, objAttributes[strAttribute])
        break;
      }
    }
  }
  
  return newElement;
}

/*function createXMLElement(strElement, objAttributes, strNamespace){
  var newElement = document.createElementNS(strElement, strNamespace);
  
  
}*/

function is_all_ws( nod )
{
  // Use ECMA-262 Edition 3 String and RegExp features
  return !(/[^\t\n\r ]/.test(nod.data));
}

function is_ignorable( nod )
{
  return ( nod.nodeType == 8) || // A comment node
         ( (nod.nodeType == 3) && is_all_ws(nod) ); // a text node, all ws
}

function node_before( sib )
{
  while ((sib = sib.previousSibling)) {
    if (!is_ignorable(sib)) return sib;
  }
  return null;
}

function node_after( sib )
{
  while ((sib = sib.nextSibling)) {
    if (!is_ignorable(sib)) return sib;
  }
  return null;
}

function last_child( par )
{
  var res=par.lastChild;
  while (res) {
    if (!is_ignorable(res)) return res;
    res = res.previousSibling;
  }
  return null;
}

function first_child( par )
{
  var res=par.firstChild;
  while (res) {
    if (!is_ignorable(res)) return res;
    res = res.nextSibling;
  }
  return null;
}





function addEvent( obj, type, fn )
{
  if (obj.addEventListener)
    obj.addEventListener( type, fn, false );
  else if (obj.attachEvent)
  {
    obj["e"+type+fn] = fn;
    obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
    obj.attachEvent( "on"+type, obj[type+fn] );
  }
}

function removeEvent( obj, type, fn )
{
  if (obj.removeEventListener)
    obj.removeEventListener( type, fn, false );
  else if (obj.detachEvent)
  {
    obj.detachEvent( "on"+type, obj[type+fn] );
    obj[type+fn] = null;
    obj["e"+type+fn] = null;
  }
}



/*RegExp.escape = function(text) {
  if (!arguments.callee.sRE) {
    var specials = [
      '/', '.', '*', '+', '?', '|',
      '(', ')', '[', ']', '{', '}', '\\'
    ];
    arguments.callee.sRE = new RegExp(
      '(\\' + specials.join('|\\') + ')', 'g'
    );
  }
  return text.replace(arguments.callee.sRE, '\\$1');
}*/



function nodeListToArray(nodeList){
  var nodeListLength = nodeList.length;
  var arrNodeList = new Array();
  
  for (var i=0; i<nodeListLength; i++)
    arrNodeList[i] = nodeList[i];
    
  return arrNodeList;
}

function arraySearch(needle, haystack){
  var length = haystack.length;

  for (var i=0; i<length; i++){
    if (haystack[i] == needle)
      return i;
  }
  
  return false;
}

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    var count = 0;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements[count] = oElement;
            count++;
        }   
    }
    return (arrReturnElements)
}


