﻿/*
 * jQuery suTip plugin 1.2
 * Copyright (c) 2008 - 2009 SU Web Group / Recep Kocur
 */

;(function($) {
	var helper = {}, current, title, event, load_call = null, load_time = null, load_arguments = null, load_this = null,
	back_click = null, back_obj = null, back_tag = "div,p,span,label,h1,h2,h3,h4,h5,h6,b,i,u,input,button,textarea,hr,table,td,strong",
	img_url = window.location.protocol + '//www.sabanciuniv.edu/jquery/plugins/sutip/i';

	$.sutip = {
		defaults: {
			delay: 500,
			skin: "sutip",
			click: false,
			cache: false,
			position: 12,
			arrowHeight: 10,
			arrowWidth: 20,
			callback: null
		}
	};
	
	$.fn.extend({
		sutip: function(settings) {
			settings = $.extend({}, $.sutip.defaults, settings);
			createHelper(settings);
			if(!settings.click) {
				return this.each(function() {
					$.data(this, "sutip-settings", settings);
					this.tooltipText = this.rel;
				})
				.hover(wait, hide);
				//.click();
			} else if(settings.click) {
				return this.each(function() {
					$.data(this, "sutip-settings", settings);
					this.tooltipText = this.rel;
				})
				.click(open);
			}
		}
	});
	
	function createHelper() {
		if( helper.parent ) return;
		helper.parent = $('<div class="sutip"><img class="sutip-top-arrow" src="'+ img_url +'/sutip-tl-arrow.gif" alt="" style="display:none" /><div class="sutip-body"><\/div><img class="sutip-bottom-arrow" src="'+ img_url +'/i/sutip-bl-arrow.gif" alt="" style="display:none" /><\/div>').appendTo(document.body).hide();
		helper.body = $('div.sutip-body', helper.parent);
		helper.topArrow = $('img.sutip-top-arrow', helper.parent);
		helper.bottomArrow = $('img.sutip-bottom-arrow', helper.parent);
	}
	
	function settings(element) {
		return $.data(element, "sutip-settings");
	}
	
	function wait() {
		if(load_time) {
			clearTimeout(load_time);
			load_this = null;
			load_arguments = null;
		}
		load_this = this;
		load_arguments = arguments;
		load_time = setTimeout(function(){open.apply(load_this, load_arguments)}, settings(this).delay);
	}
	
	function open() {
		if(current && settings(current).click) {
			return false;
		}
		if($(this).hasClass("disabled") || !this.tooltipText) {
			hide(arguments[0]);
			return;
		}

		current = this;
		title = current.tooltipText;
		
		if(!settings(current).click && $(current).attr('rel')=="load") {
			this.onclick = function() { return false; };
		}

		helper.body.html('');
		helper.parent.hide();
		helper.topArrow.hide();
		helper.bottomArrow.hide();
		helper.parent.css('width', '');
		helper.parent.css('height', '');
		helper.parent.css('top', '0');
		helper.parent.css('left', '0');
		helper.parent.removeClass();
		helper.parent.addClass(settings(current).skin);

		// {tag} convert to <tag>
		if(title.match(/{.[^}]*}/)) title = title.replace(/{(.[^}]*)}/g, "<$1>");
		
		if(settings(current).click) {
			helper.body.html('<img class="sutip-close" src="'+ img_url +'/sutip-close.gif" alt="" />' + (title!='load' ? title : ''));
			$('.sutip-close').show();
			$('.sutip-close').click(function() {
				hide(arguments[0]);
			});
		} else {
			helper.body.html(title!='load' ? title : '');
		}

		event = arguments[0];

		if(title == "load") {
			if(load_time != null) {
				clearTimeout(load_time);
			}
			load_time = setTimeout(load_call, (settings(current).click ? 1 : 300));
			load_arguments = arguments;
		} else {
			clearTimeout(load_time);
			load_time = null;
			show.apply(current, arguments);
			// addClass Back click
			helper.parent.addClass("sutip-back-click");
			helper.parent.find(back_tag).each(function() {
				if(!$(this).hasClass("sutip-back-click")) {
					$(this).addClass("sutip-back-click");
				}
			});
			if(settings(current).callback != null) settings(current).callback();
		}

		// Back click to hide
		back_obj = arguments[0];
		back_click = function(event) {
			var $target = $(event.target);
			if(!$target.hasClass("sutip-back-click")) {
				current = null;
				hide(back_obj);
			}
		};
		$(document).bind("click", back_click);

		return false;
	}

	load_call = function() {
		if(current != null) {
			//var href = $(current).attr("ajax");
			var href = current.href;
			if(!settings(current).cache) {
				href = href.indexOf("?")>-1 ? href + "&_=" + now() : href + "?_=" + now();
			}
			$.ajax({
				type: 'GET',
				url: href,
				success: function(html) {
					if(load_time != null && current != null) {
						if(settings(current).click) {
							helper.body.append(html);
							// addClass Back click
							helper.parent.addClass("sutip-back-click");
							helper.parent.find(back_tag).each(function() {
								if(!$(this).hasClass("sutip-back-click")) {
									$(this).addClass("sutip-back-click");
								}
							});
						} else {
							helper.body.html(html);
						}
						show.apply(current, load_arguments);
						if(settings(current).callback != null) settings(current).callback();
					}
				}
			});
		}
	};
	
	function show() {
		var width = helper.parent.width();
		if(settings(current).width) width = settings(current).width;
		var left = helper.parent[0].offsetLeft;
		var top = helper.parent[0].offsetTop;
		var position = "";

		if(event) {
			left = event.pageX;
			top = $(current).offset().top + $(current).height();
		}

		helper.parent.css("width", width + 'px');
		if(settings(current).click) $('.sutip-close').attr("align", "right");
		
		/* Sol veya Sağ */
		if(left + width + settings(current).position > ($(window).scrollLeft() + $(window).width()) && left > width) {
			position = "right";
			helper.parent.css("left", left-width + 'px');
		} else {
			left += settings(current).position;
			position = "left";
			helper.parent.css("left", left + 'px');
		}

		/* Üst veya Alt */
		top += settings(current).position;
		if(top + settings(current).arrowHeight + helper.parent.height() < parseInt($(window).scrollTop() + $(window).height() - 15)) {
			helper.bottomArrow.hide();
			if(position == "left") {
				helper.topArrow.attr("src", img_url +"/" + settings(current).skin + "-tl-arrow.gif");
				helper.topArrow.css("margin-left", '');
			} else {
				helper.topArrow.attr("src", img_url +"/" + settings(current).skin + "-tr-arrow.gif");
				helper.topArrow.css("margin-left", (width-settings(current).arrowWidth) + 'px');
			}
			helper.topArrow.show();
			helper.parent.css("top", top + 'px');
		} else {
			helper.topArrow.hide();
			if(position == "left") {
				helper.bottomArrow.attr("src", img_url +"/" + settings(current).skin + "-bl-arrow.gif");
				helper.bottomArrow.css("margin-left", '');
			} else {
				helper.bottomArrow.attr("src", img_url +"/" + settings(current).skin + "-br-arrow.gif");
				helper.bottomArrow.css("margin-left", (width-settings(current).arrowWidth) + 'px');
			}
			helper.bottomArrow.show();
			helper.parent.css("top", $(current).offset().top-helper.parent.height() + 'px');
		}

		helper.parent.show();
		
		return false;
	}

	// hide helper and restore added classes and the title
	function hide() {
		if(load_time) {
			clearTimeout(load_time);
			load_this = null;
			load_arguments = null;
		}
		if(current && settings(current).click) {
			return false;
		} else {
			$(document).unbind("click", back_click);
			helper.parent.hide();
			current = null;
			return false;
		}
	}
	
	function now() {
		return +new Date;
	}

	$.fn.suTip = $.fn.sutip;
	
})(jQuery);
