// start info
if(typeof jsReport != 'undefined'){
	jsVersion = new Array(
	/*Name			=*/ 'Class Behaviour',
	/*Version 		=*/ '0.2',
	/*Date 			=*/ 20040224,
	/*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.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"',
						' ',
						'<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 = "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]){
							// 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;
							default :
								/*event*/;
						}
						// check for parsable classes
							// "openAsPopUp[400x300][TB0][SC0] (add an onclick event, opening a popup)
							// case "offsetHeight-64px 	(make the element 100%-offset heigh)
							// case "offsetWidth-64px 	(make the element 100%-offset wide)
					}
				}
			}
		}
	// ternary function - event handlers
		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 ;
			// restore previous node
			if(objLastOpened!=null && objLastOpened!=objNode.nextSibling) objLastOpened.style.display = 'none';
			// toggle next node
			objNode.nextSibling.style.display = (objNode.nextSibling.style.display=='none') ? 'block' : 'none' ;
			objLastOpened = objNode.nextSibling;	
		}
		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 = parseInt(objNode.style.left) - parseInt(objNode.style.left)%intGridX + 'px';
			if(intGridY>0) objNode.style.top = parseInt(objNode.style.top) - parseInt(objNode.style.top)%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;
			}
		}
	// events
		onload = parseForClasses;

}