// Глобальные переменные
var isCSS, isW3C, isIE4, isNN4, isIE6CSS;

// инициализация после загружки, чтобы все браузеры успели сформировать структуру после загрузки
function initDHTMLAPI(){
	if (document.images){
		isCSS = (document.body && document.body.style) ? true : false;
		isW3C = (isCSS && document.getElementById) ? true : false;
		isIE4 = (isCSS && document.all) ? true : false;
		isNN4 = (document.layers) ? true : false;
		isIE6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >= 0) ? true : false;
	}
}

// назначение обработчика события для инициализации API
window.onload = initDHTMLAPI;

// поиск вложенного объекта layer в NN4 по имени
function seekLayer (doc, name){
	var theObj;
	for (var i = 0; i < doc.layer.length; i++){
		if (doc.layers[i].name == name){
			theObj = doc.layers[i];
			break;
		}
		// переходим к вложенным слоям, если таковые имеются
		if (doc.layers[i].document.layers.length > 0){
			theObj = seekLayer (document.layers[i].document,name);
		}
	}
	return theObj;
}

// преобразуем строку с именем объекта или ссылку на объект в ссылку на элемент документа
function getRawObject (obj){
	var theObj;
	if (typeof obj == "string"){
		if (isW3C){
			theObj = document.getElementById(obj);
		}else if (isIE4){
			theObj = document.all(obj);
		}else if(isNN4){
			theObj = seekLayer (document, obj);
		}
	}else{
		// Получаем ссылку на объект
		theObj = obj;
	}
	return theObj;
}

// Преобразуем строку с именем объекта или ссылку на объект в ссылку на обект стиля
// (или ссылку на слой NN 4)
function getObject(obj){
	var theObj = getRawObject(obj);
	if (theObj && isCSS){
		theObj  = theObj.style;
	}
	return theObj;
}

// располагаем объект по определенным пиксельным координатам
function shiftTo (obj, x, y){
	var theObj = getObject (obj);
	if (theObj){
		if (isCSS){
			// Преобразуем некорректные числовые значения
			var units = 0;
			if (theObj.left && typeof (theObj.left) == "string"){
				units =  "px";
			}
			theObj.left = x + units;
			theObj.top = y + units;
		}else if(isNN4){
			theObj.moveTo(x,y);
		}
	}
}

// Сдвиг объекта на заданный вектор
function shiftBy (obj, deltaX, deltaY){
	var theObj = getObject(obj);
	if (theObj){
		if (isCSS){
			// Преобразуем некорректные числовые значения
			var units = 0;
			if (theObj.left && typeof (theObj.left) == "string"){
				units =  "px";
			}
			theObj.left = getObjectLeft(obj) + deltaX + units;
			theObj.top = getObjectTop(obj) + deltaY +units;
		}else if (isNN4){
			theObj.moveBy(delatX, deltaY);
		}
	}
}

// Устанавливаем порядок наложения объектов (Z order)
function setZIndex (obj, zOrder){
	var theObj = getObject(obj);
	if (theObj){
		theObj.zIndex = zOrder;
	}
}

// Задаем фоновый цвет объекта
function setBGColor (obj, color){
	var theObj = getObject(obj);
	if (theObj){
		if (isNN4){
			theObj.bgColor = color;
		}else if(isCSS){
			theObj.backgroundColor = color;
		}
	}
}

// Делаем объект видимым
function show(obj){
	var theObj = getObject(obj);
	if (theObj){
		theObj.visibility = "visible";
	}
}

// Убираем объект с экрана
function hide (obj){
	var theObj = getObject(obj);
	if (theObj){
		theObj.visibility = "hidden";
	}
}

// Определяем горизонтальные координаты элемента
function getObjectLeft(obj){
	var elem = getRawObject(obj);
	var result = 0;
	if (document.defaultView){
		var style = document.defaultView;
		var cssDecl = style.getComputedStyle(elem, "");
		result = cssDecl.getPropertyValue("left");
	}else if (elem.currentStyle){
		result = elem.currentStyle.left;
	} else if (elem.style){
		result = elem.style.left;
	}else if (isNN4){
		result = elem.left;
	}
	return parseInt(result);
}

// Определяем вертикальные координаты позиционируемого объекта
function getObjectTop(obj){
	var elem = getRawObject(obj);
	var result = 0;
	if (document.defaultView){
		var style = document.defaultView;
		var cssDecl = style.getComputedStyle(elem, "");
		result = cssDecl.getPropertyValue("top");
	}else if (elem.currentStyle){top;
	} else if (elem.style){
		result = elem.style.top;
	}else if (isNN4){
		result = elem.top;
	}
	return parseInt(result);
}

// Определяем ширину отображенного на экране объекта
function getObjectWidth(obj){
	var elem = getRawObject(obj);
	var result = 0;
	if (elem.offsetWidth){
		result = elem.offsetWidth;
	}else if (elem.clip && elem.clip.width){
		result = elem.clip.width;
	}else if (elem.style && elem.style.pixelWidth){
		result = elem.style.pixelWidth;
	}
	return parseInt(result);
}

// Определение высоты отображенного на экране объекта
function getObjectHeight(obj){
	var elem = getRawObject(obj);
	var result = 0;
	if (elem.offsetHeight){
		result = elem.offsetHeight;
	}else if (elem.clip && elem.clip.height){
		result = elem.clip.height;
	}else if (elem.style && elem.style.pixelHeight){
		result = elem.style.pixelHeight;
	}
	return parseInt(result);
}

// Возвращает ширину доступного в окне браузера пространства
function getInsideWindowWidth(){
	if (window.innerWidth){
		return window.innerWidth;
	}else if (isIE6CSS){
		// Измеряем clientWidth элемента html
		return document.body.parentElement.clientWidth;
	}else if (document.body && document.body.clientWidth){
		return document.body.clientWidth;
	}
	return 0;	
}

// Возвращает высоту доступного в окне браузера пространства
function getInsideWindowHeight(){
	if (window.innerHeight){
		return window.innerHeight;
	}else if (isIE6CSS){
		// измеряем clientHeight элемента html
		return document.body.parentElement.clientHeight;
	}else if (document.body && document.body.clientHeight){
		return document.body.clientHeight;
	}
	return 0;	
}