(function($){
	$.fn.tooltip = function(options) {
		var defaults = {  
			positionToMouse:false,
			tipMarginFromElement : 10,
			tipMarginFromWindow : 10,
			loadDelay:100,
			url:'',
			params:'',
			loadingGif:'/templates/v2.1/images/tooltip/loading.gif',
			cacheData:true,
			autoClose:true,
			developeMod:false,
			changeParam:'',
			arrow:true,
			arrowMargin:8,
			tipData:''
		};       
   	var options = $.extend(defaults, options);
   	
   	var element = $(this);
   	var elementTitle = element.attr('title');
   	var elementTop = 0;
   	var elementLeft = 0;
   	var elementWidth = 0;
   	var elementHeight = 0;
   	
   	var tipActive = false;   	
   	var tipWidth = 0;
   	var tipHeight = 0;
   	var tipLeft = 0;
   	var tipTop = 0;
   	
   	if(options.tipData == ''){
   		var tipData = '';
   	}
   	else{
   		var tipData = options.tipData;
   	}
   	   	
   	var tipDeal = -1;
   	var tipArrow = '';
   	
   	var wWidth = $(window).width();
   	var wHeight = $(window).height();
   	var wScrollTop = $(window).scrollTop();
   	var wScrollLeft = $(window).scrollLeft();
   	
   	var mouseEvent = "";

   	element.attr('title','');
   	$(element).bind('mouseover',function(e){
   		mouseEvent = e;
   		delayTime = setTimeout(init,options.loadDelay); 
   	});
   	
 		$(element).bind('mouseout',function(e){
 			clearTimeout(delayTime);
 			if(options.autoClose && !options.developeMod){
 				removeTooltip(e);
 			}
 		});
   	
   	
   	$(window).scroll(function () { 
	    wScrollTop = $(window).scrollTop();
	   	wScrollLeft = $(window).scrollLeft(); 
    });
    $(window).resize(function(){
			wWidth = $(window).width();
	   	wHeight = $(window).height();
		});



//----------------------------------------------------------------------------------------------------------------------   	
   	function init(){
   		tipActive = true;
   		showLoading(mouseEvent);   		
   		setElementOffset(mouseEvent);
   		buildTooltip();
   		if(tipData == ''){
   			getData();
   		}
   		else{
				$('#tooltipContent').html(tipData);
		  	createTip();
   		}
   	}
//----------------------------------------------------------------------------------------------------------------------
   	function showLoading(e){
   		$("BODY").append('<img src="loading.gif" id="tooltipLoading"/>');
   		$('#tooltipLoading').css({'position':'absolute','top':e.pageY + options.tipMarginFromElement,'left':e.pageX + options.tipMarginFromElement});
   		$(element).bind('mousemove',function(e){
   			$('#tooltipLoading').css({'top':e.pageY + options.tipMarginFromElement,'left':e.pageX + options.tipMarginFromElement});
   		});
   	}
//----------------------------------------------------------------------------------------------------------------------
   	function removeLoading(){
   		$('#tooltipLoading').remove();
   	}
//----------------------------------------------------------------------------------------------------------------------
   	function createTip(){
   		setSize();
   		setTipPosition(getTipPosition());
   		setArrowPosition();
   		if(options.positionToMouse){
   			$(element).bind('mousemove',function(e){moveToMouse(e)});
   		}
   		removeLoading();
   		showTip();
   	}
//----------------------------------------------------------------------------------------------------------------------
   	function showTip(){
   		$('#tooltipContainer').fadeIn("fast");
   	}
//----------------------------------------------------------------------------------------------------------------------
   	function setTipPosition(posArray){
   		tipLeft = posArray.left;
   		tipTop = posArray.top;
   		$('#tooltipContainer').css({'top':posArray.top+'px','left':posArray.left+'px'});
   	}
//----------------------------------------------------------------------------------------------------------------------
   	function moveToMouse(e){
   		if(tipActive){
   			setElementOffset(e);
   			setTipPosition(getTipPosition());
   			setArrowPosition();   			
   		}
   	}
//beállítja a tip méretét----------------------------------------------------------------------------
   	function setSize(){
   		tipWidth = $('#tooltipContainer').outerWidth();
   		tipHeight = $('#tooltipContainer').outerHeight();
   	}
//beállítja az elempozicióját vagy az egérét----------------------------------------------------------------------------   
   	function setElementOffset(e){
   		if(options.positionToMouse){
   			elementTop = e.pageY;
   			elementLeft = e.pageX;
   		}
   		else{
	   		elementTop = element.offset().top;
	   		elementLeft = element.offset().left;
	   		elementWidth = element.outerWidth();
	   		elementHeight = element.outerHeight();
   		}
   	}
//lekéri az adatokat a szervetől----------------------------------------------------------------------------
		function getData(){
			$.ajax({
				type: 'post',
			  url: options.url,
			  data: options.params,
			  success: function(msg){
			  	$('#tooltipContent').html(msg);
			  	createTip();
			  	if(options.cacheData)
			  		tipData = msg;
			  }
			});
		}
//összeállítja a tip html kódját----------------------------------------------------------------------------   	
		function buildTooltip(){
			$('#tooltipContainer').remove();
				$("BODY").append(	'<div id="tooltipContainer" style="display:none">'+
														'<div id="tooltipHead" class="clearfix">'+
															'<div id="tooltipHeadLeft"></div>'+'<div id="tooltipHeadRight"></div>'+
														'</div>'+
														'<div id="tooltipContentContainer">'+
															'<div id="tooltipContent"></div>'+	
														'</div>'+												
														'<div id="tooltipFoot">'+
															'<div id="tooltipFootLeft"></div>'+'<div id="tooltipFootRight"></div>'+
														'</div>'+											
													'</div>'
												);
												
			if((!options.autoClose || options.developeMod) && !$('.toolTipClose',$('#tooltipHeadRight')).length){
				$('#tooltipHeadRight').append('<a href="#" class="toolTipClose"></a>');
				$('.toolTipClose').each(function(){
					$(this).click(function(){
						removeTooltip();
						return false;
					})
				});
				
				$(document).click(function(e){
					if($(e.target).parents('div#tooltipContainer').length == 0){
						removeTooltip();
					}
				});
			}
			
			if(options.arrow && !$('#tooltipArrow',$('#tooltipContainer')).length){
				$('#tooltipContainer').append('<div id="tooltipArrow"></div>');
			}
			
			if(options.developeMod){
				$('#tooltipContent').click(function(){
					changeTextarea();
				});
			}
		}
//A szöveget textareára cseréli és a mentés elküldése----------------------------------------------------------------------------		
		function changeTextarea(){
			if($('#tooltipTextarea').length == 0){
				$('#tooltipContent').html('<textarea id="tooltipTextarea" style="height:'+ $('#tooltipContent').height() +'px;width:'+ $('#tooltipContent').width() +'px">'+ $('#tooltipContent').html() +'</textarea><a href="#" id="tooltipTextareaSending">Mentés</a>');
				$('#tooltipTextareaSending').click(function(){
					$.ajax({
						type: 'post',
					  url: options.url,
					  data: options.changeParams + '&value=' + $('#tooltipTextarea').val(),
					  success: function(msg){
					  	
					  }
					});
					$('#tooltipContent').html($('#tooltipTextarea').val());
					setSize();
					setTipPosition(getTipPosition());
					setArrowPosition();
					return false;
				});
			}
		}
//törli a tipet----------------------------------------------------------------------------		
		function removeTooltip(e){
			tipActive = false;
			//element.attr('title',elementTitle);
			$(element).unbind('mousemove',moveToMouse);
			removeLoading();
			$("#tooltipContainer").remove();
		}
//visszaadja a megfelelő poziciót----------------------------------------------------------------------------
		function getTipDeals(){
			var placeRound = new Array(elementTop - wScrollTop,elementLeft - wScrollLeft,wScrollTop + wHeight - elementTop - elementHeight,wScrollLeft + wWidth - elementLeft - elementWidth); 	
			//console.log(placeRound);
			for (var place in placeRound) {
     		if(place % 2 == 0){
     			if(placeRound[place] >= tipHeight + options.tipMarginFromWindow + options.tipMarginFromElement){
     				return place;
     			}
     		}
     		else{
     			if(placeRound[place] >= tipWidth + (2*options.tipMarginFromElement)){
     				return place;
     			}
     		}
			}
			return 3;
		}
		function getTipPosition(){ 
			tipDeal = getTipDeals();
			///console.log(tipDeal);
			if(tipDeal % 2 == 0){
				if(tipDeal == 0){
					var top = elementTop - options.tipMarginFromElement - tipHeight;
				}
				else{
					var top = elementTop + elementHeight + options.tipMarginFromElement;
				}
				var left = elementLeft + (elementWidth/2) - (tipWidth/2) - options.tipMarginFromWindow;
				if(tipWidth + (2 * options.tipMarginFromWindow) > wWidth || left < wScrollLeft){
					return {'top':top,'left':wScrollLeft + options.tipMarginFromWindow};
   			}
   			if(left + (2 * options.tipMarginFromWindow) + tipWidth > wWidth + wScrollLeft){
   				return {'top':top,'left':wScrollLeft + wWidth - options.tipMarginFromWindow - tipWidth};
   			}
			}
			else{
				if(tipDeal == 1){
					var left = elementLeft - options.tipMarginFromElement - tipWidth;
				}
				else{
					var left = elementLeft + elementWidth + options.tipMarginFromElement;
				}
				var top = elementTop +  (elementHeight / 2) - (tipHeight / 2) - options.tipMarginFromWindow;
				if(tipHeight + (2 * options.tipMarginFromWindow) > wHeight || top < wScrollTop){
					return {'top': wScrollTop + options.tipMarginFromWindow,'left':left};
				}
				if(top + (2 * options.tipMarginFromWindow) + tipHeight > wHeight + wScrollTop){
   				return {'top':wScrollTop + wHeight - options.tipMarginFromWindow - tipHeight,'left':left};
   			}
			}
			return {'top':top,'left':left};
   	}
   	function setArrowPosition(){
   		tipArrow = $('#tooltipArrow',$('#tooltipContainer')); 
   		tipArrow.attr('style','');
   		if(tipArrow.length){   			
   			tipArrow.attr('class','arrow'+tipDeal);
   		}
   		if(tipDeal % 2 == 0){
   			var elementVerticalCenter = elementLeft + (elementWidth/2);
   			if(elementVerticalCenter < tipLeft + options.arrowMargin){
   				tipArrow.css({'left':options.arrowMargin});
   				return
   			}
   			if(elementVerticalCenter > tipLeft + tipWidth - options.arrowMargin){
   				tipArrow.css({'left':tipWidth - options.arrowMargin - parseInt(tipArrow.css('width'))});
   				return;
   			}
   			tipArrow.css({'left':elementVerticalCenter - tipLeft - (parseInt(tipArrow.css('width')) / 2)});
   			return;
   		}
   		else{
   			var elementHorizontalCenter = elementTop + (elementHeight/2);
   			if(elementHorizontalCenter < tipTop + options.arrowMargin){
   				tipArrow.css({'top':options.arrowMargin});
   				return
   			}

   			if(elementHorizontalCenter > tipTop + tipHeight - options.arrowMargin - parseInt(tipArrow.css('height'))){
   				tipArrow.css({'top':tipHeight - options.arrowMargin - parseInt(tipArrow.css('height'))});
   				return;
   			}
   			tipArrow.css({'top':elementHorizontalCenter - tipTop - (parseInt(tipArrow.css('height'))/2)});
   		}
   	}
	}	
})(jQuery);
	
