/*
ns dc				http://purl.org/dc/elements/1.1/
dc:title			SemSol JavaScript library
dc:creator			benjamin nowack, bnowack at appmosphere.com
dc:date				2006-03-09
*/

function elById(id){
	return (typeof id != "string") ? id : (document["getElementById"] ? document.getElementById(id) : false );
}

function elsByTag(t, p){
	var p_el=(p) ? elById(p) : document; 
	return (p_el["getElementsByTagName"]) ? p_el.getElementsByTagName(t) : [];
}
	
function elByTag(t, p){
	var els=elsByTag(t, p);
	return (els.length) ? els[0] : false;
}
	
function elsByClass(c, p, t){
	var els=(t) ? elsByTag(t, p) : elsByTag("*", p);
	var re=new RegExp("(^|\\s)"+c+"(\\s|$)");
	var r=[];
	for(var i=0, i_max=els.length; i<i_max; i++){
		if(els[i].className && els[i].className.match(re)){
			r[r.length]=els[i];
		}
	}
	return r;
}

function elByClass(c, p){
	var els=elsByClass(c, p);
	return (els.length) ? els[0] : false;
}

function hasClass(el, c){
	var re=new RegExp("(^|\\s)"+c+"(\\s|$)");
	return (el.className && el.className.match(re)) ? true : false;
}

function addClass(el, c) {
  if (!hasClass(el, c)) {
    el.className += (el.className) ? " "+c : c;
  }
}

function elsByAttr(a_name, a, p){
	var els=elsByTag("*", p);
	var esc_a = a.replace(/([\.])/g, '\\$1');
	var re=new RegExp("(^|\\s)"+esc_a+"(\\s|$)");
	var r=[];
	var cur_a;
	for(var i=0, i_max=els.length; i<i_max; i++){
		if((cur_a=els[i].getAttribute(a_name)) && cur_a.match(re)){
			r[r.length]=els[i];
		}
	}
	return r;
}

function elByAttr(a_name, a, p){
	var els=elsByAttr(a_name, a, p);
	return (els.length) ? els[0] : false;
}

function attrVal(el, a_name){
	return(el && el["getAttribute"]) ? el.getAttribute(a_name) : false;
}

function domId(el) {
  if (el['domId']) {
    return el.domId;
  }
  var p = el.parentNode ? el.parentNode : false;
  var pos = 0;
  if (p) {
    var p_child_nodes = p.childNodes;
    while (p_child_nodes[pos] != el) {
      pos++;
    }
  }
  return p ? domId(p)+'.'+pos : pos;
}

function toggleEl(el){
	el.style.display = (el.style.display=="none") ? "" : "none";
	window.focus();
}

function updateEl(id, val){
	elById(id).innerHTML=val;
}

function addHeadScript(url, id){
	var head, node;
	node=document.createElement('script');
	node.type = 'text/javascript';
	node.src = url;
	if(id){
		node.id = id;
	}
	head = elByTag("head");
	head.appendChild(node)	
}

function addEvent(el, e_type, fnc) {
  /* event registry */
  if(!window.e_reg){window.e_reg = {'count' : 0};}
  /* dom_id */
  var dom_id = domId(el);
  if (!window.e_reg[dom_id]) {
    window.e_reg[dom_id] = {};
  }
  /* register */
  var fnc_key = escape(e_type+fnc);
  /* unset old listeners */
  if (!el.domId && window.e_reg[dom_id][fnc_key]) {
    var old_el = window.e_reg[dom_id][fnc_key][0];
    if (old_el.removeEventListener) {
      try { old_el.removeEventListener(e_type, fnc, false); } catch (e) {};
    }
    else if (old_el.detachEvent) {
      try { old_el.detachEvent('on'+e_type, fnc); } catch (e) {};
    }
    else {
      old_el['on'+e_type] = null;
    }
    window.e_reg[dom_id][fnc_key][0] = null;
    window.e_reg[dom_id][fnc_key] = null;
  }
  var added = false;
  if (!window.e_reg[dom_id][fnc_key]) {
    window.e_reg[dom_id][fnc_key] = [el, e_type];
    added = true;
  }

  /* add handler */
  if (!el.domId || added) {/* re-rendered or unregistered event */
    el.domId = dom_id;
    if (el.addEventListener) {
      el.addEventListener(e_type, fnc, false);
    }
    else if (el.attachEvent) {
      el.attachEvent('on'+e_type, fnc);
    }
    else {
      var old_fnc = el['on'+e_type];
      el['on'+e_type] = (typeof old_fnc == 'function') ? function() { old_fnc(); fnc();} : fnc;
    }
  }
}

function xaddEvent(el, e_type, fnc) {
  /* event registry */
  
  if(!window["js_events"]){window.js_events = {'count' : 0};}
  var new_el = false;
  if (!window.js_events[el]) {
    new_el = true;
    window.js_events[el] = {};
    window.js_events.count++;
  }
  /* add event if el was re-rendered or is not in registry yet */
  var key = escape(e_type+fnc);
  if (!el['on'+e_type] || !window.js_events[el][key]) {
    window.js_events[el][key] = fnc;
    if (el.addEventListener) {
      if(e_type == 'click') {
        //alert("adding \n"+el.id+"\n"+el['on'+e_type]+"\n"+window.js_events[el]+"\n"+new_el);
      }
      el.addEventListener(e_type, fnc, false);
    }
    else if (el.attachEvent) {
      el.attachEvent('on'+e_type, fnc);
    }
    else {
      var old_fnc = el['on'+e_type];
      el['on'+e_type] = (typeof old_fnc == 'function') ? function() { old_fnc(); fnc();} : fnc;
    }
  }
}

function cancelEvent(e) {
  if (e['preventDefault']) {
    e.preventDefault();
    e.stopPropagation();
  }
  else {
    e.cancelBubble = true;
    e.returnValue = false;
  }
}
