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

function Position(x, y)
{	
    this.x = (x == null ? 0 : x);
    this.y = (y == null ? 0 : y);
    this.toString = function() {
	return '[' + this.x + ',' + this.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 insertLayer(id)
{
    var layer = getLayer(id);
    if (layer == null) {
    	return;
    }
    if (platform == NN) {
    	layer.visibility = 'visible';
    	layer.position = 'static';
    } else {
    	layer.style.visibility = 'visible';
    	layer.style.position = 'static';
    }
}

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

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';
    }
}

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

function getMousePosition(mouseEvt, pos) 
{
    if (pos == null) pos = new Position();
    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 Position();	
    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 Position(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;
        }
    }
}
