/**
 * @author Adam McIntyre -- adam.mcintyre@molecular.com
 * @classDescription Utility class for popping up product flyouts throughout the
 *                   site.
 */

Popper = function() {
	var isOver = false;
	var position = false;
	var el = null;
	var to = 14;
	var ho = 0;
	var isSingleColMode = false;
	var isNewFlyout = false;
	return {
		addOpenListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'mouseover', this.handleMouseover, this);
		},
		addPollListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'mouseout', this.handleMouseout, this);
		},
		addOverListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'mouseover', this.setOver, this);
		},
		addCloseListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'mouseout', this.handleMouseout, this);
		},
		addOpenClickListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'click', this.handleMouseover, this);
		},
		addPollClickListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'click', this.handleMouseout, this);
		},
		addOverClickListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'click', this.setOver, this);
		},
		addCloseClickListener : function(elId) {
			YAHOO.util.Event.addListener(elId, 'click', this.doCloseWin, this);
		},
		setOffsets : function(topOffset, horizOffset) {
			to = topOffset;
			ho = horizOffset;
		},
		doCloseWin : function(e, obj) {
			obj.hideWin();
		},
		handleMouseover : function(e, obj) {
			
			YAHOO.util.Event.preventDefault(e);
			YAHOO.util.Event.stopPropagation(e);
			if (el) {
				isOver = false;
				isNewFlyout = true;
				obj.hideWin();
			}
			obj.setEl(this.id);
			obj.showWin(e, this);
		},
		showWin : function(e, o) {
			var l = document.getElementById(el + '_pop');
			if (document.getElementById(el + '_img')) {
				var im = document.getElementById(el + '_img');
				im.src = o.href;
			}
			var anchor = document.getElementById(el + '_pop_anchor');
			if (e.clientX > (YAHOO.util.Dom.getViewportWidth() / 2)) {
				var tmpLeftCoord = YAHOO.util.Dom.getX(anchor) + ho;
				var oWidth = l.offsetWidth;
				if (tmpLeftCoord + oWidth >= YAHOO.util.Dom.getViewportWidth() || (!isSingleColMode || o.id.indexOf('twoColMode') > 0)) {
					l.style.left = YAHOO.util.Dom.getX(anchor) - anchor.offsetWidth - (l.offsetWidth - 2 * anchor.offsetWidth) + "px";
				} else {
					l.style.left = tmpLeftCoord + "px";
				}
				l.style.top = this.setTop(l, anchor);
			} else {
				l.style.left = YAHOO.util.Dom.getX(anchor) + ho + "px";
				l.style.top = this.setTop(l, anchor);
			}
		},
		setTop : function(l, anchor) {
			var top = YAHOO.util.Dom.getY(anchor) + to;
			if ((top + l.offsetHeight) > YAHOO.util.Dom.getClientRegion().bottom) {
				return (top - l.offsetHeight) + 'px';
			} else {
				return top + 'px';
			}
		},
		handleMouseout : function(e, obj) {
			isNewFlyout = false;
			obj.checkMouseout(e, obj);
		},
		hideWin : function() {
			var l = document.getElementById(el + '_pop')
			l.style.left = "-4000px";
		},
		setEl : function(id) {
			el = id;
		},
		setOver : function() {
			isOver = true;
		},
		poll : function() {
			var obj = this;
			if (!obj.isPolling) {
				obj.isPolling = true;
				setTimeout(function() {
					obj.isPolling = false;
					if (!isOver && !isNewFlyout) {
						obj.hideWin();
					} else {
						return true;
					}
				}, 2000);
			}
		},
		checkMouseout : function(e, o) {
			if (e.toElement && e.toElement != o) {
				isOver = false;
				this.poll();
			} else if (e.target && e.target != o) {
				isOver = false;
				this.poll();
			} else if (MOLECULAR.util.CBEvent.isInTarget(e, this)) {
				isOver = true;
				return true;
			} else {
				isOver = false;
				this.poll();
			}
		},
		setPosition : function(o) {
			var p = o.parentNode;
			var g = p.parentNode;
			while (g.tagName.toLowerCase() != 'body') {
				p = g;
				g = p.parentNode;
			}
			p.style.position = 'relative';
			p.style.zIndex = '999';
		},
		setSingleColumnMode : function(mode) {
			isSingleColMode = mode;
		}
	}
}();