//Javascript functions-- Genera. functions.js
//var xmlhttp;
var return_xml;
var isIE=document.all;
var validate_error = false;
function setCheckboxes(the_form, do_check)
{
	var elts      = (typeof(document.forms[the_form].elements['selected_db[]']) != 'undefined')
	? document.forms[the_form].elements['selected_db[]']
	: (typeof(document.forms[the_form].elements['selected_tbl[]']) != 'undefined')
	? document.forms[the_form].elements['selected_tbl[]']
	: document.forms[the_form].elements['selected_fld[]'];
	var elts_cnt  = (typeof(elts.length) != 'undefined')
	? elts.length
	: 0;

	if (elts_cnt)
	{
		for (var i = 0; i < elts_cnt; i++)
		{
			elts[i].checked = do_check;
		} // end for
	}
	else
	{
		elts.checked        = do_check;
	} // end if... else

	return true;
} // end of the 'setCheckboxes()' function

//another check/uncheck all function
function setAll(the_form, do_check,suffix)
{
	for (i=0,n=the_form.elements.length;i<n;i++)
	if (the_form.elements[i].name.indexOf('selected_'+suffix) !=-1)
	the_form.elements[i].checked = do_check;
}

function open_window(url)
{
	var NEW_WIN = null;
	NEW_WIN = window.open ("", "NewWindow", "toolbar=no,width=640,height=480,directories=no,status=no,scrollbars=yes,resize=no,menubar=no");
	NEW_WIN.location.href = url;
}

function get_timezone()
{
	var local_now = new Date();
	return local_now.getTimezoneOffset()+':'+local_now.getFullYear()+':'+local_now.getMonth()+':'+local_now.getDate();
}

//disable right click
///document.oncontextmenu=new Function("/*alert(message);*/return false")
//============================================================================
//set input background for ie
sfFocus = function()
{
	var sfEls = document.getElementsByTagName("INPUT");set_focus(sfEls);
	var sfEls = document.getElementsByTagName("TEXTAREA");set_focus(sfEls);
	var sfEls = document.getElementsByTagName("SELECT");set_focus(sfEls);
	function set_focus(sfEls)
	{
		for (var i=0; i<sfEls.length; i++)
		{
			sfEls[i].onfocus=function()
			{
				this.className+=" sffocus";
			}
			sfEls[i].onblur=function()
			{
				this.className=this.className.replace(new RegExp(" sffocus\\b"), "");
			}
		}
	}
}
if (window.attachEvent) window.attachEvent("onload", sfFocus);
//============================================================================
function xmlhttp_responce(url, callback_function, method)
{
	//alert(url);
	xmlhttp = new XMLHttpRequest();
	xmlhttp.onreadystatechange = function()
	{
		if (xmlhttp.readyState == 4)
		{
			if (xmlhttp.status == 200)
			{
				document.getElementById('body').style.cursor = 'default';
				if(document.getElementById('wait')) document.getElementById('wait').style.display='none';
				if (return_xml)
				{
					//alert('xml=>'+Sarissa.serialize(xmlhttp.responseXML));
					if(Sarissa.serialize(xmlhttp.responseXML).search(/<!DOCTYPE HTML/) != -1) //if session is over lgon page is returned that we relocate to it
					{
						location.href=host_url + '/logout';
						return false;
					}
					eval(callback_function + '(xmlhttp.responseXML)');
				}
				else
				{
					//alert(xmlhttp.responseText);
					if(xmlhttp.responseText.search(/<!DOCTYPE HTML/) != -1)
					{
						location.href=host_url + '/logout';
						return false;
					}
					eval(callback_function + '(xmlhttp.responseText)');
				}
			}
			else
			{
				alert('There was a problem with the request.(Code: ' + xmlhttp.status + ')');
			}
		}
		else return;
	}
	xmlhttp.open(method, url, true);
	xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	//if(!document.all)
	//xmlhttp.overrideMimeType('text/xml');
	//xmlhttp.setRequestHeader("Cache-Control","no-cache");
	if (parameters)
	{
		///alert('Method POST');
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Content-length", parameters.length);
		xmlhttp.setRequestHeader("Connection", "close");
	}
	xmlhttp.send(parameters);
}
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;
	}
}

var parameters;
var link_id;
var head = 'INFO';
var xoffset = 0;
var yoffset = 0;
var hauto = 1;
var setElementData = true; //set to false if you don't want to keep value in the provided element (if data of the field is changed friquently)
function view_data(txt_data)
{
	//alert(txt_data);
	//if(document.getElementById(link_id) && setElementData) document.getElementById(link_id).value = txt_data;
	return overlib(txt_data, STICKY, DRAGGABLE, ALTCUT, /**/CAPTION, head, CLOSECLICK, CLOSECOLOR, '#ffff00', WRAP, FGCOLOR, '#eeffee', BGCOLOR, '#556655', CENTERPOPUP, CENTEROFFSET, 0, OFFSETX, xoffset, OFFSETY, yoffset, HAUTO, 0);
}
function getData(url, elm_id, default_view, x, y)
{
	//alert(elm_id);
	xoffset = x ? x : 0;
	hauto = x == 0 ? 0 : 1;
	yoffset = y ? y : 0;
	default_view = default_view ? default_view : '<font style="color:yellow;font-weight:700;font-size:14px>Loading...</font>';
	elm = document.getElementById(elm_id);
	link_id=elm_id;
	if(elm.value == undefined){elm.value = default_view};
	if(elm.value == default_view) {return_xml=false; xmlhttp_responce(url, 'view_data', 'GET');};
	return overlib( elm.value, /*STICKY, DRAGGABLE, ALTCUT, CAPTION, head, CLOSECLICK, CLOSECOLOR, '#ffff00', */WRAP, FGCOLOR, '#3344ee', BGCOLOR, '#eeee55');
}
//===Next 3 functions useful for single field update
var current_field_id;
var value_field_id;
var view_field_id;
var trigger = false;
var running = false;
var val;
var _url
var view_val;
var validate_rule;
var real_val;//if view val trancated
var orig_val;
function getInput(type)
{
	switch (type)
	{
		case 'text':
		return '<input type="text" size="37" id="input_edit" value="' + real_val + '" style="font-size:12px;vertical-align:middle" onclick="this.focus()" /> <input type="image" src="/images/save.gif" alt="Save" valign="middle" onclick="updateField(_url, document.getElementById(\'input_edit\').value)" style="vertical-align:middle" title="Save" /><input type="image" alt="Cancel" src="/images/icon_cancel.gif" style="vertical-align:middle" title="Cancel" onclick="cancelUpdate()" />'
		case 'textarea':
		return '<textarea id="input_edit" style="width:350px;height:100px" style="font-size:12px;" onclick="this.focus()">' + real_val + '</textarea> <input type="image" src="/images/save.gif" valign="middle" onclick="updateField(_url, document.getElementById(\'input_edit\').value)" style="vertical-align:middle" title="Save" /><input type="image" src="/images/icon_cancel.gif" style="vertical-align:middle" title="Cancel" onclick="cancelUpdate()" />'
		case 'select':
		getSelect(real_val); //in tpl
		return 'Wait...';
	}
}
function editField(url, id, type)
{
	_url = url;
	if (trigger) return true;
	current_field_id = id;
	value_field_id = 'value_'+id;
	view_field_id = 'view_'+id;
	validate_field_id = 'validate_'+id;
	validate_rule = document.getElementById(validate_field_id) ? document.getElementById(validate_field_id).value : null;
	//alert('validate rule: '+validate_rule);
	view_val = document.getElementById(view_field_id).innerHTML;
	orig_val = document.getElementById(id).innerHTML;
	real_val = document.getElementById(value_field_id).value ? document.getElementById(value_field_id).value : '';
	document.getElementById(id).innerHTML = getInput(type);
	trigger = true;
}

function updateField(url, value)
{
	if(validate_rule)
	{
		//alert('vr:'+validate_rule);
		validate_input('input_edit', validate_rule);
	}
	if(validate_error)
	{
		//alert('Validation error')
		return false;
	}
	wait_cursor();
	running = true;
	parameters = 'id='+current_field_id+'&input=' + escape(encodeURIComponent(value));
	//return alert(parameters);
	xmlhttp_responce(url, 'updateLocal', 'POST');
}
function updateLocal(data)
{
	//alert(data);
	if(!data) data=orig_val;
	else var data_array = json2array(data);
	data = isArray(data_array) ? data_array[1].replace(isIE ? /\\r\\n/gi : /\\n/gi, "\n") : data.replace(isIE ? /\\r\\n/gi : /\\n/gi, "\n");
	//overlib_hide();
	//alert(data);
	//alert(data_array);
	var new_val = isArray(data_array) ? data_array[1] : data;
	///alert("New value updated to:\n " + new_val);//"([(\n)+(\r)+]+)"
	document.getElementById(current_field_id).innerHTML = unescape(orig_val);
	document.getElementById(view_field_id).innerHTML = isArray(data_array) ? unescape(data_array[1].replace(/\n/gi, '<br/>')) : unescape(data.replace(/\n/gi, '<br/>'));
	document.getElementById(value_field_id).value = isArray(data_array) ? unescape(data_array[0]) : unescape(data);
	trigger = false;
	running = false;
}
function cancelUpdate()
{
	document.getElementById(current_field_id).innerHTML = orig_val;
	trigger = false;
	running = false;
	//if (!this.value) return cancelUpdate({$merchant_fees[key].value}) //in the code
}
//-----------======
function onEnterKey(func, e)
{
	if (window.event && window.event.keyCode == 13)
	{
		return eval(func);
	}
	else if(e.which && e.which == 13) // Netscape/Firefox/Opera
	{
		return eval(func);
	}
}
function hideElement(e)
{
	document.getElementById(e).style.display = 'none';
}
function showElement(e)
{
	document.getElementById(e).style.display = 'inline';
}
function copy_clip(maintext)
{
	if (window.clipboardData)
	{

		// the IE-manier
		window.clipboardData.setData("Text", maintext);

		// waarschijnlijk niet de beste manier om Moz/NS te detecteren;
		// het is mij echter onbekend vanaf welke versie dit precies werkt:
	}
	else if (window.netscape)
	{
		if(typeof(user_pref) == 'undefined') return false;
		user_pref("capability.policy.policynames", "allowclipboard");
		user_pref("capability.policy.allowclipboard.sites", "https://dev.buxline.com");
		user_pref("capability.policy.allowclipboard.Clipboard.cutcopy", "allAccess");
		user_pref("capability.policy.allowclipboard.Clipboard.paste", "allAccess");
		// dit is belangrijk maar staat nergens duidelijk vermeld:
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

		// maak een interface naar het clipboard
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip) return;

		// maak een transferable
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans) return;

		// specificeer wat voor soort data we op willen halen; text in dit geval
		trans.addDataFlavor('text/unicode');

		// om de data uit de transferable te halen hebben we 2 nieuwe objecten nodig   om het in op te slaan
		var str = new Object();
		var len = new Object();

		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);

		var copytext=maintext;

		str.data=copytext;

		trans.setTransferData("text/unicode",str,copytext.length*2);

		var clipid=Components.interfaces.nsIClipboard;

		if (!clip) return false;

		clip.setData(trans,null,clipid.kGlobalClipboard);

	}
	alert("Following text was copied to your clipboard:\n\n" + maintext + "\nPaste (Ctrl+V) this text in your code.");
	return true;
}
function wait_tag()
{
	return overlib('<div align="center" style="color:white;background:blue"><b>WAIT...</b></div>', VAUTO, HAUTO);
}
function wait_cursor()
{
	document.getElementById('body').style.cursor = 'wait';
}
function overlib_hide()
{
	document.getElementById('overDiv').style.visibility = 'hidden';
}
//will check if value in html field > than 0
function isValue(id)
{
	if(document.getElementById(id).innerHTML.replace(/\D/g, '') > 0)
	return true;
	return false;
}
function json2array(data)
{
	if(data == 'undefined' || !data)
	{
		alert('No data received. ');
		return false;
	}
	try
	{
		eval("var data_array = "+data);
	}
	catch(err)
	{
		return data;
	}
	//alert(data_array);
	//alert(data_array.constructor.toString().indexOf("Array"));
	//return isArray(data_array) ?  data_array : data;
	return data_array;
}
function isArray(obj)
{
	if (obj.constructor.toString().indexOf("Array") == -1)
	return false;
	else
	return true;
}

function serialize (object) {
	var values = [];
	var prefix = '';

	values = recursive_serialize(object, values, prefix);

	param_string = values.join('&');
	return param_string;
}

function recursive_serialize(object, values, prefix) {
	for (key in object) {
		if (typeof object[key] == 'object') {

			if (prefix.length > 0) {
				prefix += '['+key+']';
			} else {
				prefix += key;
			}

			values = recursive_serialize(object[key], values, prefix);

			prefixes = prefix.split('[');

			if (prefixes.length > 1) {
				prefix = prefixes.slice(0,prefixes.length-1).join ('[');
			} else {
				prefix = prefixes[0];
			}

		} else {
			value = (object[key]);//encodeURIComponent
			if (prefix.length > 0) {
				prefixed_key = prefix+'['+key+']'
			} else {
				prefixed_key = key
			}
			prefixed_key = encodeURIComponent(prefixed_key);
			if (value) values.push(prefixed_key + '=' + value + '\n');
		}
	}
	return values;
}
function validate_rules(min_len, max_len)
{
	var valid_rules = new Array();
	var occur = min_len ? '{'+min_len+',}' : max_len ? '{'+min_len+','+max_len+'}' : '+';
	valid_rules['validate_address'] = new Array("^(\\w+[',-.]?[\\s]*)"+occur+"$", "Use alpha-numeric, single comma, hyphen or single quote."); //allows alpha-numeric, single comma, hyphen or quote
	valid_rules['validate_name'] = new Array("^[ a-z'-]"+occur+"$", "Use alpha, hyphen or single quote"); //allows alpha-numeric, single comma, hyphen or quote
	valid_rules['validate_username'] = new Array("^(\\w+([-._]?\\w)*)"+occur+"$", "Use alpha-numeric, dot(.) and hyphen(-)"); //allows alpha-numeric, single comma, hyphen or quote
	valid_rules['validate_city_state'] = new Array("^[a-z]+([\\s',-.]*[a-z]+)?$", "Use alpha, space, hyphen, dot");
	valid_rules['validate_url'] = new Array("^((http|https):\\/\\/)?\\w+([.-]\\w+)*(\\.[a-z]{2,4}){1}((\\/){1}[?]?([\\w#!:.?+=&%@!\\-\\/])*)*$", "Use valid URL.");
	//valid_rules['validate_url'] = new Array("^((ftp|http|https):\\/\\/)?(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$", "Use valid URL.");
	valid_rules['validate_email'] = new Array("^(\\w+([-|.]?\\w+)*)+@\\w+([.|-]\\w+)*(\\.[a-z]{2,3}){1}$", "Use valid email.");
	valid_rules['validate_postal_code'] = new Array("^\\d{5}(-\\d{4})?$", "\nUse valid zip code.");
	valid_rules['validate_decimal'] = new Array("^([0-9]+([.]{1}[0-9]+)?)"+occur+"$", "\nUse digits and dot.");
	valid_rules['validate_height'] = new Array("^([0-9]+([,.'\"]?[0-9]+([.'\"]?))?)"+occur+"$", "\nUse digits, dot, single and double quotes.");
	///valid_rules['validate_text'] = new Array("^(\\w+([-|.]?\\w+)*)"+occur+"$", "\nUse any.");

	//valid_rules['validate_password'] = new Array("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{"+min_len+",}$", "Use any characters and at least one digit.");
	valid_rules['validate_text'] = new Array("^[\\W\\w-.\\s\\n]"+occur+"$", "Use any . ");
	valid_rules['validate_dob'] = new Array("^[\\W\\w-.\\s\\n]+$", "Please select your date of birth. ");
	return valid_rules;
}

function validate_input(field, type, min_len, max_len)
{
	//return true; //test
	//if(type='validate_url')
	//alert(document.getElementById(field).value+'::'+type);
	var min_max = min_len && !max_len ? "Min " + min_len : max_len ? " " + min_len + ' - ' + max_len  :  '';
	//alert(min_len+' '+max_len);
	var valid_rules = validate_rules(min_len, max_len);
	//alert('valid_rules=>'+serialize(valid_rules));
	//alert('>>'+valid_rules[type][0]);
	var rule = new RegExp(valid_rules[type][0], 'i');
	///if(field=='mname') alert(rule);
	if (!rule.test(trim(document.getElementById(field).value)))
	{
		//alert(valid_rules[type][1]);
		validate_error = true;
		chars = min_max ? ' characters' : '';
		document.getElementById('error_'+field).innerHTML = error_tag(valid_rules[type][1] + ' ' + min_max + chars);
		document.getElementById(field).focus();
		return false;
	}
	validate_error = false;
	document.getElementById('error_'+field).innerHTML = '';
}
function error_tag(msg)
{
	return msg ?  '<span>'+msg+'</span>' : null;
}
///---login functions
var pup = '';
function viewError(data)
{
	data_array = json2array(data);
	if(data != 'undefined')
	{
		//alert(data_array['redirect']);
		if(data_array['result'] == 'false')
		{
			//alert(data_array['msg']);
			document.getElementById('err_msg'+pup).style.color = 'red';
			document.getElementById('err_msg'+pup).innerHTML = data_array['msg'];
			document.getElementById('password'+pup).value = '';
			setFocus();
		}
		else location.href = data_array['redirect'] && data_array['redirect'] != null ? data_array['redirect'] : location.href;
	}
}
function sendLogin(pup_id)
{
	pup_id = pup_id ? pup_id : '';
	pup = pup_id;
	var username = document.getElementById('username'+pup_id).value;
	var password = document.getElementById('password'+pup_id).value;
	if(!username || !password)
	{
		//alert('Please provide username and password.');
		document.getElementById('err_msg'+pup_id).style.color = 'red';
		document.getElementById('err_msg'+pup_id).innerHTML = 'Please provide username and password.';
		setFocus();
		return false;
	}
	var contr = activate ? link : '/login/do/login'
	var url = host_url + contr + '/username/' + username + '/password/' + password + '/act/proc/pup/' + pup;// + '/url/' + Base64.encode(location.href);
	//alert(url);
	xmlhttp_responce(url, 'viewError', 'GET')
}
function setFocus()
{
	if(document.getElementById('username'+pup).value=='')
	document.getElementById('username'+pup).focus();
	else
	{
		document.getElementById('password'+pup).value = '';
		document.getElementById('password'+pup).focus();
	}
}
///-------------------
function trim(string)
{
	return string.replace(/^\s*/, "").replace(/\s*$/, "");
}
function debug(msg, clear)
{
	var output = document.getElementById("output");
	if (clear == true)
	output.innerHTML = "<p>" + msg + "</p>";
	else
	{
		output.innerHTML += "<p>" + msg + "</p>";
	}
}
//change the opacity for different browsers
function changeOpac(opacity, id)
{
	var object = document.getElementById(id).style;
	object.opacity = (opacity / 100);
	object.MozOpacity = (opacity / 100);
	object.KhtmlOpacity = (opacity / 100);
	object.filter = "alpha(opacity=" + opacity + ")";
}
function gebi(id)
{
	return document.getElementById(id);
}
function selectReplacement(obj)
{
	obj.className += ' replaced';
	var ul = document.createElement('ul');
	ul.className = 'selectReplacement';
	var opts = obj.options;
	for (var i=0; i<opts.length; i++)
	{
		var selectedOpt;
		if (opts[i].selected)
		{
			selectedOpt = i;
			break;
		}
		else
		{
			selectedOpt = 0;
		}
	}
	for (var i=0; i<opts.length; i++)
	{
		var li = document.createElement('li');
		var txt = document.createTextNode(opts[i].text);
		li.appendChild(txt);
		li.selIndex = opts[i].index;
		li.selectID = obj.id;
		li.onclick = function()
		{
			selectMe(this);
		}
		if (i == selectedOpt)
		{
			li.className = 'selected';
			li.onclick = function()
			{
				this.parentNode.className += ' selectOpen';
				this.onclick = function()
				{
					selectMe(this);
				}
			}
		}
		if (window.attachEvent)
		{
			li.onmouseover = function()
			{
				this.className += ' hover';
			}
			li.onmouseout = function()
			{
				this.className =
				this.className.replace(new RegExp(" hover\\b"), '');
			}
		}
		ul.appendChild(li);
	}
	obj.parentNode.insertBefore(ul,obj);
}
function selectMe(obj)
{
	var lis = obj.parentNode.getElementsByTagName('li');
	for (var i=0; i<lis.length; i++)
	{
		if (lis[i] != obj)
		{
			lis[i].className='';
			lis[i].onclick = function()
			{
				selectMe(this);
			}
		}
		else
		{
			setVal(obj.selectID, obj.selIndex);
			obj.className='selected';
			obj.parentNode.className =
			obj.parentNode.className.replace(new RegExp(" selectOpen\\b"), '');
			obj.onclick = function()
			{
				obj.parentNode.className += ' selectOpen';
				this.onclick = function()
				{
					selectMe(this);
				}
			}
		}
	}
}
function setVal(objID, selIndex)
{
	var obj = document.getElementById(objID);
	obj.selectedIndex = selIndex;
}
function setForm()
{
	var s = document.getElementsByTagName('select');
	for (var i=0; i<s.length; i++)
	{
		selectReplacement(s[i]);
	}
}
function _urchinTrackerCall(url)
{
	if(dev) return false;
	_uacct = "UA-1366093-5";
	urchinTracker(url);
	return true;
}
function urchinTrackerCall(url)
{
	var pageTracker = _gat._getTracker("UA-1366093-5");
	pageTracker._initData();
	pageTracker._trackPageview(url);
}
/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

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;
	}
}
function select_text(o)
{
	if (typeof o != 'undefined')
	{
		o.focus();
		o.select();
	}
}