/*
	script take care of the HTML object such as div,span and etc
	25/2/07 yoav blum
*/

function Div(Div1)
{
//this.onerror=function (sError,sURL,iLine){	return ClassException('Div',sError,sURL,iLine); }
var oIframePrint;
var oDiv=Div1;
var iStartPos;
var iStartPosLeft;
var iStartPosLeftWidth;
var bSameLocation;
var iSizeStep;
var iMaxSize;
var iStartHeight=0;
var iOpacityLevel;
var bNetScape = false;

try
{
	var bNetScape = navigator.appName.toLowerCase()=='netscape' ;
	iStartHeight=oDiv.nodeName=='IFRAME'?oDiv.height:iStartHeight=oDiv.offsetHeight;
}catch(e){}

this.getAllChild=getAllChild;
oDiv.getAllChild=getAllChild;
oDiv.iStartPos=iStartPos;
this.iStartPos=iStartPos;
oDiv.Print=Print;
this.Print=Print;
oDiv.ChangeState=ChangeState;
this.ChangeState=ChangeState;
oDiv.Open=StateOpen;
this.Open=StateOpen;
oDiv.Close=StateClose;
this.Close=StateClose;
oDiv.Clear=Clear;
this.Clear=Clear;
oDiv.reLocate=LocateInit;
this.reLocate=LocateInit;
oDiv.ChangeSize=ChangeSizeInit;
this.ChangeSize=ChangeSizeInit;
oDiv.ChangeSizeClose=ChangeSizeCloseInit;
this.ChangeSizeClose=ChangeSizeCloseInit;
oDiv.RemoveHTMLNode=RemoveNode;
this.RemoveHTMLNode=RemoveNode;
oDiv.ObjectResize=ObjectResize;
this.ObjectResize=ObjectResize;
oDiv.ObjectResizeHeight=ObjectResizeHeight;
this.ObjectResizeHeight=ObjectResizeHeight;
oDiv.ObjectResizeWidth=ObjectResizeWidth;
this.ObjectResizeWidth=ObjectResizeWidth;
oDiv.Opacity=Opacity;
this.Opacity=Opacity;
oDiv.FadeIn=FadeInInit;
this.FadeIn=FadeInInit;
oDiv.FadeOut=FadeOutInit;
this.FadeOut=FadeOutInit;
oDiv.ShowAndFade=ShowAndFade;
this.ShowAndFade=ShowAndFade;
oDiv.getWidth=getWidth;
this.getWidth=getWidth;
oDiv.getHeight=getHeight;
this.getHeight=getHeight;
oDiv.PositionBest=PositionBest;
this.PositionBest=PositionBest;
oDiv.LocationBest=LocationBest;
this.LocationBest=LocationBest;
oDiv.getElementX=getElementX;
this.getElementX=getElementX;
oDiv.getElementY=getElementY;
this.getElementY=getElementY;
oDiv.PlaceOver=PlaceOverInit;
this.PlaceOver=PlaceOverInit;
oDiv.isOpen=isOpen;
this.isOpen=isOpen;
	function getAllChildRecurse(sTag,oPtr,oArr)
	{
		for (var i=0;i<oPtr.length;i++)
		{
			if(sTag==oPtr[i].tagName)
				oArr[oArr.length]=oPtr[i];
			getAllChildRecurse(sTag,oPtr[i],oArr);
		}
	}
	function getAllChild(sTag)
	{
		var oArr=new Array();
		var oPtr=oDiv.parentNode.childNodes;
		getAllChildRecurse(sTag, oPtr,oArr);		
		return oArr;
	}
	function LocationBest(oInput)
	{
		var iTop=0;
		var iLeft=60;
		var oParent=oInput;

		for (var oPtr=oParent;oPtr;oPtr=oPtr.parentNode)
		{
			if(oPtr.tagName!='TR')
			{
				if( oPtr.offsetLeft )	iLeft += oPtr.offsetLeft;
				if( oPtr.offsetTop  )	iTop  += oPtr.offsetTop;
			}
		}
		oDiv.style.left=iLeft - oInput.getWidth()/2;
		oDiv.style.top=iTop + new Div(oParent).getHeight();
	}

	function getScreenWidth()
	{
		return document.body.offsetWidth;	
	}
	function PlaceOver(oDivToPlace,iTableWidth)
	{
		oDivToPlace.style.top=getElementY();
		var iX = getElementX();
		var iExtra = getScreenWidth() - iX >0 ? (getScreenWidth()-iTableWidth)/2 : 0 ;
		oDivToPlace.style.left = iX + iExtra;
		var fnResize=window.onresize;
	}

	function PlaceOverInit(oDivToPlace,iTableWidth)
	{
		PlaceOver(oDivToPlace,iTableWidth);
		var fnResize=window.onresize;
		window.onresize=function (){
			if (fnResize)
				fnResize();
			PlaceOver(oDivToPlace,iTableWidth);
		}
	}
	
	function getElementX()
	{	
		return oDiv.scrollLeft + oDiv.offsetLeft;
	}
	
	function getElementY()
	{	
		return oDiv.scrollTop + oDiv.offsetTop;
	}
	
	function PositionBest(e)
	{
			var x=getX(e);
			var y=getY(e);
			var iHeight=getHeight();
			var iWidth=getWidth();
			var iWidth2=iWidth / 2;
			var iPageWidth=getPageWidth() ;
			var iLeftScroll=document.body.scrollLeft;
			var	iLeftArrow=0;
			var oTDTop		= document.getElementById('tdToolTipTop');
			var oTDBottom	= document.getElementById('tdToolTipBottom');
			var iImgWidth	= 25
			if( y > document.body.scrollTop + iHeight )
			{
				y += -1 * iHeight - 20 
				if (oTDTop && oTDBottom)
				{
					new Div(oTDTop).Close()
					new Div(oTDBottom).Open()
				}
			}else{
				y += 20;
				if (oTDTop && oTDBottom)
				{
					new Div(oTDTop).Open()
					new Div(oTDBottom).Close()
				}
			}
			oDiv.style.top=y;
				
			if (bNetScape)
				oDiv.style.right=iPageWidth-x;
			else
			{
				if (x + iWidth2 > iPageWidth + iLeftScroll )
				{
					x= iPageWidth  - iWidth;
					iLeftArrow =  getX()-iLeftScroll- x - iImgWidth;
				}else if( x - iWidth2  < iLeftScroll)
				{
					x= 0; 
					
					iLeftArrow = getX()-iLeftScroll- x - iImgWidth;
				}else{
						x -= iLeftScroll + iWidth2 ;
						iLeftArrow=iWidth2 - iImgWidth;
				}
				
				if (iLeftArrow>0 && oTDTop && oTDBottom)
				{
					oTDTop.style.paddingLeft=iLeftArrow;
					oTDBottom.style.paddingLeft=iLeftArrow;
				}
				oDiv.style.left=x;
			}

	}
	
	function ShowAndFade(oDiv1)
	{
		StateOpen()
		oDiv1?oDiv1.onmouseout=FadeOutInit:oDiv.onmouseout=FadeOutInit;
	}
	
	function FadeInInit()
	{
		iOpacityLevel=0;
		FadeIn()
	}
	
	function FadeIn()
	{
		iOpacityLevel++;
		Opacity(iOpacityLevel);
		if (iOpacityLevel<=100)
			setTimeout(FadeIn,20);
	}

	function FadeOutInit()
	{
		iOpacityLevel=100;
		FadeOut()
	}

	function FadeOut()
	{
		iOpacityLevel-=5;
		Opacity(iOpacityLevel)
		if(iOpacityLevel>=0)
			setTimeout(FadeOut,20)
		else{
			StateClose(); 
			Opacity(100);
		}
		
	}

	function Opacity(iOpacity)
	{
		oDiv.style.filter='alpha(opacity=' + iOpacity + ', style=0)';
	}

	function getPageWidth()
	{
		return document.body.clientWidth;
	}
	
	function getPageHeight()
	{
		return document.body.clientHeight;
	}

	function getX(e)
	{
		var x;
		x=!bNetScape ? window.event.x :e.pageX;
		x+=document.body.scrollLeft;
		return x;
	}
	
	function getY(e)
	{
		return bNetScape ? e.pageY : window.event.y + document.body.scrollTop ;
	}

	function getWidth()
	{
	
	//alert(parseInt(document.defaultView.getComputedStyle(oDiv,'').getPropertyValue('width')));
		return oDiv.offsetWidth;
	}

	function getHeight()
	{
		return oDiv.offsetHeight;
	}

	function ObjectResizeHeight(oHTML)
	{
		oDiv.style.height	=oHTML.offsetHeight;
	}

	function ObjectResizeWidth(oHTML)
	{
		oDiv.style.width	=oHTML.offsetWidth;
	}

	function ObjectResize(oHTML,iOpacity)
	{
		ObjectResizeHeight(oHTML);
		ObjectResizeWidth(oHTML);

		if (iOpacity)
			Opacity(iOpacity);
	}
	
	function RemoveNode()
	{
		oDiv.parentNode.removeChild(oDiv);
	}

	function ChangeSizeInit(Step,MaxSize)
	{
		iSizeStep	= Step;
		iMaxSize	= MaxSize;
		clearInterval (oDiv.Interval);
		oDiv.Interval=setInterval(ChangeSize,10);
	}
	
	function Clear()
	{
		oDiv.innerHTML='';
	}
	
	function ChangeSize()
	{
		var iHeight=oDiv.offsetHeight;
		iHeight < iMaxSize?	oDiv.style.height = iHeight + iSizeStep : clearInterval (oDiv.Interval);
	}
	
	function ChangeSizeCloseInit(Step)
	{
		iSizeStep	= Step;
		clearInterval (oDiv.Interval);
		oDiv.Interval=setInterval(ChangeSizeClose,10);
	}

	function ChangeSizeClose()
	{
		var iHeight=oDiv.offsetHeight;
		iHeight > iStartHeight?	oDiv.style.height = iHeight - iSizeStep : clearInterval (oDiv.Interval);
	}
	
	function Print(sTitle)
	{
		var oArr=document.getElementsByTagName('link')
		if(!sTitle) sTitle='Print Frame';
		oIframePrint=document.createElement('<IFRAME id="ifrmPrint" src="about:blank" height="0" width="0">');
		var sHTML = 
		'<html dir=rtl>'+
			'<head>'+
				'<title>'+sTitle+'</title>';

		for (var i=0;i<oArr.length;i++)
			if(oArr[i].rel=='stylesheet')
				sHTML+=
				'<LINK REL="stylesheet" TYPE="text/css" HREF="' + oArr[i].href + '">';
		sHTML+=
			'</head>'+
			'<body>' + 
				oDiv.innerHTML+
			'<body>'+
		'</html>';
		
		document.body.appendChild(oIframePrint);
		var oIFr=document.frames['ifrmPrint']
		
		oIFr.document.writeln(sHTML);
		oIFr.focus();
		setTimeout(PrintFin,200);
	}
	
	function PrintFin()
	{
		print();
		document.body.removeChild(oIframePrint);
	}
	
	function StateOpen()
	{
		if (!isOpen())
		{
			if (bNetScape)
			{
				oDiv.style.display='inline';
			}
			oDiv.style.display='';
		}
	}
	
	function StateClose()
	{
		oDiv.style.display='none';
	}
	
	function isOpen()
	{
		return oDiv.style.display!='none';
	}
	
	function ChangeState()
	{
		isOpen() ? StateClose() : StateOpen();
	}
	
	function LocateInit(iY,bSamePlace)
	{
		!iY? iStartPos=oDiv.offsetTop : iStartPos=iY;
		var fnOnScroll=window.onscroll;
		window.onscroll=function (){
			if (fnOnScroll) fnOnScroll();
			reLocate();
		}
		bSameLocation=bSamePlace;
		iStartPosLeft=oDiv.offsetLeft;
		iStartPosLeftWidth	= oDiv.offsetWidth;
		reLocate ();
	}
	
	function reLocate()
	{
		var oDivStyle = oDiv.style
		var iDestPos
		if (bSameLocation)
			iDestPos = document.body.scrollTop + iStartPos;
		else if (iStartPos > document.body.scrollTop )
			iDestPos = iStartPos;
		else
			iDestPos = document.body.scrollTop;

		oDivStyle.left		= iStartPosLeftWidth + iStartPosLeft;
		oDivStyle.top		= iDestPos;
		
	}
		
	if (bNetScape)
	{
	/*
		oDiv.insertAdjacentHTML=function(stam,str)
		{	
			var r = document.createRange();
			r.setStartBefore(document.body);
			var oNode = r.createContextualFragment(str);
			
			if(stam=='afterBegin')
			{
				oDiv.insertBefore(oNode,oDiv.firstChild);
			}else{
				oDiv.appendChild(oNode);
			}
			

		}
	*/
		
		oDiv.insertAdjacentHTML = function (sWhere, sHTML) 
		 {
			
		 
			var oFragment;   
			var oRange = oDiv.ownerDocument.createRange();
			sWhere=String(sWhere).toLowerCase();

			switch (sWhere) 
			{  
				case "beforebegin":
					oRange.setStartBefore(oDiv);
					oFragment = oRange.createContextualFragment(sHTML);
					oDiv.parentNode.insertBefore(oFragment, oDiv);
					break;
				case "afterbegin":
					oRange.selectNodeContents(oDiv);
					oRange.collapse(true);
					oFragment = oRange.createContextualFragment(sHTML);
					oDiv.insertBefore(oFragment, oDiv.firstChild);
					break;
				case "beforeend":
					oRange.selectNodeContents(oDiv);
					oRange.collapse(false);
					oFragment = oRange.createContextualFragment(sHTML);
					oDiv.appendChild(oFragment);
					break;
				case "afterend":
					
					oRange.setStartAfter(oDiv);
					oFragment = oRange.createContextualFragment(sHTML);
					oDiv.parentNode.insertBefore(oFragment, oDiv.nextSibling);
					break;
				default:
					oDiv.appendChild(oNode);
					break;
			}
			
			
		}
		this.insertAdjacentHTML=oDiv.insertAdjacentHTML;
		
		oDiv.insertAdjacentElement = function(sWhere,oNode)
		{
			switch (sWhere)
			{
			case 'beforeBegin':
				oDiv.parentNode.insertBefore(oNode,oDiv)
				break;
			case 'afterBegin':
				oDiv.insertBefore(oNode,oDiv.firstChild);
				break;
			case 'beforeEnd':
				oDiv.appendChild(oNode);
				break;
			case 'afterEnd':
				if (this.nextSibling) 
					oDiv.parentNode.insertBefore(parsedNode,oDiv.nextSibling);
				else 
					oDiv.parentNode.appendChild(parsedNode);
				break;
			}
		}
		this.insertAdjacentElement=oDiv.insertAdjacentElement;
		
		function allIn(sID,oCurrNode)
		{
			for(var i=0;i<oCurrNode.length;i++)
			{
				if(oCurrNode[i].id==sID)
					return oCurrNode[i];
				else
				{
					var returned=allIn(sID,oCurrNode[i].childNodes);
					if (returned!=null)
						return returned;
				}
			}
		}

		function allFirst(sID)
		{
			var oCurrNode=oDiv.childNodes;
			return allIn(sID,oCurrNode);
		}
		
		this.all=allFirst;
		oDiv.all=allFirst;
		/*
		this.all=layer;
		oDiv.all=layer;
		*/

	}
}		
