/*
 * JTip
 * By Cody Lindley (http://www.codylindley.com)
 * Under an Attribution, Share Alike License
 * JTip is built on top of the very light weight jquery library.
 * Jack 2009-04-09 change log 
 * 1.In order to make jquery and prototype work together,use $jqry instead of $
 * 2.Fix the position for ie
 * 3.Use a.target to store the url which using to get hint text
 * Jack 2009-05-11 
 * 4.Fix the width of tool tip dialog if it's not enough area neither left nor right.
 * James 2010-09-03
 * 5.Added option to have delayed timeout (so tip will linger for a short time after mouseout) to support hyperlinks in tip
 */

$jqry=jQuery;
//on page load (as soon as its ready) call JT_init
$jqry(document).ready(JT_init);

// these are global variables!
var jTipTimeout;			//Stores the setTimeout for the delayed tooltip.
var jTipTimeDelay = 1500;	//Time delay for extended tooltip (in milliseconds)


function JT_init(){
	       $jqry("a.jTip").hover(
	    		   function(){
	    			   JT_show(this.target,this.id,this.name);
	    		   },
	    		   // support extended delay based on 
	    		   // http://michael.theirwinfamily.net/articles/jquery/putting-links-jtip
	    		   function(){
	    			   if (!$jqry('#' + this.id).parent().hasClass("extendedJtip")) {
	    				   $jqry('#JT').remove()
					   } else {
						   jTipTimeout = setTimeout(function() {$jqry('#JT').remove()}, jTipTimeDelay);
					   }
	    			}
	       ).click(
	    		   function(){
	    			   return false;
	    		   }
	       );	   
}

function JT_show(url,linkId,title){
	if(title == false)title="&nbsp;";
	var de = document.documentElement;
	var w = self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
	var absoluteLeft= getAbsoluteLeft(linkId);
	var hasArea = w - absoluteLeft;
	
	var clickElementy = getAbsoluteTop(linkId) - 3; //set y position
	
	var queryString = url.replace(/^[^\?]+\??/,'');
	var params = parseQuery( queryString );
	if(params['width'] === undefined){params['width'] = 250};
	if(params['link'] !== undefined){
	$jqry('#' + linkId).bind('click',function(){window.location = params['link']});
	$jqry('#' + linkId).css('cursor','pointer');
	}
	
	//Fix the width of tool tip dialog if it's not enough area neither left nor right.
	if(((params['width']*1)+75)>hasArea && ((params['width']*1)+75)>absoluteLeft){
		params['width']=hasArea>absoluteLeft?hasArea-80:absoluteLeft-80;
	}
	
	if(hasArea>((params['width']*1)+75)){
		$jqry("body").append("<div id='JT' style='width:"+params['width']*1+"px'><div id='JT_arrow_left'></div><div id='JT_close_left'>"+title+"</div><div id='JT_copy'><div class='JT_loader'><div></div></div>");//right side
		var arrowOffset = getElementWidth(linkId) + 11;
		var clickElementx = getAbsoluteLeft(linkId) + arrowOffset; //set x position
		//Jack 2009-04-09 bugfix for ie
		if($jqry.browser.msie){
			clickElementx=clickElementx+10;
		}	
	}else{
		$jqry("body").append("<div id='JT' style='width:"+params['width']*1+"px'><div id='JT_arrow_right' style='left:"+((params['width']*1)+1)+"px'></div><div id='JT_close_right'>"+title+"</div><div id='JT_copy'><div class='JT_loader'><div></div></div>");//left side
		var clickElementx = getAbsoluteLeft(linkId) - ((params['width']*1) + 15); //set x position
		//Jack 2009-04-09 bugfix for ie
		if($jqry.browser.msie){
			clickElementx=clickElementx+5;
		}
	}
	
	//Jack 2009-04-09 bugfix for ie
	if($jqry.browser.msie){
		clickElementy=clickElementy+10;
	}	
	$jqry('#JT').css({left: clickElementx+"px", top: clickElementy+"px"});
	$jqry('#JT').show();
	$jqry('#JT_copy').load(url);

}

function getElementWidth(objectId) {
	x = document.getElementById(objectId);
	return x.offsetWidth;
}

function getAbsoluteLeft(objectId) {
	// Get an object left position from the upper left viewport corner
	o = document.getElementById(objectId)
	oLeft = o.offsetLeft            // Get left position from the parent object
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent    // Get parent object reference
		oLeft += oParent.offsetLeft // Add parent left position
		o = oParent
	}
	return oLeft
}

function getAbsoluteTop(objectId) {
	// Get an object top position from the upper left viewport corner
	o = document.getElementById(objectId)
	oTop = o.offsetTop            // Get top position from the parent object
	while(o.offsetParent!=null) { // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent  // Get parent object reference
		oTop += oParent.offsetTop // Add parent top position
		o = oParent
	}

	return oTop
}

function parseQuery ( query ) {
   var Params = new Object ();
   if ( ! query ) return Params; // return empty object
   var Pairs = query.split(/[;&]/);
   for ( var i = 0; i < Pairs.length; i++ ) {
      var KeyVal = Pairs[i].split('=');
      if ( ! KeyVal || KeyVal.length != 2 ) continue;
      var key = unescape( KeyVal[0] );
      var val = unescape( KeyVal[1] );
      val = val.replace(/\+/g, ' ');
      Params[key] = val;
   }
   return Params;
}

function blockEvents(evt) {
              if(evt.target){
              evt.preventDefault();
              }else{
              evt.returnValue = false;
              }
}
