
// File Version 2.0


// Check for Browser & Platform for PC & IE specific bits
// More details from: http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
var clientVer = parseInt(navigator.appVersion, 10); // Get browser version

var is_ie = ((clientPC.indexOf("msie") != -1) && (clientPC.indexOf("opera") == -1));
var is_opera = ((clientPC.indexOf("msie") == -1) && (clientPC.indexOf("opera") != -1));
var is_safari = ((clientPC.indexOf("safari") != -1));
var is_chrome = ((clientPC.indexOf("chrome") != -1));

var is_win = ((clientPC.indexOf("win")!=-1) || (clientPC.indexOf("16bit") != -1));
var is_mac = (clientPC.indexOf("mac")!=-1);
var is_ios = (clientPC.indexOf('iphone') >= 0 || clientPC.indexOf('ipad') >= 0);

var scriptPath = window.location.pathname;
var scriptPage = scriptPath.substring(scriptPath.lastIndexOf('/') + 1);
var baseURL = "http://"+window.location.hostname+"/";



function isValidInteger(num) {
	return(num !== null && (num.length !== 0) && (!(/[^0-9]+/.exec(num))));
}

function isValidFloat(num) {
	return(num !== null && (num.length !== 0) && (!(/[^0-9\.]+/.exec(num))));
}

function inArray(needle, haystack) {
	for(var i=0; i<haystack.length; i++) {
		if(needle == haystack[i]) {
			return true;
		}
	}
	return false;
}

function rand(cieling) {
    return Math.floor(Math.random()*cieling);
}

function roundNumber(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); }
String.prototype.ltrim = function() { return this.replace(/^\s+/,""); }
String.prototype.rtrim = function() { return this.replace(/\s+$/,""); }


/*
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
	Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
	From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
function getElementsByClassName(oElm, strTagName, oClassNames){
	var arrReturnElements = new Array();
	if ( typeof( oElm.getElementsByClassName ) == "function" ) {
		/* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
		var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
		if ( strTagName == "*" )
			return arrNativeReturn;
		for ( var h=0; h < arrNativeReturn.length; h++ ) {
			if( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() )
				arrReturnElements[arrReturnElements.length] = arrNativeReturn[h];
		}
		return arrReturnElements;
	}
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrRegExpClassNames = new Array();
	if(typeof oClassNames == "object"){
		for(var i=0; i<oClassNames.length; i++){
			arrRegExpClassNames[arrRegExpClassNames.length] =
				new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)");
		}
	}
	else{
		arrRegExpClassNames[arrRegExpClassNames.length] =
			new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)");
	}
	var oElement;
	var bMatchesAll;
	for(var j=0; j<arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = true;
		for(var k=0; k<arrRegExpClassNames.length; k++){
			if(!arrRegExpClassNames[k].test(oElement.className)){
				bMatchesAll = false;
				break;
			}
		}
		if(bMatchesAll){
			arrReturnElements[arrReturnElements.length] = oElement;
		}
	}
	return (arrReturnElements)
}

function getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el };
	if (el.textContent) return el.textContent; // not needed but it is faster
	if (el.innerText) return el.innerText;     // IE doesn't have textContent
	var str = "";

	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				str += ts_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

//************************************
//EasyData by MajorVictory
//************************************
// Description:
//	These functions provide quick and easy methods of retrieving and
//	setting data within any html element.
//***********************************************

//returns an html object with the given name/id
function getObject(data) {
	if (data && typeof data == "string") {		// this is an id or name
		var object = document.getElementById(data); //id takes precedence over name
		if (object === null) { // If null then try by name
			object = getObject(document.getElementsByName(data)[0]);
		}
		if (!object) {
			//alert("Error: " +data+ " is not a valid ID, Name, or HTML Object");
			return null;
		}
		return getObject(object);
	} else if (data && data.nodeType == 1) {
		return data;
	} else {
		return null;
	}
}

//returns an html object with the given name/id in the given valid form object
function getSubObject(formobject,data) {
	if (data && typeof data == "string") {		// Assume this is an id of an object
		var object = formobject.elements[data];
		if (object === null) { // If null then this might be a name
			object = getSubObject(formobject,formobject[data]);
		}
		if (!object) {
			alert("Error: " +data+ " does not exist in the given Form Object");
			return null;
		}
		return getSubObject(formobject,object);
	} else if (data && typeof data == "object") {
		return data;
	} else {
		return null;
	}
}

//for all functions below:
//the "form" argument is always optional, simply use '' to indicate blank

//returns an html object with the given name/id in the given form
function getItemObject(form,item) {
	var itemobject;
	if (form !== '' && getObject(form) !== null) {
		itemobject = getSubObject(getObject(form),item);
	} else {
		itemobject = getObject(item);
	}
	return itemobject;
}

//returns the selected index from a select box or radio group
function getItemIndex(form,item) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	if (itemobject[0] && itemobject[0].type == "radio") {
		for(var i=0; i<itemobject.length; i++) {
			if(itemobject[i].checked) {
				return i;
			}
		}
		return 0;
	}
	return itemobject.selectedIndex;
}

//returns a form elements current value
function getItemValue(form,item) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	if (itemobject[0] && itemobject[0].type == "radio") {
		var value = itemobject[getItemIndex('',itemobject)].value;
		if (is_ie && !value) {
			return getItemIndex('',itemobject);
		}
		return value;
	} else if (itemobject.type == "select-one") {
		var option = itemobject.options[getItemIndex('',itemobject)];
		if (is_ie && !option.value) {
			return option.text;
		}
		return option.value;
	} else if  (itemobject.type == "checkbox") {
		return itemobject.checked;
	}
	return itemobject.value;
}

//sets the selected index for select boxes and radio groups
function setItemIndex(form,item,value) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	if (itemobject[0] && itemobject[0].type == "radio") { //radio groups
		for(var i=0; i<itemobject.length; i++) {
			if (i != value){
				itemobject[i].checked = false;
			} else {
				itemobject[value].checked = true;
			}
		}
	} else if (itemobject.type == "select-one") { //comboboxes
		if (typeof value == "number") {
			itemobject.selectedIndex = value;
		} else {
			for(var i=0; i<itemobject.options.length; i++) {
				if (itemobject.options[i].value == value){
					itemobject.selectedIndex = i;
				}
			}
		}
	}
}

//sets the value of a form element
//use index to specify which item to change in select boxes and radio groups (optional)
function setItemValue(form,item,value,index) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	if (itemobject[0] && itemobject[0].type == "radio") {
		if (!isValidInteger(index)) {
			index = getItemIndex('',itemobject);
		}
		itemobject[index].value = value;
	} else if (itemobject.type == "checkbox") {
		itemobject.checked = Boolean(value);
	} else if (itemobject.type == "select-one") {
		if (!isValidInteger(index)) {
			index = itemobject.selectedIndex;
		}
		itemobject.options[index].value = value;
	} else {
		itemobject.value = value;
	}
}

function setSelectedValue(form,item,value) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	if (itemobject[0] && itemobject[0].type == "radio") { //radio groups
		for(var i=0; i<itemobject.length; i++) {
			itemobject[i].checked = (itemobject[i].value == value);
		}
	} else if (itemobject.type == "checkbox") {
		if (isValidInteger(value)) {
			itemobject.checked = value == '1';
		} else {
			itemobject.checked = Boolean(value);
		}
	} else if (itemobject.type == "select-one") { //comboboxes
		for(var i=0; i<itemobject.options.length; i++) {
			if (itemobject.options[i].value == value) itemobject.selectedIndex = i;
		}
	} else {
		itemobject.value = value;
	}
}

function submitFormByID(form,action,target) {
	var form = getObject(form);
	if (form === null) return;
	if (action) form.action = action;
	if (target) form.target = target;
	form.submit();
}

function toggleCheckbox(form,item) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	setItemValue('',itemobject,!getItemValue('',itemobject));
}

function selectAll(form,item) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	itemobject.focus();
	itemobject.select();
}

function hideElement(form, item) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;

	itemobject.style.visibility = 'hidden';
	itemobject.style.display = 'none';
}

function showElement(form, item, displaytype) {
	var itemobject = getItemObject(form,item);
	if (itemobject === null) return;
	if (displaytype === null) displaytype = 'block';

	itemobject.style.visibility = 'visible';
	itemobject.style.display = displaytype;
}

function setElementHidden(form, item, visible, displaytype) {
	if (visible) {
		showElement(form, item, displaytype);
	} else {
		hideElement(form, item);
	}
}

//************************************
//End of EasyData functions
//************************************

/******************************************************/
////////////////////////////Useful functions
/******************************************************/
var ConsoleDisabled = false;

function out(message) {
	var htmlconsole = getItemObject('','htmlconsole');

	//var doscroll = ((htmlconsole.scrollHeight - htmlconsole.scrollTop) - htmlconsole.offsetHeight) < 1;
	if (htmlconsole != null && !ConsoleDisabled) htmlconsole.innerHTML = message + "<br>" + htmlconsole.innerHTML;
	//if (doscroll) htmlconsole.scrollTop = htmlconsole.scrollHeight;
}

function out_set(message) {
	var htmlconsole = getItemObject('','htmlconsole');
	if (htmlconsole != null && !ConsoleDisabled) htmlconsole.innerHTML = message;
}


function out_clear() {
	var htmlconsole = getItemObject('','htmlconsole');
	if (htmlconsole != null) htmlconsole.innerHTML =  '';
}

function out_get() {
	var htmlconsole = getItemObject('','htmlconsole');
	return (htmlconsole != null) ? htmlconsole.innerHTML : '';
}

function out_getconsole() {
	return getItemObject('','htmlconsole');
}

function out_hidetoggle() {
	var htmlconsole = getItemObject('','htmlconsole');
	if (htmlconsole != null) {
		if (htmlconsole.style.display == 'none') {
			htmlconsole.style.display = 'block';
		} else {
			htmlconsole.style.display = 'none';
		}
	}
}

function out_disabletoggle() {
	ConsoleDisabled = !ConsoleDisabled;
}

function toggleVis(elementidname,value,displaytype) {
	if (!value) {
		setItemProperty('',elementidname,'style.display','none');
	} else {
		setItemProperty('',elementidname,'style.display',displaytype);
	}
}

function getVisibility(elementidname) {
	return getItemProperty('',elementidname,'style.display') == "none";
}

//returns any GET data sent to the page
function queryStringToHash(query, separator) {
	if(!query) {
		query = window.location.toString()
	}
	var obj = {}
	var match = query.match(/([^?#]*)(#.*)?$/)
	if (!match) {
		return {};
	}
	var kv = match[1].split(separator || '&')

	for(var i = 0; i < kv.length; i++) {
		var k = kv[i].split('=')
		//alert(k[0] + ' == ' + k[1])
		try {
			obj[k[0]] = decodeURIComponent(k[1])
		} catch(e) {
			obj[k[0]] = unescape(k[1])
		}
	}
	return obj;
}

function addOnLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}

var alreadyrunflag=false;
function addLoadEvent(func) {
	if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", function(){alreadyrunflag=true; func()}, false)
	} else if (document.all && !window.opera) {
		document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="javascript:void(0)"><\/script>');
		var contentloadtag=document.getElementById("contentloadtag");
		contentloadtag.onreadystatechange=function(){
			if (this.readyState=="complete"){
				alreadyrunflag=true;
				func();
			}
		}
	}

	addOnLoadEvent(function() {if (!alreadyrunflag) func()});
}

function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else {
		elm['on' + evType] = fn;
	}
}

function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}


function getSetting(name, defaultvalue, type) {
	var value = getItemValue('','setting_'+name);
	if (type == 'string') {
		return (value == null || value == '') ? defaultvalue : value;
	} else if (type == 'int') {
		return isValidInteger(value) ? value : defaultvalue;
	} else if (type == 'bool') {
		return (value == '1' || value == 'true' || value == true);
	}
}

function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

// From http://www.massless.org/mozedit/
function mozWrap(txtarea, open, close)
{
	var selLength = txtarea.textLength;
	var selStart = txtarea.selectionStart;
	var selEnd = txtarea.selectionEnd;
	if (selEnd == 1 || selEnd == 2)
		selEnd = selLength;

	var s1 = (txtarea.value).substring(0,selStart);
	var s2 = (txtarea.value).substring(selStart, selEnd)
	var s3 = (txtarea.value).substring(selEnd, selLength);
	txtarea.value = s1 + open + s2 + close + s3;
	return;
}
// Insert at Caret position. Code from
// http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
function storeCaret(Textbox) {
	if (Textbox.createTextRange) Textbox.caretPos = document.selection.createRange().duplicate();
}

function clearText(thefield){
	if (thefield.defaultValue==thefield.value) {
		thefield.value = ""
	}
}

// from: http://phpjs.org/functions/number_format:481
function number_format(number, decimals, dec_point, thousands_sep) {
    var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

// ====================================================================
//       URLEncode and URLDecode functions
//
// Copyright Albion Research Ltd. 2002
// http://www.albionresearch.com/
//
// You may copy these functions providing that
// (a) you leave this copyright notice intact, and
// (b) if you use these functions on a publicly accessible
//     web site you include a credit somewhere on the web site
//     with a link back to http://www.albionresearch.com/
//
// If you find or fix any bugs, please let us know at albionresearch.com
//
// SpecialThanks to Neelesh Thakur for being the first to
// report a bug in URLDecode() - now fixed 2003-02-19.
// And thanks to everyone else who has provided comments and suggestions.
// ====================================================================
function URLEncode( input )
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var plaintext = input;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '"
                        + ch
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for
	return encoded;
};

function URLDecode( input )
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef";
   var encoded = input;
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2)
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
   return plaintext;
};


/******************************************************/
////////////////////////////AJAX functions
/******************************************************/

var MINICHATLOADCOUNT = 0;

function GetRequestObject() {
	if (window.XMLHttpRequest && !is_ie) {
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		return new window.ActiveXObject("Microsoft.XMLHTTP");
	}
	return null;
}

var request_Minichat = GetRequestObject();
var AJAXLoading_s = "<div class=\"center\"><img src=\"/image/util/ajax-loading-s.gif\" width=\"32\" height=\"32\" alt=\"Loading...\"></div>";
var MiniChat_Content = null;

function loadMiniChat() {
	if (timedchatload != null) window.clearTimeout(timedchatload);
	MiniChat_Content = document.getElementById("minichat_content");
	if (MiniChat_Content != null) MiniChat_Content.innerHTML = AJAXLoading_s;
	MiniChat_Content.style.height = '250px';
	updateMiniChat();
	out("(minichat) LOADING");
}

function updateMiniChat() {

	if (MiniChat_Content == null) return;

	if (MINICHATLOADCOUNT > 10) {
		MINICHATLOADCOUNT = 0;
		return;
	}
	MINICHATLOADCOUNT++;

	request_Minichat = (request_Minichat == null) ? GetRequestObject() : request_Minichat; //if null try making it again
	if (request_Minichat == null) {//if STILL null this browser doesn't support AJAX
		MiniChat_Content.innerHTML = NoAJAXMessage;
	}

	request_Minichat.open("GET", baseURL+"chat_ajax_responder.php?action=lines&sid="+new Date().getTime()+"&limit=5&mini=1&f=0&e=0",true);
	request_Minichat.onreadystatechange = function(){ handleMiniChatResponse(request_Minichat) };
	request_Minichat.send(null);
	out("(minichat) SENDING");
}

// This function handles an ajax call for the minichat
function handleMiniChatResponse(request){
	if( request.readyState == 4 ) {
		if( request.status == 200 ) {
			if (request.responseText.length == 0) {
				out("EMPTY RESPONSE");
				window.setTimeout(updateMiniChat,150);
				return;
			} else {
				var linedata = request.responseText.split("\r\n");

				out("FRESH RESPONSE ("+request.responseText.length+")");

				if (linedata[0] != '|') {
					out("MALFORMED DATA");
					//out("--> "+request.responseText.replace(/\r\n/g, "¶<br>"));
					window.setTimeout(updateMiniChat,150);
					return;
				}

				var chatcontent = document.getElementById("minichat_content");
				var chatnotification = document.getElementById("minichat_notification");

				var InHeader = false;
				var header = '';
				var output = new Array();
				//read the header
				for (var i = 3; i < linedata.length; i++) {

					//out("--> "+linedata[i]+"¶");

					if (linedata[i] == "|") {
						InHeader = true;
						continue;
					} //end of header

					if (InHeader) {
						output.push(linedata[i]);
					} else {

						var headdata = linedata[i].split(' ');
						var action = headdata.shift();
						var data = headdata.join(' ');

						if (action == 'QSTAT') {
							var statsholder = document.getElementById("requestats");
							if (statsholder != null) statsholder.innerHTML = data;
						} else if (action == 'C') {
							out("-&gt;) "+data);
						}

						if (action == 'B') {
							chatnotification.style.display = 'block';
							chatnotification.innerHTML = data;
						} else {
							chatnotification.style.display = 'none';
						}
					}
				}

				if (output == null || output.length == 0) {
					window.setTimeout(updateMiniChat,250);
					return;
				}

				if (getSetting('order', 1, 'int') != '1') {
					output.reverse();
				}

				output = output.join('');
				out("OUTPUT LENGTH: "+output.length);

				if (output != '') {
					chatcontent.innerHTML = output;
					if (getSetting('order', 1, 'int') == '1') chatcontent.scrollTop = (chatcontent.scrollHeight - chatcontent.offsetHeight) + 20;
				}
				MINICHATLOADCOUNT = 0;
			}
		} else {
			out("(minichat) ABNORMAL STATUS --> "+request.status);
			window.setTimeout(updateMiniChat,150);
		}
	}
}

var request_PlayerStats = GetRequestObject();
function updatePlayerStats() {

	request_PlayerStats = (request_PlayerStats == null) ? GetRequestObject() : request_PlayerStats; //if null try making it again
	if (request_PlayerStats == null) return;//if STILL null this browser doesn't support AJAX, fail silently

	getObject('stats_loadergif1').className = 'inline';
	getObject('stats_loadergif2').className = 'hidden';
	getObject('stats_loaderdiv').style.bottom = '47px';
	window.setTimeout(showPlayerStatsLoader,2100);

	request_PlayerStats.open("GET", baseURL+'player_ajax_responder.php?action=stats', true);
	request_PlayerStats.onreadystatechange = function(){ handlePlayerStatsResponse(request_PlayerStats) };
	request_PlayerStats.send(null);
}

function showPlayerStatsLoader() {
	getObject('stats_loadergif2').className = 'inline famx3 imagebutton';
}

var hpbar_max = 0;
var hpbar_percent_current = 0;
var hpbar_percent_goal = 0;
var stats_hp = null;
var stats_hpbar = null;
var stats_hppercent1 = null;
var stats_hppercent2 = null;

var expbar_max = 0;
var expbar_percent_current = 0;
var expbar_percent_goal = 0;
var stats_exp = null;
var stats_exppercent1 = null;
var stats_exppercent1 = null;

function AnimateHPBar() {
	if (hpbar_percent_current == hpbar_percent_goal) return;
	if (stats_hp == null) stats_hp = getObject('stats_hp');
	if (stats_hpbar == null) stats_hpbar = getObject('stats_hpbar');
	if (stats_hppercent1 == null) stats_hppercent1 = getObject('stats_hppercent1');
	if (stats_hppercent2 == null) stats_hppercent2 = getObject('stats_hppercent2');

	var addnum = Math.round((hpbar_percent_goal - hpbar_percent_current) * 0.15);
	if (addnum > -4 && addnum < 4) addnum = (hpbar_percent_goal > hpbar_percent_current) ? 1 : -1;
	hpbar_percent_current += addnum;

	stats_hp.innerHTML = number_format(hpbar_percent_current)+'/'+number_format(hpbar_max);
	stats_hpbar.style.borderColor = hpbar_percent_current == 0 ? 'brown' : 'green';
	setPlayerStatsPercentWidth(stats_hppercent1, Math.round((hpbar_percent_current/hpbar_max)*100));
	setPlayerStatsPercentWidth(stats_hppercent2, 100-Math.round((hpbar_percent_current/hpbar_max)*100));

	window.setTimeout(AnimateHPBar, 15);
}

function AnimateEXPBar() {
	if (expbar_percent_current == expbar_percent_goal) return;
	if (stats_exp == null) stats_exp = getObject('stats_exp');
	if (stats_exppercent1 == null) stats_exppercent1 = getObject('stats_exppercent1');
	if (stats_exppercent1 == null) stats_exppercent1 = getObject('stats_exppercent1');

	var addnum = Math.round((expbar_percent_goal - expbar_percent_current) * 0.15);
	if (addnum > -4 && addnum < 4) addnum = (expbar_percent_goal > expbar_percent_current) ? 1 : -1;
	expbar_percent_current += addnum;

	stats_exp.innerHTML = number_format(expbar_percent_current)+'/'+number_format(expbar_max);
	setPlayerStatsPercentWidth(stats_exppercent1, Math.round((expbar_percent_current/expbar_max)*100));
	setPlayerStatsPercentWidth(stats_exppercent2, 100-Math.round((expbar_percent_current/expbar_max)*100));

	window.setTimeout(AnimateEXPBar, 15);
}

function setPlayerStatsPercentWidth(element, width) {
	if (element != null) {
		setElementHidden('', element, (width > 0), 'table-cell');
		element.width = width+'%';
	}
}

function handlePlayerStatsResponse(request){
	if( request.readyState == 4 ) {
		if( request.status == 200 ) {

			getObject('stats_loadergif1').className = 'hidden';
			getObject('stats_loaderdiv').style.bottom = '28px';

			if (request.responseText.length > 0) {

				Data = eval('(' + request.responseText + ')');

				getObject('stats_name').innerHTML = Data.name;
				getObject('stats_lvl').innerHTML = Data.lvl;

				getObject('stats_class').innerHTML = Data.pclass;
				getObject('stats_clvl').innerHTML = Data.clvl;

				expbar_max = Data.expmax;
				var current = parseInt(getObject('stats_exp').innerHTML.split('/')[0].replace(',', ''));

				expbar_percent_current = Data.exp == 0 ? Data.expmax : 0;
				expbar_percent_goal = Data.exp;
				AnimateEXPBar();

				getObject('stats_energy').innerHTML = number_format(Data.energy);
				getObject('stats_evault').innerHTML = number_format(Data.evault);

				hpbar_max = Data.hpmax;
				current = parseInt(getObject('stats_hp').innerHTML.split('/')[0].replace(',', ''));
				hpbar_percent_current = Data.hp == 0 ? Data.hpmax : 0;
				hpbar_percent_goal = Data.hp;
				AnimateHPBar();

				getObject('stats_str').innerHTML = number_format(Data.str, 2);
				getObject('stats_strbonus').innerHTML = Data.strbonus;
				getObject('stats_dex').innerHTML = number_format(Data.dex, 2);
				getObject('stats_dexbonus').innerHTML = Data.dexbonus;
				getObject('stats_end').innerHTML = number_format(Data.end, 2);
				getObject('stats_endbonus').innerHTML = Data.endbonus;

				getObject('stats_gold').innerHTML = number_format(Data.gold);
				getObject('stats_bank').innerHTML = number_format(Data.bank);
				getObject('stats_ada').innerHTML = number_format(Data.ada);
				getObject('stats_shards').innerHTML = number_format(Data.shards);

				getObject('stats_points').innerHTML = number_format(Data.points);
				getObject('stats_mining').innerHTML = Data.mining;
				getObject('stats_stamina').innerHTML = number_format(Data.stamina)+"/"+number_format(Data.maxstamina);
				getObject('stats_city').innerHTML = Data.city;
				getObject('stats_ensaves').innerHTML = Data.ensaves;
			}
		}
	}
}
