// This library is dependent on utils.js
dhtml = new Object();
dhtml.prevState = null;
dhtml.selectedObj = null; // Used to track the object event target.
dhtml.offsetX  = null;
dhtml.offsetY = null; 
dhtml.timeout; // used to store currently executing timeout reference.

// tracks all event listeners to unregister during unload due to IE mem leakage bug
dhtml.__eventListeners = []; 

//	The el param can be either an id or object in all methods below.
dhtml.getElementById = function( el ){
		if(typeof el == "object") return el;
		else return document.getElementById(el);
}

dhtml.getStyleObj = function( el ){	
		var el =	this.getElementById( el ); 
		return el.style;
}

dhtml.setSelectedElement = function(evt){
	this.selectedObj = this.getTarget(evt);
  return (this.selectedObj != null);
}

dhtml.setStatusBar = function(msg){
	window.status = msg;
}

//  Track element targeted with mousedown.
dhtml.engage = function(evt){
  var evt = (evt) ? evt : event;
   if(dhtml.setSelectedElement(evt)){
      if(evt.clientY){ //IE 5+ and Net 6+
         dhtml.offsetY = evt.clientY - ((dhtml.selectedObj.offsetTop) ? dhtml.selectedObj.offsetTop : 0) ;
         dhtml.offsetX = evt.clientX - ((dhtml.selectedObj.offsetLeft) ? dhtml.selectedObj.offsetLeft : 0) ;
      }else if(evt.offsetY){ //IE 4
         dhtml.offsetY = evt.offsetY - ((evt.offsetY < -2) ? 0 : document.body.scrollTop);
         dhtml.offsetX = evt.offsetX - ((evt.offsetX < -2) ? 0 : document.body.scrollLeft);
      }
      return false;
   }
}

dhtml.addEvent = function(el, evType, fn, useCapture){
		var el = this.getElementById(el);
		var useCapture = useCapture; 
		useCapture = (useCapture != null) ?useCapture  : false;

		if (el.addEventListener){
    		el.addEventListener(evType, fn, useCapture);
	    	return true;
  	  } else if (el.attachEvent){
	    	el.attachEvent("on"+evType, fn);
  		} else throw new Error("Handler could not be attached");

		var event = {
        el: el,
        evType: evType,
        fn: fn
    };
    this.__eventListeners.push(event);
}

dhtml.removeEvent = function(el, evType, fn, useCapture){
 		var el = this.getElementById(el);

	  if (el.removeEventListener){
  	 	el.removeEventListener(evType, fn, useCapture);
	  } else if (el.detachEvent){
  	 	el.detachEvent("on"+evType, fn);
  	} else 	alert("Handler could not be removed");
    for (var i = 0; i < this.__eventListeners.length; i++) {
    	if (this.__eventListeners[i] == event) {
      	this.__eventListeners.splice(i, 1);
        break;
    	}
    }
}

dhtml.unregisterAllEvents = function() {
    while (this.__eventListeners.length > 0) {
        this.removeEventListener(this.__eventListeners[0]);
    }	
	}

dhtml.getEvent = function( e ){
	var event = event || null;	 var e = e || event;
	return e;
}

dhtml.cancelEvent = function( e ){
	var event = event || null;	 var e = e || event;

	if(e != null){ 
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
	}
}

dhtml.getTarget = function(e){
		// might be able to return 'this' obj;
		var e = e || this.getEvent(e);
		if(e != null) {
			var t = e.target || e.srcElement;
			return t;
		}
		return null;
}

dhtml.getTargetId = function(e){
		var target = this.getTarget(e);
		for(var i = 0; i <=10; i++){				
			if(target.id && target.id != '') return target.id;
			else if(target.parentNode){
				target = target.parentNode;
			}else return null;
		}
		return null;
}

dhtml.eventDebug = function(){
	alert('eventDebug');
}


dhtml.setStyle = function(obj,attrib,value){
  //value must be a string
  var obj = obj || null;
  var attrib = attrib || null;
  var value = value || '';
  var styleObj = this.getStyleObj(obj);
  if(styleObj != null && attrib != ''){
			styleObj[attrib] = value;
    return true;
  }
  return false;
}

dhtml.getStyle = function(obj,attrib){
  var obj = obj || null;
  var attrib = attrib || null;
  var styleObj = this.getStyleObj(obj);
  if(styleObj != null && attrib != ''){
    	return styleObj[attrib];
  }
  return false;
}

dhtml.swapImgBySrc = function( e, id, state ){
		// if id or state passed then state == new state
		var e = doc.dhtml.getEvent(e);
		var src = null;
		if(e != null){
			var type = e.type;
			var target = doc.dhtml.getTarget(e);
			src = target.src;
			var state = state || src.slice(src.lastIndexOf('_')+1,src.lastIndexOf('.'));
		} else {
			var type = null;
			var target = doc.dhtml.getElementById(id);
			var imgs = target.getElementsByTagName('img');
			target = (imgs && imgs.length > 0) ? imgs[0] : target;
			(target.firstChild != null) ? target.firstChild : target;
 		  src = target.src
		}

	if(!src) return;
	//get start of img name and ext
		var start = src.slice(0,src.lastIndexOf('_')+1);
		var ext = src.slice(src.lastIndexOf('.'));
		var prevState = (doc.dhtml.prevState != null) ?  doc.dhtml.prevState  : 'off';
		switch( type ){
			case 'click':
				var state = (state == 'on') ? 'off' : 'on' ;
				target.src = start + state + ext;
				doc.dhtml.prevState = state;
				break;
			case 'mouseover':
				target.src = start + 'over' + ext;		 
				doc.dhtml.prevState = state;
				break;
			case 'mousedown':
				target.src = start + 'over' + ext;		 
				doc.dhtml.setStatusBar('');
				break;
			case 'mouseout':
				target.src = start + prevState + ext;		
				doc.dhtml.setStatusBar('');
				break;
			default:
				// to use this, send in id and null evt;
				doc.dhtml.prevState = state;
				target.src = start + state + ext;		
				break;				
		}
}

dhtml.toggleVisibilityById = function( id, state ){
		var el = this.getStyleObj(id);

		if (state == null) el.visibility = (el.visibility == 'hidden') ? 'visible' : 'hidden';
		else el.visibility = state;
	}

dhtml.toggleDisplayById = function( id, state ){
		var el = this.getStyleObj(id);

		if (state == null) 	el.display = (el.display == 'none') ? 'block' : 'none';
		else el.display = state;
}

dhtml.shiftTo = function(obj, x, y){
  // if strings are passed in then they must include the px suffix
  var obj = obj || null;
  var x = x || 0;
  var y = y || 0;
  if( this.setStyle(obj,'left',(typeof x == 'string')? x : x.toString() + 'px') 
      && this.setStyle(obj,'top',(typeof y == 'string')? y : y.toString() + 'px')) return true;
  else return false;
}

dhtml.getElementByIdFromCollection = function( id, arr ){
	for(var i = 0; i < arr.length; i++){
		if(arr[i].id && 	arr[i].id == id) return arr[i];
	}
	return null;
}

dhtml .getComputedStyle = function(obj,attrib){
  // obj can be id string or HTML object
  // attrib must be in hyphenated, CSS format
  var obj = obj || null;
  var attrib = attrib || null;
  var curSize = null;
  /* Safari does not support getComputedStyle - DOM2 method */
  if(typeof obj == "string") obj = this.getElementById(obj);
  if(obj != null && attrib != null){
    if(window.getComputedStyle){
      var compStyleObj = window.getComputedStyle(obj,"");
      curSize = compStyleObj.getPropertyValue(attrib);
    }else if(obj.currentStyle){
      var parts = attrib.split('-');
      attrib = parts[0];
      for(var i = 1; i < parts.length; i++){
        attrib += parts[i].substr(0,1).toUpperCase() + parts[i].substring(1,parts[i].length);
      }
      curSize = eval('obj.currentStyle.' + attrib);
    }
  }
  return curSize
}
