/*
 * easytip - jQuery Plugin
 * 
 * Copyright (c) 2010 Joachim Doerr
 * Hinderling Volkart AG
 *
 * Version: 1.4
 * Requires: jQuery v1.3+
 *
 */

// easytip('.item',{'animate_to_position':'top'});

(function($){
	easytip = function(items,options) {
		var defaults = {
			animation: true, // false is instant, true is animate.
			show_duration: 110, // how fast must the animation move in milliseconds?
			hide_duration: 110, // how fast must the animation move in milliseconds?
			over_this: 30, // tip hangover initialisator
			multitips: true, // false or true for single- or multitips
			close: "out-item-etip", // out-item, out-item-etip or click-etip, click-button, click-item
			close_button: false, // true or fals by out-item-etip or click-etip or click-item
			etip_content: 'next-div', // next-div, parent-div
			folow_pointer: false, // false or true to folow the pointer
			animate_slideway: 5, // the slide animation distance 0 = not move animation
			animate_opticality: true, // folow or fix top, bottom, left, right
			animate_to_position: 'top', // folow or fix top, bottom, left, right
			animate_from: 'top', // top, bottom, left, right
			animate_to: 'top', // top, bottom, left, right
			tip_class: 'long', // tooltip design
			callback: null // function that executes after every move
		};
		var _items = '-'+items.substring(1);
		var items = $(items);
		var options = $.extend(defaults, options);
		var enumber = get_random(0,20000);
		
		var opticality,animate_to,_from_top,_from_left,_to_top,_to_left,_to_position_top,_to_position_left,animate_to_left,animate_to_top,duration,closetimer,
			easy_tip = 
				'<div class="easytip-tip-wrapper">'+
					'<div class="easytip-top"></div>'+
					'<div class="easytip-top-left-corner"></div>'+
					'<div class="easytip-top-right-corner"></div>'+
					'<div class="easytip-content-inner"></div>'+
					'<div class="easytip-close-button"><a href="#">Close</a></div>'+
					'<div class="easytip-right"></div>'+
					'<div class="easytip-left"></div>'+
					'<div class="easytip-bottom"></div>'+
					'<div class="easytip-bottom-left-corner"></div>'+
					'<div class="easytip-bottom-right-corner"></div>'+
				'</div>';
		
		$('.etip-wrapper').remove();
		$('body').append('<div class="etip-wrapper"></div>');
		
		initialize();
		
		function initialize() {
			items.each(function(index,e) {
				$(this).attr("id",'etip'+ index + _items);
				var item = $('#etip'+ index + _items);
				
				switch (options.etip_content) {
					case 'next-div' :
						var item_content = item.next('.easytip-content:eq(0)');
					break;
					case 'parent-div' :
						var item_content = item.parent().find('.easytip-content:eq(0)');
					break;
				}
				var etips = $('.easytip');
					
				if(jQuery.support.opacity && options.animate_opticality === true && options.animation === true) {
					opticality = 0;
				} else {
					opticality = 1;
				}
				
				$('.etip-wrapper').append('<div class="easytip etip' + index + _items + ' ' + options.tip_class + '" style="display:none;">' + easy_tip + '</div>');
				
				var etip = $('.etip' + index + _items);
				var close_button =$('.etip' + index + _items +' .easytip-close-button').hide();
				if(options.close == "click-button" || options.close_button === true && options.close != "out-item") close_button.show();
				$('.etip' + index + _items +' .easytip-content-inner').html(item_content.html());
				
				return item.hover(function(e) {
					// items.removeClass('hover');
					item.addClass('hover');
					if(!item.hasClass('showit')) {
						var position = get_positions(item,etip,e);
						etip.css({'display':'block','top':position.etip.from_top,'left':position.etip.from_left});
						show_tip(item,etip,e);
						item.click(function() {
						//	return false;
						});
					}
					if(options.close == 'click-item') {
						hideit = false;
						item.click(function() {
							item.removeClass('hover');
							hide_tip(item,etip,e);
							return false;
						});
					} else 
					if(!options.multitips) {
						hide_tips(item,items,e);
					} else {
						// set z-index
					}
				}, function(e) {
					var hideit = true;
					switch (options.close) {
						case 'click-etip' :
							hideit = false;
							etip_button.click(function() {
								item.removeClass('hover');
								hide_tip(item,etip,e);
							});
							if(options.close_button === true) hide_click_button(item,etip,e,close_button);
						case 'click-button' :
							hideit = false;
							hide_click_button(item,etip,e);
						break;
						case 'click-item' :
							hideit = false;
							if(options.close_button === true) hide_click_button(item,etip,e,close_button);
						break;
						case 'out-item-etip' :
							etip.hover(function() {
								etip.addClass('hoverit');
								item.removeClass("hover")
								hideit = false;
								if(options.close_button === true) hide_click_button(item,etip,e,close_button);
							}, function(e) {
								etip.removeClass('hoverit');
								window.setTimeout(function() {
									if(!item.hasClass("hover")) {
										hide_tip(item,etip,e);
									}
								},1);
								
							});
						break;
					}
					if(options.folow_pointer === true) {
						hideit = true;
						item.removeClass('dontmove');
					}
					if(hideit) {
						window.setTimeout(function() {
							if(!etip.hasClass("hoverit")) {
								item.removeClass('hover');
								hide_tip(item,etip,e);
							}
						},1);
					}
				}).mousemove(function(e) {
					// initialize move_tip
					if(options.folow_pointer === true) {
						if(options.close == 'click-item'){
							item.click(function() {
								item.removeClass('hover');
								item.addClass('dontmove');
								hide_tip(item,etip,e);
								return false;
							});
						};
						move_tip(item,etip,e);
					}
				});
			});
		}
		function show_tip(item,etip,e) {
			// display tooltip
			var position = get_positions(item,etip,e);
			if(!item.hasClass('dontmove')) {
				if(options.animation === true) {
					animate_tip(item,etip,'showit',e);
				}
				if(options.animation === false) {
					// dont animate show easy - later...
					if(typeof options.callback == 'function') {
						the_callback(item,etip,'showit',e);
					}
				}
			}
			item.addClass('showit');
			item.addClass('current');
		}
		function hide_tip(item,etip,e) {
			// hidden tooltip
			if(!item.hasClass("hover")) {
				if(options.animation === true) {
					animate_tip(item,etip,'hideit',e);
				}
				if(options.animation === false) {
					// dont animate show easy - later...
					if(typeof options.callback == 'function') {
						the_callback(item,etip,'showit',e);
					}
				}
			}
			item.removeClass('showit');
			item.removeClass('current');
		}
		function hide_tips(item,elements,e){
			for (var i = 0; i < elements.length; i++){
				if($(elements[i]).attr('id')!=item.attr('id')) {
					var element_id = $(elements[i]).attr('id');
					$(elements[i]).removeClass('hover');
					hide_tip($(element_id),$('.' + element_id),e);
				}
			}
		}
		function hide_click_button(item,etip,e,close_button) {
			close_button.click(function() {
				item.removeClass('hover');
				hide_tip(item,etip,e);
				return false;
			});
		}
		function hide_all_tips(elements,e){
			for (var i = 0; i < elements.length; i++){
				var element_id = $(elements[i]).attr('id');
				$(elements[i]).removeClass('hover');
				hide_tip($(element_id),$('.' + element_id),e);
			}
		}
		function move_tip(item,etip,e) {
			var over_this = options.over_this;
			// if(over_this<20) over_this = 20;
			etip.css({top: e.pageY-over_this, left: e.pageX - (etip.width()/2)});
		}
		function animate_tip(item,etip,typ,e){
			var position = get_positions(item,etip,e);
			if(typ == "showit") {
				duration = options.show_duration;
				opticality = 1;
				animate_to_top = position.etip.to_position_top;
				animate_to_left = position.etip.to_position_left;
			} else if(typ == "hideit") {
				duration = options.hide_duration;
				if(jQuery.support.opacity && options.animate_opticality === true) opticality = 0;
				animate_to_top = position.etip.to_top;
				animate_to_left = position.etip.to_left;
			}
			if(jQuery.browser.msie) {
				etip.css({
					'top': animate_to_top,
					'left': animate_to_left,
					'opacity': ''
				});
				if(typ == "hideit") {
					etip.css({'display':'none'});
				}
			} else {
				etip.stop().animate({
					'top': animate_to_top,
					'left': animate_to_left,
					'opacity': opticality
					}, {
					queue: false,
					duration: options.animation ? duration : 0,
					complete: function(){
					//	if(jQuery.browser.msie)
					//		etip.get(0).style.removeAttribute('filter');
						if(typ == "hideit") {
							etip.css({'display':'none'});
						} else {
						
						}
						if(typeof options.callback == 'function') {
							the_callback(item,etip,typ,e);
						}
					}
				});
			}
		}
		function get_positions(item,etip,e) {
			// default position
			var item_position = item.offset();
			var item_dimension = get_dimensions(item);
			var etip_dimension = get_dimensions(etip);
			switch (options.animate_to_position) {
				case 'top' :
					_to_position_top = item_position.top - etip_dimension.height + options.over_this;
					_to_position_left = (item_position.left + item_dimension.half.width)-etip_dimension.half.width;
					etip.addClass('etip-top');
					if(item_position.top < etip_dimension.height) {
						_to_position_top = item_position.top + item_dimension.height - options.over_this;
						etip.removeClass('etip-top');
						etip.addClass('etip-bottom');
					}
				break;
				case 'bottom' :
					_to_position_top = item_position.top + item_dimension.height - options.over_this;
					_to_position_left = (item_position.left + item_dimension.half.width)-etip_dimension.half.width;
					etip.addClass('etip-bottom');
					if($('body').height()-(item_position.top + item_dimension.height) < etip_dimension.height) {
						_to_position_top = item_position.top - etip_dimension.height + options.over_this;
						etip.removeClass('etip-bottom');
						etip.addClass('etip-top');
					}
				break;
				case 'left' :
					_to_position_top = (item_position.top + item_dimension.half.height)-etip_dimension.half.height;
					_to_position_left = item_position.left - etip_dimension.width + options.over_this;
					etip.addClass('etip-left');
					if(item_position.left < etip_dimension.width) {
						_to_position_left = item_position.left + item_dimension.width - options.over_this;
						etip.removeClass('etip-left');
						etip.addClass('etip-right');
					}
				break;
				case 'right' :
					_to_position_top = (item_position.top + item_dimension.half.height)-etip_dimension.half.height;
					_to_position_left = item_position.left + item_dimension.width - options.over_this;
					etip.addClass('etip-right');
					if($('body').width()-(item_position.left + item_dimension.width) < etip_dimension.width) {
						_to_position_left  = item_position.left - etip_dimension.width + options.over_this;
						etip.removeClass('etip-right');
						etip.addClass('etip-left');
					}
				break;
				
			}
			if(options.animate_from == "top") {
				_from_top = _to_position_top - options.animate_slideway;
				_from_left = _to_position_left;
			} else
			if(options.animate_from == "bottom") {
				_from_top = _to_position_top + options.animate_slideway;
				_from_left = _to_position_left;
			}
			if(options.animate_to == "top") {
				_to_top = _to_position_top - options.animate_slideway;
				_to_left = _to_position_left;
			} else 
			if(options.animate_to == "bottom") {
				_to_top = _to_position_top + options.animate_slideway;
				_to_left = _to_position_left;
			}
			if(options.animate_from == "left") {
				_from_top = _to_position_top;
				_from_left = _to_position_left - options.animate_slideway;
			} else
			if(options.animate_from == "right") {
				_from_top = _to_position_top;
				_from_left = _to_position_left + options.animate_slideway;
			}
			if(options.animate_to == "left") {
				_to_top = _to_position_top;
				_to_left = _to_position_left - options.animate_slideway;
			} else 
			if(options.animate_to == "right") {
				_to_top = _to_position_top;
				_to_left = _to_position_left + options.animate_slideway;
			}
			var getpositions = {
				item: {
					top: item_position.top,
					left: item_position.left
					},
				etip: {
					from_top: _from_top,
					from_left: _from_left,
					to_position_top: _to_position_top,
					to_position_left: _to_position_left,
					to_top: _to_top,
					to_left: _to_left
				}
			};
			return getpositions;
		}
		function get_dimensions(element) {
			var getdimensions = {
				width: element.width(),
				height: element.height(),
				half: {
					width: parseInt(element.width()/2),
					height: parseInt(element.height()/2)
				}
			};
			return getdimensions;
		}
		function the_callback(item,etip,typ,e) {
			// later...
		}
		function add_cover(item) {
			// later...
			var item_dimension = get_dimensions(item);
			var item_position = get_positions(item,etip,e);
			$('body').append('<div class="etip_cover" style="display:block;position:absolute;left:' + item_position.item.left + 'px;top:' + item_position.item.top + 'px;width:' + item_dimension.width + 'px;height:' + item_dimension.height + 'px"></div>');
		}
		function remove_cover(item) {
			// later...
		}
		function get_random(min, max) {
			if(min > max) return(-1);
			if(min == max) return(min);
			return(min + parseInt(Math.random() * (max-min+1)));
		}
	};

})(jQuery);
