	/* 
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		CLASS: ToolTip
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	*/
	
	$j.Avaya.ToolTip = function(options){
		var self=this;
		
		this.settings = $j.extend({
			yOffset : 10, 
			xOffset : 10, 
			flipX:true,
			flipY:true,
			fixed:false,
			fixedRef:false,
			timeout : 1000, 
			width: 214,
			anchor: 'trigger', //Offsets should be used if set to mouse
			location: 'NW',
			dynPop: {
				use : false,
				url : '',
				params : ''
			},
			repository : { //Use if data is being stored in a hidden child of the triggers
				use : false,
				source : '' //Class name of the child
			},
			staticContent: '',
			canLock: true,
			id: ""
		}, options)
		
		//Initializations
			
			//Create tool-tip div if it doesn't already exist
			if (!document.getElementById('tool-tip')){
				var toolTip = $j('<div id="tool-tip"><div class="wrapper"><div class="top-outer"><div class="top-inner"><div class="content tool-tip-content"></div></div></div><div class="bottom-outer"><div class="bottom-inner"></div></div><div id="tool-tip-pointer"></div></div>').appendTo('body');
			}

			var $toolTip = $j('#tool-tip');
			var $pointer = $j('#tool-tip-pointer');
			$toolTip.content = $toolTip.find('.tool-tip-content');
			var currentEvent, $currentTarget, showTimeout, hideTimeout, isOpen, initRefTop, initScrollTop, locked; 
			
			if (this.settings.fixedRef){
				initRefTop = this.settings.fixedRef.offset().top - $j(window).scrollTop();
			}
						
			/*$toolTip.hover(
				function(){
					clearTimeout(showTimeout);
					clearTimeout(hideTimeout);
				},
				function(){
					clearTimeout(showTimeout);
					self.hideToolTip();
				}
			)*/
			

		//Public methods
		this.showToolTip = function(tar,event){
			if ($currentTarget&&$currentTarget.get(0)==tar&&isOpen==true){			
				clearTimeout(showTimeout);
				clearTimeout(hideTimeout);
			} else {
				currentEvent = event;				
				$currentTarget = $j(tar);

				$currentTarget.settings = $currentTarget.data('settings');
				if (!$currentTarget.settings || ( $currentTarget.settings.canLock && locked )) return;
				showTimeout = setTimeout(populate,$currentTarget.settings.timeout);
			}
		}
		
		this.hideToolTip = function(){
			clearTimeout(showTimeout);
			hideTimeout = setTimeout(hide,200);
		}
		
		this.killToolTip = function(){
			clearTimeout(showTimeout);
			clearTimeout(hideTimeout);
			hide();
		}
		
		this.lockToolTip = function(){
			locked = true;
		}
		
		this.unlockToolTip = function(){
			locked = false;
		}
		
		this.checkOpen = function(){
			return isOpen;
		}
		
		//Private methods
		function show(){
			//if (isOpen==true) return;
			var pos = position();
			$toolTip.css({
				left: pos[0],
				top: pos[1]
			});
			
			if (!$j.support.objectAll){ //Check for IE7
				$toolTip.css({display:'block'});
				isOpen = true;
			} else {
				$toolTip.fadeIn(200,function(){
					isOpen = true;
				});
			}

		}
		
		function hide(){
			if (!$j.support.objectAll){ //Check for IE7
				$toolTip.css({display:'none'});
				isOpen = false;
			} else {
				$toolTip.fadeOut(200,function(){
					isOpen = false;
				});
			}
		}
		
		function populate(){
			$toolTip.content.attr("id", "");
			if($currentTarget.settings.id != "") {
				$toolTip.content.attr("id", $currentTarget.settings.id);	
			}
			
			if ($currentTarget.settings.dynPop.use==true){
				getContent();
			} else if ($currentTarget.settings.repository.use==true){
				var content = $j(currentEvent.target).find('div[class="'+$currentTarget.settings.repository.source+'"]').clone();
				$toolTip.content.html(content);
				show();
			} else {
				$toolTip.content.html($currentTarget.settings.staticContent);
				show();
			}
		}
		
		function getContent(){
			var content;
			//Show loader gif
			//$toolTip.html(<img src="img/loader.gif" alt="Loading..." title="Loading..." />);
			$j.ajax({
				url: $currentTarget.settings.dynPop.url,
				data: $currentTarget.settings.dynPop.params,
				success: function(data){
					content = data;
				},
				error: function(){
					content = "There was an error with your request."
				},
				complete: function(){
					$toolTip.content.html(content);
					show();
				}
			})
		}
		
		//Returns array [number,number]
		function position(){		
			
			$toolTip.width($currentTarget.settings.width);
			$pointer.get(0).className = '';
			
			var x,y,xTemp,yTemp;
			var width = $toolTip.outerWidth();
			var height = $toolTip.outerHeight();
			var tarWidth = 0;
			var tarHeight = 0;
			var $window = $j(window);
			var windowLeft = $window.scrollLeft();
			var windowTop = $window.scrollTop();
			var location = [];
			
			
			//Position according to cursor or target element
			if ($currentTarget.settings.anchor=='mouse'){
				x = currentEvent.pageX;
				y = currentEvent.pageY;
			} else {
				x = $currentTarget.offset().left;
				y = $currentTarget.offset().top;
				tarWidth = $currentTarget.outerWidth();
				tarHeight = $currentTarget.outerHeight();
			}
			
			//Cross broswer fix to position according to a fixed element
			if ($currentTarget.settings.fixed && $currentTarget.settings.fixedRef && initRefTop==$currentTarget.settings.fixedRef.offset().top) {
				y = y+windowTop;
				x = x+windowLeft;
			}
			
			//Position according to specified location. NW is default
			switch ($currentTarget.settings.location) {
				case 'NE':
					xTemp = x + tarWidth + $currentTarget.settings.xOffset;
					yTemp = y - $currentTarget.settings.yOffset - height;
					location = [1,1];
					break;
				case 'SE':
					xTemp = x + tarWidth + $currentTarget.settings.xOffset;
					yTemp = y + tarHeight + $currentTarget.settings.yOffset; 
					location = [1,-1];
					break;
				case 'SW':
					xTemp = x - $currentTarget.settings.xOffset - width;
					yTemp = y + tarHeight + $currentTarget.settings.yOffset;
					location = [-1,-1];
					break;
				default:
					xTemp = x - $currentTarget.settings.xOffset - width;
					yTemp = y - $currentTarget.settings.yOffset - height;
					location = [-1,1];
					break;
			}
			
			if ($currentTarget.settings.flipX){
				
				var _leftEdge = windowLeft + 20, 
					_rightEdge = $window.width() + windowLeft - 20,
					_flippedLeft = x - $currentTarget.settings.xOffset - width,
					_flippedRight = x + $currentTarget.settings.xOffset;
				
				//Fixes to prevent box from going offscreen	
				if ( (xTemp < _leftEdge && _flippedRight > _rightEdge) || (xTemp + width > _rightEdge && _flippedLeft < _leftEdge) ){
					//Center it if it doesnt fit to either side
					x = x + (tarWidth/2);
				}
				else if (xTemp<_leftEdge){
					x = _flippedRight;
					location[0] = 1;
				} else if (xTemp+width > _rightEdge){
					x = _flippedLeft;
					location[0] = -1;
				} else {
					x = xTemp;
				}
				
			} else { x = xTemp; }
			
			if ($currentTarget.settings.flipY){
			
				if (yTemp<windowTop+20){
					y = y + $currentTarget.settings.yOffset + tarHeight;
					location[1] = -1;
				} else if (yTemp+height>$j(window).height()+windowTop-20){
					y = y - $currentTarget.settings.yOffset - height;
					location[1] = 1;
				} else {
					y = yTemp;
				}
				
			} else { y = yTemp; }

			//Add class to pointer to style with css
			$toolTip.removeClass("flipped");
			if (location[0]==1){
				if (location[1]==1){
					$pointer.addClass('NE');
				} else {
					$pointer.addClass('SE');
					$toolTip.addClass("flipped");
				}
			} else {
				if (location[1]==1){
					$pointer.addClass('NW');
				} else {
					$pointer.addClass('SW');
					$toolTip.addClass("flipped");
				}
			}
			
			return [x,y];
			
		}
	}
	
	
	/* 
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		CLASS: ToolTipTrigger
		
		***Requires Class $j.Avaya.ToolTip
		
		-This is how triggers are added to tooltip
		-Trigger is the dom element
		-Will assume options from tooltip class for any options that are not passed
		-Options:
			yOffset: number,
			xOffset: number,
			timeout: number,
			width: number,
			anchor: string "trigger" or "mouse",
			location: string "NE","SE","SW"     "NW" is default
			dynPop: obj
			repository: obj
			staticContent: string
		
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	*/
	
	$j.Avaya.ToolTipTrigger = function(trigger,options){
		var self = this;
		
		if (!$j.Avaya.global.ToolTip){
			alert('$j.Avaya.ToolTipTrigger requires use of $j.Avaya.global.ToolTip');
			return false;
		}
		
		if (!trigger){
			return false;
		}
		
		var settings = $j.extend({},$j.Avaya.global.ToolTip.settings,options);
			
		$j(trigger).data('settings',settings);
		
		$j(trigger).hover(
			function(event){
				$j.Avaya.global.ToolTip.showToolTip(this,event);
			},
			function(event){
				$j.Avaya.global.ToolTip.hideToolTip();
			}
		)				
	}