/*
 * jQuery ImageTooltip plugin 0.9
 * Edited by Pykaso.net
 */

(function($) {
	
	// the tooltip element
	var helper = {},
		// the current tooltipped element
		current,
		// timeout id for delayed tooltips
		tID,
		// IE 5.5 or 6
		IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
		// flag for mouse tracking
		track = false;
	
	$.ImageTooltip = {
		defaults: {
			delay: 200,
			top: 15,
			left: 15
		}
	};
	
	$.fn.extend({
		ImageTooltip: function(settings) {
			settings = $.extend({}, $.ImageTooltip.defaults, settings);
			createTooltip();
			return this.each(function() {
					this.tSettings = settings;
					$(this).removeAttr("title");
					this.alt = "";
				})
				.hover(save, hide);
		},
		url: function() {
			return this.attr('href') || this.attr('src');
		}
	});


	function createTooltip() {
		// there can be only one tooltip helper
		if( helper.parent )
			return;
		// create the helper, h3 for title, div for url
		helper.parent = $('<div id="tooltip"><div class="body"></div></div>')
			.hide()
			.appendTo('body');		
		// apply bgiframe if available
		if ( $.fn.bgiframe )
			helper.parent.bgiframe();		
		// save references to title and url elements
		helper.body = $('div.body', helper.parent);
	}


	// main event handler to start showing tooltips
	function handle(event) {
		if( this.tSettings.delay )
			tID = setTimeout(show, this.tSettings.delay);
		else
			show();
			
		// update at least once
		update(event);
	}
	
	// save elements title before the tooltip is displayed
	function save() {
		// if this is the current source
		if (this == current){return;}
		current = this;

		if( $(this).attr("href").indexOf('.jpg') > 0 || $(this).attr("href").indexOf('.jpeg') > 0 || $(this).attr("href").indexOf('.gif') > 0 ) {
			var image = new Image();
			image.src = $(this).url();
			helper.body.empty();		
			helper.body.append(image);	
		}
			
		handle.apply(this, arguments);
	}
	
	// delete timeout and show helper
	function show() {
		tID = null;
		helper.parent.show();
		update();
	}
	
	/**
	 * callback for mousemove
	 * updates the helper position
	 * removes itself when no current element
	 */
	function update(event)	{
		
		// stop updating when tracking is disabled and the tooltip is visible
		if ( !track && helper.parent.is(":visible")) {
			$('body').unbind('mousemove', update)
		}
		
		// if no current element is available, remove this listener
		if( current == null ) {
			$('body').unbind('mousemove', update);
			return;	
		}
		var left = helper.parent[0].offsetLeft;
		var top = helper.parent[0].offsetTop;
		if(event) {
			// position the helper 15 pixel to bottom right, starting from mouse position
			left = event.pageX + current.tSettings.left;
			top = event.pageY + current.tSettings.top;
			helper.parent.css({
				left: left + 'px',
				top: top + 'px'
			});
		}
		var v = viewport(),
			h = helper.parent[0];
		// check horizontal position
		if(v.x + v.cx < h.offsetLeft + h.offsetWidth) {
			left -= h.offsetWidth + 20 + current.tSettings.left;
			helper.parent.css({left: left + 'px'});
		}
		// check vertical position
		if(v.y + v.cy < h.offsetTop + h.offsetHeight) {
			top -= h.offsetHeight + 20 + current.tSettings.top;
			helper.parent.css({top: top + 'px'});
		}
	}
	
	function viewport() {
		return {
			x: $(window).scrollLeft(),
			y: $(window).scrollTop(),
			cx: $(window).width(),
			cy: $(window).height()
		};
	}
	
	// hide helper and restore added classes and the title
	function hide(event) {
		if($.ImageTooltip.blocked)
			return;
		// clear timeout if possible
		if(tID)
			clearTimeout(tID);
		// no more current element
		current = null;	
		helper.parent.hide();

	}	
})(jQuery);

