/*
 * --------------------------------------------------------------------
 * jQuery-Plugin "easyshow" (UTF-8 編碼)
 * Version: 1.0.0, 6.24.2009
 * by Guan-Ting Chen, fi@livemail.tw
 *
 * Copyright (c) 2009 Guan-Ting Chen
 * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
*/

$.fn.easyshow = function(text, settings) {
	// global variable
	settings = $.extend( {
		trigger 	: 'hover', // click, hover
//		id 			: 'jq-easy-show',
		css 		: '',
		hide 		: 0,
		show 		: 0,
		hide_timer 	: null,
		show_timer 	: null,
		update 		: false,
		offset 		: {
			x 		: 0,
			y		: 0
		},
		hook 		: {
			self 	: 'bottom-center',
			target	: 'top-center'
		},
		fixed 		: true,
		fade 		: true,
		show_callback 	: function () { },
		hide_callback 	: function () { }
	}, settings);
	
	// main function
	return this.each( function() {
		// variable initialize
		var self = $(this);
		var target = $('<div></div>').hide().appendTo(document.body);

		if (false == target.hasClass('jq-easyshow')) {
			target.addClass('jq-easyshow').fadeTo('fast', 0.56);
		}

		if ('' != settings.css && false == target.hasClass(settings.css)) {
			target.addClass(settings.css);
		}
		
		target.html(text);
		
		// main - initialize
		var update_tips_position  = function (self, target) {
			var new_top 		= 0;
			var new_left 		= 0;
			var self_outline 	= { width : self.outerWidth(), height : self.outerHeight() };
			var target_outline 	= { width : target.outerWidth(), height : target.outerHeight() };
			var self_position 	= self.position();
			var target_position = target.position();

			switch (settings.hook.self) {
				case 'top-left':
					new_top = self_position.top;
					new_left = self_position.left;
				break;
				
				case 'middle-left':
					new_top  = self_position.top + self_outline.height / 2;
					new_left = self_position.left;
				break;
				
				case 'bottom-left':
					new_top = self_position.top + self_outline.height;
					new_left = self_position.left;
				break;
				
				case 'top-center':
					new_top = self_position.top;
					new_left = self_position.left + self_outline.width / 2;
				break;
				
				case 'middle-center':
					new_top  = self_position.top + self_outline.height / 2;
					new_left = self_position.left + self_outline.width / 2;
				break;
				
				case 'bottom-center':
					new_top = self_position.top + self_outline.height;
					new_left = self_position.left + self_outline.width / 2;
				break;
				
				case 'top-right':
					new_top = self_position.top;
					new_left = self_position.left + self_outline.width;
				break;
				
				case 'middle-right':
					new_top  = self_position.top + self_outline.height / 2;
					new_left = self_position.left + self_outline.width;
				break;
				
				case 'bottom-right':
					new_top = self_position.top + self_outline.height;
					new_left = self_position.left + self_outline.width;
				break;
			}
			
			switch (settings.hook.target) {
				case 'top-left':
					//new_top -= 0;
					//new_left -= 0;
				break;
				
				case 'middle-left':
					new_top  -= target_outline.height / 2;
					//new_left -= 0;
				break;
				
				case 'bottom-left':
					new_top  -= target_outline.height;
					//new_left -= 0;
				break;
				
				case 'top-center':
					//new_top -= 0;
					new_left -= target_outline.width / 2;
				break;
				
				case 'middle-center':
					new_top  -= target_outline.height / 2;
					new_left  -= target_outline.width / 2;
				break;
				
				case 'bottom-center':
					new_top  -= target_outline.height;
					new_left  -= target_outline.width / 2;
				break;
				
				case 'top-right':
					//new_top -= 0;
					new_left -= target_outline.width;
				break;
				
				case 'middle-right':
					new_top  -= target_outline.height / 2;
					new_left  -= target_outline.width;
				break;
				
				case 'bottom-right':
					new_top  -= target_outline.height;
					new_left  -= target_outline.width;
				break;
			}
			
			new_top 	+= settings.offset.y;
			new_left 	+= settings.offset.x;

			target.css('top', new_top + 'px').css('left', new_left + 'px');
		};

		var show_tips = function () {
			
			if (true == settings.update) {
				target.html(text);
			}
			
			if (true == settings.fixed) {
				update_tips_position(self, target);
			}

			settings.show_callback();
			if (true == settings.fade) {
				target.fadeIn('fast');
			} else {
				target.show();
			}
		};
		
		var hide_tips = function () {
			if (true == settings.fade) {
				target.fadeOut('fast', settings.hide_callback);
			} else {
				target.hide();
				settings.hide_callback();
			}
		};
		
		if (false == settings.fixed) {
			self.bind('mousemove', function (event) {
				var new_top 	= event.pageY;
				var new_left 	= event.pageX;
				var target_outline 	= { width : target.outerWidth(), height : target.outerHeight() };

				switch (settings.hook.target) {
					case 'top-left':
						//new_top -= 0;
						//new_left -= 0;
					break;
					
					case 'middle-left':
						new_top  -= target_outline.height / 2;
						//new_left -= 0;
					break;
					
					case 'bottom-left':
						new_top  -= target_outline.height;
						//new_left -= 0;
					break;
					
					case 'top-center':
						//new_top -= 0;
						new_left -= target_outline.width / 2;
					break;
					
					case 'middle-center':
						new_top  -= target_outline.height / 2;
						new_left  -= target_outline.width / 2;
					break;
					
					case 'bottom-center':
						new_top  -= target_outline.height;
						new_left  -= target_outline.width / 2;
					break;
					
					case 'top-right':
						//new_top -= 0;
						new_left -= target_outline.width;
					break;
					
					case 'middle-right':
						new_top  -= target_outline.height / 2;
						new_left  -= target_outline.width;
					break;
					
					case 'bottom-right':
						new_top  -= target_outline.height;
						new_left  -= target_outline.width;
					break;
				}
				
				new_top 	+= settings.offset.y;
				new_left 	+= settings.offset.x;

				target.css('top', new_top + 'px').css('left', new_left + 'px');
			});
		}

		self.bind('mouseover', function (event) {
			clearInterval(settings.hide_timer);
			settings.show_timer = setInterval( function () {						 
				show_tips();
				clearInterval(settings.show_timer);
			}, settings.show);
		});

		self.bind('mouseout', function (event) {
			clearInterval(settings.show_timer);
			settings.hide_timer = setInterval( function () {
				hide_tips();
				clearInterval(settings.hide_timer);
			}, settings.hide);
		});
		
		target.bind('mouseover', function (event) {
			self.trigger('mouseover');
		});
		
		target.bind('mouseout', function (event) {
			self.trigger('mouseout');
		});
	});

};

