/*

    Copyright 2002, eric@base10.org
    
    This file is part of OOMouseovers.

    You should have received a copy of the license terms along with 
    OOMouseovers; if not, read the latest license at 
    http://base10.org/software/mouseovers.php

*/

// Server constructor and prototypes
function MouseOverServer() {
	this.debug = false;
	this.handlers = new Array();
	return this;
}
MouseOverServer.prototype.newhandler = _MOS_NewHandler;
MouseOverServer.prototype.gethandler = _MOS_GetHandler;

// Handler constructor and prototype
function MouseOverHandler(){
	this.debug = false;
	this.events = new Array();
	this.events["over"] = new Array();
	this.events["out"] = new Array();
	this.events["on"] = new Array();
	this.events["press"] = new Array();
	this.events["release"] = new Array();
	return this;
}
MouseOverHandler.prototype.addlistener = _MOH_AddListener;
MouseOverHandler.prototype.fire = _MOH_FireEvent;


// Server Functions
function _MOS_NewHandler(obj) {
	if(this.debug) alert("Adding handler to image " + obj);
	if (IsDef(obj)) {
		if (IsDef(obj.parentNode)) {
			// see if the parent is a link, and if so, attach the on-events and the handler to it.
			if(this.debug) alert(obj.parentNode.nodeName);
			if (obj.parentNode.nodeName == "A") {
				// it's a link, all right
				if(this.debug) alert("The image was in a link.  Adding handler to link instead.");
				var link = obj.parentNode;
				link.onmouseover = _MOO_Over;
				link.onmouseout = _MOO_Out;
				link.onmousedown = _MOO_Press;
				link.onmouseup = _MOO_Release;
				link.mousehandler = new MouseOverHandler();
				this.handlers[obj] = link.mousehandler;
				return link.mousehandler;
			}
		}
		// we don't support DOM, or it wasn't a link.
		obj.onmouseover = _MOO_Over;
		obj.onmouseout = _MOO_Out;
		obj.onmousedown = _MOO_Press;
		obj.onmouseup = _MOO_Release;
		obj.mousehandler = new MouseOverHandler();
		this.handlers[obj] = obj.mousehandler;
		return obj.mousehandler;
	}
}
function _MOS_GetHandler(obj) {
	return this.handlers[obj];
}

// Handler Functions
function _MOH_AddListener(ev, obj){
	if(this.debug) alert("Adding listener " + typeof obj + " to event " + ev);
	this.events[ev].push(obj);
	if(this.debug) alert("Now have " + this.events[ev].length + " listeners to " + ev);
}

function _MOH_FireEvent(ev){
	if(this.debug) alert("Firing event " + ev);
	for (var i = 0; i < this.events[ev].length; i++) {
		var evhandler = this.events[ev][i];
		if(this.debug) alert("Firing " + ev + " listener " + evhandler + "...");
		evhandler.fire();
	}
}

// Event trigger functions (called from onX, there is no prototype object)
function _MOO_Over() {
	this.mousehandler.fire("over");
}
function _MOO_Out() {
	this.mousehandler.fire("out");
}
function _MOO_Press() {
	this.mousehandler.fire("press");
}
function _MOO_Release() {
	this.mousehandler.fire("release");
}