jQuery.noConflict();

(function($){
	/* =================================================================
		URL PARSER - PARSES URL (QUERY STRING) INTO HASH TABLE
	================================================================= */
	$.parseURL = function(url) {
		var params = {};
		var query = '';
		if (url) {
			query = url.substring((url.indexOf('?')) + 1);
			/* REMOVE HASH */
			if (query.indexOf('#') >= 0 ) { query = query.substring(0, query.indexOf('#')); }
		}
		if (query.length < 1) { return params; }
		var pairs = query.split(/[;&]/);
		for (var i = 0; i < pairs.length; i++) {
			var key_value = pairs[i].split('=');
			if (!key_value || key_value.length != 2) { continue; }
			var key = unescape(key_value[0].toLowerCase());
			var value = unescape(key_value[1]);
			value = value.replace(/\+/g, ' ');
			params[key] = value;
		}
		return params;	
	}

	/* =================================================================
		FUNCTION TO STRIP HTML ENTITIES CREATED BY HTMLEDITORMAT IN CF
	================================================================= */
	$.unHTMLEditFormat = function(str) {
		str = str.replace(new RegExp('&quot;','gi'), '"');
		str = str.replace(new RegExp('&amp;','gi'), '&');
		str = str.replace(new RegExp('&lt;','gi'), '<');
		str = str.replace(new RegExp('&gt;','gi'), '<');
		return str;
	}

	/* =================================================================
		POPUP PLUGIN
	================================================================= */
	$.fn.popup = function(settings) {
		var _this = this;
		var settings = $.extend({
			url:null,
			name:'popupWindow',
			width:600,
			height:500,
			toolbar:0,
			location:0,
			directories:0,
			status:0,
			menuBar:0,
			scrollBars:1,
			resizable:1,
			top:0,
			left:0,
			center:true,
			onClick:null
		}, settings);

		/* CENTER THE POPUP */
		if (settings.center) {
			settings.top = (screen.height-(settings.height + 110))/2;
			settings.left = (screen.width-settings.width)/2;
		}

		/* POPUP FEATURES */
		var params = 'width=' + settings.width + ',height=' + settings.height + ',toolbar=' + settings.toolbar + ',location=' + settings.location + ',directories=' + settings.directories + ',status=' + settings.status + ',menuBar=' + settings.menuBar + ',scrollBars=' + settings.scrollBars + ',resizable=' + settings.resizable + ',top=' + settings.top + ',left=' + settings.left;

		return this.each(function(){

			/* OPEN THE NEW WINDOW */
			$(this).click(function(e){

				if (settings.onClick && !settings.onClick()) { return false; }

				windowURL = settings.url ? settings.url : this.href;

				/* IF SHIFT, ALT, ETC. CLICKED - RETURN TRUE */
				if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { return true; }

				/* OPEN WINDOW */
				var newWindow = window.open(windowURL,settings.name,params);

				/* FOCUS ON POPUP */
				if (newWindow) {
					if (newWindow.focus) {
						newWindow.focus();
						return false;
					}
				}

				return true;

			});

		});

	}
	/* =================================================================
		BUBBLE
	================================================================= */
	$.fn.bubble = function(settings) {
		var settings = $.extend({
			width:'200px',
			height:'300px',
			arrowWidth:'30px',
			arrowHeight:'50px',
			arrowOverlap:4,
			padding:4, /* how far away the bubble is from the clicked element */
			gutter:10, /* how close the bubble can get to the edge of the viewport */
			onShow:null,
			onClose:null
		}, settings);

		/* CREATE BUBBLE DIV */
		var bubbleDiv = $('div#bubble');
		var bubbleArrow = $('div#bubble');
		bubbleDiv = bubbleDiv.size > 0 ? bubbleDiv : $('<div id="bubble"><div class="bdy"></div></div>').css({display:'none',width:settings.width,height:settings.height}).appendTo('body');
		bubbleArrow = bubbleArrow.size > 0 ? bubbleArrow : $('<div id="bubbleArrow"></div>').css({display:'none',width:settings.arrowWidth,height:settings.arrowHeight}).appendTo('body');


		/* POSITION BUBBLE FUNCTION */
		var position = function(e) {
			var $e = $(e);
			var $eOffset = $(e).offset();
			var $body = $('body');
			var $win = $(window); /* VIEWPORT */

			/* GET DIMENSIONS */
			var dims = {
				e:{
					width:$e.width(),
					height:$e.height(),
					top:$eOffset.top,
					left:$eOffset.left
				},
				win:{
					width:$win.width(),
					height:$win.height(),
					scrollLeft:$win.scrollLeft(),
					scrollTop:$win.scrollTop(),
					top:$win.height() + $win.scrollTop()
				},
				bubble:{
					width:bubbleDiv.width(),
					height:bubbleDiv.height()
				},
				arrow:{
					width:bubbleArrow.width(),
					height:bubbleArrow.height()
				}
			}

			/* DEFAULT BUBBLE POSITION */
			var rightBubblePosX = dims.e.left + dims.e.width + dims.arrow.width + settings.padding;
			var leftBubblePosX = dims.e.left - dims.bubble.width - dims.arrow.width + settings.padding;
			var bubblePosY = dims.e.top - dims.bubble.height + dims.e.height + settings.padding;
			var rightBubbleArrowPosX = dims.e.left + dims.e.width + settings.padding + settings.arrowOverlap;
			var leftBubbleArrowPosX = dims.e.left - dims.arrow.width + settings.padding - settings.arrowOverlap;
			var bubbleArrowPosY = dims.e.top - dims.arrow.height;

			/* IF THE BOTTOM OF THE BUBBLE EXTENDS BEYOND THE BOTTOM OF THE WINDOW, MOVE IT UP */
			bubblePosY = (bubblePosY + dims.bubble.height + settings.gutter) < (dims.win.scrollTop + dims.win.height) ? bubblePosY : (dims.win.scrollTop + dims.win.height) - dims.bubble.height - settings.gutter;

			/* IF THE TOP OF THE BUBBLE DOESN'T CLEAR THE TOP OF THE WINDOW, MOVE IT DOWN */
			bubblePosY = bubblePosY > (dims.win.scrollTop + settings.gutter) ? bubblePosY : dims.win.scrollTop + settings.gutter;

			/* IF THE ARROW NEEDS TO POINT UPWARD, PLACE THE TOP OF THE ARROW AT THE BOTTOM OF THE CLICKED ELEMENT */
			bubbleArrowDir = (dims.e.top - bubblePosY) > (dims.bubble.height/2.3) ? 'down' : 'up';
			bubbleArrowPosY = bubbleArrowDir == 'down' ? bubbleArrowPosY : dims.e.top + dims.e.height;

			var fitsOnRight = (rightBubblePosX + dims.bubble.width + settings.gutter - dims.win.scrollLeft) < dims.win.width;
			var fitsOnLeft = (leftBubblePosX - settings.gutter - dims.win.scrollLeft > 0);
			var bubbleSide = fitsOnRight || !fitsOnLeft ? 'right' : 'left';
			var arrowSide = bubbleSide == 'right' ? 'left' : 'right';

			/* DECIDE WHERE THE BUBBLE FITS... IF IT DOESN'T FIT ON EITHER SIDE, PLACE IT ON THE RIGHT */
			var bubblePosX = bubbleSide == 'right' ? rightBubblePosX : leftBubblePosX;
			var bubbleArrowPosX = bubbleSide == 'right' ? rightBubbleArrowPosX : leftBubbleArrowPosX;

			/* POSITION THE DIV */
			bubbleDiv.css({left:bubblePosX,top:bubblePosY});
			bubbleArrow.css({left:bubbleArrowPosX,top:bubbleArrowPosY}).removeClass().addClass(arrowSide + '_' + bubbleArrowDir);
			
		}

		/* SHOW BUBBLE FUNCTION */
		var show = function(e) {

			position(e);

			bubbleDiv.show();
			bubbleArrow.show();

			return;
		}

		/* HIDE BUBBLE FUNCTION */
		var hideBubble = function() {
			bubbleDiv.css('display','none');
		}

		return this.click(function(){

			/* SHOW BUBLE */
			show(this);

			/* ON SHOW */
			if (settings.onShow) { settings.onShow(this); }

			return false;

		});

	}

	/* =================================================================
		KEEP SESSION ALIVE
	================================================================= */
	$.keepAlive = function(timeout) {
		var timeout = 60; /* IN MINUTES */
		setTimeout(function(){ $.ajax(window.location.pathname + '?a=admin2.main.keepAlive'); }, ((timeout - 1) * 60) * 1000)
	}


	/* =================================================================
		WHEN DOM IS READY...
	================================================================= */
	$(document).ready(function(){
	
		/* ACTIVATE POPUP LINKS */
		$('a.popup').popup();
	
		/* POPUP STATS */
		$('div#headerUtils a.launchStats').popup({width:907});
	
	});

})(jQuery);

