<!--
/* Copyright 2007 by xNet Publishing.  All Rights Reserved.  The use of this code can only be done with the explicit written consent of xNet Publishing. */
xNames = new Array();
xOffsetX = new Array();
xOffsetY = new Array();
xStartDelay = new Array();
xExpand = new Array();
xCloseDelay = new Array();
db = (document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body? document.body : null;
xwTimeStep = 50;
xwStartSizes = 20;
xwShadowOffset = 5;
xwShadowOpacity = 17;
zIndex = 10000;
closeFunc = "closeXWindow()";

function XWindow(ID,objectEvent)
{ 
	if (!getElement(ID)) {//Check object existance first
		return false;
	}
	//Get initialising arrays index using object ID and xNames array
	var index = -1;
	for (var i=0;i<xNames.length;i++) {
		if(xNames[i] == ID) {
			index = i;
			break;
		}
	}
	if (index == -1) {
		return false;
	}
	//Check event type
	var eventType = -1;
	switch (objectEvent.type) {
		case 'mouseover' : eventType = 0; break;
		case 'click'     : eventType = 1; break;
		default          : return false;
	}
	var srcElement = objectEvent.srcElement;
	srcElement = (objectEvent.srcElement)?objectEvent.srcElement:objectEvent.target;
	if (srcElement.nodeType == 3) {// defeat Safari bug
	   srcElement = srcElement.parentNode;
	}
	if (srcElement) {
		if (srcElement.getAttribute('PROCESSED')) {//Object is being processed already
			return false;
		}
	} else {
		return false;
	}

	//Create XWindow object
	var xwObject = new XW(ID,srcElement,eventType,objectEvent.clientX,objectEvent.clientY,int(xOffsetX[index]),int(xOffsetY[index]),int(xExpand[index]),int(xCloseDelay[index]));
	
	var timer = new Timer(xwObject);
	var timerID = timer.setTimeout("startDelayElapsed",int(xStartDelay[index]));
	
	//Indicate that object is being processed 
	srcElement.setAttribute('PROCESSED',true);
		
	if (eventType == 0) {//Cancel events after delay if mouse run out
		srcElement.onmouseout = function () {
			timer.clearTimeout(timerID);
			xwObject.restoreProcessedState();
		};
	}
	
	return false;
}


function XW(ID,srcElement,eventType,xPointer,yPointer,xOffsetFromPointer,yOffsetFromPointer,expandTime,closeDelay)
{
	var xwWidth = 0;
	var xwHeight = 0;
	var xwExpandXStep = 0;
	var xwExpandYStep = 0;
	var xwWindow = null;
	var xwWindowShadow = null;
	var xwInnerWindow = null;
	var position = 0;
	var redrawIntervalID = -1;
	var mouseontip = false;
	var timer = null;
	var itterations = 0;
	var curObj = null;
	
	this.startDelayElapsed = function()
	{
		zIndex++;//Provide new z-index
		//Do window creation
		curObj = this;
		timer = new Timer(this);
		
		//Add new mouseout events after window is created
		if (eventType == 0) {
			srcElement.onmouseout = function () {
				var t_timer = new Timer(curObj);
				t_timer.setTimeout("closeDelayElapsed",closeDelay);
			};
		}

		//Determine sizes
		var xlim = int((db && db.clientWidth)? db.clientWidth : window.innerWidth) + int(window.pageXOffset || (db? db.scrollLeft : 0) || 0);
		var ylim = int(window.innerHeight || db.clientHeight) + int(window.pageYOffset || (db? db.scrollTop : 0) || 0);
		var xwTmp = getElement(ID);
		xwWidth = int(xwTmp.style.width) + int(xwTmp.style.paddingLeft) + int(xwTmp.style.paddingRight);
		xwHeight = int(xwTmp.style.height) + int(xwTmp.style.paddingTop) + int(xwTmp.style.paddingBottom);
		
		//horisontal positioning
		position = 1;//right 0 - left
		if (xOffsetFromPointer + xwWidth < xPointer) {
			position = 0;
		}
		if (xPointer + xOffsetFromPointer + xwWidth < xlim) {
			position = 1;
		}
		//vertical positioning
		if (yPointer + yOffsetFromPointer + xwHeight < ylim) {
			position |= 2;
		}
		if (yOffsetFromPointer + xwHeight < yPointer) {
			position &= 1;
		}
		
		//Determine X/Y step in pixels when expanding
		xwExpandXStep = Math.ceil((xwWidth - xwStartSizes) / (expandTime / xwTimeStep));
		xwExpandYStep = Math.ceil((xwHeight - xwStartSizes) / (expandTime / xwTimeStep));
		
		var xPos = db.scrollLeft;
		var yPos = db.scrollTop;
		if (position == 1) {//Top Right
			xPos += xPointer + xOffsetFromPointer;
			yPos += yPointer - yOffsetFromPointer - xwStartSizes;
		} else if (position == 0) {//Top Left
			xPos += xPointer - xOffsetFromPointer - xwStartSizes;
			yPos += yPointer - yOffsetFromPointer - xwStartSizes;
		} else if (position == 3) {//Bottom Right
			xPos += xPointer + xOffsetFromPointer;
			yPos += yPointer + yOffsetFromPointer;
		} else if (position == 2) {//Bottom Left
			xPos += xPointer - xOffsetFromPointer - xwStartSizes;
			yPos += yPointer + yOffsetFromPointer;
		}
		
		//Create new div
		xwWindow = document.createElement("div");
		document.body.appendChild(xwWindow);
		//Create shadow
		xwWindowShadow = document.createElement("div");
		document.body.appendChild(xwWindowShadow);
		
		var obj = getElement(ID);
		obj.removeAttribute('id');
		//objBorderWidth = int(obj.style.borderLeftWidth);
		//objBorder = obj.style.border;
		//increase wrapper sizes on border width
		//xwWidth += 2*objBorderWidth;
		//xwHeight += 2*objBorderWidth;
		xwWindow.style.width = xwWindowShadow.style.width = xwStartSizes + 'px';
		xwWindow.style.height = xwWindowShadow.style.height = xwStartSizes + 'px';
		xwWindow.style.overflow = 'hidden';
		xwWindow.style.position = xwWindowShadow.style.position = 'absolute';
		xwWindowShadow.style.zIndex = zIndex++;
		xwWindow.style.zIndex = zIndex++;
		xwWindow.style.left = xPos + 'px';
		xwWindow.style.top = yPos + 'px';
		xwWindowShadow.style.left = xPos + xwShadowOffset + 'px';
		xwWindowShadow.style.top = yPos + xwShadowOffset + 'px';
		xwWindow.innerHTML = obj.outerHTML;
		obj.setAttribute("id",ID);
		xwInnerWindow = xwWindow.childNodes[0];
		xwWindow.className = 'xwindow';
		//xwWindow.style.border = xwInnerWindow.style.border;//copy border of the nested item into wrapper
		xwInnerWindow.style.border = '';
		xwInnerWindow.style.display = '';
		xwWindowShadow.style.backgroundColor = '#000000';
		xwWindowShadow.style.opacity = (xwShadowOpacity / 100); 
		xwWindowShadow.style.MozOpacity = (xwShadowOpacity / 100); 
		xwWindowShadow.style.KhtmlOpacity = (xwShadowOpacity / 100); 
		xwWindowShadow.style.filter = "alpha(opacity=" + xwShadowOpacity + ")";
		//alert(xwWindowShadow);
		
		
		//Add new click event to close window
		if (eventType == 1) {
			this.search4OnClick(curObj,xwInnerWindow);
		}
		if (eventType == 0) {
			xwWindow.onmouseover = function () {
				mouseontip = true;
			};
			xwWindow.onmouseout = function () {
				mouseontip = false;
				var t_timer = new Timer(curObj);
				t_timer.setTimeout("closeDelayElapsed",closeDelay);
			};
		}
		
		xwWindow.onclick = function () {
			if (xwWindow.style.zIndex < zIndex) {
				xwWindowShadow.style.zIndex = zIndex++;
				xwWindow.style.zIndex = zIndex++;
			}
		};

		redrawIntervalID = timer.setInterval("redrawWindow",xwTimeStep,true);
	}
	
	this.search4OnClick = function(curObj,obj)
	{
		if(itterations++>100) return;//Make this function safe
		if(obj.childNodes) {
			for(var i=0;i<obj.childNodes.length;i++) {
				if(obj.childNodes[i].nodeType != 1) continue;
				if (typeof (t_tj = obj.childNodes[i]).onclick == "function" && t_tj.onclick.toString().indexOf(closeFunc) != -1) {
					obj.childNodes[i].onclick = function () {
						t_timer = new Timer(curObj);
						t_timer.setTimeout("closeDelayElapsed",closeDelay);
						return false;
					};
				}
				curObj.search4OnClick(curObj,obj.childNodes[i]);
			}
			
		}
		return;
	}
	
	
	this.redrawWindow = function(isOpen)
	{
		if (!xwWindow) {
			timer.clearInterval(redrawIntervalID);
			return;
		}
		var expandYStep = xwExpandYStep;
		var expandXStep = xwExpandXStep;
		
		if (isOpen) {
			if (int(xwWindow.style.height) + expandYStep < xwHeight) {
				newHeight = int(xwWindow.style.height) + expandYStep;	
			} else {
				newHeight = xwHeight;
				expandYStep = newHeight - int(xwWindow.style.height);
			}
			if (int(xwWindow.style.width) + expandXStep < xwWidth) {
				newWidth = int(xwWindow.style.width) + expandXStep;	
			} else {
				newWidth = xwWidth;
				expandXStep = newWidth - int(xwWindow.style.width);
			}
			xwWindow.style.width = xwWindowShadow.style.width = newWidth + 'px';
			xwWindow.style.height = xwWindowShadow.style.height = newHeight + 'px';
			
			if (position == 1) {//Top Right
				var tmpVal = int(xwWindow.style.top) - expandYStep;
				xwWindow.style.top = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.top = tmpVal + 'px';
			} else if (position == 0) {//Top Left
				var tmpVal = int(xwWindow.style.left) - expandXStep;
				xwWindow.style.left = tmpVal + 'px' ;
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.left = tmpVal + 'px';
				tmpVal = int(xwWindow.style.top) - expandYStep;
				xwWindow.style.top = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.top = tmpVal + 'px';
			} else if (position == 2) {//Bottom Left
				var tmpVal = int(xwWindow.style.left) - expandXStep;
				xwWindow.style.left = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.left = tmpVal + 'px';
			}
			if(newWidth >= xwWidth && newHeight >= xwHeight) {
				timer.clearInterval(redrawIntervalID);
				redrawIntervalID = -1;
			}
		} else {
			if (int(xwWindow.style.height) - expandYStep > xwStartSizes) {
				newHeight = int(xwWindow.style.height) - expandYStep;	
			} else {
				newHeight = xwStartSizes;
				expandYStep = int(xwWindow.style.height) - newHeight;
			}
			if (int(xwWindow.style.width) - expandXStep > xwStartSizes) {
				newWidth = int(xwWindow.style.width) - expandXStep;	
			} else {
				newWidth = xwStartSizes;
				expandXStep = int(xwWindow.style.width) - newWidth;
			}
			xwWindow.style.width = xwWindowShadow.style.width = newWidth + 'px';
			xwWindow.style.height = xwWindowShadow.style.height = newHeight + 'px';
			if (position == 1) {//Top Right
				var tmpVal = int(xwWindow.style.top) + expandYStep;
				xwWindow.style.top = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.top = tmpVal + 'px';
			} else if (position == 0) {//Top Left
				var tmpVal = int(xwWindow.style.left) + expandXStep;
				xwWindow.style.left = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.left = tmpVal + 'px';
				tmpVal = int(xwWindow.style.top) + expandYStep;
				xwWindow.style.top = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.top = tmpVal + 'px';
			} else if (position == 2) {//Bottom Left
				var tmpVal = int(xwWindow.style.left) + expandXStep;
				xwWindow.style.left = tmpVal + 'px';
				tmpVal += xwShadowOffset;
				xwWindowShadow.style.left = tmpVal + 'px';
			}
			if(newWidth <= xwStartSizes && newHeight <= xwStartSizes) {
				timer.clearInterval(redrawIntervalID);
				redrawIntervalID = -1;
				this.destroyWindow();
			}
		}
	}
	
	this.closeDelayElapsed = function()
	{
		if(!mouseontip && redrawIntervalID == -1) {
			redrawIntervalID = timer.setInterval("redrawWindow",xwTimeStep,false);
		}
	}
	this.destroyWindow = function()
	{
		if(xwWindow) {
			document.body.removeChild(xwWindow);
			xwWindow = null;
		}
		if(xwWindowShadow) {
			document.body.removeChild(xwWindowShadow);
			xwWindowShadow = null;
		}
		//zIndex--;
		this.restoreProcessedState();
	}
	this.restoreProcessedState = function()
	{
		srcElement.removeAttribute('PROCESSED');
		if (eventType == 0) {
			srcElement.onmouseout = function() {};
		}
	}
	
}
// The constructor should be called with the parent object (optional, defaults to window).
function Timer(){
    this.obj = (arguments.length)?arguments[0]:window;
    return this;
}

//func - the name of the object method (as a string) (required)
//msec - the millisecond delay (required)
//any number of extra arguments, which will all be passed to the method when it is evaluated.
Timer.prototype.setInterval = function(func, msec){
    var i = Timer.getNew();
    var t = Timer.buildCall(this.obj, i, arguments);
    Timer.set[i].timer = window.setInterval(t,msec);
    return i;
}
Timer.prototype.setTimeout = function(func, msec){
    var i = Timer.getNew();
    Timer.buildCall(this.obj, i, arguments);
    Timer.set[i].timer = window.setTimeout("Timer.callOnce("+i+");",msec);
    return i;
}

//clear functions should be called with the return value from the equivalent set function.
Timer.prototype.clearInterval = function(i){
    if(!Timer.set[i]) return;
    window.clearInterval(Timer.set[i].timer);
    Timer.set[i] = null;
}
Timer.prototype.clearTimeout = function(i){
    if(!Timer.set[i]) return;
    window.clearTimeout(Timer.set[i].timer);
    Timer.set[i] = null;
}

Timer.set = new Array();
Timer.buildCall = function(obj, i, args){
    var t = "";
    Timer.set[i] = new Array();
    if(obj != window){
        Timer.set[i].obj = obj;
        t = "Timer.set["+i+"].obj.";
    }
    t += args[0]+"(";
    if(args.length > 2){
        Timer.set[i][0] = args[2];
        t += "Timer.set["+i+"][0]";
        for(var j=1; (j+2)<args.length; j++){
            Timer.set[i][j] = args[j+2];
            t += ", Timer.set["+i+"]["+j+"]";
    }}
    t += ");";
    Timer.set[i].call = t;
    return t;
}
Timer.callOnce = function(i){
    if(!Timer.set[i]) return;
    eval(Timer.set[i].call);
    Timer.set[i] = null;
}
Timer.getNew = function(){
    var i = 0;
    while(Timer.set[i]) i++;
    return i;
}

function int(x)
{
	var y;
	return isNaN(y = parseInt(x))? 0 : y;
}
-->
