


function reset_form(form)
{
	for ( i=0; i<form['elements'].length; i++ )
	{
		el = form['elements'][i];	
			
		if ( 'hidden' != el.type && 'submit' != el.type && 'button' != el.type && 'reset' != el.type )
			el.value = '';
	}
}


/**
 * Javascript Object Extensions
 **/
Array.prototype.in_array = function (s)
{
	for ( var i=0; i<this.length; i++ )
		if ( this[i] == s )
			return true;
			
	return false;
};



function removeAllChildNodes(node) { if ( node && node.hasChildNodes && node.removeChild ) { while ( node.hasChildNodes() ) { node.removeChild(node.firstChild); }; }; };
function days_in_month(y, m) { for ( i=31; i>27; i-- ) { if ( (new Date(y, m, i)).getMonth() == m )	{ return i; }; }; };
function str_pad(input, pad_length, pad_string, pad_direction) { if ( !isNaN(input) ) { input=""+input+""; }; if ( input.length>=pad_length ) { return input; }; var new_str=""; for ( var i=0; i<(pad_length-input.length); i++ ) { new_str+=pad_string; }; return ("PAD_LEFT" == pad_direction) ? (new_str + input) : (input + new_str); };
function msg(id, m) {	var e = el(id); if ( e ) { if ( m.replace ) { m = m.replace(/\n/ig, "<br>"); }; e.innerHTML = m + e.innerHTML; }; };
function el(id) { var e = 0; try { e = document.getElementById(id); } catch(e){ e = 0; }; return e; };
function px(n) { return n+"px"; };
function contains(a, b) { while (b.parentNode) { if ( (b = b.parentNode) == a ) { return true; }; }; return false; };
function trim(s) { return s.replace(/^\s*|\s*$/g,""); };
function nl2br(s) { return s.replace(/\n/g, "<br />"); };
function print_r(a) { var s = ""; for ( i in a ) { s += i +" => "+ a[i] +"\n"; }; return s; }

function prependChild(parent, node)
{
    parent.insertBefore(node, parent.firstChild);
}

function get_event_target(e)
{
	var t;
	
	if (!e)
	{
		var e = window.event;
	};
	
	if (e.target)
	{
		t = e.target;
	}
	else if (e.srcElement)
	{
		t = e.srcElement;
	};
	
	if (t.nodeType == 3) // defeat Safari bug
	{
		t = t.parentNode;
	};
	
	return t;
}

function find_pos_x(obj) { var curleft = 0; if ( obj.offsetParent ) { while ( obj.offsetParent ) { curleft += obj.offsetLeft; obj = obj.offsetParent; }; } else if ( obj.x ) { curleft += obj.x; }; return curleft; };
function find_pos_y(obj) { var curtop = 0; if ( obj.offsetParent ) { while ( obj.offsetParent ) { curtop += obj.offsetTop; obj = obj.offsetParent; }; } else if ( obj.y ) { curtop += obj.y; }; return curtop; };

function get_scroll_x()
{
	return (self.pageXOffset)
	        ? self.pageXOffset
		    : ((document.documentElement && document.documentElement.scrollLeft)
			   ? document.documentElement.scrollLeft
			   : ((document.body)
				 ? document.body.scrollLeft
				 : false)
		    );
}


function get_scroll_y()
{
	return (self.pageYOffset)
	        ? self.pageYOffset
		    : ((document.documentElement && document.documentElement.scrollTop)
			   ? document.documentElement.scrollTop
			   : ((document.body)
				 ? document.body.scrollTop
				 : false)
		    );
}

function get_scroll_amount()
{
	var x,y;
	
	if (self.pageYOffset) // all except Explorer
	{
		x = self.pageXOffset;
		y = self.pageYOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		x = document.documentElement.scrollLeft;
		y = document.documentElement.scrollTop;
	}
	else if (document.body) // all other Explorers
	{
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
	};
	
	return {x:x,y:y};
};

function verify_form_submit(msg, form) { if ( confirm(msg) ) {  form.submit(); } else { return false; }; };
function verify_visit_url(msg, url) { if ( confirm(msg) ) { if ( '' != url ) { window.document.location = url; } else { return true; }; }; };


function load_javascript(path)
{
	if ( "" != path )
	{
		document.write('<script language="javascript" type="text/javascript" src="'+ path +'"></script>');
	};
};

function load_stylesheet(path)
{
	if ( "" != path )
	{
		document.write('<link rel="stylesheet" type="text/css" href="'+ path +'">');
	};
};


function mouse_coords(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;
		posy = e.clientY + document.body.scrollTop;
	};
		
	return {x:posx,y:posy};
};

/**
 * Toggle all checkboxes in a form to checked or unchecked.
 */ 
function toggle_all_checkboxes(formId, keyElement, nameFilter)
{
	var e = document.getElementById(formId).elements;
	var check_value = keyElement.checked;
	
	if ( nameFilter ) 
		nameFilter = new RegExp(nameFilter);
	
	for ( var i=0; i<e.length; i++ )
	{
		if ( e[i] && e[i].type && 'checkbox' == e[i].type && !e[i].disabled && e[i] != keyElement && (nameFilter && e[i].name.match(nameFilter) ) )
		{
			if ( e[i].checked != check_value )				
				e[i].checked = check_value;
			else
				e[i].checked = !check_value;
		}
	}
}

function create_basic_item(msg, url, name)
{
	var input = prompt(msg);
	
	if ( input )
	{
		document.location = url +'&act=create&name='+ input;
	}
}

function update_basic_item(msg, url, name)
{
	var input = prompt(msg, name);
	
	if ( input )
	{
		document.location = url +'&act=update&prev_name='+ name +'&new_name='+ input;
	}
}






function E() {};
E.addBuiltInListener = function(obj, strEvent, func)
{
	if(obj.addEventListener)
	{
		obj.addEventListener(strEvent,func,false);
	}
	else if(obj.attachEvent)
	{
		obj.attachEvent("on"+strEvent,func);
	}
	else
	{
		obj["on"+strEvent]=func;
	}
}
E.removeBuiltInListener = function(obj, strEvent, func)
{
	if ( obj.removeEventListener )
	{
		obj.removeEventListener(strEvent, func, false);
	}
	else if ( obj.detachEvent )
	{
		obj.detachEvent("on"+ strEvent, func);
	}
	else
	{
		obj["on"+ strEvent] = null;
	}
}
E.addListener = function(obj, strEvent, func)
{
	var evnt = E.getEventName(strEvent);
	
	if ( obj[evnt] )
	{
		obj[evnt].push(func);
	}
	else
	{
		obj[evnt] = [func];
	}	
}
E.createEventAdapter = function(obj, func) 
{
    return function(e)
    {
        if ( !e )
        {
            e = window.event;
        }
        if ( e && !e.target )
        {
            e.target = e.srcElement;
        }
		
        func.call(obj,e);
    }
}
E.createRegularAdapter = function(obj, func)
{
	return function()
	{
		func.apply(obj, arguments);	
	}
}

E.bindDom = function(a, b, c, d)
{
	return E.addBuiltInListener(a, b, E.createEventAdapter(c,d) );
}
E.bind = function(a, b, c, d)
{
	return E.addListener(a, b, function(){ d.apply(c,arguments); } );
}
E.getEventName = function(strEvent)
{
	return "__"+ strEvent; 
}
E.trigger = function(obj, strEvent)
{
	var evnt = E.getEventName(strEvent);
	var funcArray = obj[evnt];
	
	if ( funcArray && 0 < funcArray.length)
	{
		var args = [];
        
        for ( var i=2; i<arguments.length; i++ )
        {
            args.push(arguments[i])
        }
	
		for ( var i=0; i<funcArray.length; i++ )
		{
			var func = funcArray[i];
			func.apply(this, args);			
		}
	}	
}

/*
Asynchronous Javascript and XML

*/
function Ajax()
{
	this.req = null;
	var self = this;
	
	
	this.LoadXMLDoc = function(url, handler)
	{
		if (window.XMLHttpRequest)
		{
			this.req = new XMLHttpRequest();
			
			this.req.onreadystatechange = function()
			{
				self.Processor(self, handler);
			}
			
			this.req.open("GET", url, true);
			this.req.send(null);
		}
		else if (window.ActiveXObject)
		{
			this.req = new ActiveXObject("Microsoft.XMLHTTP");
			if (this.req)
			{
				this.req.onreadystatechange = function()
				{
					self.Processor(self, handler);
				}
				this.req.open("GET", url, true);
				this.req.send();
			}
		}
	
	}
	
	this.cancelXMLRequest = function()
	{
		if ( this.req )
		{
			this.req.abort();
		}
	}
	
	this.Processor = function(self, handler)
	{
		if ( self.req )
		{
			if (self.req.readyState == 4)
			{
				
				if (self.req.status == 200)
				{
					var xmlObj = 0;
					var xmlText = self.req.responseText;
					
					if ( !self.req.responseXML.documentElement )
					{
						try
						{
							xmlObj = createXMLParser(self.req.responseText);							
						}
						catch(e)
						{
							xmlObj = self.req.responseText;
						}
					}
					else
					{
						 xmlObj = self.req.responseXML.documentElement;
					}
					
					handler(xmlObj, xmlText);										
				}
				else
				{
					alert("There was a problem retrieving the XML data:\n" + self.req.statusText);
				}
			}
		}
		
	}
	
}



function createXMLParser(xText)
{	
	if ( typeof DOMParser != "undefined" )
	{
		var parseX = new DOMParser();
		return parseX.parseFromString(xText, "text/xml");
	}
	else if ( typeof ActiveXObject != "undefined" )
	{
		var XMLobj = new ActiveXObject("Microsoft.XMLDOM");
		
		if(XMLobj)
		{
			XMLobj.async = false;
			XMLobj.loadXML(xText);
			return XMLobj;
		}
		else
		{
			alert("Could not parse XML in IE");
			return false;
		}
	}
	else
	{
		alert("Failed");
		return false;
	}
}
