var selfDoc = window.location.toString();
selfDoc = selfDoc.substr(0, selfDoc.indexOf("?"));

function $(obj) { return document.getElementById(obj); }

/** Includes javascript files into document
	Requires full path, ex: 'resource/js/included.js'
 **/
function include (file) {
	var script = document.createElement('script');
	script.src = file;
	script.type = 'text/javascript';
	
	document.getElementsByTagName('head').item(0).appendChild(script);
}

/** Shows and hides all elements with "adminShow" in class
	Used for showing and hiding after login and logout functions
 **/
function showAdmin() {
	var list = document.getElementsByTagName('*');
	for (var i in list) 
		if (list[i].className && list[i].className.indexOf('adminShow') != -1)
			list[i].style.display = "block";
}
function hideAdmin() {
	var list = document.getElementsByTagName('*');
	for (var i in list) 
		if (list[i].className && list[i].className.indexOf('adminShow') != -1)
			list[i].style.display = "none";
}

/** Parses query string into a global variable GET **/
function getVarParse() {
	var GET = Array();
	var location = window.location.toString();
	location = location.replace(/#/g,'');
	var data = location.substr(location.indexOf('?')+1);
	
	data = data.split('&');
	for (var i = 0; i < data.length; i++) {
		var dataS = data[i].split('=');
		if (dataS[0].indexOf("[]") != -1) {
			var key = dataS[0].replace("[]", "");
			if (typeof(GET[key]) == "undefined") 
				GET[key] = new Array();
			GET[key].push(dataS[1]);
		} else 
			GET[dataS[0]] = dataS[1];
	}
	
	return GET;
}
var GET = getVarParse();

/** Full suite of AJAX manipulators **/
function defaultResponse () { 
	this.go = function (http_request) {
		if (http_request.readyState == 4) {
			if (http_request.status == 200) {
				this.action(http_request.responseText);
			} else {
				alert('There was a problem with the request.');
			}
		}
	};
	
	this.action = function(response) {
		if (response != "Success") {
			alert(response);
		}
	}
}
var response = null;
function getRequestObj() {
	var http_request = false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		//if (http_request.overrideMimeType) {
		//	http_request.overrideMimeType('text/xml');
		//}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
		}
	}
	
	if (!http_request) {
		alert('AJAX unavailable. Please upgrade to Firefox!');
		return false;
	}
	return http_request;
}

/** Issues a short GET request to the given URL **/
function shortRequest(url, response) {
	var http_request = getRequestObj();
	defaultObj = new defaultResponse();
		
	if (typeof(response) == "function") {
		var responder = response;
		defaultObj.action = function( newResponse ) { responder(newResponse); };
		response = defaultObj;
	} else
		response = (response == null) ? defaultObj : response;
		
		try {
		http_request.onreadystatechange = function() { response.go(http_request); };
		http_request.open('GET', url, true);
		http_request.send(null);
	} catch (e) {alert(e);}
}

/** Posts a longer request to the given URL, with a properly encoded content string **/
function postRequest(url, response, content) {
	var http_request = getRequestObj();
	var defaultObj = new defaultResponse();
	
	if (typeof(response) == "function") {
		var responder = response;
		defaultObj.action = function( newResponse ) { responder(newResponse); };
		response = defaultObj;
	} else
		response = (response == null) ? defaultObj : response;
	
	try {
		http_request.onreadystatechange = function() { response.go(http_request); };
		http_request.open('POST', url, true);
		http_request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		http_request.send(content);
	} catch (e) {alert(e);}
}

/** Most useful AJAX function - posts a javascript associative array **/
function postArray( url, response, data ) {
	var content = "";
	for (var i in data) {
		content += i+"=" + escape(data[i]).replace("+", "%2B").replace("/", "%2F") +"&";
	}
	
	postRequest(url, response, content);
}
/** Retrieves an XML object for javascript XML manipulations **/
function getXMLObj( response ) {
	var doc = null;
	
	if (window.ActiveXObject) {
		doc = new ActiveXObject("Microsoft.XMLDOM");
		doc.async = false;
		doc.loadXML(response);
	} else {
		var parser = new DOMParser();
		var doc = parser.parseFromString( response, "text/xml" );
	}
	
	return doc;
}
/*************************************End of AJAX manipulators ************/

/** Takes a string and turns it into sentence case - ucwords() in php **/
function sentenceCase( data ) {
	var splitDat = data.split(" ");
	for ( i in splitDat ) 
		if (typeof(splitDat[i]) == "string") 
			splitDat[i] = splitDat[i].substr(0,1).toUpperCase() + splitDat[i].substr(1);
	
	return splitDat.join(" ");
}
/** Finds if a value is in an array **/
function inArray(value, array) {
    for (var i = 0; i < array.length; i++)
        if (array[i] === value)
            return true;
			
    return false;
}

/** Useful for debugging, logs an object out to firebug console **/
function inspect(element) {
	var str = "";
	for (var j in element) {
		str += j + ": " + element[j] + "\n";
	}
	alert(str);
	//console.log(str);
}

/** A proper modulus function **/
function mod(int1, int2) {
	return int1>=0 ? int1%int2 : (int1%int2 + Math.abs(int2))%int2;
}


/** These two functions put together allow objects to appear under
	mouse pointer
	Useful in the media uploader
 **/
function findPos(obj) {
	if (obj == null) alert("Invalid Object");
	
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function getMousePos(e) {
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		var posx = e.pageX;
		var posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		var posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		var posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	
	return [posx, posy];
}


/** Register an event for window.onload **/
var windowLoad = [];
window.onload = function () {
	for (var i = 0; i < windowLoad.length; i++) {
		if (typeof(windowLoad[i]) == "function")
			windowLoad[i]();
	}
}
function registerOnload(func) {
	windowLoad.push(func);
}


function setOpacity (obj, value) {
	if (obj.filters ) {
		obj.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+(value*100)+")";
	} else {
		obj.style.opacity = value;
	}
}

String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}
