(function($){
function maybeCall(thing, ctx){
return (typeof thing=='function') ? (thing.call(ctx)):thing;
};
function isElementInDOM(ele){
while (ele=ele.parentNode){
if(ele==document) return true;
}
return false;
};
function Tipsy(element, options){
this.$element=$(element);
this.options=options;
this.enabled=true;
this.fixTitle();
};
Tipsy.prototype={
show: function(){
var title=this.getTitle();
if(title&&this.enabled){
var $tip=this.tip();
$tip.find('.tipsy-inner')[this.options.html ? 'html':'text'](title);
$tip[0].className='tipsy';
$tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
var pos=$.extend({}, this.$element.offset(), {
width: this.$element[0].offsetWidth,
height: this.$element[0].offsetHeight
});
var actualWidth=$tip[0].offsetWidth,
actualHeight=$tip[0].offsetHeight,
gravity=maybeCall(this.options.gravity, this.$element[0]);
var tp;
switch (gravity.charAt(0)){
case 'n':
tp={top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
break;
case 's':
tp={top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
break;
case 'e':
tp={top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
break;
case 'w':
extra_gap=0;
if($('body').css('position').length > 0&&$('body').css('position')=='relative'){
if($('#wpadminbar').length){
extra_gap=$('#wpadminbar').height();
}}
tp={top: pos.top + pos.height / 2 - actualHeight / 2 - extra_gap, left: pos.left + pos.width + this.options.offset};
break;
}
if(gravity.length==2){
if(gravity.charAt(1)=='w'){
tp.left=pos.left + pos.width / 2 - 15;
}else{
tp.left=pos.left + pos.width / 2 - actualWidth + 15;
}}
$tip.css(tp).addClass('tipsy-' + gravity);
$tip.find('.tipsy-arrow')[0].className='tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
if(this.options.className){
$tip.addClass(maybeCall(this.options.className, this.$element[0]));
}
if(this.options.fade){
$tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
}else{
$tip.css({visibility: 'visible', opacity: this.options.opacity});
}}
},
hide: function(){
if(this.options.fade){
this.tip().stop().fadeOut(function(){ $(this).remove(); });
}else{
this.tip().remove();
}},
fixTitle: function(){
var $e=this.$element;
if($e.attr('title')||typeof($e.attr('original-title'))!='string'){
$e.attr('original-title', $e.attr('title')||'').removeAttr('title');
}},
getTitle: function(){
var title, $e=this.$element, o=this.options;
this.fixTitle();
var title, o=this.options;
if(typeof o.title=='string'){
title=$e.attr(o.title=='title' ? 'original-title':o.title);
}else if(typeof o.title=='function'){
title=o.title.call($e[0]);
}
title=('' + title).replace(/(^\s*|\s*$)/, "");
return title||o.fallback;
},
tip: function(){
if(!this.$tip){
this.$tip=$('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
this.$tip.data('tipsy-pointee', this.$element[0]);
}
return this.$tip;
},
validate: function(){
if(!this.$element[0].parentNode){
this.hide();
this.$element=null;
this.options=null;
}},
enable: function(){ this.enabled=true; },
disable: function(){ this.enabled=false; },
toggleEnabled: function(){ this.enabled = !this.enabled; }};
$.fn.tipsy=function(options){
if(options===true){
return this.data('tipsy');
}else if(typeof options=='string'){
var tipsy=this.data('tipsy');
if(tipsy) tipsy[options]();
return this;
}
options=$.extend({}, $.fn.tipsy.defaults, options);
function get(ele){
var tipsy=$.data(ele, 'tipsy');
if(!tipsy){
tipsy=new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
$.data(ele, 'tipsy', tipsy);
}
return tipsy;
}
function enter(){
var tipsy=get(this);
tipsy.hoverState='in';
if(options.delayIn==0){
tipsy.show();
}else{
tipsy.fixTitle();
setTimeout(function(){ if(tipsy.hoverState=='in') tipsy.show(); }, options.delayIn);
}};
function leave(){
var tipsy=get(this);
tipsy.hoverState='out';
if(options.delayOut==0){
tipsy.hide();
}else{
setTimeout(function(){ if(tipsy.hoverState=='out') tipsy.hide(); }, options.delayOut);
}};
if(!options.on) this.each(function(){ get(this); });
if(options.trigger!='manual'){
var eventIn=options.trigger=='hover' ? 'mouseenter':'focus',
eventOut=options.trigger=='hover' ? 'mouseleave':'blur';
if(options.on)
$(document).on(eventIn, this.selector, enter).on(eventOut, this.selector, leave);
else
this.on(eventIn, enter).on(eventOut, leave);
}
return this;
};
$.fn.tipsy.defaults={
className: null,
delayIn: 0,
delayOut: 0,
fade: false,
fallback: '',
gravity: 'n',
html: false,
live: false,
offset: 0,
opacity: 0.8,
title: 'title',
trigger: 'hover'
};
$.fn.tipsy.revalidate=function(){
$('.tipsy').each(function(){
var pointee=$.data(this, 'tipsy-pointee');
if(!pointee||!isElementInDOM(pointee)){
$(this).remove();
}});
};
$.fn.tipsy.elementOptions=function(ele, options){
return $.metadata ? $.extend({}, options, $(ele).metadata()):options;
};
$.fn.tipsy.autoNS=function(){
return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's':'n';
};
$.fn.tipsy.autoWE=function(){
return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e':'w';
};
$.fn.tipsy.autoBounds=function(margin, prefer){
return function(){
var dir={ns: prefer[0], ew: (prefer.length > 1 ? prefer[1]:false)},
boundTop=$(document).scrollTop() + margin,
boundLeft=$(document).scrollLeft() + margin,
$this=$(this);
if($this.offset().top < boundTop) dir.ns='n';
if($this.offset().left < boundLeft) dir.ew='w';
if($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew='e';
if($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns='s';
return dir.ns + (dir.ew ? dir.ew:'');
}};})(jQuery);