	// configuration/constants
		var intRefreshrate = 15; // Hz
		var booEnableScrollLock = false; // CPU hungry
		var booAutoAdjustAllObjectPositions = false; // more CPU hungry
		var booFaderEnabled = false; //ie && v6 && !mc;

	// primary functions - functionality
		function setFade(strId,booGo,fltFade){
			// only initiate the fade if it's allowed and possible
			if(fltFade>0 && booFaderEnabled){
				// the real object
				objId = eval(strId);
				if(booGo){
					// activate the fader-filter
					objId.filters.blendTrans.Play();
				}else{
					// initiate the fader-filter
					objId.style.filter="blendTrans(duration="+fltFade+")";
					objId.filters.blendTrans.Apply();
				}
			}
		}
	
		function setClass(strId,strClass,fltFade){
			if(dom){
				// apply the new properties only if there's a change to the old properties
				if( document.getElementById(strId) != null) {
					if(document.getElementById(strId).className!=strClass){
						// initiate the fader-filter
						setFade(strId,false,fltFade);
						// the new properties
						document.getElementById(strId).className=strClass;
						// activate the fader-filter
						setFade(strId,true,fltFade);
					}
				}
			}else if(ie && !dom){
				// the real object
				objId = eval(strId);
				// the new properties
				objId.className = strClass;
			}else if(ns){
				// I wish
			}
		}		
		
		function setBackgroundImage(strId,objImageName,fltFade){
			objImage = eval(objImageName);
			if(dom){
				if(document.getElementById(strId).style.backgroundImage!=objImage.src){
					setFade(strId,false,fltFade);
					document.getElementById(strId).style.backgroundImage= "url("+objImage.src+")";
					setFade(strId,true,fltFade);
				}
			}else if(ie && !dom){
				objId = eval(strId);
				objId.background = objImage.src;
			}else if(ns){
				// I wish
			}
		}
		
		function setForegroundImage(imgDocId,objImageName,layerName,fltFade) {
			objImage = eval(objImageName);
			if(ns && layerName!=-1){
				eval("document."+layerName+".document.images['"+imgDocId+"'].src = objImage.src");
			}else{
				if(document.images[imgDocId].src!=objImage.src){
					setFade(document.images[imgDocId],false,fltFade);
					document.images[imgDocId].src = objImage.src;
					setFade(document.images[imgDocId],true,fltFade);
				}
			}
		}
		
		function setContent(strId,objContent,fltFade){
			if(dom){
				if(document.getElementById(strId).innerHTML!=objContent){
					setFade(strId,false,fltFade);
					document.getElementById(strId).innerHTML = objContent;
					setFade(strId,true,fltFade);
				}
			}else if(ie && !dom){
				objId = eval(strId);
				objId.innerHTML=objContent;
			}else if(ns){
				objId = eval('document.'+strId);
				objId.document.open();
				objId.document.write(objContent);
				objId.document.close();
			}	
		}
	
		function setVisibility(strId,objState,fltFade){
			if(objState){styleSetting="visible"}else{styleSetting="hidden"}
			if(dom){
				if(document.getElementById(strId).style.visibility!=styleSetting){
					setFade(strId,false,fltFade);
					document.getElementById(strId).style.visibility = styleSetting;
					setFade(strId,true,fltFade);
				}
			}else if(ie && !dom){
				objId = eval(strId);
				objId.style.visibility = styleSetting;
			}else if(ns){
				if(objState){styleSetting="show"}else{styleSetting="hide"}
				objId = eval('document.'+strId);
				objId.visibility = styleSetting;
			}
		}

		function setPosition(strId,objXpos,objYpos,objZpos,objWidth,objHeight,booScrollLock,booOffScreenGuard){
			// incomplete arguments guard
				if(typeof objWidth == 'undefined'){
					objWidth = 0;
					objHeight = 0;
					booScrollLock = false;
					booOffScreenGuard = false;
				}
			// find page postition
			intXadjust = 0; intYadjust = 0;
			if(booScrollLock){
				if (ie){
					intXadjust = document.body.scrollLeft;
					intYadjust = document.body.scrollTop;
				}
				if (mo || ns){
					intXadjust = window.pageXOffset;
					intYadjust = window.pageYOffset;
				}
			}
			// adjust positions for screen-fitting
			intScreenXAdjust=0; intScreenYAdjust=0;
			if(booOffScreenGuard){
				// find page size
				if(ie){
					intPageWidth = document.body.offsetWidth;
					intPageHeight = document.body.offsetHeight;
				}
				if(ns||mo){
					intPageWidth = window.innerWidth;
					intPageHeight = window.innerHeight;
				}
				// find object size
				intObjWidth = objWidth;
				intObjHeight = objHeight;
				// adjust object position
				if(intObjWidth+objXpos>intPageWidth)	intScreenXAdjust=intPageWidth-intObjWidth-objXpos;
				if(intObjHeight+objYpos>intPageHeight)	intScreenYAdjust=intPageHeight-intObjHeight-objYpos;
			}
			// set new positions
			if(dom){
				if(document.getElementById(strId).style.left!=objXpos+intXadjust+intScreenXAdjust || document.getElementById(strId).style.top!=objYpos+intYadjust+intScreenYAdjust || document.getElementById(strId).style.zIndex!=objZpos){
					document.getElementById(strId).style.left = (objXpos+intXadjust+intScreenXAdjust);
					document.getElementById(strId).style.top = (objYpos+intYadjust+intScreenYAdjust);
					document.getElementById(strId).style.zIndex = objZpos;
				}
			}else if(ie && !dom){
				objId = eval(strId);
				objId.style.left = (objXpos+intXadjust+intScreenXAdjust);
				objId.style.top = (objYpos+intYadjust+intScreenYAdjust);
				objId.style.zIndex = objZpos;
			}else if(ns){
				objId = eval('document.'+strId);
				objId.left = (objXpos+intXadjust+intScreenXAdjust);
				objId.top = (objYpos+intYadjust+intScreenYAdjust);
				objId.zIndex = objZpos;
			}	
		}

		
	// secondary functions - construction
		// preload possible background images
		function cacheBackgroundImage(objImageName,objImageSource){
			eval(objImageName + "= new Image(0,0);");
			eval(objImageName + ".src = '" + objImageSource + "';");
		}
		
		// store layer attributes centraly
		arrLayers =	new Array();
		function defineLayer(objName,booAbsolutePos,intXpos,intYpos,intZpos,intWidth,intHeight,intDepth,strContent,strUrl,booScrollable,booVisible,booScollLock,booOffscreenGuard){
			// store layer attributes in an array for reference
			//											0				1			2			3		4		5		6		7			8		9		10			11			12			13				14
			arrLayers[arrLayers.length] = new Array(arrLayers.length,objName,booAbsolutePos,intXpos,intYpos,intZpos,intWidth,intHeight,intDepth,strContent,strUrl,booScrollable,booVisible,booScollLock,booOffscreenGuard);
		}

		// look up a layer's name and return it's position in the list.
		function objName2objID(objName){
			objID = -1;
			intA = 0;
				// go through the entire list until you find the object's name
				while(intA<arrLayers.length && objID==-1){
					// if the name matches the list's element note it's ID
					if(arrLayers[intA][1]==objName){objID=arrLayers[intA][0]}
					intA = intA + 1;
				}
			// give the ID back to the function's caller
			return objID;
		}

		// write a layer-tag that works in all browsers
		function writeLayerTag(objName,OpenTag){
			var objID = objName2objID(objName);
			var strWrite = '';
			// is it an open-tag
			if(OpenTag){
				// url?
				if(arrLayers[objID][10]!=""){
					// netscape
					if(ns){
						// layer
							// absolute positioned
						if(arrLayers[objID][2]){strPosition='pagex="'+arrLayers[objID][3]+'" pagey="'+arrLayers[objID][4]+'" clip="0,0,'+arrLayers[objID][6]+','+arrLayers[objID][7]+'" zindex="'+arrLayers[objID][5]+'"';strLayPrefix=''}else{strPosition='';strLayPrefix='i'}
							// visibility
						if(!arrLayers[objID][12]){strVisible='visibility="hide"'}else{strVisible=''}
							// tag construction
						strWrite = '<'+strLayPrefix+'layer name="'+arrLayers[objID][1]+'" src="'+arrLayers[objID][10]+'" '+strPosition+' width="'+arrLayers[objID][6]+'" height="'+arrLayers[objID][7]+'" '+strVisible+'></'+strLayPrefix+'layer>';
					// other
					}else{
						// iframe
							// absolute positioned
						if(arrLayers[objID][2]){strPosition='position:absolute; left: '+arrLayers[objID][3]+'px; top: '+arrLayers[objID][4]+'px; z-index: '+arrLayers[objID][5]+'; width: '+arrLayers[objID][6]+'px; height: '+arrLayers[objID][7]+'px;'}else{strPosition=''}
							// visibility
						if(!arrLayers[objID][12]){strVisible='visibility:hidden;'}else{strVisible=''}
							// tag construction
						if(arrLayers[objID][11]){strScroll='scrolling="auto"'}else{strScroll='scrolling="no"'}
						strWrite = '<iframe id="'+arrLayers[objID][1]+'" src="'+arrLayers[objID][10]+'" name="frm'+arrLayers[objID][1]+'" frameborder="0" width="'+arrLayers[objID][6]+'" height="'+arrLayers[objID][7]+'" '+strScroll+' style="'+strPosition+strVisible+'">';
					}
				// else
				}else{
					// netscape
					if(ns){
						// layer
							// absolute positioned
						if(arrLayers[objID][2]){strPosition='pagex="'+arrLayers[objID][3]+'" pagey="'+arrLayers[objID][4]+'"';strLayPrefix=''}else{strPosition='';strLayPrefix='i'}
							// visibility
						if(!arrLayers[objID][12]){strVisible='visibility="hide"'}else{strVisible=''}
							// tag construction
						strWrite = '<'+strLayPrefix+'layer name="'+arrLayers[objID][1]+'" '+strPosition+' width="'+arrLayers[objID][6]+'" height="'+arrLayers[objID][7]+'" '+strVisible+'>';
					// other
					}else{
						// div
							// absolute positioned
						if(arrLayers[objID][2]){strPosition='position:absolute;left:'+arrLayers[objID][3]+'px;top:'+arrLayers[objID][4]+'px;z-index:'+arrLayers[objID][5]+';'}else{strPosition=''}
							// visibility
						if(!arrLayers[objID][12]){strVisible='visibility:hidden;'}else{strVisible=''}
							// tag construction
						strWrite = '<div id="'+arrLayers[objID][1]+'" style="width:'+arrLayers[objID][6]+'px;height:'+arrLayers[objID][7]+'px;'+strPosition+strVisible+'">';
					}
				}
			// is it a close-tag
			}else{
				// url?
				if(arrLayers[objID][10]!=""){
					// netscape
					if(!ns){
						// iframe
						strWrite = '</iframe>';
					}
				// else
				}else{
					// netscape
					if(ns){
						// layer
						if(arrLayers[objID][2]){strLayPrefix=''}else{strLayPrefix='i'}
						strWrite = '</'+strLayPrefix+'layer>';
					// other
					}else{
						// div
						strWrite = '</div>';
					}
				}		
			}
			return strWrite;
		}
		
		// write a predefined amount of layers with attributes
		function makeLayers(){
			makeLayer('all')
		}
		
		function makeLayer(strName){
			var strMakeLayer = ''
			// for all  layers in the central list
			for(var intA=0; intA<arrLayers.length; intA++){
				if(arrLayers[intA][1]==strName || strName=='all'){
					strMakeLayer += writeLayerTag(arrLayers[intA][1],true);
					strMakeLayer += arrLayers[intA][9];
					strMakeLayer += writeLayerTag(arrLayers[intA][1],false);
				}
			}
			document.writeln(strMakeLayer)
		}
		
		// lock specified layers to a scroll position
		function setScrollLock(){
			// delay before updating, every "intRefreshrate" above 5Hz is considered "as fast as possible"
			if(ie && intRefreshrate>5){
				onscroll = doScrollLock;
			}else{
				setInterval('doScrollLock()',Math.round(1000/intRefreshrate));
			}
		}
		
		function doScrollLock(){
			for(var intA=0; intA<arrLayers.length; intA++){
				// only adjust the position of repositionable (booScrollLock) items
				if(arrLayers[intA][13] || booAutoAdjustAllObjectPositions){
					setPosition(arrLayers[intA][1],arrLayers[intA][3],arrLayers[intA][4],arrLayers[intA][5],arrLayers[intA][6],arrLayers[intA][7],arrLayers[intA][13],arrLayers[intA][14]);
				}
			}
		return true;
		}

		
	// executed inline
		// optionaly define scrolling (event) capture
		if(booEnableScrollLock || booAutoAdjustAllObjectPositions)setScrollLock();
