

try { now_loading('Utility support.'); } catch (e) {}

// Utility functions used all over the place

function get_style(d) 
{
	return document.defaultView.getComputedStyle(get_el(d),'');
}

function get_el(d)
{
	return document.getElementById(d);
}

function init_gensym() {
  var __symbol  = '___symbol_';
  var __counter = 100000;

  //| genSym()
  //|
  //|   Generate & return a new unique global symbol.
  //|
  window.genSym = function () // closed over __symbol & __counter
  {
    return ''+__symbol+(parseInt(++__counter)); //XXX is this really atomic in JS? bleh
  }
}
init_gensym();


function formatAsMoney(mnt)
{
  mnt = parseFloat(mnt);
  var is_neg = mnt < 0 ? 1 : 0;
  mnt = Math.abs(mnt);
  mnt = mnt ? parseInt(mnt * 100) : 0;
  var cents   = parseInt(mnt) % 100;
  while ((''+cents).length < 2) cents = '0'+cents;
  var dollars = parseInt(mnt) != 0 ? parseInt(mnt / 100) : 0;
  var out = ''+dollars+'.'+cents;
  if (is_neg) { out = '-'+out; }
  return out;
}

function fillDropdown(t, p, v, s)
{
	var rpc, data;
	var html = '', x;
	try {
		rpc  = new RPC(undefined, '/lib/__service_form.asp?f=');
		data = new biData();
		data.inp.source = { table: t, pkey: p, view: v };
		var res = rpc.fire('fill_databound_dropdown', data);
		if (!res) throw data.error;
	} catch (e) { alert ('An error occurred while talking to the RPC service: ' + e); }

	if (data.out.found)
	{
		for (x = 0; x < data.out.fill.length; x++) 
		{		
			var string = data.out.fill[x].view[0].toUpperCase() + data.out.fill[x].view.substr(1, data.out.fill[x].view.length);
			html += '<option value="' + data.out.fill[x].value + '" ';
			if (data.out.fill[x].value == s) html += 'selected';
			html += '/>' + string + '<br />';
		}
	}

	return html;
}

function populateFormSelect(id, options)
{
  var i;
  var e = document.getElementById(id);
  for (i in options)
  {
    var n = document.createElement('option');
    n.value = i;
    n.innerHTML = options[i];
    e.appendChild(n);
  }
}

function returnConstantTable(t, p, v)
{
	var rpc, data, x;
	var values = {};
	try {
		rpc  = new RPC(undefined, '/lib/__service_form.asp?f=');
		data = new biData();
		data.inp.source = { table: t, pkey: p, view: v };
		var res = rpc.fire('fill_databound_dropdown', data);
		if (!res) throw data.error;
	} catch (e) { alert ('An error occurred while talking to the RPC service: ' + e); }

	if (data.out.found)
	{
		for (x = 0; x < data.out.fill.length; x++) 
		{		
			var string = data.out.fill[x].view.substr(0,1).toUpperCase() + data.out.fill[x].view.substr(1, data.out.fill[x].view.length);
			values[data.out.fill[x].value] = string;
		}
	}

	return values;
}

function generateRandomPassword() 
{
	var pass = '', num = parseInt(Math.random()*3)+5;
	var capLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('');
	var letters    = "abcdefghijklmnopqrstuvwxyz".split('');
  var numbers    = "0123456789".split('');
	
	for (var x = 0; x < num; x++)
	{
		switch (parseInt(Math.random()*3))
		{
			case 0:
				pass += capLetters[parseInt(Math.random()*(capLetters.length-1))+1];
				break;
			case 1:
				pass += letters[parseInt(Math.random()*(letters.length-1))+1];
				break;
			case 2:
				pass += numbers[parseInt(Math.random()*(numbers.length-1))+1];
				break;
		}
	}
	return pass;
}

var hexDigit = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
function dec2hex(dec) { return(hexDigit[parseInt(dec)>>4]+hexDigit[parseInt(dec)&15]); }
function hex2dec(hex) { return(parseInt((""+hex).toUpperCase(),16));  }

function chrhex_cb (s) { return String.fromCharCode(hex2dec(s)); }
function hexord_cb (s) { return dec2hex((""+s).charCodeAt(0)); }

function hex_decode_string(s)
{
	return (""+s).split(/\-/).map(chrhex_cb).join('');
}

function hex_encode_string(s)
{
	return (""+s).split('').map(hexord_cb).join('-');
}


// ------ XML/XSLT Functions ------ //

// Defines XmlDocument.xml as the serialization mechanism
Document.prototype.__defineGetter__("xml", function() { return (new XMLSerializer()).serializeToString(this); } )

// Loads an XML document from a text string
Document.prototype.loadXML = function(s)
{
	var doc2 = (new DOMParser()).parseFromString(s,"text/xml");
	while (this.hasChildNodes())
	{
		this.removeChild(this.lastChild);
	}
	for (var i=0; i != doc2.childNodes.length; i++)
	{
		this.appendChild(this.importNode(doc2.childNodes[i],true));
	}
}

function render_XML(pane, xml, xslt_file)
{
	var div     = document.getElementById(pane);
	try 
	{
		var xsltp   = new XSLTProcessor();
		var xmlhttp = new XMLHttpRequest();
		var xmldoc  = document.implementation.createDocument("","",null);
		var xslt, xml_fragment;
	
		xmldoc.loadXML(xml);
		xmlhttp.open("GET", xslt_file, false);
		xmlhttp.send(null);
	
		xslt = xmlhttp.responseXML;
		xsltp.importStylesheet(xslt);
	
		xml_fragment = xsltp.transformToFragment(xmldoc, document);
	
		div.innerHTML = '';
		div.appendChild(xml_fragment);
		return true;
	} catch (e) {
		div.innerHTML = 'Error rendering XML: ' + e;
	}
}

