// start info
if(typeof jsReport != 'undefined'){
	jsVersion = new Array(
	/*Name			=*/ 'Class Behaviour',
	/*Version 		=*/ '0.4',
	/*Date 			=*/ 20040322,
	/*Author		=*/ 'Maurice van Creij',
	/*ProjectCode	=*/ 'lib_classbehaviour',
	/*Summary		=*/ 'Parse a document and add often used event-handlers to specific classes.',
	/*Dependencies	=*/ new Array('lib_classbehaviour.js'),
	/*Browsers		=*/ new Array('MO','IE','OP','KO'),
	/*Changes		=*/ new Array(
						'0.4: Added "showAsCode" to show the source-code of containers',
						'0.31: A textnode detector was included in "toggleNextNode"',
					  	'0.3: Added class parameters parser for opening links as popup',
					  	'0.2: Basic set of supported classes',
					  	'0.1: Basic document parsing'
					  	),
	/*Usage			=*/ new Array(
						'1. Replace "link" in class',
						'	class="classMouseHover"',
						'2. Replace "link" in src',
						'	class="srcMouseHover"',
						'3. Add display:none; on parse',
						'	class="hideThisNode"',
						'4. Add or remove display:none; onclick',
						'	class="toggleNextNode"',
						'5. Add display:none; to parent node',
						'	class="closeParentNode"',
						'6. Replace image with transparent version, invoke activeX background loader',
						'	class="pngAlpha"',
						'7. Handle ondrag events',
						'	class="dragAndDrop"',
						'8. Open links in a popup',
						'	class="openAsPopUp[_WI400][_HE300][_TByes][_SCyes][_RSyes][_STyes][_LOyes][_MEyes][_NMmyname]"',
						'	(Everything between [brackets] is optional. Leave out the [brackets] in the classname)',
						'	WI = width (default: automatic)',
						'	HE = height (default: automatic)',
						'	TB = toolbars (default: no)',
						'	SC = Scrollbars (default: no)',
						'	RS = Resizable (default: no)',
						'	ST = Status bar (default: no)',
						'	LO = Location bar (default: no)',
						'	ME = Menus (default: no)',
						'	NM = Window name (default: popup)',
						'9. Shows the contents of a container as raw code',
						'	class="showAsCode"',
						' ',
						'<dl>',
						'	<dt class="link classMouseHover toggleNextNode">click this to open definition 1</dt>',
						'	<dd class="hideThisNode">',
						'		Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ',
						'		<a href="#" class="closeParentNode">close</a>',
						'	</dd>',
						'</dl>',
						' ',
						'<script language="javascript" src="/~wmittensrdx/resources/lib_classbehaviour.js"></script>'
					  	)
	)
}else{
// end info

	// constants/configuration
		if(typeof(strTransparentImg)=='undefined')			var strTransparentImg = "./images/transparent.gif";
		if(typeof(intDragAndDropGridWidth)=='undefined')	var intDragAndDropGridWidth = 16;
		if(typeof(intDragAndDropGridHeight)=='undefined')	var intDragAndDropGridHeight = 16;
	// primary functions - functionality

	// secondary function - constructors
		function parseForClasses(){
			var strClass, arrClass
			// get all elements
			var objAll = (document.all) ? document.all : document.getElementsByTagName("*");
			// for all elements
			for(var intA=0; intA<objAll.length; intA++){
				// get the element's class attribute
				strClass = objAll[intA].className;
				// if there is a class
				if(strClass!=null){	
					// split the class attribute into classes
					arrClass = strClass.split(' ');
					// for all sub-classes
					for(var intB=0; intB<arrClass.length; intB++){
						// choose known classes
						switch(arrClass[intB].toLowerCase()){
							// replace in class
							case "classmousehover" :
								var strClassName = objAll[intA].className;
								objAll[intA].className += (strClassName.indexOf('link')<0 && strClassName.indexOf('active')<0) ? ' link' : '' ;
								objAll[intA].onmouseover = addClassHover;
								objAll[intA].onmouseout = remClassHover;
								objAll[intA].onclick = addClassActive;
								break;
							// replace in src sub-string
							case "srcmousehover" : 
								objAll[intA].onmouseover = addSrcHover;
								objAll[intA].onmouseout = remSrcHover;
								break;
							// add display='none'; on parse
							case "hidethisnode" : 
								/*event*/;
								objAll[intA].style.display = 'none';
								break;
							// add or remove display='none'; onclick
							case "togglenextnode" : 
								/*event*/;
								objAll[intA].onclick = toggleNextNode;
								break;
							// add display='none'; to parent node
							case "closeparentnode" : 
								/*event*/;
								objAll[intA].onclick = closeParentNode;
								break;
							// replace image with transparent version, invoke activeX background loader
							case "pngalpha" : 
								/*event*/;
								pngAlpha(objAll[intA]);
								objAll[intA].onload = pngAlpha;
								break;
							// handle ondrag events
							case "draganddrop" : 
								/*event*/;
								objAll[intA].onmousedown = dragPickUp;
								objAll[intA].onmouseup = dragDrop;
								objAll[intA].onmousemove = dragMove
								break;
							// show contents as code
							case "showascode" : 
								/* event */
								showAsCode(objAll[intA]);
							default :
								/*event*/;
						}
						// check for parsable classes
							// "openAsPopUp_[WH400]_[HE300]_[TByes]_[SCyes]_[RSno]-[STno]_[NMmyname] (add an onclick event, opening a popup)
							if(arrClass[intB].toLowerCase().indexOf("openaspopup")>-1) objAll[intA].onclick = openAsPopup;
					}
				}
			}
		}
	// ternary function - event handlers
		var objPopup;
		function openAsPopup(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// get the className
			var arrClassNames = objNode.className.split(' '); var strClass; var intClass = 0;
			while(strClass==null && intClass<arrClassNames.length){
				strClass = (arrClassNames[intClass].indexOf("openAsPopUp")>-1) ? arrClassNames[intClass] : null;
				intClass += 1;
			}
			// get class parameters
			var arrClassParams = strClass.split('_');
			for(var intParam=1; intParam<arrClassParams.length; intParam++){
				eval("var " + arrClassParams[intParam].substr(0,2) + "= '" + arrClassParams[intParam].substr(2) + "'");
			}
			// get width parameter
			var strWidth		= (typeof(WI)!='undefined') ? 'width='+WI : '' ;
			// get height parameter
			var strHeight		= (typeof(HE)!='undefined') ? ',height='+HE : '' ;
			// get toolbar string
			var strToolbars		= (typeof(TB)!='undefined') ? ',toolbar='+TB : ',toolbar=no' ;
			// get scrolling string
			var strScrolling	= (typeof(SC)!='undefined') ? ',scrollbars='+SC : ',scrollbars=no' ;
			// get status string
			var strStatus		= (typeof(ST)!='undefined') ? ',status='+ST : ',status=no' ;
			// get resizable string = 
			var strResize		= (typeof(RS)!='undefined') ? ',resizable='+RS : ',resizable=no' ;
			// get resizable string = 
			var strLocation		= (typeof(LO)!='undefined') ? ',location='+LO : ',location=no' ;
			// get resizable string = 
			var strMenu			= (typeof(ME)!='undefined') ? ',menu='+ME : ',menu=no' ;
			// window name
			var strName			= (typeof(NM)!='undefined') ? NM : 'popup' ;
			// open requested window
			objPopup = window.open(objNode.getAttribute('href'), strName, strWidth+strHeight+strScrolling+strToolbars+strStatus+strResize+strLocation+strMenu);
			objPopup.focus();
			// cancel click
			return false;
		}
		function addClassHover(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// replace link by hover
			objNode.className = objNode.className.replace('link','hover');
		}
		function remClassHover(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// replace hover by link
			objNode.className = objNode.className.replace('hover','link');
		}
		function addClassActive(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// replace link by active
			objNode.className = objNode.className.replace('link','active');
			// replace hover by active
			objNode.className = objNode.className.replace('hover','active');
		}
		function addSrcHover(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// replace link by hover
			objNode.src = objNode.src.replace('link','hover');
		}
		function remSrcHover(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// replace link by hover
			objNode.src = objNode.src.replace('hover','link');
		}
		var objLastOpened;
		function toggleNextNode(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			var objNextNode = (objNode.nextSibling.nodeName.indexOf("text")<0) ? objNode.nextSibling : objNode.nextSibling.nextSibling ;
			// restore previous node
			if(objLastOpened!=null && objLastOpened!=objNextNode) objLastOpened.style.display = 'none';
			// toggle next node
			objNextNode.style.display = (objNextNode.style.display=='none') ? 'block' : 'none' ;
			objLastOpened = objNextNode;	
		}
		function closeParentNode(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// hide the parent node
			objNode.parentNode.style.display = 'none';
		}
		var objTransparentImg = new Image(); objTransparentImg.src = strTransparentImg;
		function pngAlpha(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			if(typeof(objNode.style.filter)!='undefined'){
				// is the image a png
				if(objNode.src.toLowerCase().indexOf('.png')>-1 && objNode.src.indexOf(objTransparentImg.src)<0){
					// change the image styles
					objNode.style.width = objNode.width + 'px';
					objNode.style.height = objNode.height + 'px';
					objNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + objNode.src + "')";
					// remove the original
					objNode.src = strTransparentImg;
				}
			}
		}
		var intPickupX, intPickupY, intPickupZ;
		function dragPickUp(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// store pickup location
			intPickupX = (document.all) ? event.x : that.layerX ;
			intPickupY = (document.all) ? event.y : that.layerY ;
			intPickupZ = objNode.style.zIndex;
			// promote z position
			objNode.style.zIndex = 1024;
			// cancel browser mouse handler
			return false;
		}
		var intGridX=intDragAndDropGridWidth; var intGridY=intDragAndDropGridHeight;
		function dragDrop(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// snap coordinates to grid
			if(intGridX>0) objNode.style.left = Math.round(parseInt(objNode.style.left)/intGridX)*intGridX + "px";
			if(intGridY>0) objNode.style.top = Math.round(parseInt(objNode.style.top)/intGridY)*intGridY + "px";
			// restore z position
			objNode.style.zIndex = intPickupZ;
			// clear pickup location
			intPickupX = null;
			intPickupY = null;
			intPickupZ = null;
			// cancel browser mouse handler
			return false;
		}
		function dragMove(that){
			if(intPickupZ!=null){
				var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
				// mouse position
				intEventX = (document.all) ? event.x : that.layerX ;
				intEventY = (document.all) ? event.y : that.layerY ;
				// current object position
				var intStyleX = (objNode.style.left.indexOf('px')<0) ? 0 : parseInt(objNode.style.left) ;
				var intStyleY = (objNode.style.top.indexOf('px')<0) ? 0 : parseInt(objNode.style.top) ;
				// new object position
				if(intPickupX!=null) objNode.style.left = (intStyleX+intEventX-intPickupX) + 'px';
				if(intPickupY!=null) objNode.style.top = (intStyleY+intEventY-intPickupY) + 'px';
				// update pickup location (for some browsers)
				if(document.all) intPickupX = intEventX;
				if(document.all) intPickupY = intEventY;
				// cancel browser mouse handler
				return false;
			}
		}
		function showAsCode(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// replace html tags
			objNode.innerHTML = objNode.innerHTML.replace(/>/gi,"&gt;").replace(/</gi,"&lt;").replace(/ /gi,"&nbsp;").replace(/\t/gi,"&nbsp;&nbsp;&nbsp;").replace(/\n/gi,"<br />");
		}
	// events
		//onload = parseForClasses;
		parseForClasses();

}