function urlencode(str){
var histogram = {}, histogram_r = {}, code = 0, tmp_arr = [];
var ret = str.toString();
var replacer = function(search, replace, str) {
var tmp_arr = [];
tmp_arr = str.split(search);
return tmp_arr.join(replace);
};
histogram['!']   = '%21';
histogram['%20'] = '+';
ret = encodeURIComponent(ret);
for (search in histogram) {
replace = histogram[search];
ret = replacer(search, replace, ret);
}
return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2){
return "%"+m2.toUpperCase();
});
return ret;
}
function urldecode(str){
var histogram = {}, histogram_r = {}, code = 0, str_tmp = [];
var ret = str.toString();
var replacer = function(search, replace, str) {
var tmp_arr = [];
tmp_arr = str.split(search);
return tmp_arr.join(replace);
};
histogram['!']   = '%21';
histogram['%20'] = '+';
for (replace in histogram) {
search = histogram[replace]; // Switch order when decoding
ret = replacer(search, replace, ret) // Custom replace. No regexing   
}
ret = decodeURIComponent(ret);
return ret;
}
function Query(response)
{
	var xml = response;
	var records =  xml.getElementsByTagName("record");
	var record;
	var size = records.length;
	var next_count = 0;
	var prev_count = size-1;

	this.next = function()
	{
		record = records[next_count];
		next_count = next_count + 1;
		return next_count <= size;
	}
	this.prev = function()
	{
		record = records[prev_count];
		prev_count = prev_count - 1;
		return prev_count >= -1;
	}

	this.getRecordTag = function( tag )
	{
		var node = record.getElementsByTagName(tag)[0];
		if(node.hasChildNodes())
		{
			return node.firstChild.nodeValue;
         	}
		else
		{
			return "";
		}
	}
	this.getTag = function( tag )
	{
		var node = xml.getElementsByTagName(tag)[0];
		if(node.hasChildNodes())
		{
			return node.firstChild.nodeValue;
         	}
		else
		{
			return "";
		}
	}
}
function trim(text)
{
	return text.replace(/^\s+|\s+$/g, '');
}
function GetXmlHttpObject()
{
	var obj=null;
	try
	{
		obj=new XMLHttpRequest();
	}
	catch (e)
	{
	 	try
	  	{
	  		obj=new ActiveXObject("Msxml2.XMLHTTP");
		}
	 	catch (e)
	  	{
			obj=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return obj;
}
function purge_id(id)
{
	var node = document.getElementById(id);
	while(node.hasChildNodes())
	{
		node.removeChild(node.firstChild);
	}

}
function purge_node(node)
{
	while(node.hasChildNodes())
	{
		node.removeChild(node.firstChild);
	}

}

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