function get(n) { return document.getElementById(n); }

function hide(o) { if(typeof o=='string') o=get(o); if(o) o.style.display = 'none'; }
function show(o,blnInline) { if(typeof o=='string') o=get(o); if(o) o.style.display = (!blnInline) ? 'block' : 'inline'; }
function swap(o) { if(o) o.style.display = (o.style.display=='none') ? 'block' : 'none'; }
function display(o,blnVisible) { if(o) o.style.display = (blnVisible) ? 'block' : 'none'; }
function visibility(o,blnVisible) { if(o) o.style.visibility = (blnVisible) ? 'visible' : 'hidden'; }
function is_displayed(o) { if(!o) return false; return (o.style.display!='none') ? true: false; }

function is_array(o) { if(o != null && typeof o == 'object') { return (typeof o.push == 'undefined') ? false : true; }else { return false; } } 
function is_object(o) { return (o != null && typeof o == 'object') ? true : false; } 
function is_htmlobj(o) { return (o == null || typeof o.nodeName == 'undefined') ? false: true; }

function in_array(n,h) { for(var i in h) if(h[i]==n) return i; return false; }

function trim(s) { return s.replace(/^\s*|\s*$/g,''); }

function sanitize(str) { return str.toString().replace(/[^a-zA-Z0-9]/g, '_'); }

function list_to_json(lst) {
	if(!is_htmlobj(lst)) return;
	if(lst.length == 0) return '[]';
	
	var o = '';
	for(var i=0; i<lst.length; i++)
		o += ', "'+lst.options[i].value+'": '+'"'+lst.options[i].text+'"';
	
	return '{ '+o.substr(2)+' }';
}

//testing
function clone_object(o) {
	var nArr = new Array();
	for(var i in o) {
		if(is_object(arr[i]))	nArr[nArr.length] = clone_object(arr[i]);
		else 				 	nArr[nArr.length] = arr[i];
	}
	
	return nArr;
}

function generate_uid() {
	var r = (Math.random()).toString();
	var s = r.substr(r.indexOf('.')+1,14);

	return (String.fromCharCode(65+(22-r.length)))+s;
}

function print_r(obj) {
	var label = 'unknown';
	if(obj == null) {
		return 'null';
	}else if(is_htmlobj(obj)) { 
		obj = obj.children; 
		label = 'HTMLObject';
	}else if(is_object(obj) && obj.prototype) {
		obj = obj.prototype; 
		label = 'Object';
	}else if(is_object(obj) && !obj.prototype) {
		label = 'Object';
	}else if(is_array(obj)) {
		label = 'Array{' + obj.length + '}';
	}
	
	var base = (typeof arguments[1] == 'undefined') ? '': arguments[1];

	var r = '';
	var ret_val = '';
	for(var key in obj) {
		if (typeof obj[key] == 'object') {
			if (label.indexOf('Array') > -1 || label == 'Object') {
				r += base + '\t[' + key + '] => ' + print_r(obj[key], (base + '\t')) + '\n';
			}else if (label == 'HTMLObject')  {
				var element_id = '';
				if (typeof obj[key].id != 'undefined') {
					element_id += base + '\t\t\t[className] => ' + typeof(obj[key].className) + '{' + obj[key].className.length + '}: ' + '&quot;' + obj[key].className + '&quot;' + '\n';
					element_id += base + '\t\t\t[id] => ' + typeof(obj[key].id) + '{' + obj[key].id.length + '}: ' + '&quot;' + obj[key].id + '&quot;' + '\n';
					element_id += base + '\t\t\t[innerText] => ' + typeof(obj[key].innerText) + '{' + obj[key].innerText.length + '}: ' + '&quot;' + obj[key].innerText + '&quot;' + '\n';
					element_id += base + '\t\t\t[parentElement] => ' + typeof(obj[key].parentElement.id) + '{' + obj[key].parentElement.id.length + '}: ' + '&quot;' + obj[key].parentElement.id + '&quot;' + '\n';
					element_id += base + '\t\t\t[tagName] => ' + typeof(obj[key].tagName) + '{' + obj[key].tagName.length + '}: ' + '&quot;' + obj[key].tagName + '&quot;' + '\n';
				}
				
				r += base + '\t[' + key + '] => ' + print_r(obj[key].children, (base + '\t')) + '\n' + base + '\t\tHTMLObj {\n' + element_id + base + '\t\t}\n';
			}
		}else {
			if (typeof obj[key] == 'string') {
				r += base + '\t[' + key + '] => ' + (typeof obj[key]  + '{' + obj[key].length + '}: ' + '"' + obj[key] + '"' + '\n');
			}else {
				r += base + '\t[' + key + '] => ' + (typeof obj[key] + ': ' + '"' + obj[key] + '"' + '\n');
			}
		}
	}

	return (label + ' { \n' + r + base + '} \n');
}

String.prototype.toArray = function() {
	var tArr=this.split('&');
	var arr=new Array();
	for(var i in tArr) {
		var dArr=tArr[i].split('=');
		arr[dArr[0]] = dArr[1];
	}

	return arr;
};


String.prototype.inn = function() {
	var arr=[];
	
	if(arguments.length > 1) {
		for(var i=0; i < arguments.length; i++) {
			arr[i] = arguments[i];
		}
	}else {
		if(typeof arguments[0] == 'string' && arguments[0].indexOf(',') > -1) 
			arr = arguments[0].split(',');
		else 
			arr = arguments[0];
	}
	
	for(var i in arr) {
		if(arr[i] == this) return true;	
	}
	
	return false;
};

String.prototype.repeat = function(l){
	return new Array(l+1).join(this);
};


// This code was written by Tyler Akins and has been placed in the
// public domain.  It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com

var base64_re = new RegExp(/[^A-Za-z0-9\+\/\=]/g);
var base64_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      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 + base64_keyStr.charAt(enc1) + base64_keyStr.charAt(enc2) + 
         base64_keyStr.charAt(enc3) + base64_keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

function decode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(base64_re, "");

   do {
      enc1 = base64_keyStr.indexOf(input.charAt(i++));
      enc2 = base64_keyStr.indexOf(input.charAt(i++));
      enc3 = base64_keyStr.indexOf(input.charAt(i++));
      enc4 = base64_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);
      }
   } while (i < input.length);

   return output;
}

function isDescendantOf(tNode, pNode) {
	try{
		if(pNode.contains) {
			if(pNode.contains(tNode) && !pNode.contains(get('__!)(@&__'))) // safari always returns true so lookup nonexistent element
				return true;
		}
	}catch(ex) { }// manually look
	
	var p = tNode;
	while(p.parentNode && false != (p = p.parentNode))
		if(p == pNode) 
			return true;

	return false;
}

function getChildren(n) {
	var children=[];
	if(n && n.hasChildNodes())
		for(var i in n.childNodes)
			if(n.childNodes[i] && n.childNodes[i].nodeType == 1)
				children[children.length]=n.childNodes[i];

	return children;
}

function getParentNode(n) {
	var o=n.parentNode;
	while(o != document && o.nodeType != 1)
		o=o.parentNode;

	return o;
}

function findParentNode(o, nodeName, highestNode) {
	var i=0;
	var max=1000;
	if(!highestNode) highestNode = document.body;
	do {
		o=o.parentNode;
		i++;
				
		if(i>=max||o==highestNode) return false;
	}while(o.nodeName != nodeName);
	
	return o;
}

function newElement(type) { return document.createElement(type); }

function getMousePos(e) {
	var posx = 0;
	var posy = 0;
	
	if (!e) var e = window.event;
	
	if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft
				+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
				+ document.documentElement.scrollTop;
	}
	
	return {'x':posx, 'y':posy};
}



function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}

function removeEvent( obj, type, fn )
{
	if (obj.removeEventListener)
		obj.removeEventListener( type, fn, false );
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
}


function centerOnPoint(o,x,y) {
	o.style.left = (x-(o.offsetWidth / 2))+'px';
	o.style.top = (y-(o.offsetHeight / 2))+'px';
}


function evsrc(e) {
	var o=false;
	if (e.target) o = e.target;
	else if (e.srcElement) o = e.srcElement;
	if (o.nodeType == 3) // defeat Safari bug
		o = o.parentNode;
	
	return o;
}


function set_field_value(o,o_val) {
	if(o) {
		switch(o.type) {
			case 'file':		case 'button':		case 'image':
			case 'password':	case 'submit':		case 'hidden':
			case 'text':		case 'textarea':
				o.value = o_val;
				break;

			case 'radio':
			case 'checkbox':
				o.checked = o_val.inn('1', 'true', 'TRUE', 't')?true:false;
				break;
				
			case 'select-one':
				o_val = [ o_val ];
			case 'select-multiple':
				for(var i=0; i < o.options.length; i++) {
					if(in_array(o.options[i].value, o_val)) {
						o.options[i].selected=true;
					}
				}
				break;
				
		}
	}
}



if (!window.console || !console.firebug)
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}