/***
 * toolTipBlock class - display tooltip from one given div id when mouse is over another given div id,
 * 						it triggers mouse action 'mouseover', 'mousemove', 'mouseout' on given div id,
 * 						needs Prototype 1.6 to work.
 *
 * @version: 1.0
 * @author: Blazej (b.sutkowski@tsi-solutions.pl)
 *
 * Effects:
 * - fade (sets style opacity from 0 to 1)
 * - slide (sets style height from 0% to 100%)
 * - instant (instantly shows the tooltip div)
 *
 * @example:
 * Instant display:
 * var tooltip = new toolTipBlock();
 * tooltip.addToolTip('TriggerDivId', 'ToolTipDivId', '10', '20', 'float', ['instant']);
 *
 * Slide effect:
 * var tooltip = new toolTipBlock();
 * tooltip.addToolTip('TriggerDivId', 'ToolTipDivId', '10', '20', 'float', [ ['slide', ['1.0', '1']] ]);
 *
 * Fade effect:
 * var tooltip = new toolTipBlock();
 * tooltip.addToolTip('TriggerDivId', 'ToolTipDivId', '10', '20', 'float', [ ['fade', ['0.5', '0.1']] ]);
 *
 * Both effects:
 * var tooltip = new toolTipBlock();
 * tooltip.addToolTip('TriggerDivId', 'ToolTipDivId', '10', '20', 'float', [ ['fade', ['0.5', '0.1']], ['slide', ['1.0', '1']] ]);
 *
 * @params:
 * 		'TriggerDivId' - div which trigger tooltip when mouse on it
 * 		'ToolTipDivId' - div with tooltip content
 * 		'10' - pixels from left (cursor or the trigger div)
 * 		'20' - pixels from top (cursor or the trigger div)
 * 		'float' - type of tooltip (float or fixed)
 * 		['instant'] - effect on tooltip (fade, slide, (fade and slide), instant)
 *
 * 		['fade', ['0.5', '0.1']] => ['effect type', ['time in seconds', 'step']]
 * 		['slide', ['1.0', '1']] => ['effect type', ['time in seconds', 'step']]
 *
 */
var toolTipBlockWithEffects = Class.create({

    initialize: function()
    {
		//not used atm (deprecated)
		//document.onmousemove = this.getMouseXY;
    },

    getMouseXY: function(e)
    {
    	//not used atm (deprecated)
    	var IE = document.all?true:false;
    	if (!IE){ document.captureEvents(Event.MOUSEMOVE); }

    	var tempLeft = 0;
		var tempTop = 0;

    	if (IE) { // grab the x-y pos if browser is IE
    		var de = document.documentElement;
    		var bdy = document.body;

    		tempLeft = event.clientX + (de.scrollLeft || bdy.scrollLeft) - (de.clientLeft || 0);
    		tempTop = event.clientY + (de.scrollTop || bdy.scrollTop) - (de.clientTop || 0);
    	}
    	else {  // grab the x-y pos if browser is not IE
    		tempLeft = e.pageX;
    		tempTop = e.pageY;
    	}

    	if (tempLeft < 0){tempLeft = 0;}
    	if (tempTop < 0){tempTop = 0;}

    	window.leftPosition = tempLeft;
    	window.topPosition = tempTop;
    	return true;
    },



    //displaying tooltip when activate 'mouseover' action
	showToolTip: function(event)
	{
    	var elemPos = $(this.triggerID).cumulativeOffset();
    	var posLeft = elemPos[0];
    	var posTop = elemPos[1];
    	var X = (posLeft + this.leftDistance).toString();
		var Y = (posTop + this.topDistance).toString();
		var toolID = this.tooltipID;



	   	if (typeof($(toolID)) == "object")
	   	{
	   		if ($(toolID) != null)
	   		{
	   			//not displaying the alt when tooltip is on, IE7 problem.
	   			document.getElementById(toolID).alt="";

	   			//fade effect
	   			if(this.setFadeEffect == 'yes' && this.fadeTime != '' && this.fadeStep != '')
	   			{
	   				this.fadeEffect(toolID, this.fadeTime, this.fadeStep);
	   			}else{
	   				$(toolID).setStyle({opacity: '1'});
	   			}

	   			//slide effect
	   			if(this.setSlideEffect == 'yes' && this.slideTime != '' && this.slideStep != '')
	   			{
	   				this.slideEffect(toolID, this.slideTime, this.slideStep);
	   			}else{
	   				$(toolID).setStyle({height: '100%'});
	   			}

	   			//instant effect
	   			if(this.setInstantEffect == 'yes')
	   			{
	   				this.instantEffect(toolID);
	   			}

	   			if(this.type != 'float')
	   			{
	   				$(toolID).setStyle({left: X+'px', top: Y+'px'});
	   			}

	   		}
	   	}
	},

	//displaying tooltip when activate 'mousemove' action
	moveToolTip: function(event)
	{
		var posLeft = Event.pointerX(event);
    	var posTop = Event.pointerY(event);

    	var X = (posLeft + this.leftDistance).toString();
		var Y = (posTop + this.topDistance).toString();
		var toolID = this.tooltipID;

	   	if (typeof($(toolID)) == "object")
	   	{
	   		if ($(toolID) != null)
	   		{
	   			//not displaying the alt when tooltip is on, IE7 problem.
	   			document.getElementById(toolID).alt="";
	   			var opacity = $(toolID).getOpacity();

	   			if(opacity == '0' || opacity == 0 || this.loop != 'off')
	   			{
	   				//fade effect
	   				if(this.setFadeEffect == 'yes' && this.fadeTime != '' && this.fadeStep != '')
		   			{
		   				this.fadeEffect(toolID, this.fadeTime, this.fadeStep);
		   			}else{
		   				$(toolID).setStyle({opacity: '1'});
		   			}

	   				//slide effect
		   			if(this.setSlideEffect == 'yes' && this.slideTime != '' && this.slideStep != '')
		   			{
		   				this.slideEffect(toolID, this.slideTime, this.slideStep);
		   			}else{
		   				$(toolID).setStyle({height: '100%'});
		   			}

		   			//instant effect
		   			if(this.setInstantEffect == 'yes')
		   			{
		   				this.instantEffect(toolID);
		   			}

	   			}else{
	   				$(toolID).setStyle({display: 'block', visibility: '', zIndex: '9999'});
	   			}

	   			$(toolID).setStyle({left: X+'px', top: Y+'px'});
	   		}
	   	}
	},

	//hiding tooltip when activate 'mouseout' action
	hideToolTip: function(event)
    {
    	if (typeof($(this.tooltipID)) == "object")
    	{
    		if ($(this.tooltipID) != null)
    		{
    			this.loop = 'on';
    			$(this.tooltipID).setStyle({display: 'none', visibility: 'hidden'});
    		}
    	}
    },

    //fade effect
    fadeEffect: function(toolID, timeToGo, stepToGo)
    {
    	$(toolID).setStyle({display: 'block', visibility: '', zIndex: '9999', opacity: '0'});

    	var totalTimeNum = (10/timeToGo);

    	function divFadeIn(opacity, time)
		{
			$(toolID).setOpacity(opacity);
			this.loop = 'off';
		}

    	for(i=0; i<=10; i++)
       	{
			var time = (i/totalTimeNum);
			var opacity = (i*stepToGo);
			divFadeIn.delay(time, opacity, time);
			if(i > 9) { this.loop = 'off'; }
       	}
    },

    //slide effect
    slideEffect: function(toolID, timeToGo, stepToGo)
    {
    	$(toolID).setStyle({display: 'block', visibility: '', zIndex: '9999', height: '0%'});

    	//console.info('toolID: '+toolID+' | timeToGo: '+timeToGo+' | stepToGo: '+stepToGo);

    	var stepToGoInt = parseInt(stepToGo);
    	var totalTimeNum = (100/timeToGo);
    	var add = (100%stepToGoInt);

    	//console.warn('stepToGoInt: '+stepToGoInt+' | totalTimeNum: '+totalTimeNum+' | add: '+add);

    	function divHeightBigger(i, time)
    	{
			$(toolID).setStyle({height: i+'%'});
			this.loop = 'off';
		}

    	for(i=0; i<=(101+add); i+=stepToGoInt)
       	{
			var time = (i/totalTimeNum);
			var dimension = i;
			divHeightBigger.delay(time, dimension, time);
			if(i > (100+add)) { this.loop = 'off'; }
       	}
    },

    //instant effect
    instantEffect: function(toolID)
    {
    	$(toolID).setStyle({display: 'block', visibility: '', zIndex: '9999', opacity: '1', height: '100%'});
    },

    //setting startup parameters
	setParams: function(left, top, type, effects)
    {
		if(left != undefined && left != null){ leftDist = left; }else{ leftDist = '10'; }
		if(top != undefined && top != null){ topDist = top; }else{ leftDist = '20'; }
		this.leftDistance = parseInt(leftDist);
		this.topDistance = parseInt(topDist);
		this.type = type;

		if(effects.length > 0)
		{
			for(i=0; i<effects.length; i++)
			{
				if(effects[i] == 'instant')
				{
					this.setInstantEffect = 'yes';

				}else{

					var name = effects[i][0];
					var time = effects[i][1][0];
					var step = effects[i][1][1];
					if(name == 'fade')
					{
						this.setFadeEffect = 'yes';
						this.fadeTime = time;
						this.fadeStep = step;
					}
					if(name == 'slide')
					{
						this.setSlideEffect = 'yes';
						this.slideTime = time;
						this.slideStep = step;
					}
				}
			}
		}
    },

    //adding tooltip listiner
	addToolTip: function(triggerID, tooltipID, left, top, type, effects)
	{
    	//setting startup parameters
		this.setParams(left, top, type, effects);

		this.triggerID = triggerID;
		this.tooltipID = tooltipID;

		if(this.type == 'fixed')
		{
			//not moving after mouse cursor
			$(this.triggerID).observe('mouseover', this.showToolTip.bind(this));
		}
		else if(this.type == 'float')
		{
			//moving after mouse cursor
			$(this.triggerID).observe('mousemove', this.moveToolTip.bind(this));
		}

		//hide when mouse cursor is out of the element
		$(this.triggerID).observe('mouseout', this.hideToolTip.bind(this));
	}



});
