var PageUtils = new _PageUtils();
/**
 * A Helper class to create PageElement from the given Element ID.
 */
// public class PageUtils {
	function _PageUtils() {
		this.createFromID = _createFromID;
		this.pageElements = new Array();
	}
	/**
	 * Creates a new PageElement from the given elementID
	 */
	function _createFromID(elementID) {
		element = document.getElementById(elementID);
		pageElement = null;
		if(element) {
			pageElement = new _PageElement(element);
		}
		if(pageElement) {
			this.pageElements[elementID] = pageElement;
		}
		return pageElement;
	}
//}

/**
 * PageElement dispatches the events on the given element to all attatched
 * eventListeners.
 */
// public class PageElement {
	function _PageElement(element) {
		this.element = element;
		this.mouseListeners = new Array(10);
		this.keyListeners = new Array(10);
		this.mouseListenerTop = 0;
		this.keyListenerTop = 0;
		this.addMouseListener = _addMouseListener;
		this.addKeyListener = _addKeyListener;
		this.handleMousePressed = _handleMousePressed;
		this.handleMouseReleased = _handleMouseReleased;
		this.handleMouseClicked = _handleMouseClicked;
		this.handleMouseDoubleClicked = _handleMouseDoubleClicked;
		this.handleMouseEntered = _handleMouseEntered;
		this.handleMouseExited = _handleMouseExited;
		this.handleKeyPressed = _handleKeyPressed;
		this.handleKeyReleased = _handleKeyReleased;
		this.handleKeyTyped = _handleKeyTyped;
		this.element.onmousedown = this.handleMousePressed;
		this.element.onmouseup = this.handleMouseReleased;
		this.element.onmouseover = this.handleMouseEntered;
		this.element.onmouseout = this.handleMouseExited;
		this.element.onclick = this.handleMouseClicked;
		this.element.ondblclick = this.handleMouseDoubleClicked;
		this.element.onkeydown = this.handleKeyPressed;
		this.element.onkeyup = this.handleKeyReleased;
		this.element.onkeypress = this.handleKeyTyped;
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _addMouseListener(mouseListener) {
		if(this.mouseListenerTop > this.mouseListeners.length) {
			tempListeners = new Array(this.mouseListenerTop + 10);
			for(i = 0; i < tempListeners.length; i++) {
				tempListeners[i] = this.mouseListeners[i];
			}
			this.mouseListeners = tempListeners;
		}
		this.mouseListeners[this.mouseListenerTop] = mouseListener;
		this.mouseListenerTop++;
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _addKeyListener(keyListener) {
		if(this.keyListenerTop > this.keyListeners.length) {
			tempListeners = new Array(this.keyListenerTop + 10);
			for(i = 0; i < tempListeners.length; i++) {
				tempListeners[i] = this.keyListeners[i];
			}
			this.keyListeners = tempListeners;
		}
		this.keyListeners[this.keyListenerTop] = keyListener;
		this.keyListenerTop++;
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleMousePressed(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.mouseListenerTop; i++) {
			pageElement.mouseListeners[i].mousePressed(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleMouseReleased(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.mouseListenerTop; i++) {
			pageElement.mouseListeners[i].mouseReleased(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleMouseEntered(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.mouseListenerTop; i++) {
			pageElement.mouseListeners[i].mouseEntered(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleMouseExited(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.mouseListenerTop; i++) {
			pageElement.mouseListeners[i].mouseExited(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleMouseClicked(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.mouseListenerTop; i++) {
			pageElement.mouseListeners[i].mouseClicked(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleMouseDoubleClicked(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.mouseListenerTop; i++) {
			pageElement.mouseListeners[i].mouseDoubleClicked(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleKeyPressed(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.keyListenerTop; i++) {
			pageElement.keyListeners[i].keyPressed(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleKeyReleased(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.keyListenerTop; i++) {
			pageElement.keyListeners[i].keyReleased(simpleEvent);
		}
	}
	/**
	 * Dispatches SimpleEvent to all eventListeners
	 */
	function _handleKeyTyped(event) {
		pageElement = PageUtils.pageElements[this.id];
		simpleEvent = new SimpleEvent(pageElement.element, event);
		for(i = 0; i < pageElement.keyListenerTop; i++) {
			pageElement.keyListeners[i].keyTyped(simpleEvent);
		}
	}
//}

/**
 * The SimpleEvent Class is used to pass which Element producted the event 
 * along with the actual event object. To get the source, use getSource() and
 * to get the event Object use getEvent;
 */
// public class SimpleEvent {
	// SimpleEvent Class.
	function SimpleEvent(source, event) {
		this.source = source;
		this.event = event;
		this.getSource = _getSource;
		this.getEvent = _getEvent;
	}
	/**
	 * @return The Source of this event - The element that triggered the event.
	 */
	function _getSource() {
		return this.source;
	}
	/**
	 * @return The Javascript event object - Provided by the browser's js engine.
	 */
	function _getEvent() {
		return this.event;
	}
//}

/**
 * The LoggingListener listens for clicks or key events on any element it's 
 * attached with.
 */
//public class LoggingListener implements MouseListener, KeyListener {

	/**
	 * Creates a new ColorPaletteMouseListener with the given formElementId.
	 */
	function LoggingListener() {
		this.mouseClicked = _log_mouseClicked;
		this.mouseDoubleClicked = _log_mouseDoubleClicked;
		this.mouseEntered = _log_mouseEntered;
		this.mouseExited = _log_mouseExited;
		this.mousePressed = _log_mousePressed;
		this.mouseReleased = _log_mouseReleased;
		this.keyPressed = _log_keyPressed;
		this.keyReleased = _log_keyReleased;
		this.keyTyped = _log_keyTyped;
	}
	function _log_mouseClicked(event) {
		/*
		if(Logger) {
			Logger.log("_mouseClicked");
		}
		*/
	}
	function _log_mouseDoubleClicked(event) {
		/*
		if(Logger) {
			Logger.log("_mouseDoubleClicked");
		}
		*/
	}
	function _log_mouseEntered(event) {
		/*
		if(Logger) {
			Logger.log("_mouseEntered");
		}
		*/
	}
	function _log_mouseExited(event) {
		/*
		if(Logger) {
			Logger.log("_mouseExited");
		}
		*/
	}
	function _log_mousePressed(event) {
		/*
		if(Logger) {
			Logger.log("_mousePressed");
		}
		*/
	}
	function _log_mouseReleased(event) {
		/*
		if(Logger) {
			Logger.log("_mouseReleased");
		}
		*/
	}
	function _log_keyPressed(event) {
		/*
		if(Logger) {
			Logger.log("_keyPressed");
		}
		*/
	}
	function _log_keyReleased(event) {
		/*
		if(Logger) {
			Logger.log("_keyReleased");
		}
		*/
	}
	function _log_keyTyped(event) {
		/*
		if(Logger) {
			Logger.log("_keyTyped");
		}
		*/
	}
//}
