// are we IE or Gecko/other?
var IE = (document.all) ? true : false;

// Ancient function that is used on some sites across the network.
function gotourl(thisone)
{
	var thisurl = thisone.options[thisone.selectedIndex].value;
	if (thisurl != '')
	{
		window.top.location.href = thisurl;
	}
}

// Function to control form submission into a targeted popup window
var isResizable = false;

function createTarget(form)
{
	_target = form.target;
	_colon = _target.indexOf(":");

	if(_colon != -1)
	{
		form.target = _target.substring(0,_colon);
		form.args = _target.substring(_colon+1);
	}
	else if(typeof(form.args)=="undefined")
	{
		form.args = "";
	}

	if(form.args.indexOf("{")!=-1)
	{
		_args = form.args.split("{");
		form.args = _args[0];
		for(var i = 1; i < _args.length;i++)
		{
			_args[i] = _args[i].split("}");
			form.args += eval(_args[i][0]) + _args[i][1];
	  }
	}

	form.args = form.args.replace(/ /g,"");
	_win = window.open('',form.target,form.args);
	if(typeof(focus)=="function")
	_win.focus();

	return true;
}

// Handles global checking/clearing of checkbox arrays.

function is_array(obj) {
	return (typeof(obj.length)=="undefined")?false:true;
}

function checkall(ca, name)
{
	var xState = ca.checked;
	c = document.getElementsByName(name + '[]');

	if(is_array(c))
	{
	  for(var i=0;i<c.length;i++) c[i].checked = xState;
	}
	else
	{
		c.checked = xState;
	}
}

// Handles auto-resizing textarea fields

function countLines(strtocount, cols, min, max)
{
	var hard_lines = 1;
	var last = 0;
	while(true)
	{
		last = strtocount.indexOf("\n", last+1);
		hard_lines ++;
		if ( last == -1 ) break;
	}
	var soft_lines = Math.round(strtocount.length / (cols-1));
	var hard = eval("hard_lines  " + unescape("%3e") + "soft_lines;");
	if (hard) soft_lines = hard_lines;
	if(soft_lines < min) soft_lines = min;
	if(soft_lines > max) soft_lines = max;

	return soft_lines;
}

function check_content(obj,min,max)
{
	$(obj).rows = countLines($(obj).value,$(obj).cols,min,max);
}

// Extension to Ajax allowing for classes of requests of which only one (the latest) is ever active at a time
// - stops queues of now-redundant requests building up / allows you to supercede one request with another easily.

// just pass in onlyLatestOfClass: 'classname' in the options of the request

Ajax.currentRequests = {};

Ajax.Responders.register({
	onCreate: function(request) {
		if (request.options.onlyLatestOfClass && Ajax.currentRequests[request.options.onlyLatestOfClass]) {
			// if a request of this class is already in progress, attempt to abort it before launching this new request
			try { Ajax.currentRequests[request.options.onlyLatestOfClass].transport.abort(); } catch(e) {}
		}
		// keep note of this request object so we can cancel it if superceded
		Ajax.currentRequests[request.options.onlyLatestOfClass] = request;
	},
	onComplete: function(request) {
		if (request.options.onlyLatestOfClass) {
			// remove the request from our cache once completed so it can be garbage collected
			Ajax.currentRequests[request.options.onlyLatestOfClass] = null;
		}
	}
});

// Functions to handle OAS ad loading independently from page load.

function update_ads()
{
	if($('oas_grabber'))
	{
		$('oas_grabber').src = "/global/ajax/oas.php?" + new Date().getTime();
	}
	else
	{
		obj = "<iframe src='/global/ajax/oas.php?"+ new Date().getTime() + "' style='position: absolute; top: 0px; left: -10000px; height: 1px; width: 1px;' id='oas_grabber'></iframe>";
		new Insertion.Bottom(document.body,obj);
	}
}

function handle_oas_frame(position,content)
{
	if($('oas_' + position))
	{
		$('oas_' + position).innerHTML = content;
	}
}

// JavaScript-based Base64 encoding and decoding class

var Base64 = {

	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;

		input = Base64._utf8_encode(input);

		while (i < input.length)
		{
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);

			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;

			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}

			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
		}

		return output;
	},

	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;

		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

		while (i < input.length)
		{
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));

			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;

			output = output + String.fromCharCode(chr1);

			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
		}
		output = Base64._utf8_decode(output);

		return output;
	},

	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++)
		{
			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
		return utftext;
	},

	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}

		return string;
	}
}