////////////////////////////////////////////////////////////////////////////////
// Basics
////////////////////////////////////////////////////////////////////////////////

function Pos(x, y)
{	
	this.x = (x == null ? 0 : x);
	this.y = (y == null ? 0 : y);
}

////////////////////////////////////////////////////////////////////////////////
// Platform-Specific Basics
////////////////////////////////////////////////////////////////////////////////

var DOM = 1;
var NN = 2;
var IE = 4;
var OTHER = 0;

function detect()
{
	if (document.getElementById) {
		return DOM;
	}
	if(document.all) {
		return IE;
	}
	if (window.netscape && window.screen) {	
		return NN;
	}
	return OTHER;
}

var platform = detect();

function getElementById(id) 
{
	switch (platform) {
		case DOM: return document.getElementById(id);
		case NN:  return document[id];
		case IE:  return document.all[id];
		default: return null;
	}
}

function getElementByName(name)
{
	switch (platform) {
		case DOM: return document.getElementByName(name);
		case NN:  return document[id];
		case IE:  return document.all[id];
		default: return null;
	}
}

function getElementsByTag(name)
{
	switch (platform) {
		case DOM: return document.getElementsByTagName(name);
		case IE: return document.all.tags(name);
		default: return null;
	}
}

function getLayer(id)
{
	switch (platform) {
		case DOM: return document.getElementById(id);
		case NN:  return document.layers[id];
		case IE:  return document.all[id];
		default: return null;
	}
}

function getLayers()
{	
	switch (platform) {
		case DOM: return document.getElementsByTagName('div');
		case IE: return document.all.tags('div');
		case NN: return document.layers;
		default: return null;
	}	
}

function hideLayer(id)
{
	var layer = getLayer(id);
	if (layer == null) {
		return;
	}
	if (platform == NN) {
		layer.visibility = 'hidden';
	} else {
		layer.style.visibility = 'hidden';
	}
}

function hideLayers()
{
	var layers = getLayers();
	if (layers == null) {
		return;
	}
	for (var i = 0; i < layers.length; i++) {
		if (platform == NN) {
			layers[i].visibility = 'hidden';
		} else {
			layers[i].style.visibility = 'hidden';
		}
	}
}

function showLayer(id)
{
	var layer = getLayer(id);
	if (layer == null) {
		return;
	}
	if (platform == NN) {
		layer.visibility = 'visible';
	} else {
		layer.style.visibility = 'visible';
	}
}

function showLayerAt(id, pos, hideOthers)
{
	if (hideOthers) {
		hideLayers();
	}
	var layer = getLayer(id);
	if (layer == null) {
		return;
	}
	if (platform == NN) {
		layer.moveTo(pos.x, pos.y);
		layer.visibility = 'visible';			
	} else {			
		layer.style.left = pos.x;
		layer.style.top = pos.y;
		layer.style.visibility = 'visible';
	}
}

////////////////////////////////////////////////////////////////////////////////
// URL Manipulation
////////////////////////////////////////////////////////////////////////////////

function removeParam(url, name)
{
	var qm = url.indexOf('?');
	if (qm == -1 || qm + 1 == url.length) {
		return url;
	}
	var sharp = url.indexOf('#');
	
	var result = url.substring(0, qm);
	var params = url.substring(qm + 1, (sharp == -1 ? url.length : sharp)).split('&');
	var first = true;
	for (var i = 0; i < params.length; i++) {
		if (params[i].indexOf(name + '=') != 0) {
			result += (first ? '?' : '&') + params[i];
			if (first) first = false;
		}
	}
	if (sharp != -1) {
		result += url.substring(sharp, url.length);
	}
	return result;
}

////////////////////////////////////////////////////////////////////////////////
// Mouse Management
////////////////////////////////////////////////////////////////////////////////

function getMousePosition(mouseEvt, pos) 
{
	if (pos == null) pos = new Pos();
	switch (platform) {
		case DOM: 
			pos.x = mouseEvt.clientX + window.pageXOffset;
			pos.y = mouseEvt.clientY + window.pageYOffset;
			break;
		case IE:  
			pos.x = window.event.x + document.body.scrollLeft;
			pos.y = window.event.y + document.body.scrollTop;
			break;
		case NN:  
			pos.x = mouseEvt.pageX;
			pos.y = mouseEvt.pageY;
			break;		
	}
	return pos;
}

function Mouse()
{
	this.position = new Pos();	
	this.listeners = new Array();

	this.addListener = function(mouseListener) {
		this.listeners.push(mouseListener);
	}
	
	this.startCapture = function() {
		var handler = function(mouseEvt) {
			getMousePosition(mouseEvt, mouse.position);
			for (var i = 0; i < mouse.listeners.length; i++) {
				var listener = mouse.listeners[i];
				if (listener.onMouseMove) {
					listener.onMouseMove(mouse.position);
				}
			}
		}
		this.setMouseEventHandler(handler);
	}

	this.endCapture = function() {
		this.setMouseEventHandler(null);
	}

	this.setMouseEventHandler = function(handler) {
		switch (platform) {
		case DOM: 
			document.captureEvents(Event.MOUSEMOVE);
			document.onmousemove = handler;
			break;
		case NN:
			document.captureEvents(Event.MOUSEMOVE);
			document.onmousemove = handler;
			break;
		case IE:
			document.onmousemove = handler;
			break;
		}	
	}	

	this.toString = function() {
		return '[Mouse position=' + this.position + ']';
	}
}

var mouse = new Mouse();

function MouseListener()
{
	this.onMouseMove = null;
}


////////////////////////////////////////////////////////////////////////////////
// Window Management
////////////////////////////////////////////////////////////////////////////////

function getWindowPosition()
{
	var x = 0;
	var y = 0;
	if (platform == IE) {
		x = window.screenLeft;
		y = window.screenTop;
	} else {
		x = window.screenX;
		y = window.screenY;
	}
	return new Pos(x, y);
}

function popup(url, target, width, height, features)
{
    if (!target) {
		target = "_blank";
	}
	var pos = getWindowPosition();	
	var left = (pos ? pos.x : 100) + 50;
	var top = (pos ? pos.y : 100) + 50; 
	if (!features) {
		features = "menubar=no,locationbar=no,resizable=yes";
	}
	features += ",width=" + width + 
			    ",height=" + height +
			    ",left=" + left +
			    ",top=" + top;
    return window.open(url, target, features);
} 

////////////////////////////////////////////////////////////////////////////////
// Form Utilities
////////////////////////////////////////////////////////////////////////////////

function selectAll(formName)
{
	var form = document[formName];
	if (form) {
		var elts = form.elements;
		for (var i = 0; i < elts.length; i++) {
			if (elts[i].type == "checkbox") {
				elts[i].checked = true;
			}
		}
	}
}

function unselectAll(formName)
{
	var form = document[formName];
	if (form) {
		var elts = form.elements;
		for (var i = 0; i < elts.length; i++) {
			if (elts[i].type == "checkbox") {
				elts[i].checked = false;
			}
		}
	}
}

function selectOption(select, value) 
{
    var opts = select.options;
    for (var i = 0; i < opts.length; i++) {
        if (opts[i].value == value) {
            opts[i].selected = true;
        }
    }
}

