// ---------------------------------------------------------------
// Class Highlighter
// (C) Copyright by Publicform GmbH (www.publicform.de)
//
// Version: 1.0
// Date: 2004-09-06
// Author: Andreas Doelling (doelling@publicform.de)
//
// Assigns a background color to an element at mouseover, click and 
// mouseout.
// ---------------------------------------------------------------

function Highlighter() {
	this.cssClassName = 'highlight';
	this.cssClassClick = 'highlight-click';
	this.cssClassMouseover = 'highlight-mouseover';
	
	// -----------------------------------------------------
	// Method setId
	// -----------------------------------------------------
	this.setId = function(id) {
		this.id = id;
	}
	
	
	// -----------------------------------------------------
	// Method click
	// Handles click events propagated by a Controller object.
	// -----------------------------------------------------
	this.click = function(evt) {
		if(this != arguments.callee.scope){
	      if(typeof arguments.callee.apply == "function") {
			  	return arguments.callee.apply(arguments.callee.scope, arguments);
			} else {
		  		return  arguments.callee.scope.click(evt);
			}
	    }
		var srcElement = (evt.srcElement)? evt.srcElement : evt.target;
		srcElement = this.getResponsibleNode(srcElement);
		if(srcElement != null) {
			if(!srcElement.clicked && !srcElement.mouseovered) {
				srcElement.standardClassName = srcElement.className;
				srcElement.className = srcElement.standardClassName + ' ' + this.cssClassClick;
				srcElement.clicked = true;
			} else if(!srcElement.clicked && srcElement.mouseovered) {
				srcElement.className = srcElement.standardClassName + ' ' + this.cssClassClick;
				srcElement.clicked = true;
			} else if(srcElement.clicked) {
				srcElement.className = srcElement.standardClassName;
				srcElement.clicked = false;
				srcElement.className = srcElement.standardClassName + ' ' + this.cssClassMouseover;
				srcElement.mouseovered = true;
			}
			//return false;
			return true;
		} else {
			return true;
		}
		//return false;
		return true;
	}
	this.click.scope = this;
	
	
	// -----------------------------------------------------
	// Method keypress
	// Handles keypress events propagated by a Controller object.
	// -----------------------------------------------------
	this.keypress = this.click;
	this.keypress.scope = this;
	
	
	// -----------------------------------------------------
	// Method mouseover
	// Handles mouseover events propagated by a Controller object.
	// -----------------------------------------------------
	this.mouseover = function(evt) {
		if(this != arguments.callee.scope){
	      if(typeof arguments.callee.apply == "function") {
			  	return arguments.callee.apply(arguments.callee.scope, arguments);
			} else {
		  		return  arguments.callee.scope.mouseover(evt);
			}
	    }
		var srcElement = (evt.srcElement)? evt.srcElement : evt.target;
		srcElement = this.getResponsibleNode(srcElement);
		if(srcElement != null) {
			if(!srcElement.clicked && !srcElement.mouseovered) {
				srcElement.standardClassName = srcElement.className;
				srcElement.className = srcElement.standardClassName + ' ' + this.cssClassMouseover;
				srcElement.mouseovered = true;
			} else if(!srcElement.clicked) {
				srcElement.className = srcElement.standardClassName + ' ' + this.cssClassMouseover;
				srcElement.mouseovered = true;
			}
			//return false;
			return true;
		} else {
			return true;
		}
		//return false;
		return true;
	}
	this.mouseover.scope = this;
	
	
	// -----------------------------------------------------
	// Method mouseout
	// Handles mouseout events propagated by a Controller object.
	// -----------------------------------------------------
	this.mouseout = function(evt) {
		if(this != arguments.callee.scope){
	      if(typeof arguments.callee.apply == "function") {
			  	return arguments.callee.apply(arguments.callee.scope, arguments);
			} else {
		  		return  arguments.callee.scope.mouseout(evt);
			}
	    }
		var srcElement = (evt.srcElement)? evt.srcElement : evt.target;
		srcElement = this.getResponsibleNode(srcElement);
		if(srcElement != null) {
			if(!srcElement.clicked) {
				srcElement.className = srcElement.standardClassName;
				srcElement.mouseovered = false;
			}
			//return false;
			return true;
		} else {
			return true;
		}
		//return false;
		return true;
	}
	this.mouseout.scope = this;
	
	
	// -----------------------------------------------------
	// Method getResponsibleNode
	// Checks if the current Highlighter instance is responsible for
	// handling the propagated event, i.e. if the source element has 
	// the CSS class this.cssClassName.
	// -----------------------------------------------------
	this.getResponsibleNode = function(srcElement) {
		var className = srcElement.className;
		var classRegExp = new RegExp(this.cssClassName+'-?');
		if(className.match(classRegExp)) {
			return srcElement;
		}
		var parent = (srcElement.tagName == "BODY")? srcElement : srcElement.parentNode;
		while(parent.tagName != "BODY") {
			srcElement = parent;
			if(srcElement.className.match(classRegExp)) {
				return srcElement;
			}
			parent = parent.parentNode;
		}
		return null;
	}
}



