﻿if (!window.console)
	window.console = {log:function() {}};
	
var PopShift = {
	
	_pops: [],   
	_activePop: null, 
	
	// settings
	appearDuration: 0.3,
	disappearDuration: 0.2, 
	offsetX: -120,
	appearStartY: 0,
	appearMoveY: -20,
	disappearMoveY: -20,
	disappearDelay: 400,
	baseZindex: 20,
	
	attach: function(anchor, info) {
	
		anchor = $(anchor);
		info = $(info);
		
		info.style.position = 'absolute';
		info.style.top = '100px';
		info.style.left = '100px';
		info.style.zIndex = this.baseZindex;
		info.style.visibility = 'visible';
		info.style.display = 'none';
		info.setOpacity(0);
	
		var p = {
			anchor: anchor,
			info: info,
			timeout: null,
			isVisible: false,
			isAppearing: false
		};
		this._pops.push(p);
		
		
		Event.observe(p.anchor,'mouseover',function(e) {
			PopShift.onAnchorOver(p);
		});			 
		Event.observe(p.anchor,'mouseout', function(e) {
			PopShift.onAnchorOut(p);
		});			
		Event.observe(p.info,'mouseover',function(e) {
			PopShift.onInfoOver(p);
		});
		Event.observe(p.info,'mouseout', function(e) {
			PopShift.onInfoOut(p);
		});
		
		//console.log('startup',p);
					   
	},
	
	onAnchorOver: function(p) {
	
		//console.log('over',p);
	
		this.removeTimer(p);
		 
		// fade out others
		for (var i=0; i<this._pops.length; i++) {
			var pp = this._pops[i];
			
			if (pp != p) {
				pp.info.style.zIndex = this.baseZindex+i;
				//console.log('status',pp,'vis:',pp.isVisible,'app',pp.isAppearing);
				if (pp.isVisible || pp.isAppearing) {
					this.disappear(pp);
					//console.log('killing',pp);
				}
			}
		}
		
		if (!p.isVisible && !p.isAppearing) {
			
			this.appear(p);
		}
	},
	
	onAnchorOut: function(p) {
		this.setTimer(p);
	},
	
	onInfoOver: function(p) {
		this.removeTimer(p);
	},
	
	onInfoOut: function(p) {
		this.setTimer(p);
	},
	
	setTimer: function(p) {
		p.timeout = setTimeout(function() {
			PopShift.disappear(p);
			//console.log('timeout',p);
		}, this.disappearDelay);	
	},
	
	removeTimer: function(p) {
		clearTimeout(p.timeout);
		delete p.timeout;
		p.timeout = null;	
	},  
	
	appear: function(p) {
		
		//console.log('appear',p);
				
		// setup item
		var newTop = this.baseZIndex + this._pops.length + 1;
		if (isNaN(newTop))
			newTop = 1000;
		
		
		p.info.setOpacity(0);
		p.info.style.display = '';
		p.info.style.visibility = 'visible';
		p.info.style.zIndex = newTop;	  
		
		// place item
		var anchorPos = p.anchor.cumulativeOffset();
		var infoSize = p.info.getDimensions();		
		p.info.style.top = (anchorPos.top - infoSize.height + this.appearStartY) + 'px';
		p.info.style.left = (anchorPos.left + this.offsetX) + 'px';  
		
		//console.log('pos',anchorPos, 'size', infoSize); 
	   // console.log('t', p.info.style.top, 'l',  p.info.style.left);	  
			
		p.isVisible = false;
		p.isApearing = true;	   
		  
		// do effects
		new Effect.Opacity(p.info,
		   { afterFinish: function() { p.isVisible = true; p.isAppearing = false; },
		   duration: this.appearDuration, 
			transition: Effect.Transitions.linear, 
			from: 0.0, to: 1.0 });
			
		new Effect.MoveBy(p.info, this.appearMoveY, 0,
		{ duration: this.appearDuration, 
			transition: Effect.Transitions.linear});	 

	},
	
	disappear: function(p) {
		this.removeTimer(p);
		
		if (p.info.getStyle('opacity') == 0 || p.info.style.display == 'none')
			return;
		
		p.isVisible = true;
		p.isApearing = false;  
			   
		new Effect.Opacity(p.info,		
		{ 
			afterFinish: function() { p.isVisible = false; p.isAppearing = false; p.info.style.display = 'none';  try { p.info.style.visibility = 'none'; } catch (ex) {} },
			duration: this.disappearDuration, 
			transition: Effect.Transitions.sinoidal, 
			from: 1.0, to: 0.0 });
			
		new Effect.MoveBy(p.info, this.disappearMoveY, 0,
		{ duration: this.disappearDuration, 
			transition: Effect.Transitions.sinoidal});	
			
				 
	}	 
};