// PCW PopUp 
// author: jcounts

jQuery.fn.pcw_popup = function(options) {
	var defaults = {
			showAnimation: undefined,
			hideAnimation: undefined,
			showCallback: undefined,
			hideCallback: undefined,
			disableOnClick:false,
			positionByElement: false,
			trackingPixel: undefined,
			divId: undefined,
			fadeInDelay:400,
			fadeOutDelay:3000,
			offsetY: -71,
			offsetX: 26
	};
	options = jQuery.extend(true,{},defaults, options);
	
	/* don't want to deep-copy the animations so set the defaults here if they remain 
	* undefined
	*/
	if(options.showAnimation == undefined){
		options.showAnimation={height:"show",width:"show",opacity:"show"};
	}
	if(options.hideAnimation == undefined){
		options.hideAnimation={height:"hide",width:"hide",opacity:"hide"};
	}
	
	var timer= undefined;
	var wait=undefined;
	
	var beingShown = false;
    var shown = false;
    
	var hoverEvent=undefined;
	var tracking=false;
	
	/* Set Popup Window Event Behavior */
	if(options.divId!=undefined){
		$("#"+options.divId).mouseover(function(){
			if(wait) clearTimeout(wait);
		});
		$("#"+options.divId).mouseout(function(){
			if(timer!=undefined)
				{
					clearTimeout(timer);
					timer=undefined;
					hoverEvent=undefined;
				}
				wait=setTimeout(hide,options.fadeOutDelay);
		});
	}
	
	/* Disable Popup on Click, to prevent user from mistaking pop up for click action */
	if (options.disableOnClick){
		this.parent("a").click(function(){
			if(timer!=undefined)
				{
					clearTimeout(timer);
					timer=undefined;
					hoverEvent=undefined;
				}
				wait=setTimeout(hide,options.fadeOutDelay);
				return true;
		});
	}
	
	
	var absolutePosition=function(element){
		var offsetParent=$(element).offsetParent().get(0);
		if( element.nodeName!="BODY" && element.nodeName!="HTML"){
			var pos=absolutePosition(offsetParent);
			var offset=$(element).position();
			var x=pos.left + offset.left;
			var y=pos.top + offset.top;
			return ({top: y, left:x});
		} else {
			try{
				var pos=$(element).position();
				return ({top: pos.top, left:pos.left});
			} catch(err){
				return ({top: 0, left:0});
			}
		}
		
	}
	
	var show=function(){
		if(wait) clearTimeout(wait);
		if(options.showCallback!=undefined){
			options.showCallback(hoverEvent);
		}
		var element= hoverEvent.target ? hoverEvent.target:hoverEvent.srcElement;
		var elementPos= options.positionByElement ? absolutePosition(element) : undefined;
		var x=options.positionByElement ? elementPos.left : hoverEvent.pageX;
		var y=options.positionByElement ? elementPos.top : hoverEvent.pageY;
		clearTimeout(timer);
		timer=undefined;
		$("#"+options.divId).css("top",(y + options.offsetY) + "px")
				.css("left",(x+options.offsetX) + "px")
				.animate(options.showAnimation,options.fadeInDelay,'swing');
			if(!tracking && options.trackingPixel!=undefined){
				$("#"+options.divId).append('<img src="'+options.trackingPixel+'" />')
				tracking=true;
			}
}
	var hide=function(){
		clearTimeout(wait);
		wait=undefined;
		$("#"+options.divId).animate(options.hideAnimation,options.fadeOutDelay,'swing');
	}
	if(options.divId != undefined){
		$("#"+options.divId).hide();
		return this.each(function() {
			$(this).hover(function(e) {
				if(timer==undefined)
				{
					hoverEvent=e;
					timer=setTimeout(show,options.fadeInDelay);
				}
			},function(e){
				if(timer!=undefined)
				{
					clearTimeout(timer);
					timer=undefined;
					hoverEvent=undefined;
				}
				wait=setTimeout(hide,options.fadeOutDelay);
			});
		});
	}
}