(function($){
$.fn.qtip=function(options){
if(typeof options=='string'){
if(options=='api')return $(this).eq(0).data('qtip')}
else{
if(!options)options={}
if(typeof options.content !=='object')options.content={text: options.content}
if(typeof options.content.title !=='object')options.content.title={text: options.content.title}
if(typeof options.position !=='object')options.position={corner: options.position}
if(typeof options.position.corner !=='object')options.position.corner={target: options.position.corner,tooltip: options.position.corner}
if(typeof options.show !=='object')options.show={when: options.show}
if(typeof options.show.when !=='object')options.show.when={event: options.show.when}
if(typeof options.show.effect !=='object')options.show.effect={type: options.show.effect}
if(typeof options.hide !=='object')options.hide={when: options.hide}
if(typeof options.hide.when !=='object')options.hide.when={event: options.hide.when}
if(typeof options.hide.effect !=='object')options.hide.effect={type: options.hide.effect}
if(typeof options.style !=='object')options.style={name: options.style}
options.style=sanitizeStyle(options.style)
var opts=$.extend(true,{},$.fn.qtip.defaults,options)
opts.style=buildStyle.call({options: opts},opts.style)
opts.user=$.extend(true,{},options)}
return $(this).each(function(){
if(typeof options=='string'){
switch(options){
case 'show': $(this).data('qtip').show()
break
case 'hide': $(this).data('qtip').hide()
break
case 'focus': $(this).data('qtip').focus()
break
case 'disable': $(this).data('qtip').disable(true)
break
case 'enable': $(this).data('qtip').disable(false)
break
case 'destroy': $(this).data('qtip').destroy()
break}}
else{
var config=$.extend(true,{},opts)
config.hide.effect.length=opts.hide.effect.length
config.show.effect.length=opts.show.effect.length
if(config.position.container===false)config.position.container=$(document.body)
if(config.position.target===false)config.position.target=$(this)
if(config.show.when.target===false)config.show.when.target=$(this)
if(config.hide.when.target===false)config.hide.when.target=$(this)
var obj=new qTip($(this),config)
$(this).data('qtip',obj)}
})}
function qTip(target,options){
var self=this
self.options=options
self.elements={
target: target.addClass(self.options.style.classes.target),
tooltip: null,
wrapper: null,
content: null,
contentWrapper: null,
title: null,
tip: null}
self.mouse={}
self.timers={}
$.extend(self,self.options.api,{
show: function(event){
self.elements.tooltip.stop(true,true)
var returned=self.beforeShow.call(self,event)
if(returned===false)return
function afterShow(){self.onShow.call(self,event);}
if(typeof self.options.show.when.target.data('qtip-toggle')=='number')
self.options.show.when.target.data('qtip-toggle',1)
self.updatePosition(event)
if(typeof self.options.show.solo=='object')var solo=$(self.options.show.solo)
else if(self.options.show.solo===true)var solo=$('div.qtip').not(self.elements.tooltip)
if(solo)solo.each(function(){$(this).qtip('api').hide();})
if(typeof self.options.show.effect.type=='function'){
self.options.show.effect.type.call(self.elements.tooltip,self.options.show.effect.length)
self.elements.tooltip.queue(function(){afterShow();$(this).dequeue();})}
else{
switch(self.options.show.effect.type){
case 'fade':
self.elements.tooltip.fadeIn(self.options.show.effect.length,afterShow)
break
case 'slide':
self.elements.tooltip.slideDown(self.options.show.effect.length,function(){
afterShow()
self.updatePosition(event,true)
})
break
case 'grow':
self.elements.tooltip.show(self.options.show.effect.length,afterShow)
break
default:
self.elements.tooltip.show(null,afterShow)
break}
self.elements.tooltip.addClass(self.options.style.classes.active)}
if(self.options.position.type.search(/(fixed|absolute)/)!==-1)self.focus()
self.onShow.call(self,event)
return self
},
hide: function(event){
clearTimeout(self.timers.show)
self.elements.tooltip.stop(true,true)
var returned=self.beforeHide.call(self,event)
if(returned===false)return false
function afterHide(){self.onHide.call(self,event);}
if(typeof self.options.show.when.target.data('qtip-toggle')=='number')
self.options.show.when.target.data('qtip-toggle',0)
if(typeof self.options.hide.effect.type=='function'){
self.options.hide.effect.type.call(self.elements.tooltip,self.options.hide.effect.length)
self.elements.tooltip.queue(function(){afterHide();$(this).dequeue();})}
else{
switch(self.options.hide.effect.type){
case 'fade':
self.elements.tooltip.fadeOut(self.options.hide.effect.length,afterHide)
break
case 'slide':
self.elements.tooltip.slideUp(self.options.hide.effect.length,function(){
self.updatePosition(event,true)
afterHide()
})
break
case 'grow':
self.elements.tooltip.hide(self.options.hide.effect.length,afterHide)
break
default:
self.elements.tooltip.hide(null,afterHide)
break}
self.elements.tooltip.removeClass(self.options.style.classes.active)}
self.onHide.call(self,event)
return self
},
updatePosition: function(event,animate){
var returned=self.beforePositionUpdate.call(self,event)
if(returned===false)return false
if(self.options.position.target=='mouse'){
var targetPos={left: self.mouse.x,top: self.mouse.y}
var targetLength={height: 1,width: 1}}
else{
if(self.options.position.target.get(0).nodeName=='AREA'){
var coords=self.options.position.target.attr('coords').split(',')
for(var i=0;i<coords.length;i++)coords[i]=parseInt(coords[i])
var mapName=self.options.position.target.parent("map").attr('name')
var imagePos=$('img[usemap="#'+mapName+'"]:first').offset()
var targetPos={
left: Math.floor(imagePos.left+coords[0]),
top: Math.floor(imagePos.top+coords[1])}
switch(self.options.position.target.attr('shape')){
case 'rect':
var targetLength={
width: Math.floor(Math.abs(coords[2]-coords[0])),
height: Math.floor(Math.abs(coords[3]-coords[1]))}
break
case 'circle':
var targetLength={
width: coords[2],
height: coords[2]}
targetPos.left+=coords[2]+2
targetPos.top+=coords[2]+2
break
case 'poly':
var targetLength={
width: coords[0],
height: coords[1]}
for(var i=0;i<coords.length;i++){
if(i % 2==0){
if(coords[i]>targetLength.width)
targetLength.width=coords[i]
if(coords[i]<coords[0])
targetPos.left=Math.floor(imagePos.left+coords[i])}
else{
if(coords[i]>targetLength.height)
targetLength.height=coords[i]
if(coords[i]<coords[1]){
targetPos.top=Math.floor(imagePos.top+coords[i])}}}
targetLength.width=targetLength.width-(targetPos.left-imagePos.left)
targetLength.height=targetLength.height-(targetPos.top-imagePos.top)
break}
targetLength.width-=2
targetLength.height-=2}
else if(self.options.position.target.add(document.body).length !==1){
var targetPos=self.options.position.target.offset()
var targetLength={
height: self.options.position.target.outerHeight(),
width: self.options.position.target.outerWidth()}}
else{
var targetPos={left: $(document).scrollLeft(),top: $(document).scrollTop()}
var targetLength={
height: $(window).height(),
width: $(window).width()}}
var targetCorner=self.options.position.corner.target
if(targetCorner.search(/right/i)!==-1)targetPos.left+=targetLength.width
if(targetCorner.search(/bottom/i)!==-1)targetPos.top+=targetLength.height
if(targetCorner.search(/((top|bottom)Middle)|center/)!==-1)
targetPos.left+=targetLength.width/2
if(targetCorner.search(/((left|right)Middle)|center/)!==-1)
targetPos.top+=targetLength.height/2}
var tooltipCorner=self.options.position.corner.tooltip
if(tooltipCorner.search(/right/i)!==-1)
targetPos.left-=self.elements.tooltip.outerWidth()
if(tooltipCorner.search(/bottom/i)!==-1)targetPos.top-=self.elements.tooltip.outerHeight()
if(tooltipCorner.search(/((top|bottom)Middle)|center/)!==-1)
targetPos.left-=self.elements.tooltip.outerWidth()/2
if(tooltipCorner.search(/((left|right)Middle)|center/)!==-1)
targetPos.top-=(self.elements.tooltip.outerHeight()/2)
targetPos.left+=self.options.position.adjust.x
targetPos.top+=self.options.position.adjust.y
if(self.options.position.adjust.screen)
targetPos=screenAdjust.call(self,targetPos,targetLength,event)
if(self.options.position.target=='mouse'){
targetPos.left+=(self.options.style.tip.corner.search(/right/i)!==-1)?-6 : 6
targetPos.top+=(self.options.style.tip.corner.search(/bottom/i)!==-1)?-6 : 6}
if(animate===true)
self.elements.tooltip.animate({left: targetPos.left,top: targetPos.top},200,'swing')
else
self.elements.tooltip.css({left: targetPos.left,top: targetPos.top})
self.onPositionUpdate.call(self,event)
return self
},
updateWidth: function(newWidth){
if(newWidth&&typeof newWidth !=='number')return
var borderWidth=Math.max(self.options.style.border.width,self.options.style.border.radius)
if(!newWidth){
if(typeof self.options.style.width.value=='number')
var newWidth=self.options.style.width.value
else{
var prevWidth=self.elements.tooltip.outerWidth()
self.elements.tooltip.css({width: 'auto'})
if(($.support&&!$.support.cssFloat)|| $.browser.msie){
self.elements.wrapper.css({position: 'static',zoom: 'normal'})
if(self.elements.tip)self.elements.tip.hide()}
var newWidth=self.elements.tooltip.outerWidth()+(borderWidth*2)+1
if(!self.options.style.width.value){
if(newWidth>self.options.style.width.max)newWidth=self.options.style.width.max
if(newWidth<self.options.style.width.min)newWidth=self.options.style.width.min}}}
if(newWidth % 2 !==0)newWidth-=1
self.elements.tooltip.width(newWidth)
if(self.options.style.border.radius){
self.elements.tooltip.find('.qtip-betweenCorners').each(function(i){
$(this).width(newWidth-(self.options.style.border.radius*2))
})}
if(($.support&&!$.support.cssFloat)|| $.browser.msie){
self.elements.wrapper.css({position: 'relative',zoom: '1'}).width(newWidth)
if(self.elements.tip)self.elements.tip.show()}
return self
},
updateStyle: function(name){
if(typeof name !=='string' || !$.fn.qtip.styles[name])
return debug('No such style is defined')
self.options.style=buildStyle.call(self,$.fn.qtip.styles[name],self.options.user.style)
self.elements.content.css(jQueryStyle(self.options.style))
if(self.options.content.title.text !==false)
self.elements.title.css(jQueryStyle(self.options.style.title,true))
self.elements.contentWrapper.css({borderColor: self.options.style.border.color})
if(self.options.style.tip.corner !==false){
if(document.createElement('canvas').getContext){
var tip=self.elements.tooltip.find('.qtip-tip canvas:first')
var context=tip.get(0).getContext('2d')
context.clearRect(0,0,300,300)
drawTip.call(self,tip,tip.parent('div[rel]:first').attr('rel'),
self.options.style.tip.color || self.options.style.border.color)}
else if(($.support&&!$.support.cssFloat)|| $.browser.msie){
var tip=self.elements.tooltip.find('.qtip-tip [nodeName="shape"]')
tip.attr('fillcolor',self.options.style.tip.color || self.options.style.border.color)}}
if(self.options.style.border.radius>0){
self.elements.tooltip.find('.qtip-betweenCorners').css({backgroundColor: self.options.style.border.color})
if(document.createElement('canvas').getContext){
var borders=calculateBorders(self.options.style.border.radius)
self.elements.tooltip.find('.qtip-wrapper canvas').each(function(){
var context=$(this).get(0).getContext('2d')
context.clearRect(0,0,300,300)
var corner=$(this).parent('div[rel]:first').attr('rel')
drawBorder.call(self,$(this),borders[corner],
self.options.style.border.radius,self.options.style.border.color)
})}
else if(($.support&&!$.support.cssFloat)|| $.browser.msie){
self.elements.tooltip.find('.qtip-wrapper [nodeName="arc"]').each(function(){
$(this).attr('fillcolor',self.options.style.border.color)
})}}
return self
},
updateContent: function(content,reposition){
if(!content)return false
var parsedContent=self.beforeContentUpdate.call(self,content)
if(typeof parsedContent=='string')content=parsedContent
else if(parsedContent===false)return
self.elements.content.html(content)
var images=self.elements.content.find('img')
if(images.length>0){
var loadedImages=0
images.each(function(i){
$('<img src="'+$(this).attr('src')+'" />')
.load(function(){if(++loadedImages==images.length)reposition();})
})}
else reposition()
function reposition(){
self.updateWidth()
if(reposition !==false){
self.updatePosition(self.elements.tooltip.is(':visible'))
if(self.options.style.tip.corner !==false)positionTip.call(self)}}
self.onContentUpdate.call(self)
return self
},
loadContent: function(url,data,method){
var returned=self.beforeContentLoad.call(self)
if(returned===false)return
if(method=='post')
$.post(url,data,setupContent)
else
$.get(url,data,setupContent)
function setupContent(content){
self.updateContent(content)
self.onContentLoad.call(self)}
return self
},
focus: function(event){
var returned=self.beforeFocus.call(self,event)
if(returned===false)return
var baseIndex=6000
var curIndex=parseInt(self.elements.tooltip.css('z-index'))
var newIndex=baseIndex+$('.qtip').length-1
if(curIndex !==newIndex){
$('.qtip').not(self.elements.tooltip).each(function(){
$(this).css({zIndex: parseInt($(this).css('z-index'))-1})
})
self.elements.tooltip.css({zIndex: newIndex})}
self.onFocus.call(self,event)
return self
},
disable: function(state){
if(state){
self.options.show.when.target.unbind('mousemove.qtip',self.updatePosition)
self.options.show.when.target.unbind('mouseout.qtip',self.hide)
self.options.show.when.target.unbind(self.options.show.when.event+'.qtip')
self.options.show.when.target.removeData("qtip-toggle")
self.options.hide.when.target.unbind(self.options.hide.when.event+'.qtip')
self.elements.tooltip.unbind(self.options.hide.when.event+'.qtip')
self.elements.tooltip.unbind('mouseover.qtip',self.focus)}
else assignEvents.call(self)
return self
},
destroy: function(){
var returned=self.beforeDestroy.call(self)
if(returned===false)return
self.disable(true)
self.elements.tooltip.remove()
self.elements.target.removeData("qtip")
self.onDestroy.call(self)
return self.elements.target
},
getPosition: function(){
var show=(!self.elements.tooltip.is(':visible'))? true : false
if(show)self.elements.tooltip.css({visiblity: 'hidden'}).show()
var offset=self.elements.tooltip.offset()
if(show)self.elements.tooltip.css({visiblity: 'visible'}).hide()
return offset}
})
construct.call(self)}
function construct(){
var self=this
function render(event){
self.beforeRender.call({options: self.options,elements:{target: self.elements.target}})
self.elements.tooltip=$(document.createElement('div'))
.addClass('qtip')
.addClass(self.options.style.classes.tooltip || self.options.style)
.css('-moz-border-radius','').css('-webkit-border-radius','')
.css({
position: self.options.position.type,
zIndex: 6000+$('.qtip').length
})
.appendTo(self.options.position.container).hide()
.data('qtip',self)
self.elements.wrapper=$(document.createElement('div'))
.addClass('qtip-wrapper')
.css({
position: 'relative',
overflow: 'hidden',
textAlign: 'left'
})
.appendTo(self.elements.tooltip)
self.elements.contentWrapper=$(document.createElement('div'))
.addClass('qtip-contentWrapper')
.css({overflow: 'hidden'})
.appendTo(self.elements.wrapper)
self.elements.content=$(document.createElement('div'))
.addClass(self.options.style.classes.content)
.css(jQueryStyle(self.options.style))
.appendTo(self.elements.contentWrapper)
if(($.support&&!$.support.cssFloat)|| $.browser.msie){
$(self.elements.wrapper,self.elements.contentWrapper).css({lineHeight: '100%'})
$(self.elements.wrapper).css({zoom: '1'})
if(parseInt($.browser.version.charAt(0))==6){
if($('select, object').length)bgiframe.call(self)
var adjust=(self.options.style.border.radius<6)?-1 :-2
self.elements.content.css({marginTop: adjust})}}
if(typeof self.options.style.width.value=='number')self.updateWidth()
createBorder.call(self)
createTip.call(self)
if(self.options.content.text===false){
var content=self.elements.target.attr('title').replace("\\n",'<br />')
self.elements.target.attr('title','')}
else if(typeof $(self.options.content.text).length>0)
var content=$(self.options.content.text).clone(true)
else var content=self.options.content.text
self.updateContent(content)
if(self.options.content.title.text !==false)createTitle.call(self)
if(self.options.content.url !==false){
var url=self.options.content.url
var data=self.options.content.data
var method=self.options.content.method || 'get'
self.loadContent(url,data,method)}
assignEvents.call(self)
if(self.options.show.ready===true){
var tempLength=self.options.show.effect.length
self.elements.tooltip.show()
self.options.show.effect.length=tempLength}
self.onRender.call(self)}
if(self.options.content.prerender===false
&&self.options.show.when.event !==false
&&self.options.show.ready !==true){
var showTarget=self.options.show.when.target
var showEvent=self.options.show.when.event
showTarget.bind(showEvent+'.qtip-create',function(event){
showTarget.unbind(showEvent+'.qtip-create')
render()
self.mouse={x: event.pageX,y: event.pageY}
showTarget.trigger(event)
})}
else render()}
function createBorder(){
var self=this
self.elements.tooltip.find('.qtip-borderTop, .qtip-borderBottom').remove()
var width=self.options.style.border.width
var radius=self.options.style.border.radius
var color=self.options.style.border.color || self.options.style.tip.color
if(radius===0)
self.elements.contentWrapper.css({border: width+'px solid '+color})
else{
var borders=calculateBorders(radius)
var shapes={}
for(var i in borders){
shapes[i]=$(document.createElement('div'))
.css({
height: radius,
width: radius,
overflow: 'hidden',
position: 'absolute',
lineHeight: 0.1,
fontSize: 1
})
.css((i.search(/Left/)!==-1)? 'left' : 'right',0)
.attr('rel',i)}
if(document.createElement('canvas').getContext){
for(var i in borders){
var canvas=$(document.createElement('canvas'))
.attr('height',radius)
.attr('width',radius)
.css({verticalAlign: 'top'})
.appendTo(shapes[i])
drawBorder.call(self,canvas,borders[i],radius,color)}}
else if(($.support&&!$.support.cssFloat)|| $.browser.msie){
for(var i in borders){
var arc=$('<v:arc style="behavior: url(#default#VML)"></v:arc>')
.attr('stroked',false)
.attr('fillcolor',color)
.attr('startangle',borders[i][0])
.attr('endangle',borders[i][1])
.css({
width: radius*2+3,
height: radius*2+3,
marginLeft:(i.search(/Right/)!==-1)? borders[i][2]-3.5 :-1,
marginTop:(i.search(/bottom/)!==-1)?-2 :-1,
verticalAlign: 'top',
display: 'inline-block'
})
.appendTo(shapes[i])}}
var betweenCorners=$(document.createElement('div'))
.addClass('qtip-betweenCorners')
.css({
height: radius,
width: self.elements.tooltip.outerWidth()-(Math.max(width,radius)*2),
overflow: 'hidden',
backgroundColor: color,
lineHeight: 0.1,
fontSize: 1
})
var borderTop=$(document.createElement('div'))
.addClass('qtip-borderTop')
.css({height: radius,marginLeft: radius,lineHeight: 0.1,fontSize: 1,padding: 0})
.append(shapes['topLeft'])
.append(shapes['topRight'])
.append(betweenCorners)
.prependTo(self.elements.wrapper)
var borderBottom=$(document.createElement('div'))
.addClass('qtip-borderBottom')
.css({height: radius,marginLeft: radius,lineHeight: 0.1,fontSize: 1,padding: 0,clear: 'both'})
.append(shapes['bottomLeft'])
.append(shapes['bottomRight'])
.append(betweenCorners.clone())
.appendTo(self.elements.wrapper)
var sideWidth=Math.max(radius,(radius+(width-radius)))
var vertWidth=Math.max(width-radius,0)
self.elements.contentWrapper.css({
margin: 0,
border: '0px solid '+color,
borderWidth: vertWidth+'px '+sideWidth+'px',
position: 'relative',
clear: 'both'
})}}
function drawBorder(canvas,coordinates,radius,color){
var context=canvas.get(0).getContext('2d')
context.fillStyle=color
context.beginPath()
context.arc(coordinates[0],coordinates[1],radius,0,Math.PI*2,false)
context.fill()}
function createTip(corner){
var self=this
var color=self.options.style.tip.color || self.options.style.border.color
if(self.options.style.tip.corner===false)return
else if(!corner)corner=self.options.style.tip.corner
if(self.elements.tip !==null)self.elements.tip.remove()
$(self.elements.tooltip).find('.'+self.options.style.classes.tip).remove()
self.elements.tip=$(document.createElement('div'))
.addClass(self.options.style.classes.tip)
.css({
width: self.options.style.tip.size.x,
height: self.options.style.tip.size.y,
margin: '0 auto',
lineHeight: 0.1,
fontSize: 1
})
.attr('rel',corner)
if(document.createElement('canvas').getContext){
var canvas=$(document.createElement('canvas'))
.attr('width',self.options.style.tip.size.x)
.attr('height',self.options.style.tip.size.y)
.appendTo(self.elements.tip)
drawTip.call(self,canvas,corner,color)}
else if(($.support&&!$.support.cssFloat)|| $.browser.msie){
var coordinates=calculateTip(corner,self.options.style.tip.size.x,self.options.style.tip.size.y)
var path='m'+coordinates[0][0]+','+coordinates[0][1]
path+=' l'+coordinates[1][0]+','+coordinates[1][1]
path+=' '+coordinates[2][0]+','+coordinates[2][1]
path+=' xe'
$('<v:shape style="behavior: url(#default#VML)"></v:shape>')
.attr('fillcolor',color)
.attr('stroked','false')
.attr('coordsize',self.options.style.tip.size.x+','+self.options.style.tip.size.y)
.attr('path',path)
.css({
width: self.options.style.tip.size.x,
height: self.options.style.tip.size.y,
lineHeight: 0.1,
verticalAlign:(corner.search(/top/)!==-1)? 'bottom' : 'top',
display: 'inline-block'
})
.appendTo(self.elements.tip)
if(($.support&&!$.support.cssFloat)|| $.browser.msie)
self.elements.content.css({position: 'relative'})}
else return debug('Canvas/VML unsupported, cannot draw the tip!')
if(corner.search(/left|top|right/)!==-1)
self.elements.tip.prependTo(self.elements.tooltip)
else
self.elements.tip.appendTo(self.elements.tooltip)
positionTip.call(self,corner)}
function drawTip(canvas,corner,color){
var self=this
var coordinates=calculateTip(corner,self.options.style.tip.size.x,self.options.style.tip.size.y)
var context=canvas.get(0).getContext('2d')
context.fillStyle=color
context.beginPath()
context.moveTo(coordinates[0][0],coordinates[0][1])
context.lineTo(coordinates[1][0],coordinates[1][1])
context.lineTo(coordinates[2][0],coordinates[2][1])
context.fill()}
function positionTip(corner){
var self=this
if(self.options.style.tip.corner===false || !self.elements.tip)return
if(!corner)var corner=self.elements.tip.attr('rel')
var radiusAdjust=self.options.style.border.radius
var pixelAdjust=(($.support&&!$.support.cssFloat)|| $.browser.msie)? 1 : 0
self.elements.tip.css(corner.match(/left|right|top|bottom/)[0],0)
if(corner.search(/top|bottom/)!==-1){
if(corner.search(/Middle/)!==-1){
self.elements.tooltip.css({textAlign: 'center'})}
else if(corner.search(/Left/)!==-1){
self.elements.tip.css({marginLeft: radiusAdjust-pixelAdjust})
self.elements.tooltip.css({marginLeft:-radiusAdjust})}
else if(corner.search(/Right/)!==-1){
self.elements.tip.css({marginLeft: self.elements.tooltip.outerWidth()-self.options.style.tip.size.x-radiusAdjust-pixelAdjust})
self.elements.tooltip.css({marginLeft: radiusAdjust})}
if(($.support&&!$.support.cssFloat)|| $.browser.msie){
if(corner.search(/bottom/)!==-1)
self.elements.tip.css({marginTop:-2})}}
else if(corner.search(/left|right/)!==-1){
if(corner.search(/Middle/)!==-1){
self.elements.tip.css({position: 'absolute',top: "50%",marginTop:-(self.options.style.tip.size.y/2)})}
else if(corner.search(/Top/)!==-1){
self.elements.tip.css({position: 'absolute',top: radiusAdjust-pixelAdjust})
self.elements.tooltip.css({marginTop:-radiusAdjust})}
else if(corner.search(/Bottom/)!==-1){
self.elements.tip.css({position: 'absolute',bottom: radiusAdjust+pixelAdjust})
self.elements.tooltip.css({marginTop: radiusAdjust})}
if(($.support&&!$.support.cssFloat)|| $.browser.msie){
if(corner.search(/left/)!==-1)
self.elements.tip.css({marginLeft:-1})
else
self.elements.tip.css({marginRight: 1})}
var paddingCorner='padding-'+corner.match(/left|right/)[0]
var paddingSize=(paddingCorner.search(/left/)!==-1)? self.options.style.tip.size.x : self.options.style.tip.size.y
if(paddingCorner !=='padding-bottom')self.elements.tooltip.css(paddingCorner,paddingSize-1)}}
function createTitle(){
var self=this
if(self.elements.title !==null)self.elements.title.remove()
self.elements.title=$(document.createElement('div'))
.addClass(self.options.style.classes.title)
.css(jQueryStyle(self.options.style.title,true))
.html(self.options.content.title.text)
.prependTo(self.elements.contentWrapper)
if(self.options.content.title.button !==false
&&typeof self.options.content.title.button=='string'){
var button=$(document.createElement('a'))
.attr('href','#')
.css({'float': 'right',position: 'relative'})
.addClass(self.options.style.classes.button)
.html(self.options.content.title.button)
.prependTo(self.elements.title)
.click(self.hide)}}
function assignEvents(){
var self=this
var showTarget=self.options.show.when.target
var hideTarget=self.options.hide.when.target
if(self.options.hide.fixed)hideTarget=hideTarget.add(self.elements.tooltip)
if(self.options.hide.when.event=='inactive'){
var inactiveEvents=['click','dblclick','mousedown','mouseup','mousemove',
'mouseout','mouseenter','mouseleave','mouseover' ]
function inactiveMethod(){
clearTimeout(self.timers.inactive)
self.timers.inactive=setTimeout(function(){
$(inactiveEvents).each(function(){
hideTarget.unbind(this+'.qtip-inactive')
self.elements.content.unbind(this+'.qtip-inactive')
})
self.hide()}
,self.options.hide.delay)}}
else if(self.options.hide.fixed===true){
self.elements.tooltip.bind('mouseover.qtip',function(){
clearTimeout(self.timers.hide)
})}
function showMethod(event){
if(self.options.hide.when.event=='inactive'){
$(inactiveEvents).each(function(){
hideTarget.bind(this+'.qtip-inactive',inactiveMethod)
self.elements.content.bind(this+'.qtip-inactive',inactiveMethod)
})
inactiveMethod()}
clearTimeout(self.timers.show)
clearTimeout(self.timers.hide)
self.timers.show=setTimeout(function(){self.show(event);},self.options.show.delay)}
function hideMethod(event){
if(self.options.hide.fixed===true
&&self.options.hide.when.event.search(/mouse(out|leave)/i)!==-1
&&$(event.relatedTarget).parents('.qtip').length>0){
event.stopPropagation()
event.preventDefault()
clearTimeout(self.timers.hide)
return false}
clearTimeout(self.timers.show)
clearTimeout(self.timers.hide)
self.timers.hide=setTimeout(function(){self.hide(event);},self.options.hide.delay)}
if((self.options.show.when.target.add(self.options.hide.when.target).length===1
&&self.options.show.when.event==self.options.hide.when.event
&&self.options.hide.when.event !=='inactive')
|| self.options.hide.when.event=='unfocus'){
showTarget.data('qtip-toggle',0)
if(self.options.hide.when.event=='unfocus')
self.elements.tooltip.attr('unfocus',true)
showTarget.bind(self.options.show.when.event+'.qtip',function(event){
if(parseInt($(this).data('qtip-toggle'))===0)
showMethod(event)
else
hideMethod(event)
})}
else{
showTarget.bind(self.options.show.when.event+'.qtip',showMethod)
if(self.options.hide.when.event !=='inactive')
hideTarget.bind(self.options.hide.when.event+'.qtip',hideMethod)}
if(self.options.position.type.search(/(fixed|absolute)/)!==-1)
self.elements.tooltip.bind('mouseover.qtip',self.focus)
if(self.options.position.target=='mouse'){
showTarget.bind('mousemove.qtip',function(event){
self.mouse={x: event.pageX,y: event.pageY}
if(self.elements.tip.css('display')!=='none')
self.updatePosition(event,false)
})}}
function screenAdjust(currentPos,targetLength,event){
var self=this
var corner=self.options.position.corner.tooltip
if(corner=='center')return
var tooltipLength={
height: self.elements.tooltip.outerHeight(),
width: self.elements.tooltip.outerWidth()}
var newPos=$.extend(true,{},currentPos)
if(self.options.position.target !=='mouse')
var targetPos=self.options.position.target.offset()
var overflow={
leftMin:(currentPos.left<$(window).scrollLeft()),
leftMax:(newPos.left+tooltipLength.width+2>=$(window).width()+$(window).scrollLeft()),
topMin:(currentPos.top<$(window).scrollTop()),
topMax:(newPos.top+tooltipLength.height+2>=$(window).height()+$(window).scrollTop())}
if(overflow.leftMin || overflow.leftMax){
if(overflow.leftMin
&&((corner.search(/right/i)===-1&&!overflow.leftMax)|| corner.search(/right/i)!==-1)){
if(self.options.position.target=='mouse')
newPos.left=self.mouse.x
else
newPos.left=targetPos.left+targetLength.width}
else if(overflow.leftMax
&&((corner.search(/left/i)===-1&&!overflow.leftMin)|| corner.search(/left/i)!==-1)){
if(corner.search(/(top|bottom)Middle/)!==-1)
newPos.left-=(targetLength.width/2)+(tooltipLength.width/2)+(self.options.position.adjust.x*2)
else
newPos.left-=tooltipLength.width+targetLength.width+(self.options.position.adjust.x*2)}}
if(overflow.topMin || overflow.topMax){
if(overflow.topMin&&corner.search(/top/i)===-1){
if(self.options.position.target=='mouse')
newPos.top=self.mouse.y
else
newPos.top=targetPos.top+targetLength.height}
else if(overflow.topMax&&corner.search(/bottom/i)===-1){
if(corner.search(/(left|right)Middle/)!==-1)
newPos.top-=(targetLength.height/2)+(tooltipLength.height/2)+(self.options.position.adjust.y*2)
else
newPos.top-=tooltipLength.height+targetLength.height+(self.options.position.adjust.y*2)}}
if(newPos.left<0)newPos.left=currentPos.left
if(newPos.top<0)newPos.top=currentPos.top
if(self.options.style.tip.corner !==false){
corner=invertCornerString(corner,newPos.left !==currentPos.left,newPos.top !==currentPos.top,overflow)
if(corner !==self.elements.tip.attr('rel')){
self.options.style.tip.corner=corner
createTip.call(self)}}
return newPos}
function jQueryStyle(style,title){
var styleObj=$.extend(true,{},style)
for(var i in styleObj){
if(title===true&&i.search(/(tip|classes)/i)!==-1)
delete styleObj[i]
else if(i.search(/(width|border|tip|title|classes|user)/i)!==-1)
delete styleObj[i]}
return styleObj}
function sanitizeStyle(style){
if(typeof style.tip !=='object')style.tip={corner: style.tip}
if(typeof style.tip.size !=='object')style.tip.size={x: style.tip.size,y: style.tip.size}
if(typeof style.border !=='object')style.border={width: style.border}
if(typeof style.width !=='object')style.width={value: style.width}
if(typeof style.width.max=='string')style.width.max=parseInt(style.width.max.replace(/([0-9]+)/i,"$1"))
if(typeof style.width.min=='string')style.width.min=parseInt(style.width.min.replace(/([0-9]+)/i,"$1"))
return style}
function buildStyle(){
var self=this
var styleArray=[true,{}]
for(var i=0;i<arguments.length;i++)
styleArray.push(arguments[i])
var styleExtend=[ $.extend.apply($,styleArray)]
while(typeof styleExtend[0].name=='string'){
var nextStyle=sanitizeStyle($.fn.qtip.styles[ styleExtend[0].name ])
styleExtend.unshift(nextStyle)}
styleExtend.unshift(true,{classes:{tooltip: 'qtip-'+arguments[0].name}},$.fn.qtip.styles.defaults)
var final=$.extend.apply($,styleExtend)
var pixelAdjust=(($.support&&!$.support.cssFloat)|| $.browser.msie)? 1 : 0
final.tip.size.x+=pixelAdjust
final.tip.size.y+=pixelAdjust
if(final.tip.size.x % 2>0)final.tip.size.x+=1
if(final.tip.size.y % 2>0)final.tip.size.y+=1
if(final.tip.corner===true)
final.tip.corner=(self.options.position.corner.tooltip==='center')? false : self.options.position.corner.tooltip
return final}
function calculateTip(corner,width,height){
var tips={
bottomRight: [[0,0],[width,height],[width,0]],
bottomLeft: [[0,0],[width,0],[0,height]],
topRight: [[0,height],[width,0],[width,height]],
topLeft: [[0,0],[0,height],[width,height]],
topMiddle: [[0,height],[width/2,0],[width,height]],
bottomMiddle: [[0,0],[width,0],[width/2,height]],
rightMiddle: [[0,0],[width,height/2],[0,height]],
leftMiddle: [[width,0],[width,height],[0,height/2]]}
tips.leftTop=tips.bottomRight
tips.rightTop=tips.bottomLeft
tips.leftBottom=tips.topRight
tips.rightBottom=tips.topLeft
return tips[corner]}
function calculateBorders(radius){
if(document.createElement('canvas').getContext){
var borders={
topLeft: [radius,radius],topRight: [0,radius],
bottomLeft: [radius,0],bottomRight: [0,0]}}
else if(($.support&&!$.support.cssFloat)|| $.browser.msie){
var borders={
topLeft: [-90,90,0],topRight: [-90,90,-radius],
bottomLeft: [90,270,0],bottomRight: [90,270,-radius]}}
return borders}
function invertCornerString(corner,x,y,overflow){
if(x){
if(corner.search(/(top|bottom)Middle/)!==-1){
if(overflow.leftMin)
corner=corner.replace('Middle','Left')
else if(overflow.leftMax)
corner=corner.replace('Middle','Right')}
else if(corner.search(/right/)!==-1)corner=corner.replace('right','left')
else if(corner.search(/Right/)!==-1)corner=corner.replace('Right','Left')
else if(corner.search(/left/)!==-1)corner=corner.replace('left','right')
else if(corner.search(/Left/)!==-1)corner=corner.replace('Left','Right')}
if(y){
if(corner.search(/(left|right)Middle/)!==-1){
if(overflow.topMin)
corner=corner.replace('Middle','Top')
else if(overflow.topMax)
corner=corner.replace('Middle','Bottom')}
else if(corner.search(/top/)!==-1)corner=corner.replace('top','bottom')
else if(corner.search(/Top/)!==-1)corner=corner.replace('Top','Bottom')
else if(corner.search(/bottom/)!==-1)corner=corner.replace('bottom','top')
else if(corner.search(/Bottom/)!==-1)corner=corner.replace('Bottom','Top')}
return corner}
function bgiframe(){
var self=this
var html='<iframe class="qtip-bgiframe" frameborder="0" tabindex="-1" src="javascript:false" '+
'style="display:block; position:absolute; z-index:-1; filter:Alpha(Opacity=\'0\'); '+
'top:expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\'); '+
'left:expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\'); '+
'width:expression(this.parentNode.offsetWidth+\'px\'); '+
'height:expression(this.parentNode.offsetHeight+\'px\');"/>'
$(html).prependTo(self.elements.tooltip)}
function debug(text){
if(window.console&&window.console.log)
window.console.log('qTip: '+text)}
$.fn.qtip.defaults={
content:{
prerender: false,
text: false,
url: false,
data: null,
title:{
text: false,
button: false}
},
position:{
target: false,
corner:{
target: 'bottomRight',
tooltip: 'topLeft'
},
adjust:{
x: 0,y: 0,
screen: false,
scroll: true,
resize: true
},
type: 'absolute',
container: false
},
show:{
when:{
target: false,
event: 'mouseover'
},
effect:{
type: 'fade',
length: 100
},
delay: 140,
solo: false,
ready: false
},
hide:{
when:{
target: false,
event: 'mouseout'
},
effect:{
type: 'fade',
length: 100
},
delay: 0,
fixed: false
},
api:{
beforeRender: function(){},
onRender: function(){},
beforePositionUpdate: function(){},
onPositionUpdate: function(){},
beforeShow: function(){},
onShow: function(){},
beforeHide: function(){},
onHide: function(){},
beforeContentUpdate: function(){},
onContentUpdate: function(){},
beforeContentLoad: function(){},
onContentLoad: function(){},
beforeDestroy: function(){},
onDestroy: function(){},
beforeFocus: function(){},
onFocus: function(){}}}
$.fn.qtip.styles={
defaults:{
background: 'white',
color: '#111',
overflow: 'hidden',
textAlign: 'left',
width:{
min: 0,
max: 250
},
padding: '5px 9px',
border:{
width: 3,
radius: 0,
color: '#d3d3d3'
},
tip:{
corner: false,
color: false,
size:{x: 13,y: 13},
opacity: 1
},
title:{
background: '#e1e1e1',
fontWeight: 'normal',
padding: '7px 12px'
},
classes:{
target: '',
tip: 'qtip-tip',
title: 'qtip-title',
content: 'qtip-content',
active: 'qtip-active'}
},
cream:{
border:{
width: 3,
radius: 0,
color: '#F9E98E'
},
title:{
background: '#F0DE7D',
color: '#A27D35'
},
background: '#FBF7AA',
color: '#A27D35',
classes:{tooltip: 'qtip-cream'}
},
light:{
border:{
width: 3,
radius: 0,
color: '#E2E2E2'
},
title:{
background: '#f1f1f1',
color: '#454545'
},
background: 'white',
color: '#454545',
classes:{tooltip: 'qtip-light'}
},
dark:{
border:{
width: 3,
radius: 0,
color: '#303030'
},
title:{
background: '#404040',
color: '#f3f3f3'
},
background: '#505050',
color: '#f3f3f3',
classes:{tooltip: 'qtip-dark'}
},
red:{
border:{
width: 3,
radius: 0,
color: '#CE6F6F'
},
title:{
background: '#f28279',
color: '#9C2F2F'
},
background: '#F79992',
color: '#9C2F2F',
classes:{tooltip: 'qtip-red'}
},
green:{
border:{
width: 3,
radius: 0,
color: '#A9DB66'
},
title:{
background: '#b9db8c',
color: '#58792E'
},
background: '#CDE6AC',
color: '#58792E',
classes:{tooltip: 'qtip-green'}
},
blue:{
border:{
width: 2,
radius: 3,
color: '#ADD9ED'
},
title:{
background: '#D0E9F5',
color: '#5E99BD'
},
background: '#E5F6FE',
color: '#4D9FBF',
classes:{tooltip: 'qtip-blue'}}}
var adjustTimer
$(window).bind('resize scroll',function(event){
clearTimeout(adjustTimer)
adjustTimer=setTimeout(function(){
$('.qtip').each(function(){
var api=$(this).qtip("api")
if(api.options.position.adjust.scroll&&event.type==='scroll'
|| api.options.position.adjust.resize&&event.type==='resize')
api.updatePosition(event)
})}
,100)
})
$(document).bind('mousedown.qtip',function(event){
if($(event.target).parents('div.qtip').length===0){
$('.qtip[unfocus]').each(function(){
var api=$(this).qtip("api")
if($(this).is(':visible')
&&$(event.target).add(api.elements.target).length>1)
api.hide()
})}
})
})(jQuery)
