//	----------------------------------------------------------------------------------------
//	
//	
//	
//	----------------------------------------------------------------------------------------


function browserClass ()
{
	this.className		= "toc::browser";
	this.type			= 0;

	this.init				= _browser_init;
	this.showElement		= _browser_showElement;
	this.hideElement		= _browser_hideElement;
	this.getElement			= _browser_getElement;
	this.isElementVisible	= _browser_isElementVisible;
	this.scrollTo			= _browser_scrollTo;

	this.clientHeight		= _browser_clientHeight;
	this.clientWidth		= _browser_clientWidth;
	this.scrollTop			= _browser_scrollTop;
	this.scrollLeft			= _browser_scrollLeft;

	this.offsetTop			= _browser_offsetTop;
	this.offsetLeft			= _browser_offsetLeft;
	this.offsetHeight		= _browser_offsetHeight;
	this.offsetWidth		= _browser_offsetWidth;

	this.init();
}

function _browser_init ()
{
//	var saveOnError = window.onerror;

//	window.onerror = null;

	//	-----------------------
	//	0: DHTML not supported
	//	1: IE >= 3, Opera > 6
	//	2: NS 4.x
	//	3: NS 6.x
	//	-----------------------

	switch (navigator.family) {
	case 'ie4':
		this.type = 1
		break;
	case 'nn4':
		this.type = 2;
		break;
	case 'gecko':
		this.type = 3;
		break;
	case 'safari':
		this.type = 1;
		break;
	case 'opera':
		this.type = (navigator.version > 6 ? 1 : 0);
		break;
	default:
		this.type = 0;
		break;
	}

//	window.onerror = saveOnError;

	return true;
}

function _browser_showElement (win, id)
{
	var element = this.getElement (win, id);
	if (element == null) {
		return;
	}
	switch (this.type) {
	case 1:
		//	document
		element.style.display = "block";
		break;
	case 2:
		element.visibility = "show";
		break;
	case 3:
		element.style.display = "block";
		break;
	default:
		alert ("Not Implemented");
		break;
	}
}

function _browser_hideElement (win, id)
{
	var element = this.getElement (win, id);
	switch (this.type) {
	case 1:
		//	document
		element.style.display = "none";
		break;
	case 2:
		element.visibility = "hidden";
		break;
	case 3:
		element.style.display = "none";
		break;
	default:
		alert ("Not Implemented");
		break;
	}
}

function _browser_isElementVisible (win, id)
{
	var element = this.getElement (win, id);
	switch (this.type) {
	case 1:
		//	document
		return element.style.display != "none";
		break;
	case 2:
		return element.visibility != "hidden";
		break;
	case 3:
		return element.style.display != "none";
		break;
	default:
		alert ("Not Implemented");
		break;
	}
}

function _browser_getElement (win, name)
{
	var res = null;

	if (win.document.getElementById != null) {
		res = win.document.getElementById (name);
	}
	if (win.document.all != null) {
		res = win.document.all [name];
	}
  
//	alert ("Get Element " + win.name + " " + name + " is " + res);

	return res;
}

function _browser_scrollTo (win, id, enforce)
{

	var obj = this.getElement (win, id);
	if (!obj) return;

	var ot = this.offsetTop		(win, id);	//	Object top position
	var oh = this.offsetHeight	(win, id);	//	Object height
	var ob = ot + oh;
	var ct = this.scrollTop		(win);		//	Client top
	var ch = this.clientHeight	(win);		//	Client height
	var cb = ct + ch;						//	Client bottom

	if (ot < ct) {
		switch (this.type) {
		case 1:
			win.document.body.scrollTop = ot;
			break;
		default:
//			alert ("scrollTo not implemented");
			break;
		}
	}
	if (ot > cb) {
		var pos = 0;
		pos = (oh > ch) ? ot : ob - ch;
		
		switch (this.type) {
		case 1:
		case 3:
			win.document.body.scrollTop = pos;
			break;
		default:
//			alert ("scrollTo not implemented");
			break;
		}
	}
}

function _browser_clientHeight (win)
{
	switch (this.type) {
	case 1:
	case 3:
		return win.document.body.clientHeight;
		break;
	default:
		//	win.innerHeight
//		alert ("clientHeight not implemented");
	}
}

function _browser_clientWidth (win)
{
	switch (this.type) {
	case 1:
	case 3:
		return win.document.body.clientWidth;
	default:
		//	win.innerWidth
//		alert ("clientWidth not implemented " + this.type);
	}
}

function _browser_scrollLeft (win)
{
	switch (this.type) {
	case 1:
	case 3:
		return win.document.body.scrollLeft;
	default:
		//	win.pageXOffset
//		alert ("scrollLeft not implemented");
	}
}

function _browser_scrollTop (win)
{
	switch (this.type) {
	case 1:
	case 3:
		return win.document.body.scrollTop;
	default:
		//	win.pageYOffset
//		alert ("scrollTop not implemented");
	}
}

function _browser_offsetTop (win, id)
{
	var obj = this.getElement (win, id);
	if (!obj) return 0;

	switch (this.type) {
	case 1:
	case 3:
		return obj.offsetTop;
	default:
//		alert ("offsetTop not implemented");
	}
}

function _browser_offsetLeft (win, id)
{
	var obj = this.getElement (win, id);
	if (!obj) return 0;

	switch (this.type) {
	case 1:
	case 3:
		return obj.offsetLeft;
	default:
//		alert ("offsetLeft not implemented");
	}
}

function _browser_offsetHeight (win, id)
{
	var obj = this.getElement (win, id);
	if (!obj) return 0;

	switch (this.type) {
	case 1:
	case 3:
		return obj.offsetHeight;
	default:
		alert ("offsetHeight not implemented");
	}
}

function _browser_offsetWidth (win, id)
{
	var obj = this.getElement (win, id);
	if (!obj) return 0;

	switch (this.type) {
	case 1:
	case 3:
		return obj.offsetWidth;
	default:
//		alert ("offsetHeight not implemented");
	}
}

