/*
 * ultimathule.js
 * 
 * @author: Alexander Myadzel <aem@teletype.ru>
 * @modified: n/a
 *
 */
 
function getEvent(oEvent)
{
	return oEvent || window.event || null;
}

function getEventKeyCode(oEvent)
{
	return oEvent.keyCode || oEvent.which || null;	
}

function getEventTarget(oEvent)
{
	return oEvent.relatedTarget || oEvent.toElement || oEvent.fromElement || null;
}

function stopEvent(oEvent)
{
	var oElement = getEventElement(oEvent);

	oEvent.returnValue = false;
	if (oEvent.preventDefault) {
		oEvent.preventDefault();
	}
	
	oEvent.cancelBubble = true;
	if (oEvent.stopPropagation) {
		oEvent.stopPropagation();
	}
}

function addEvent(oElement, sEvent, sCallback, bCapture)
{
	if (oElement.attachEvent) {
		oElement.detachEvent('on' + sEvent, sCallback); //for IE memory leak
		oElement.attachEvent('on' + sEvent, sCallback);
	} else if (oElement.addEventListener) {
		oElement.addEventListener(sEvent, sCallback, bCapture);
	} else {
		oElement['on' + sEvent] = sCallback;
	}
	return oElement;
}

function removeEvent(oElement, sEvent, sCallback, bCapture)
{
	if (oElement.detachEvent) {
		oElement.detachEvent('on' + sEvent, sCallback);
	} else if (oElement.removeEventListener) {
		oElement.removeEventListener(sEvent, sCallback, bCapture);
	} else {
		oElement['on' + sEvent] = null;
	}
	return oElement;
}

function getEventElement(oEvent)
{
	var oElement = oEvent.srcElement || oEvent.target;
	
	if (oElement.nodeType == 3) {
		oElement = oEvent.oElement.parentNode;
	}
	
	return oElement;
}

function unescapeHTML(sValue)
{
	return (sValue + '').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, '\'').replace(/&amp;/g, '&');
}

function constrain(mInit, mMin, mMax)
{
    if (mInit < mMin) {
        mInit = mMin;
    } else if (mInit > mMax) {
        mInit = mMax;
	}
	
    return mInit;
} 

function getElementById(sId)
{
	var oElement = document.getElementById(sId);
	return (oElement && oElement.id === sId) ? oElement : null;
}

function $$(sId)
{
	return getElementById(sId);
}

function getInt(mValue)
{
	var mValue = parseFloat((mValue + '').replace(/[,]+/g, '.').replace(/[^-\d\.]+/g, ''));
	return isNaN(mValue) ? 0 : mValue;
}

function getOffset(oElement)
{
	var iTop = 0;
	var iLeft = 0;

	while (oElement.tagName != 'HTML' && oElement.tagName != 'BODY')
	{
		iTop += oElement.offsetTop;
		iLeft += oElement.offsetLeft;
			
		oElement = oElement.offsetParent;
	}
	
	iTop += oElement.offsetTop;
	iLeft += oElement.offsetLeft;
	
	return {
		'top': iTop, 
		'left': iLeft
	}
}

function setDocumentTitle(sTitle)
{
	var oHead = document.getElementsByTagName('head')[0];
	var oTitle = oHead.getElementsByTagName('title')[0];
	/* highlight changes for Firebug */
	try {
		oTitle.text = sTitle;
		document.title = sTitle;
	} catch (oException) {
		document.title = sTitle;
	}
}

function getDocumentWidth()
{
	var iDocWidth = 0;
	var oBody = document.getElementsByTagName('body')[0];
	
	if (oBody.scrollWidth > oBody.offsetWidth) {
		iDocWidth = oBody.scrollWidth;	
	} else {
		iDocWidth = oBody.offsetWidth;
	}

	return iDocWidth;
}

function getNextIndex(iPlanIndex, iLength)
{
	if (iPlanIndex >= iLength) {
		iPlanIndex = 0;
	} else if (iPlanIndex < 0) {
		iPlanIndex = iLength - 1;
	}
	return iPlanIndex;
}

function loadImages(mElements, sAttributeName)
{	
	var oNILoader = {};
	//quick check to prevent the startup cycles
	if (mElements && mElements.length && typeof sAttributeName == 'string') {
		for (var i = 0; i < mElements.length; i++) {
			oNILoader = new Image();
			try {
				oNILoader.src = mElements[i].getAttribute(sAttributeName);
			} catch (oException) {
				//
			}
		}
	} else if (mElements && mElements.length && typeof mElements[0] == 'string') {
		for (var i = 0; i < mElements.length; i++) {
			oNILoader = new Image();
			try {
				oNILoader.src = mElements[i];
			} catch (oException) {
				//
			}
		}
	}
}

//TODO: kill window's vars
var T_DOT_SRC = '/i/transparent.gif';

var oBody = {};
var oMeasurer = {};

var iMeasurerOffsetHeight = 0;
var iBodyOffsetHeight = 0;
var iBodyOffsetWidth = 0;

function checkChangingProportions()
{
	if (oBody.offsetHeight != iBodyOffsetHeight || oBody.offsetWidth != iBodyOffsetWidth || iMeasurerOffsetHeight != oMeasurer.offsetHeight) {
		if ($$('slidebar')) {
			Slidebar.trackAndDraw();
		}
		setProportions();
	}
}

function setProportions()
{
	if (!arguments.callee.done) {
		oBody = document.getElementsByTagName('body')[0];
		oMeasurer = document.getElementById('measurer');	
	}
	arguments.callee.done = 1;
	
	iBodyOffsetHeight = oBody.offsetHeight;
	iBodyOffsetWidth = oBody.offsetWidth;
	iMeasurerOffsetHeight = oMeasurer.offsetHeight;
}

function trackOffset()
{
	if (!arguments.callee.done) {
		setInterval(checkChangingProportions, 100);
	} 
	arguments.callee.done = 1;
}

function init()
{
	trackOffset();
	
	if ($$('slidebar')) {
		Slidebar.init($$('slidebar'));
	} else if ($$('gallery')) {
		Gallery.init();
	} else if ($$('collection')) {
		Collection.init();
	} else if ($$('wardrobe')) {
		Wardrobe.init();
	}
}

addEvent(window, 'load', init);
