function ajax(url, params, completed) {
	$.ajax({
		type: "POST",
		url: url,
		data: params,
		dataType: "json",
		beforeSend: function(callback) {
			$("#ajaxLoader").show();
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			if (this.url != HTMLPATH + '/email/error/ajax/true/') {
				var textarea = $('#ajaxError textarea');
				var string = 'URL: ' + this.url + '\n\n' + 'Data: ' + this.data + '\n\n' + 'XML: ' + XMLHttpRequest.responseText;
				textarea.val(string);
				$('#ajaxError').show();
				ajax(HTMLPATH + '/email/error/ajax/true/', textarea.serialize());
			}
			$("#ajaxLoader").hide();
		},
		success: function(callback){
			if (callback.html == 'REDIRECT')
				window.location = HTMLPATH + '/';
			else if (callback.reload == true) {
				window.location.reload();
			}
			else if (typeof(completed) == 'function') 
				completed(callback);
			$("#ajaxLoader").hide();
		}
	});
	return;
}
/**
 * print toggle function found in printLink view helper
 */
function togglePrint() {
	try {
		if ($('div.header:visible, div.tabs:visible, div.columnControl:visible, div.exportLink:visible, div.customColumns:visible').length > 0) {
			$('div.header, div.filter, div.tabs, div.columnControl, div.exportLink, div.customColumns').hide();
			$('a.printLink').html('exit print view');
		}
		else {
			$('div.header, div.filter, div.tabs, div.columnControl, div.exportLink, div.customColumns').show();
			$('a.printLink').html('print view');
		}
	} catch (e) {
		alert('Print Link Helper error: ' + e);
	}
}


function getKeyCode(event) {
	var browser = navigator.appName;
	if (browser == "Microsoft Internet Explorer")
	 	return window.event.keyCode;
	else return event.keyCode;
}
function noBubble(e) {
	if (!e)
		var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation)
		e.stopPropagation();
}

function bubble(e, elt, onComplete) {
	var targ = getTarget(e);
	var reltarg = targ;
	var count = 0;
	
	if (targ == elt)
		return true;

	while (reltarg.nodeName != 'BODY') {
		reltarg = reltarg.parentNode;
		if (reltarg == elt)
			return true;
		if (count > 7)
			break;
		count++;
	}
	if (onComplete)
		onComplete();
	else return false;
}

function getTarget(e) {
	if (!e)
		e = window.event;
	if (e.target)
		return e.target;
	else if (e.srcElement)
		return e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		return targ.parentNode;
}

function var_dump(data, subArray) {
	var output = "";
	for (i in data) {
		if (subArray)
			output += i + ": " + data[i][subArray] + "\n";
		else output += i + ": " + data[i] + "\n";
	}
	alert(output);
}

function search(search, haystack) {
	if (search == null || search == "")
		return false;

	var str = String(search).toLowerCase(); //cast to string incase javascript has 'cleverly' cast our name to a number
	var search_array = str.split(" ");
	var haystack = String(haystack).toLowerCase();

	for (var i = 0; i < search_array.length; i++)
		if ( haystack.indexOf(search_array[i]) == -1)
			return false; //Our work is done here.
	return true; //Only if it contained all of the filter words.
}

function getMouseCoords(event) {
	// Fix the event for IE.
	event = event || window.event;

	// If we have these values, just return them.
	if(event.pageX || event.pageY){
		return {x:event.pageX, y:event.pageY};
	}
	// Otherwise, add the client and scroll values togther to get the mouse coordinates.
	return {
		x:event.clientX + document.documentElement.scrollLeft,
		y:event.clientY + document.documentElement.scrollTop
	};
}

function getPosition(element) {
	var left = 0;
	var top  = 0;


	// Iterate through the parent nodes to get their top and left offset
	// and add them together. Also need to subtract out the scroll height
	// for each element which can lead to bad values othewise.
	while (element.offsetParent){
		left += element.offsetLeft - element.scrollLeft;
		top  += element.offsetTop - element.scrollTop;
		element = element.offsetParent;
	}

	// Add the offsets of this element.
	left += element.offsetLeft;
	top  += element.offsetTop;

	return {x:left, y:top};
}

function getScrollSize() {
	var scrOfX = 0, scrOfY = 0;
	if( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return {'x':scrOfX, 'y':scrOfY };
}

function getWindowSize() {
	var myWidth = 0, myHeight = 0;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	return {'x':myWidth, 'y':myHeight};
}

function exportToCSV(table){
	
	var getValue = function(string){
		if (string.indexOf('\n') != -1 || string.indexOf(',') != -1)
			return '"' + string + '"';
		else return string;
	}
	
	var headers = table._headers;
	var values = [];

	var rows = table._rows;
	for (var i = 0; i < rows.length; i++) {
		if (rows[i].visible()) {
			var tmp = {};
			for (var label in headers) {
				if (headers[label].data.hidden != true) {
					tmp[headers[label].data.display] = rows[i].getCell(label).getData();
				}
			}
			values.push(tmp);
		}
	}
	ajax('/export/tocsv', 'table=' + escape($.toJSON(values)), function(){
		window.location = '/export/download';
	});
}