
// Copyright 2009 - 2010, Drew Sellers, All rights reserved

var ie   = navigator.appName.indexOf("Microsoft") != -1;
var mobile = navigator.userAgent.toLowerCase().indexOf("iphone") != -1;
if (!mobile) mobile = navigator.appName.toLowerCase().indexOf("blackberry") != -1;
var gallery = null;

function cortex()
{
	this.counter = 0;
	this.objs = new Array();
	
	this.hoverClock;
	this.hoverObj;
	this.hoverNode;
	
	this.lastMoveEvt;
}
cortex.prototype.OID = 'oid:';

function cortex_getOID()
{
	return (this.OID + this.counter++);
}
cortex.prototype.getOID = cortex_getOID;

function cortex_addObj(obj)
{
	this.objs[obj.oid + ''] = obj;
}
cortex.prototype.addObj = cortex_addObj;

function cortex_removeObj(oid)
{
	this.objs[oid + ''] = null;
}
cortex.prototype.removeObj = cortex_removeObj;

function cortex_getObjByID(oid)
{
	return this.objs[oid + ''];
}
cortex.prototype.getObjByID = cortex_getObjByID;

function cortex_getObj(evt)
{
	var evt = new cortexEvt(evt);
	if (evt == null) return;
		
	var src = evt.srcElement;
	while (true) {
		if (src == null) 	return null;
		if ((src.id != null) && (src.id != '')) return this.getObjByID(src.id);
		src = src.parentNode;
	}
}
cortex.prototype.getObj = cortex_getObj;

function cortex_scheduleHover(obj)
{
	if (obj == null) 					return;
	if (obj.oid == null) 				throw new Error('Hover obj must have an oid!');
	if (obj.getHoverContents == null) 	throw new Error('Hover obj must have getHoverContents');
	
	if (this.hoverObj) {
		if (this.hoverObj.oid == obj.oid) return;
		this.clearHover(this.hoverObj.oid);
	}
	
	this.hoverObj = obj;
	this.hoverClock = setTimeout(cortex_showHover, 750);
}
cortex.prototype.scheduleHover = cortex_scheduleHover;

function cortex_clearHover(oid)
{
	if (this.hoverObj != null) {
		if (this.hoverObj.oid != oid) return; 
		this.hoverObj = null;
	}
	if (this.hoverClock != null) {
		clearTimeout(this.hoverClock);
		this.hoverClock = null;
	}
	if (this.hoverNode != null) {
		if (this.hoverNode.parentNode != null) {
			this.hoverNode.parentNode.removeChild(this.hoverNode);
		}
	}
}
cortex.prototype.clearHover = cortex_clearHover;

function cortex_showHover()
{
	if (cortex == null) 			return;
	if (cortex.hoverObj == null) 	return;
	if (cortex.lastMoveEvt == null)	return;
	
	if (cortex.hoverNode == null) {
		cortex.hoverNode = obtainElement('div');
		cortex.hoverNode.className = 'hover';
		cortex.hoverNode.style.zIndex = '2';
		
		var obj = obtainElement('div');
		obj.className = 'hoverBack';
		obj.style.opacity = '.7';
		cortex.hoverNode.appendChild(obj);
		
		obj = obtainElement('div')
		obj.style.top = '0px';
		obj.style.left = '0px';
		cortex.hoverNode.appendChild(obj);
	}
	
	var contents = cortex.hoverObj.getHoverContents();
	if (contents) {
		var contentsTbl = new Array();
		contentsTbl.push('<table><tr><td align="center" valign="middle" nowrap class="hoverText">');
		contentsTbl.push(contents);
		contentsTbl.push('</td></tr></table>');
		cortex.hoverNode.childNodes[1].innerHTML = contentsTbl.join('');
	
		var scrollX = document.body.scrollLeft;
		var scrollY = document.body.scrollTop;

		cortex.hoverNode.style.left = (cortex.lastMoveEvt.x + scrollX + 15) + 'px';
		cortex.hoverNode.style.top = (cortex.lastMoveEvt.y + scrollY + 15) + 'px';
		
		var	obj = document.getElementById('galleryHome');
		obj.appendChild(cortex.hoverNode);		

		cortex.hoverNode.style.width = cortex.hoverNode.childNodes[1].offsetWidth + 'px';
		cortex.hoverNode.style.height = cortex.hoverNode.childNodes[1].offsetHeight + 'px';
		
		if ((parseInt(cortex.hoverNode.style.left) + parseInt(cortex.hoverNode.style.width)) > document.body.clientWidth) {
			cortex.hoverNode.style.left = (cortex.lastMoveEvt.x + scrollX - parseInt(cortex.hoverNode.style.width) - 15) + 'px';
		}
	}
}
cortex.prototype.showHover = cortex_showHover;

function cortex_mouseOver(evt)
{
	var obj = cortex.getObj(evt);

	if (obj == null) 					return;
	if (obj.handleMouseOver == null) 	return;

	var ce = new cortexEvt(evt);
	obj.handleMouseOver(ce);	
}
cortex.prototype.mouseOver = cortex_mouseOver;

function cortex_mouseOut(evt)
{
	var obj = cortex.getObj(evt);

	if (obj == null) 					return;	
	if (cortex.hoverObj) {
		if (cortex.hoverObj.oid == obj.oid) cortex.clearHover(cortex.hoverObj.oid);
	}
	if (obj.handleMouseOut == null) 	return;

	obj.handleMouseOut();	
}
cortex.prototype.mouseOut = cortex_mouseOut;

function cortex_mouseMove(evt)
{
	cortex.lastMoveEvt = new cortexEvt(evt);

	var obj = cortex.getObj(evt);

	if (obj == null) 					return;
	if (cortex.hoverObj) {
		if (cortex.hoverObj.oid != obj.oid) cortex.clearHover(cortex.hoverObj.oid);
	}
	if (obj.handleMouseMove == null) 	return;

	obj.handleMouseMove();	
}
cortex.prototype.mouseMove = cortex_mouseMove;

function cortex_mouseDown(evt)
{
	var obj = cortex.getObj(evt);

	if (obj == null) 					return;
	if (obj.handleMouseDown == null) 	return;

	obj.handleMouseDown();	
}
cortex.prototype.mouseDown = cortex_mouseDown;

function cortex_mouseUp(evt)
{
	var obj = cortex.getObj(evt);

	if (obj == null) 				return;
	if (obj.handleMouseUp == null) 	return;

	obj.handleMouseUp();	
}
cortex.prototype.mouseUp = cortex_mouseUp;

function cortex_click(evt)
{
	var obj = cortex.getObj(evt);

	if (obj == null) 				return;
	if (obj.handleClick == null) 	return;

	obj.handleClick();	
}
cortex.prototype.click = cortex_click;

function cortex_doubleClick(evt)
{
}
cortex.prototype.doubleClick = cortex_doubleClick;

function cortex_keyDown(evt)
{
}
cortex.prototype.keyDown = cortex_keyDown;

function cortex_keyPress(evt)
{
}
cortex.prototype.keyPress = cortex_keyPress;

function cortex_redraw()
{
	if (gallery) {
		gallery.redraw();
	}
}
cortex.prototype.redraw = cortex_redraw;

function obtainElement(type)
{
	var element;
	
	element = document.createElement(type);
	element.style.position = 'absolute';
	element.style.overflow = 'hidden';
	
	return element;
}

function cortexEvt(evt) 
{
	this.evt;
	this.srcElement;
	this.ref;

	if (ie) {
		this.evt 		= window.event;
		this.srcElement = this.evt.srcElement;
	} else {
		this.evt 		= evt;
		this.srcElement = this.evt.target;
	}
	
	var n = this.srcElement;
	while (true) {
		if (n == null) break;
		if ((n.abbr != null) && (n.abbr != '')) {
			this.ref = n.abbr;
			break;
		} else {
			if (n.parentNode == null) break;
			n = n.parentNode;
		}
	}
	
	this.x = this.evt.clientX;
	this.y = this.evt.clientY;
}


