var isNav4, isNav6, isIE4;

/*
 * Browser version snooper; determines your browser
 * (Navigator 4, Navigator 6, or Internet Explorer 4/5)
 */
function setBrowser() {
	if (navigator.appVersion.charAt(0) == "4") {
		if (navigator.appName.indexOf("Explorer") >= 0) {isIE4 = true;}
		else {isNav4 = true;}
	}
	else if (navigator.appVersion.charAt(0) > "4") {isNav6 = true;}
}

/*
 *
 * Given a selector string, return a style object
 * by searching through stylesheets. Return null if
 * none found
 *
 */
function getStyleBySelector( selector ){
	if (!isNav6) { return null;}
	var sheetList = document.styleSheets;
	var ruleList;
	var i, j;

	/* look through stylesheets in reverse order that
	   they appear in the document */
	for (i=sheetList.length-1; i >= 0; i--) {
		ruleList = sheetList[i].cssRules;
		for (j=0; j<ruleList.length; j++) {
			if (ruleList[j].type == CSSRule.STYLE_RULE && ruleList[j].selectorText == selector) {
				return ruleList[j].style;
			}
		}
	}
	return null;
}

/*
 *
 * Given an id and a property (as strings), return
 * the given property of that id.  Navigator 6 will
 * first look for the property in a tag; if not found,
 * it will look through the stylesheet.
 *
 * Note: do not precede the id with a # -- it will be
 * appended when searching the stylesheets
 *
 */
function getIdProperty( id, property ) {
	if (isNav6) {
		var styleObject = document.getElementById( id );
		if (styleObject != null) {
			styleObject = styleObject.style;
			if (styleObject[property]) {
				return styleObject[property];
			}
		}
		styleObject = getStyleBySelector( "#" + id );
		return (styleObject != null) ? styleObject[property] : null;
	}
	else if (isNav4) { return document[id][property];}
	else { return document.all[id].style[property];}
}

/*
 *
 * Given an id and a property (as strings), set
 * the given property of that id to the value provided.
 *
 * The property is set directly on the tag, not in the
 * stylesheet.
 *
 */
function setIdProperty( id, property, value ) {
	if (isNav6) {
		var styleObject = document.getElementById( id );
		if (styleObject != null) {
			styleObject = styleObject.style;
			styleObject[property] = value;
		}
	}
	else if (isNav4) { document[id][property] = value; }
	else if (isIE4) { document.all[id].style[property] = value; }
}

/*
 *
 * Move a given id.	 If additive is true,
 * then move it by xValue dots horizontally and
 * yValue units vertically.	 If additive is
 * false, then move it to (xValue, yValue)
 *
 * Note: do not precede the id with a # -- it will be
 * appended when searching the stylesheets
 *
 * Note also: length units are preserved in Navigator 6
 * and Internet Explorer. That is, if left is 2cm and
 * top is 3cm, and you move to (4, 5), the left will
 * become 4cm and the top 5cm.
 *
 */
function generic_move( id, xValue, yValue, additive )
{
	var left = getIdProperty(id, "left");
	var top = getIdProperty(id, "top");
	var leftMatch, topMatch;

	if (isNav4) {
		leftMatch = new Array( 0, left, "");
		topMatch = new Array( 0, top, "");
	}
	else if (isNav6 || isIE4 ) {
		var splitexp = /([-0-9.]+)(\w+)/;
		leftMatch = splitexp.exec( left );
		topMatch = splitexp.exec( top );
		if (leftMatch == null || topMatch == null) {
			leftMatch = new Array(0, 0, "px");
			topMatch = new Array(0, 0, "px");
		}
	}
	left = ((additive) ? parseFloat( leftMatch[1] ) : 0) + xValue;
	top = ((additive) ? parseFloat( topMatch[1] ) : 0) + yValue;
	setIdProperty( id, "left", left + leftMatch[2] );
	setIdProperty( id, "top", top + topMatch[2] );
}

/*
 *
 * Move a given id to position (xValue, yValue)
 *
 */
function moveTo( id, x, y ) { generic_move( id, x, y, false ); }

/*
 *
 * Move a given id to (currentX + xValue, currentY + yValue)
 *
 */
function moveBy( id, x, y) { generic_move( id, x, y, true ); }

/*
 *
 * Function used when converting rgb format colors
 * from Navigator 6 to a hex format
 *
 */ 
function hex( n ) {
	var hexdigits = "0123456789abcdef";
	return ( hexdigits.charAt(n >> 4) + hexdigits.charAt(n & 0x0f) );
}

/*
 *
 * Retrieve background color for a given id.
 * The value returned will be in hex format (#rrggbb)
 *
 */ 
function getBackgroundColor( id ) {
	var color;

	if (isNav4) {
		color = document[id].bgColor;
	}
	else if (isNav6) {
		var parseExp = /rgb.(\d+),(\d+),(\d+)./;
		var rgbvals;
		color = getIdProperty( id, "backgroundColor" );
		if (color) {
			rgbvals = parseExp.exec( color );
			if (rgbvals) {
				color = "#" + hex( rgbvals[1] ) + hex( rgbvals[2] ) +
					hex( rgbvals[3] );
			}
		}
		return color;
	} else if (isIE4) {
		return document.all[id].backgroundColor;
	}
	return "";
}

/*
 *
 * Return a division's document
 * 
 */
function getDocument( divName ) {
	var doc;
	if (isNav4) {
		doc = window.document[divName].document;
	}
	else if (isNav6) {
		doc = document;
	}
	else if (isIE4) {
		doc = document;
	}
	return doc;
}

/*
*************************************
// Teste la présence d’un ID
// Renvoi un ID
************************************ */
function isIdExist(id){
	if (isNav6)
		{ 	var obj = document.getElementById(id); }
	else if (isNav4)
		{ 	var obj = document[id]; }
    else
		{ 	var obj = document.all[id]; }
	return (obj != undefined);
}

/* ************************************
// Récuperation d’un objet par son ID
// Renvoi un objet
************************************ */
function getElementById(id) {
 if (isNav6) {
 		var obj = document.getElementById(id);
 	} else if (isNav4) {
		var obj = document[id];
	} else if (isIE4) {
		var obj = document.all[id];
	}
	return obj;
}

/* ************************************
// Affectation d'une fonction à un événement d'objet
************************************ */
function addEventToId(id, evt, func) {
	try {
		if (isIdExist(id)) {
			var oldhandler = getElementById(id)[evt];
			if(typeof getElementById(id)[evt] != 'function'){getElementById(id)[evt] = func;}
			else{getElementById(id)[evt] = function(){oldhandler();func();}}
		}
	} catch(e) { return; }
}

