
function Hash()
{
	this.length = 0;
	this.items = new Array();
	for (var i = 0; i < arguments.length; i += 2) {
		if (typeof(arguments[i + 1]) != 'undefined') {
			this.items[arguments[i]] = arguments[i + 1];
			this.length++;
		}
	}
   
	this.removeItem = function(in_key)
	{
		var tmp_value;
		if (typeof(this.items[in_key]) != 'undefined') {
			this.length--;
			var tmp_value = this.items[in_key];
			delete this.items[in_key];
		}
	   
		return tmp_value;
	}

	this.getItem = function(in_key) {
		return this.items[in_key];
	}

	this.setItem = function(in_key, in_value)
	{
		if (typeof(in_value) != 'undefined') {
			if (typeof(this.items[in_key]) == 'undefined') {
				this.length++;
			}

			this.items[in_key] = in_value;
		}
	   
		return in_value;
	}

	this.hasItem = function(in_key)
	{
		return typeof(this.items[in_key]) != 'undefined';
	}
	
	this.keys = function() 
	{
		var keys = new Array();
		for (var i in this.items) {			
			keys.push(i);
		}			
		return keys;
	}
	
	this.values = function() 
	{
		var values = new Array();
		for (var i in this.items) {			
			values.push(this.items[i]);
		}	
		return values;
	}
	
}



function nl_to_br2(old_value){
	//textarea is reference to that object, replaceWith is string that will replace the encoded return
	
	var new_value = escape(old_value);
	//alert('new_value before replace: ' + new_value);
	var replaceWith = '<br>';
	
	for(i=0; i<new_value.length; i++){
		//loop through string, replacing carriage return encoding with HTML break tag

		if(new_value.indexOf("%0D%0A") > -1){
			//Windows encodes returns as \r\n hex
			alert('found %0D%0A');
			new_value = new_value.replace("%0D%0A",replaceWith);
			
		} else if(new_value.indexOf("%0A") > -1){
			//Unix encodes returns as \n hex
			alert('found %0A');
			new_value = new_value.replace("%0A",replaceWith);
			
		} else if(new_value.indexOf("%0D") > -1){
			//Macintosh encodes returns as \r hex
			alert('found %0D');
			new_value = new_value.replace("%0D",replaceWith);
		}

	}
	new_value = unescape(new_value);
	//alert('new_value after replace: ' + new_value);
	return new_value;
}

function nl_to_br(old_value) { 
	//alert('nl_to_br - old_value: ' + old_value);
	old_value = escape(old_value);
	var re_nlchar = "";
	//alert('nl_to_br - old_value: ' + old_value);
	if(old_value.indexOf('%0D%0A') > -1){	
		//alert("found %0D%0A");
		re_nlchar = /%0D%0A/g ;
	}else if(old_value.indexOf('%0A') > -1){
		//alert("found %0A");
		re_nlchar = /%0A/g ;
	}else if(old_value.indexOf('%0D') > -1){
		//alert("found %0D");
		re_nlchar = /%0D/g ;
	}
	return unescape( old_value.replace(re_nlchar,'<br>') );	
}

function br_to_nl(old_value){
	//textarea is reference to that object, replaceWith is string that will replace the encoded return
	
	var new_value = old_value;
	var replaceWith = '\n';
	
	for(i=0; i<new_value.length; i++){
		//loop through string, replacing carriage return encoding with HTML break tag
		if(new_value.indexOf("<br>") > -1){			
			new_value = new_value.replace("<br>",replaceWith);			
		} 
	}

	return new_value;
}

function spaces_to_nbsp(old_value){
	//textarea is reference to that object, replaceWith is string that will replace the encoded return
	
	var new_value = old_value;
	var replaceWith = '&nbsp; ';
	
	for(i=0; i<new_value.length; i++){
		//loop through string, replacing carriage return encoding with HTML break tag
		if(new_value.indexOf("  ") > -1){			
			new_value = new_value.replace("  ",replaceWith);			
		} 
	}

	return new_value;
}

function nbsp_to_spaces(old_value){
	//textarea is reference to that object, replaceWith is string that will replace the encoded return
	
	var new_value = old_value;
	var replaceWith = ' ';
	
	for(i=0; i<new_value.length; i++){
		//loop through string, replacing carriage return encoding with HTML break tag
		if(new_value.indexOf("&nbsp;") > -1){			
			new_value = new_value.replace("&nbsp;",replaceWith);			
		} 
	}

	return new_value;
}

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

function htmlentities2( s ){
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: htmlentities('Kevin & van Zonneveld');
    // *     returns 1: 'Kevin &amp; van Zonneveld'
 
    var div = document.createElement('div');
    var text = document.createTextNode(s);
    div.appendChild(text);
    return div.innerHTML;
}

function htmlentities3( str ) { 
  var ta=document.createElement("textarea");
  ta.innerHTML=str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  return ta.value;
}

function htmlentities( str ) { 
	var new_string = str;
	new_string.replace(/</g,"&lt;");
	new_string.replace(/>/g,"&gt;");
	new_string.replace(/"/g,"\"");
	new_string.replace(/'/g,"\'");
	return new_string;
}

function html_entity_decode( string ) {
    // http://kevin.vanzonneveld.net
    // +   original by: john (http://www.jd-tech.net)
    // +      input by: ger
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: html_entity_decode('Kevin &amp; van Zonneveld');
    // *     returns 1: 'Kevin & van Zonneveld'
 
    var ret, tarea = document.createElement('textarea');
    tarea.innerHTML = string;
    ret = tarea.value;
    return ret;
}

function buildAjaxRequest( id ) { 
		var ajaxRequest;  // The variable that makes Ajax possible!
		
		try{
			// Opera 8.0+, Firefox, Safari
			ajaxRequest = new XMLHttpRequest();
		} catch (e){
			// Internet Explorer Browsers
			try{
				ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try{
					ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e){
					// Something went wrong
					alert("Your browser broke!");
					return false;
				}
			}
		}
		// Create a function that will receive data sent from the server
		ajaxRequest.onreadystatechange = function(){
			if(ajaxRequest.readyState == 4){
				//document.myForm.time.value = ajaxRequest.responseText;				
				var ajaxDisplay = document.getElementById( id );
				ajaxDisplay.innerHTML = ajaxRequest.responseText;
			}
		}	
		return ajaxRequest;
	}

// shamelessly ganked from Omniprise
// give it a bool ( or a reference to a checkbox ), and it will
//    toggle the visibility/display of elements you supply as arguments based 
//		on that bool (or checkbox's value
function toggle( ref ) {
	if ( typeof ref == 'boolean' ) var rc = ref;
	else var rc = ref.checked;
	
	for ( var i = 1, len = arguments.length; i < len; i++ ) {
		var el = (typeof arguments[i] == 'string') ? document.getElementById( arguments[i] ) : arguments[i];
		if ( el && typeof el == 'object' ) {
			el.style.display = ( rc ) ? '' : 'none';
			el.style.visibility = ( rc ) ? 'visible' : 'hidden';
			toggleChildren( el, rc );
		}
	}
	rc = i = len = el = null;
}

// helper function to toggle() above 
//     also ganked from Omniprise
function toggleChildren( ref, rc ) {
	var nn = ref.nodeName.toLowerCase();
	if ( nn == 'input' || nn == 'textarea' || nn == 'select' || nn == 'a' || nn == 'button' )
	{
	  ref.style.visibility = (rc) ? 'visible' : 'hidden';
	  ref.style.display = ( rc ) ? '' : 'none';
	}
	if ( ref.childNodes.length < 1 ) return;
	for ( var i = 0, len = ref.childNodes.length; i < len; i++ ) {
		toggleChildren( ref.childNodes[i], rc );
	}
}

//also thieved from Omniprise
function destroyNode(e) {
	if ( typeof e == 'string' ) var e = document.getElementById(e);
	if ( !e ) return false;
	try{ e.innerHTML = ''; } catch(er) {}
	/*if ( e.hasChildNodes() ) for ( var i = 0, l = e.childNodes.length; i < l; i++ ) destroyNode( e.childNodes[i] );*/
	try{ with( e.style ) { height = width = '0px'; }; } catch(er) {}
	for( var k in e ) {
		try{ e[k] = ''; } catch(er) {}
		try{ e[k] = null; } catch(er) {}
		try{ delete e[k]; } catch(er) {}
	}
	e.parentNode.removeChild(e);
	try{ e = null; } catch(er) {}
	return true;
};

// Add an event to the obj given
// event_name refers to the event trigger, without the "on", like click or mouseover
// func_name refers to the function callback when event is triggered
function addEvent(obj,event_name,func_name){
	if (obj.attachEvent){
		obj.attachEvent("on"+event_name, func_name);
	}else if(obj.addEventListener){
		obj.addEventListener(event_name,func_name,true);
	}else{
		obj["on"+event_name] = func_name;
	}
}

// Removes an event from the object
function removeEvent(obj,event_name,func_name){
	if (obj.detachEvent){
		obj.detachEvent("on"+event_name,func_name);
	}else if(obj.removeEventListener){
		obj.removeEventListener(event_name,func_name,true);
	}else{
		obj["on"+event_name] = null;
	}
}

// Stop an event from bubbling up the event DOM
function stopEvent(evt){
		
	evt || window.event;
	if (!evt) var evt = window.event;	
	if (evt.stopPropagation){
		evt.stopPropagation();
		evt.preventDefault();
	}else if(typeof evt.cancelBubble != "undefined"){
		evt.cancelBubble = true;
		evt.returnValue = false;
	}
	return false;
}

// Get the obj that starts the event
function getElement(evt){
	if (window.event){
		return window.event.srcElement;
	}else{
		return evt.currentTarget;
	}
}
// Get the obj that triggers off the event
function getTargetElement(evt){
	if (window.event){
		return window.event.srcElement;
	}else{
		return evt.target;
	}
}
// For IE only, stops the obj from being selected
function stopSelect(obj){
	if (typeof obj.onselectstart != 'undefined'){
		addEvent(obj,"selectstart",function(){ return false;});
	}
}

/*    Caret Functions     */

// Get the end position of the caret in the object. Note that the obj needs to be in focus first
function getCaretEnd(obj){
	if(typeof obj.selectionEnd != "undefined"){
		return obj.selectionEnd;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		try{
			var Lp = M.duplicate();
			Lp.moveToElementText(obj);
		}catch(e){
			var Lp=obj.createTextRange();
		}
		Lp.setEndPoint("EndToEnd",M);
		var rb=Lp.text.length;
		if(rb>obj.value.length){
			return -1;
		}
		return rb;
	}
}
// Get the start position of the caret in the object
function getCaretStart(obj){
	if(typeof obj.selectionStart != "undefined"){
		return obj.selectionStart;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		try{
			var Lp = M.duplicate();
			Lp.moveToElementText(obj);
		}catch(e){
			var Lp=obj.createTextRange();
		}
		Lp.setEndPoint("EndToStart",M);
		var rb=Lp.text.length;
		if(rb>obj.value.length){
			return -1;
		}
		return rb;
	}
}
// sets the caret position to l in the object
function setCaret(obj,l){
	obj.focus();
	if (obj.setSelectionRange){
		obj.setSelectionRange(l,l);
	}else if(obj.createTextRange){
		m = obj.createTextRange();		
		m.moveStart('character',l);
		m.collapse();
		m.select();
	}
}
// sets the caret selection from s to e in the object
function setSelection(obj,s,e){
	obj.focus();
	if (obj.setSelectionRange){
		obj.setSelectionRange(s,e);
	}else if(obj.createTextRange){
		m = obj.createTextRange();		
		m.moveStart('character',s);
		m.moveEnd('character',e);
		m.select();
	}
}

/*    Escape function   */
String.prototype.addslashes = function(){
	return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
}
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};
/* --- Escape --- */

/* Offset position from top of the screen */
function curTop(obj){
	toreturn = 0;
	while(obj){
		toreturn += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return toreturn;
}
function curLeft(obj){
	toreturn = 0;
	while(obj){
		toreturn += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return toreturn;
}
/* ------ End of Offset function ------- */

/* Types Function */

// is a given input a number?
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

/* Object Functions */

function replaceHTML(obj,text){
	while(el = obj.childNodes[0]){
		obj.removeChild(el);
	};
	obj.appendChild(document.createTextNode(text));
}

function is_in_array( element, array ) {
	var foundit = 0;
	for( var i = 0; i < array.length; i++ ) {
		if( element == array[i] ) { 
			foundit = 1;
			break;
		}	
	}	
	return foundit;
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();
