
var brt, UA;
var gummi_div;       // gummidiv eller første lag

var pref = '';        // kaldeknaps præferencer .. gemmes af 
var iFrameAktiv = false;
//var prevScrollTop;

// 2 public variable til scrollbar og vinduer ----------------------------


var scrFl = false;
var scrDwli = '';

var smFl = false;
var smDwli = '';
var smEl = '';
//var scrNr = '';     // er pt. ej i brug

// ------------------------------------------------------------

var cms = false;             // standard (false) eller cms (true) .. checkes i init()

var sstr;

		if (window.ActiveXObject)				                // code for IE
		{
			brt=true;
			UA=document.documentMode;            // IE .. version (5,6),7 eller 8
//alert('Brutalis ver. '+UA);
		}
		else if (window.XMLHttpRequest)           // Gecko ..  Firefox[0],Chrome[1],Apple[2],3,4
		{
        if ( navigator.vendor && navigator.vendor != '' )
        {
      			if ( navigator.vendor && (navigator.vendor).search(/Google/i) != -1 ) {UA = 1;}   // Chrome
      			if ( navigator.vendor && (navigator.vendor).search(/Apple/i) != -1 ) {UA = 2;}    // Apple          
        }
        else
        {
            UA=0;             // Firefox
        }

      brt=false;
		}
//alert('UA '+UA+'\n\n'+'navigator.vendor '+navigator.vendor+'\n\n'+'navigator.userAgent '+navigator.userAgent);
// --------- 'handler-transport' -------------------

var _l=0;				// event-lag ..  pga. IE
var _eb=false;
// -------------------------------------------------

var _lbar=null;			// variable, der indeholder ref. til element identificeret som 'loadbar' .. sættes evt. ved opstart på lag 0

var eb=0;				// init event blokker !


var m=new Array;	    // keep track af alt det downloadede

var Ssession;				// session id (integer) .. er sat default=0 i init(0)


// ------------------------------------------------

 
 
           function dragevent() { return false }    // scroll, vindue
           function selectEv() { return false }    // defineres FØR kald


// ------------------------------------------------




function load(a,c,d,f,g)
//function load(url, fli, flslt, kn, vars)		                // vars indeholder evt. 'input'-streng
{
  var _1=a;			// url
	var _3=c;			// index til fra-laget (9)
	var _4=d;			// knappens placering i SLT-listen på kaldelaget
	var _5=f;			// ref til knap, der var årsag til kald
	var _6=g;			// variable, der skal sendes med kaldet - sentinel() og submit()
  var syncid;
	sstr='';							// send string - syncron .. erklæret global !!

	lbon();					                                    // lbar tændes, hvis 

// -------------- headers -------------

          

  var gp = 'GET';                                  // default
  
	if ( _5 == null )                                // opstart
	{
			sstr = _6;            // her sættes sstr til syncron
		  _1=_1+'?session='+Ssession;  
  }
  else
  {
      if ( ( _1.length + _6.length ) > 4096 )      // POST
      {
          gp = 'POST';                               // _1 og _6 holdes separat
//alert(_1+'\n\n'+_6);
          var tempo6 = _6.slice(1,512);
          tempo6 = tempo6.slice(0,tempo6.lastIndexOf('|')+1);    // der barberes og extraheres

// alert('POST   '+_1+'\n\n'+ tempo6);
          _6 = tempo6;
      }
      else                                         // GET
      {
          gp = 'GET';
          _1 = _1 + _6;                             // _1 og _6 lægges sammen
      }

  }




// -------------------------------------


		
	    var r=( brt ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest() );
	    if (r) 
	    {
		    r.onreadystatechange = ok;

		    r.open(gp,_1,true);
//		    r.setRequestHeader("Content-Type", "text/html; charset=iso-8859-1");	// ingen betydning, idet alle HTTPrequester'er foretages i UTF-8 !!
//alert(_1);
			  if (gp=='POST')
			  {
//alert(_6);
            //Send the proper header information along with the request
            r.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            r.setRequestHeader("Content-length", _6.length);
            r.setRequestHeader("Connection", "close");

		    	 r.send(_6);
			  }
			  else
			  {
            // headers, der KAN kan fjernes i Firefox .. kun GET .. ej checket i andre browser .. 214 byte .. 31% for tom
            r.setRequestHeader("User-Agent", '');
            r.setRequestHeader("Accept", '');
            r.setRequestHeader("Accept-Language", '');
            r.setRequestHeader("If-None-Match", '');

		    	 r.send(null);
			  }
	    }


		function ok()
		{
			if (r.readyState == 4) 
			{
				if (r.status == 200) 
				{
//					if (r.responseText==''){ lboff(); exit; }    // hvis retur fra server er tom streng .. exit .. husk eb

					if (r.getResponseHeader('Etag'))	
					{
						if (_5!=null) {_5.ETag=r.getResponseHeader('Etag');}		// alle 'knapper' får ETag - pånær første, der er null
					}
					
          syncid=m.length;
				  m[syncid] = new Array();	                // ..og alloker/reserver 'plads' i m-listen
		
		            for ( var i = 0; i < 31; i++ )
		            {
			            m[syncid][i] = new Array;					
		            }

					if (r.getResponseHeader('wanHeader'))     // og vi gemmer header i m[n][0][1][..n]
          {
              
// header("wanHeader: tilstand| .. minL|minT|minW|minH| .. dynL|dynT|dynW|dynH|dynZ|dynS| .. maxS"); 12 parametre
              m[syncid][0][1] = ( r.getResponseHeader('wanHeader') ).split('|');                             
          }
          else
          {
              m[syncid][0][1] = null;
          }
         		    					
          checkcsi(r.responseText);
   			} 
				else 
				{
					_5.className=_5.nclass;				    // sluk selve knappen
					lukm(m[_3][0][0],_3);		            // og luk evt. menu
					lboff();
				}
			}
		}


  function checkcsi(str)             // check for include (csi, dso, drop) 
  {
      //alert('checkcsi(str).. start\n\n'+str);
			var sta;
			var url;
			var dropid=null;

			var rcsi='';
			var rdso='';
			var rpop='';
			var rdrop='';
			
			var dropid;
									
			sta=str.search(/<csi/);
			if(sta != -1)
			{
				rcsi=str.slice(sta,str.indexOf('/>',sta)+2);		// data
				url=rcsi.slice(rcsi.indexOf('"')+1,rcsi.lastIndexOf('"'));
				checkcsi(str.replace(rcsi,flet(syncid,url,null)));	// flet og udskiftning
			}
			
			sta=str.search(/<dso/);
			if(sta != -1)
			{
				rdso=str.slice(sta,str.indexOf('/>',sta)+2);		// dso,data 
				url=rdso.slice(rdso.indexOf('"')+1,rdso.lastIndexOf('"'));
				checkcsi(str.replace(rdso,flet(syncid,url,null)));	// flet og udskiftning 
			}
/*			
			sta=str.search(/<pop/);
			if(sta != -1)
			{
				rpop=str.slice(sta,str.indexOf('/>',sta)+2);		// xx) "dso,data
				dropid=rpop.slice(5,rpop.lastIndexOf(')'));
				url=rpop.slice(rpop.indexOf('"')+1,rpop.lastIndexOf('"'));
				checkcsi(str.replace(rpop,flet(syncid,url,dropid)));	// flet og udskiftning 
			}			
*/
			sta=str.search(/<drop/);
			if(sta	!= -1)							// exkluder <drop(@)
			{
				rdrop=str.slice(sta,str.indexOf('/>',sta)+2);		// xx) "dso,data
				dropid=rdrop.slice(6,rdrop.lastIndexOf(')'));
				url=rdrop.slice(rdrop.indexOf('"')+1,rdrop.lastIndexOf('"'));
				checkcsi(str.replace(rdrop,flet(syncid,url,dropid)));	// flet og udskiftning .. id følger med .. behandles i flet(), lige inden parkering .. auto increment
			}

			if ((rcsi == '')&&(rdso == '')&&(rpop == '')&&(rdrop == ''))

      rk(syncid,str,_3,_4,_5);
  }
/*
              function csvParam(incl)   // da kald til DSO og CSV i DSO ikke automatisk medfører parametre .. lægges _6 til her
              {
                  var url=incl.slice(incl.indexOf('"')+1,incl.lastIndexOf('"')); // udtræk af info 

                  var a = url.split(',');                                    // fang CVS i a[2]
      
                  if (a[2].indexOf('?') != -1)                                 // er der et'?' i kaldet allerede i a[2]
                  {
                     _6 = _6.replace('?','&');                               // .. så erstat det med '&'
                  }
                  
                  a[2] += _6;                                                // korrigerede parametre lægges til CSV-kald
           
                  return a.join();
              }
*/

}       // slut på load()


function urlencode(str) 
{
    str = escape(str.replace(/^\s+|\s+$/g, ''));    // obs .. trim() .. space's i begge ENDER af str fjernes
    str = str.replace('+', '%2B');
    str = str.replace('%20', '+');
    str = str.replace('*', '%2A');
    str = str.replace('/', '%2F');
    str = str.replace('@', '%40');
    return str;
}



        function sync(url)
        {
	        var r=(brt?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest());
	        if (r) 
	        {
// evt. parametre sættes på server .. timer24()-DSO'en kræver en '?aux=' lagnr. på knapperne overføres til event på nyt lag
              r.open('GET',url,false);   // .. som er den eneste parameter, der føres med sync() kald !!
  		        r.send(null);
              return r.responseText;
	        }
        }


	function rk(n,response,fli,flslt,kn)		// session ID .. response = req.responseText .. fra-lag-index .. fra-lag-slt .. og knap, der aktiverede
	{

      // der var ingenting fra server og benyttes KUN af kald til serverPOP() og updateServer()
      if (response == ''  )  
      {
          if ( fli != null && flslt != null && flslt != 0 ) // ej første kald og det var andet kald, end updateServer() [flslt = null] 
          {
                  exit(kn);                  // ryd op, slet lag og luk laget's kaldeknap .. og glem resten          
          }
          lboff();                         // husk eb
      }
  else    // .. eller normalt gennemløb .. evt med dummy -- <div class="nada"></div>
  {

    if (cms)
    {
        response = window.document.getElementById('ajaxIndhold').innerHTML.replace(/[\r\n]+/g, "");
        window.document.getElementById('ajaxIndhold').innerHTML = '';
    }
    else
    {
        response = response.replace(/[\r\n]+/g, "");
    }
    //response = window.document.body.innerHTML.replace(/[\r\n]+/g, "");
    //window.document.body.innerHTML = '<div></div>';
		
    // der indsættes en knap, der kan kalde 'dummeDiv' i rod
/* 
// ---------- hvis min-height -------------- 
    var regex = '(?<=min-height:)\d+(?=px;)';
    var mheight = response.match( /(?<=min-height:)\d+(?=px;)/ );  // stopper efter første math
// -----------------------------------------
  
    if ( mheight != null ) 
    { 
        response = response.replace(/\bmin-height:\d+px;\b/ , 'height:auto;'); 
        response = response.replace( />/ , '><div id="knap" title="dummeLukker" style="position:relative; left:0px; top:0px; width:0px; height:0px; visibility:none;" onclick="hentHTML(dummeDiv.php)"></div>' );
    }
    else  */
    {
//        response = response.replace( />/ , '><div id="knap" title="dummeLukker" style="position:relative; left:0px; top:0px; width:0px; height:0px; visibility:none;" onclick="hentHTML(dummeDiv.php)"></div>' );
      response = response.replace( />/ , '><div id="knap" title="dummeLukker" style="display:none;" onclick="hentHTML(dummeDiv.php)"></div>' );    
    }
//alert(response);    

    var ct=window.document.createElement('DIV');
			ct.style.display='none';			        // container ej i DOM !!
			
			ct.innerHTML=response;				        // .. og ind med response
      var s=(fli!=null ? m[fli][0][0].appendChild(ct.firstChild.cloneNode(true)):window.document.body.appendChild(ct.firstChild.cloneNode(true)));
/*

           if ( brt && UA == 8 ) { s.ondragstart = dragevent  }  // IE
           else { s.addEventListener( 'ondragstart' , dragevent , false ) } // Gecko
*/

			s.setAttribute('fli',fli); s.fli=fli;          // vor 'vindue' har fået reference til kalde-lag i [10]
			s.setAttribute('flslt',flslt); s.flslt=flslt;  // ..og kalde-knaps placering i [9]

// ------------ zIndex HACK for IE -----------------------
      
// første lag i AJAX .. '0-laget' eller 'gummidiv' .. får default zIndex = 10000  (ti-tusinde) og position:relative
// .. andet lag ( første lag efter 0-laget) får default zIndex = 0
// alle efterfølgende lag incrementeres med +1 fra foregående
//   s.style.zIndex = 'auto';
/*
    if ( n == 1 )
    {
        s.style.zIndex = '0';    // OBS som string
    }
    else if ( n >= 2 )   // .. altså bare ikke 0-laget, som allerede har zIndex = 10000 og 1-laget med index 0
    {
        s.style.zIndex = ( parseInt( m[fli][0][0].style.zIndex )+ 1 ).toString();  // OBS som string
    }  			
*/
    // laget har nu fået zIndex
    s.style.zIndex = '0';

// -------------------------------------------------------
        
		ct=null;								        // fjern container-indhold .. ej deleteNode() !!

			
// ref til dwnld-laget .. kalde lag index .. kalde-knap .. knapper .. Drop .. tDrop .. tRoot .. tHead .. ref til menu fra knap .. aktive knapper .. aktive vinduer .. selve stien .. sti separ .. clientPOP'er .. clientPOP-knap .. lastinput .. select-knap .. rept ..input .. aktCsv .. session .. scroll .. DSO'er .. DSO data .. timerknapper
//          [0]             	 [1]            [2]      	 [3]       [4]     [5]	    [6]      [7]               [8]                  [9]			     [10]			 [11]		    [12]	     [13]	            [14]		  [15]		     [16]       [17]    [18]    [19]       [20]	      [21]	    [22]       [23]        	[24]
				
		m[n][0][0]=s;						// downloadlag gemmes i array		
//		m[n][0][1]=null;					// sentinel gemmes i array		
		m[n][1][0]=fli;						// <- laget husker, hvorfra der blev kaldt .. blev sat på kalde-laget	
		m[n][2][0]=flslt;					// .. og index til kalde-knap i liste[9] på kalde-laget - altid 0 for hentHTML()						
		m[n][8][0]=null;						//  zIndex styring .. øverste lag						
		m[n][9][0]='';						//   .. længde sættes til 1						
//		m[n][22][0]=null;					// skabelon (DSO) - buffer .. altid null ved opstart 
//		m[n][23][0]=null;					// DSO data-buffer .. bufferen på lag 0 er GLOBAL 
		m[n][24][0]=null;				        // 'timerknapper' .. gruperet i div med id="timerknapper" .. i første skuffe er lægges timer-intervallet i ms
    m[n][25][0] = null;             // 'buffer' array .. input
    m[n][26][0] = null;             // 'buffer' array .. go-knap   
// er nået til 28
//		s.id=n.toString();					// downloadlag har fået id
      s.setAttribute('lnr',n); s.lnr = n;


//			if (brt){ s.onkeydown=new Function("e1(this)");s.attachEvent('onkeydown',e2);}		// IE 
      if (brt){ s.onkeydown = e2 } 	// IE
			else{s.addEventListener("keydown",e3,false)}						                // Gecko 
/*
// -----------
			if (brt){ s.onmousemove=new Function("e1(this)");s.attachEvent('ondragstart',e2);}		// IE 
			else{s.addEventListener("dragstart",e3,false)}						                // Gecko 

			if (brt){ s.onmousemove=new Function("e1(this)");s.attachEvent('draggable',e2);}		// IE 
			else{s.addEventListener("draggable",e3,false)}						                // Gecko 
// -----------
*/
      if (brt){ s.onmouseenter = e2; s.onmouseleave = e2; } 	//  kun IE

      if (brt){ s.onresize = e2 } 	// IE
			else{s.addEventListener("resize",e3,false)}						                // Gecko 


//			if (brt){ s.onmousemove=new Function("e1(this)");s.attachEvent('onmousemove',e2);}		// IE 
      if (brt){ s.onmousemove = e2 } 	// IE
			else{s.addEventListener("mousemove",e3,false)}						                // Gecko 


//			if (brt){ s.onmousedown=new Function("e1(this)");s.attachEvent('onmousedown',e2);}		// IE 
      if (brt){ s.onmousedown = e2 } 	// IE
			else{s.addEventListener("mousedown",e3,false)}						                // Gecko 

//			if (brt){ s.onmouseup=new Function("e1(this)");s.attachEvent('onmouseup',e2);}		// IE 
      if (brt){ s.onmouseup = e2 } 	// IE
			else{s.addEventListener("mouseup",e3,false)}						                // Gecko 


//			if (brt){s.onclick=new Function("e1(this)");s.attachEvent('onclick',e2);}	        // IE : _l sættes i evLag()
      if (brt){ s.onclick = e2 } 	// IE
			else {s.addEventListener("click",e3,false);};								        // Gecko: _l sættes i MZ
			
//			if (brt){s.onmouseover=new Function("e1(this)");s.attachEvent('onmouseover',e2);}	// IE 
      if (brt){ s.onmouseover = e2 } 	// IE
			else{s.addEventListener("mouseover",e3,false)}						                // Gecko 

//			if (brt){ s.onmouseout=new Function("e1(this)");s.attachEvent('onmouseout',e2);}		// IE 
      if (brt)
      { 
          s.onmouseout = e2      // IE
      } 	
			else
      {
/*
          if ( UA == 1)          
          {
              s.onmouseout = e3;      // Chrome
          }
          else    */
          {
              s.addEventListener("mouseout",e3,false);  // Gecko
          }
      }						                 



		
		if (fli!=null)
		{
// ---------- sletning af foregående download af html i 'container'-tilstand foregår her ---------------------------


			if (flslt==0) 						                    // det var et download i 'container' tilstand
			{ 				
  				if (m[fli][10][0] && m[fli][10][0] != null) 		// der slettes vinduer i 'container' tilstand
  				{

            rydoplag(fli,flslt);
  				}
  				
  				// .. og så knapper i menusystem
  				if (m[fli][9][0] != null)
  				{ 
  
              childCheck(m[fli][9][0],'');
  				} 		
  				
          // .. og dertilhørende thead
          if (m[fli][7][0]!=null)  		
          { 
  //            m[fli][7][0].className=m[fli][7][0].nclass; 
              childCheck(m[fli][7][0],'');
          } 
  			
  				if(m[fli][5].length>0)		                      // drop'er ?
  				{
  					m[fli][7][0]=m[fli][6][0];	                 // den til knappen hørende(aktive) thead, hvis nogen
  					childCheck(m[fli][6][0],'_a');				       // <-- thead aktiveres samtidig
  
  				} 
/*			
//	kn.innerHTML = ( kn.psbase ? kn.psbase : '' ) +  kn.psinner;

// her gemmes stien[11] - som streng med separator - på KALDELAGET .. KUN  i 'container'-tilstand .. og INDEN lukm() kaldes !

//  				var _11 = m[fli][11][0];
//  				if (_11 != null)									    // er der allokeret en 'sti' på fra-laget ?
  				{
    					var _11 = '';								// nulstil FØR tildeling
    					for (var p = 0; p < m[fli][6].length; p++)			// her aflæses 'tRoot' (innerHTML)
    					{
    						_11 += m[fli][6][p].id + ',';
    					}
    					_11 += kn.id;		// .. plus selve knappen
  				}				
//alert(_11)
*/

			}

        if (kn.offsL)           // hvis der var offset-koordinater kald
        {
            s.style.left = (lagkoord(kn,fli)[0] + parseInt(kn.offsL)).toString() + 'px';
            s.style.top = (lagkoord(kn,fli)[1] + parseInt(kn.offsT)).toString() + 'px';
        }

				if (kn.parentNode.id != 'buffer'){akt(kn);}   // knap ej i 
				m[fli][9][flslt]=kn;		                    // nye knap gemmes i index [9]			
				m[fli][10][flslt]=s;	                        // det nye vindue gemmes i kalde-lagets liste [10] syncront med kalde-knap i liste [9]
						                                        // da 'hentDSO' er en gentage-knap .. og må derfor ikke aktiveres
    		lukm(m[fli][0][0],fli);						    // luk menuen på kalde-lag
//alert(m[fli][9][kn.sp].sp);

		}
		

// ------------ først HER startes den egentlige initierings-sekvens af elementer på laget -----------------------

		_lbar=window.document.getElementById('loader');

		var st=window.document.getElementById('sti');		//		fang 'sti' .. hvis nogen
		if (st)												// .. der var en 'sti'
		{
			m[n][11][0]=st;									// ref til 'sti' parkeret i [11]
			st.removeAttribute('id');						// .. så vi ikke fanger ved næste download
			m[n][12][0]=st.innerHTML;						// .. separator parkeres i [12]
			st.innerHTML='';								// .. og 'sti' kan nu modtage de opdaterede stier												
		}
				
//----------------------------------------  initialisering af scrollBar  ---------------------------------------------------------
			
/*
		if (n != 0)     // hentes fra SCROLLsys.js - hvor alle 'scrollerter' findes recursive .. FØR knap-gennemløb !!
    { 
      scrollInit(n,kn,fli);
   	}
*/

    knapInit(n,'knap',kn,fli);						    // så alle 'knap'er
    knapInit(n,'pop',kn,fli);						    // så alle 'pop'er
		knapInit(n,'start',kn,fli);				            // .. og til sidst 'starteren', hvis nogen	- og kun en !		
//		knapInit(n,'drop',kn,fli);				            // .. og til sidst 'starteren', hvis nogen	- og her kan der være mange !		

// ------------------------- egentlig afslutning på rk()
      //setWan(n);      // FØR scrollInit()
      //alert(cms);
  		if (n != 0 || cms)     // hentes fra SCROLLsys.js - hvor alle 'scrollerter' findes recursive .. EFTER knap-gennemløb !!
      { 
        scrollInit(n,kn,fli);
     	}

      if ( n == 0 )          // 0-laget's move-handler  .. behøves ikke i Gecko .. blokerer IE 
      {
           if ( brt ) 
           {  
              m[0][0][0].onmouseleave = smNull;      // IE
//              window.documentElement.attachEvent( 'onmouseup' , smNull )      
           }  
           else    
           { 
                // OBS .. event på 'window' og ikke 'document'
                window.addEventListener( 'mouseup' , smNull , false )                  
           } 
      }

      //vindueMoveInit(n);       // EFTER scrollInit()

      timer24(n);
//      gummidiv(n);          // ved hver download
      psMinHeight(fli);

      // og der blokeres for 'select' på alle lag ( IE )
       if ( brt ) { m[n][0][0].onselectstart = selectEv  }  // IE
       else { m[n][0][0].addEventListener( 'selectstart' , selectEv , false ) } // Gecko

// OBS 



// ------------- control af z-index .. pseudo-capture --------------
      function downLagIe()
      {
          window.event.cancelBubble = true;

          downLag( window.event.srcElement , this.lnr );

          e2();          // .. og derefter den originale event .. hvis nogen
      }
      
      
      function downLagGecko(event)
      {
          event.stopPropagation();           
                    
          downLag( event.target , event.currentTarget.lnr );

//          e3(event);    // .. og derefter den originale event .. hvis nogen
      }
      
      // først her ordnes z-index på laget      
      function downLag( s, n )   // source-element .. lag-element med 'mousedown'
      {          
          // hvis source tilfældigvis var en exit()
          if ( s != null && s.cF && s.cF == 'exit'  )
          {
          
          }
          else  
          { 
              // var der registreret et lag øverst
              if ( n != 0 )
              {
                  if (m[  m[n][1][0]  ][8][0] != null  )
                  {
                      m[  m[n][1][0]  ][8][0].style.zIndex -= 1;
                  }
                  m[n][0][0].style.zIndex += 1;
                  m[  m[n][1][0]  ][8][0] = m[n][0][0];           
              }
          }
      }
      
      
      if ( brt ) { m[n][0][0].onmousedown = downLagIe }  
      // bemærk, at Gecko sættes i NON-CAPTURE mode
      else { m[n][0][0].addEventListener( 'mousedown' , downLagGecko , false ) }

// --------------------------------------------------
      // download-laget lægger sig øverst !
      downLag( kn , n );


	}	           // .. end responseKlar()  .. rk()
}


// -------------------------- psMinHeight(fli) ------------------------------------------------------------
function psMinHeight(fli)   // virker OGSÅ på absolute-appendede downloads .. hvad min-height IKKE gør
{ 
    if ( fli != null && m[fli][0][0].style.minHeight )
    {

        // laget, hvopå der lægges
        var clon = m[fli][0][0].cloneNode(true);
            clon.style.overflow = 'hidden';
            clon.style.visibility = 'hidden';
            clon.style.height = m[fli][0][0].style.minHeight;  // min-height er udgangspunkt              
        window.document.body.appendChild(clon);

//        if ( clon.scrollHeight > parseInt(m[fli][0][0].style.minHeight) )
        m[fli][0][0].style.height = ( clon.scrollHeight ).toString() + 'px';

    	 // og clon fjernes
//       if ( brt ){ clon.removeNode(true) }	   // IE            
    	 window.document.body.removeChild(clon);  // Gecko
  }
}

// -------------------------  gummidiv funktionen -----------------------------------------------------
function gummidiv(n)
{      
      if (n == 0)     // kun første genneløb
      {
           // global 'gummidiv' variabel
			     gummi_div = m[n][0][0];
			     
/*			     
function disable(e) 
{  
     e.preventDefault();
     return false;  
} 
			     if ( UA == 8 ) { gummi_div.parentNode.selectstart = disable }    // IE8 .. <body>
//           if ( UA == 8 ) { gummi_div.parentNode.attachEvent ( 'selectstart' , disable )    }  // IE8 .. <body>
*/
// ------------- default event-handler til gummidiv .. scroll og 'selectstart' -------

           if ( brt ) 
           { gummi_div.onmouseout = smNull }  // IE
           else if ( UA != 0 )    // bare ikke Firefox
           { gummi_div.addEventListener( 'mouseout' , smNull , false ) } // Gecko

/*
           if ( brt ) { gummi_div.ondragstart = dragevent  }  // IE
           else { gummi_div.addEventListener( 'ondragstart' , dragevent , false ) } // Gecko
*/

           if ( brt ) { gummi_div.onselectstart = selectEv  }  // IE
           else { gummi_div.addEventListener( 'selectstart' , selectEv , false ) } // Gecko


           
// ------------------------------------------------------------------------------			     
           m[n][0][0][0] = gummi_div.offsetLeft;      // 0-laget's (mus)koordinater ved opstart     
           m[n][0][0][1] = gummi_div.offsetTop; 

           gummi_div.style.overflow = 'none';
                      
if ( gummi_div.style.height == '100%' )   // 'pseudeo-100%', hvor der korrigeres for padding, border og margin
{

//var tmpheight = document.documentElement.scrollHeight - checkV('pre',gummi_div,'MT','PT','PB','MB');
var tmpheight = document.documentElement.clientHeight - checkV('pre',gummi_div,'MT','BT','PT','PB','BB','MB');
           gummi_div.setAttribute('defheight',tmpheight.toString()+'px');  // default/opstart height
           gummi_div.defheight = tmpheight.toString()+'px';
}
else
{
           gummi_div.setAttribute('defheight',gummi_div.style.height);  // default/opstart height
           gummi_div.defheight = gummi_div.style.height;
}

           gummi_div.setAttribute('prevcrollHeight',gummi_div.scrollHeight);  // default/opstart height
           gummi_div.prevcrollHeight = gummi_div.scrollHeight;                                     
      }
            
      if (gummi_div.className == "gummidiv")                     // ved hver download
			{
/*
// scroll-variable nulstilles ved HVER download
vscrFl = false;
scrDwli = '';
scrNr = '';
*/

           var gummi_clon = gummi_div.cloneNode(true);           // vi tager en kopi af oprindelig .. til check

           gummi_clon.style.visibility = 'hidden';            // .. og vi gider den ikke .. display virker ikke

           gummi_clon.style.height = gummi_div.defheight;     // højde på clon sættes til default
           gummi_div.parentNode.appendChild(gummi_clon);         // clon i DOM
            
  				 if (gummi_div.prevcrollHeight > gummi_clon.scrollHeight)   // der skal formindskes !!
           {              
              window.document.body.scrollTop = 0;                   // vi starter i top                    
           }           

           gummi_div.prevcrollHeight =  gummi_clon.scrollHeight;

           gummi_div.style.height=(gummi_clon.scrollHeight).toString()+'px'; // oprindelig gummi_div 'height' opdateres
/*
// ---------------
           if ( brt ) 
//           { gummi_div.attachEvent( 'onmouseout' , bdyScrollReset ) }  // IE
           { gummi_div.onmouseout = bdySmReset }  // IE
//           { gummi_div.attachEvent( 'onmouseout' , bdySmReset ) }  // IE
           else if ( UA != 0 )    // bare ikke Firefox
//           { gummi_div.addEventListener( 'mouseout' , bdyScrollReset , false ) } // Gecko
           { gummi_div.addEventListener( 'mouseout' , bdySmReset , false ) } // Gecko



//           if ( brt ) { gummi_div.onselectstart = selectEv ) }  // IE
           if ( brt ) { gummi_div.attachEvent( 'onselectstart' , selectEv ) }  // IE
           else { gummi_div.addEventListener( 'selectstart' , selectEv , false ) } // Gecko
// ---------------
*/
        	 // og clon fjernes
           if (brt){gummi_clon.removeNode(true)}					       // IE
        	 else {window.document.body.removeChild(gummi_clon) }  // Gecko            
      }				
}

// ------------------- init funktioner ----------------------------------------------------------------	

	
	function knapInit(n,kid,kn,fli)
	{		
    var t=window.document.getElementById(kid);
		if (t)         
		{						
         t.id = '';
         
         // INDEN vi starter knap-gennemløb .. check for id = 'fileupload' i parent
         if (t.parentNode && t.parentNode != null && t.parentNode.id == 'fileupload')
         {
            t.parentNode.id = '';
            // der var en <input type="file"> .. find current-style .. generer 'inpstr'
            var inpw = ( parseInt( t.style.width ) +  checkV('post',t,'ML','BL','PL','PR','BR','MR' ) ).toString();
 
// -----------------------------------
            // .. og alokeres i DOM (knap)
            var cont = window.document.createElement('DIV');
            cont.innerHTML = '<input type="file" name="file[]" id="file" value="" size="1" class="abs opaque100" style="width:'+inpw+'px; height:100%; left:0px; top:0px;" onmouseover="inpover(this)" onmouseout="inpud(this)" onchange="fileupload(this)" >';                
            var indsinp = t.parentNode.appendChild(cont.firstChild.cloneNode(true));
            cont = null;            
// -----------------------------------
         }
         
         
         // .. og der startes med check af child-elementer på knap .. benyttes af 'childcheck'
         var cn = (brt ? t.children : t.childNodes );   // fang 'underliggende' div's
         
         if ( cn && cn.length != 0 && !( t.title && t.title == 'scrollBar' ) )   
         {                                             
              // temporær variabel til evt. <input> .. default tom
              var inptemp = '';
              var psinner = '';    // allokeres forskelligt i IE og Gecko
              
              // vi løber rækken igennem .. og tildeler 'nclass' .. til brug i 'hover' funktionerne  ( OPERA ?? )
              for (var cnt = 0; cnt < cn.length; cnt++)   
              {
                  // fanger DOM-elementerne .. virker også i IE8         
                  if ( cn[cnt].nodeType == 1 )
//                  if ( cn[cnt].tagName == 'DIV' || cn[cnt].tagName == 'INPUT' )
                  {
                      // gem oprindelig class .. som attribut
                      cn[cnt].setAttribute('nclass',cn[cnt].className); cn[cnt].nclass = cn[cnt].className;
                      
                      // der skal indsættes event-handlers, hvis <input>  og IKKE type=file
                      if ( cn[cnt].tagName == 'INPUT' && cn[cnt].type != 'file' )
                      {
                         inptemp = (t.innerHTML).slice( 0 , (t.innerHTML).lastIndexOf('>')) + 'onmouseover="inpover(this)" onmouseout="inpud(this)" >';
                      }
/*
                      // der skal indsættes event-handlers, hvis <input>  OG type=file
                      if ( cn[cnt].tagName == 'INPUT' && cn[cnt].type == 'file' )
                      {
                         inptemp = (t.innerHTML).slice( 0 , (t.innerHTML).lastIndexOf('>')) + 'onmouseover="inpover(this)" onmouseout="inpud(this)" onchange="fileupload(this)" >';                      
                      }
*/                      
                  }
                  // fang TEXT-elementet hos Gecko .. renset
                  else if ( !brt && cn[cnt].nodeType == 3 )      // IE8 reagerer IKKE på nodeType = 3 !!
                  {
                      psinner = ( cn[cnt].nodeValue  ).replace(/^\s+|\s+$/g, '');                  
                  }
              }
              
              // fang TEXT-elementet hos IE .. renset            // .. men nodeValue LÆSES som innerText hos IE
              if (brt) { psinner = (t.innerText).replace(/^\s+|\s+$/g, ''); }
              
                            
              // 'format' streng .. hjørne div's .. bruges af 'hover' funktionerne .. fjern white-space
              var psbase =  ( (t.innerHTML).slice( 0 , (t.innerHTML).lastIndexOf( (brt ? 'V>' : 'v>') ) +2 ) ).replace(/^\s+|\s+$/g, '');              


              
              t.innerHTML = ( inptemp == '' ? psbase : inptemp.replace(/^\s+|\s+$/g, '') ) + psinner;
//alert('psbase\n'+psbase+'\n\npsinner\n'+psinner+'\n\nintemp\n'+  inptemp + '\n\n'  +t.innerHTML);

//              t.setAttribute('psbase',''); t.psbase = ( t.title && t.title == 'scrollBar' ? '' : psbase );
//              t.setAttribute('psinner','');  t.psinner = ( t.title && t.title == 'scrollBar' ? '' : psinner );


              t.setAttribute('psbase',psbase); t.psbase = psbase;
              t.setAttribute('psinner',psinner);  t.psinner = psinner;
          }
      // .. slut child-check


			t.setAttribute('ETag',''); t.ETag='';			// alle 'knapper' får ETag - default ''

			t.setAttribute('dwli',n); t.dwli=n;								    // attribut-allokering 'the Mozilla way' !!			
			t.setAttribute('nclass',t.className); t.nclass=t.className;		    // attribut-allokering 'the Mozilla way' !!	
			
			t.setAttribute('absX',0); t.absX=0;
			t.setAttribute('absY',0); t.absY=0;

			t.setAttribute('fraEl',null); t.fraEl=null;
//			t.setAttribute('tilEl',null); t.tilEl=null;


// --------- er parentNode en 'buffer' .. eller allerede tagget med 'bufi' ?  ----------------
 
      if ( t.parentNode != null && ( t.parentNode.bufi || t.parentNode.id == 'buffer') ) 
      {
          
          if (t.parentNode.getAttribute('bufi') != null)  // 'buffer' var tagget
          {
              if (t.getAttribute('bufi') == null)         // element IKKE tagget
              {
                  t.setAttribute('bufi',t.parentNode.getAttribute('bufi')); // .. og elementet tagges med buffer-index
                  t.bufi = t.parentNode.getAttribute('bufi');
              }
          }
          else                                            // 'buffer' var IKKE tagget
          {
              var buffl = m[n][25].length;                // find pladsen i [25]
              t.parentNode.id = '';                       // .. så buffer ikke fanges næste gang
              
              t.parentNode.setAttribute('bufi',buffl);    // buffer får buffer-index i [25] som attribut 'bufi'
              t.parentNode.bufi = buffl;

              t.setAttribute('bufi',buffl);               // elementet får buffer-index i [25] som attribut 'bufi'
              t.bufi = buffl;          
          }
                   
          if (t.tagName == 'INPUT')
          {
              m[n][25][ t.bufi ]	= t;                      // input-buffer parkeres i [25] 
          }         

          if (t.tagName != 'INPUT' && t.getAttribute('onclick') )  // 'formaterings' div har IKKE click .. OBS checkes på 'onclick'
          {
              m[n][26][ t.bufi ]	= t;                      // 'GO' div parkeres i [26] 
          }

      }

// -------------------


      if (t.getAttribute('title') != null)       
      {
         t.id = t.title;                                // id erstattes med title
 			   t.removeAttribute('title');										// og vi fjerner 'title' - popper ellers op ved mouseover !
      }
/*      else
      {
         t.id = '';
      }
*/



/*
			var splt=t.innerHTML.indexOf('|');		                        // fanger evt. alternativ text til brug for f.eks. sti
			if (splt!=-1)
			{
				t.setAttribute('alttxt',t.innerHTML.substr(splt+3)); t.alttxt=t.innerHTML.substr(splt+3);
				t.innerHTML=t.innerHTML.substr(0,splt);
			}
*/			

			if (t.onkeydown) 	
			{					

				t.setAttribute('kF',''); t.kF=xnavn(t.onkeydown.toString());		// udtræk af funktionsnavn				
				t.setAttribute('kA',''); t.kA=xarg(t.onkeydown.toString());		// udtræk af argumenter som liste
				t.onkeydown=null;											    // onclick pasificeres
			}										

/*
      if (t.ondragstart)             // ondragstart nullet
      {
				t.setAttribute('drF',''); t.drF = 'return false';		// nullet
        t.ondragstart = null;     
      }

      if (t.draggable)             // ondragstart nullet
      {
				t.setAttribute('draF',''); t.draF = 'false';		// nullet
        t.draggable = null;     
      }
*/

			if (brt && t.onmouseenter) 	
			{					
				t.setAttribute('eF',''); t.eF=xnavn(t.onmouseenter.toString());		// udtræk af funktionsnavn				
				t.setAttribute('eA',''); t.eA = '';		// argument ALTID tom
				t.onmouseenter=null;											    // onclick pasificeres
			}										

			if (brt && t.onmouseleave) 	
			{					
				t.setAttribute('lF',''); t.lF=xnavn(t.onmouseleave.toString());		// udtræk af funktionsnavn				
				t.setAttribute('lA',''); t.lA = '';		// argument ALTID tom
				t.onmouseleave=null;											    // onclick pasificeres
			}										


			if (t.onresize) 	
			{					
				t.setAttribute('resF',''); t.resF=xnavn(t.onresize.toString());		// udtræk af funktionsnavn				
//				t.setAttribute('mA',''); t.mA=xarg(t.onmousemove.toString());		// udtræk af argumenter som liste
				t.setAttribute('resA',''); t.resA = xarg( t.onresize.toString() );		// udtræk af argumenter
				t.onresize=null;											    // onclick pasificeres
			}										



			if (t.onmousemove) 	
			{					
				t.setAttribute('mF',''); t.mF=xnavn(t.onmousemove.toString());		// udtræk af funktionsnavn				
//				t.setAttribute('mA',''); t.mA=xarg(t.onmousemove.toString());		// udtræk af argumenter som liste
				t.setAttribute('mA',''); t.mA = '';		// argument ALTID tom
				t.onmousemove=null;											    // onclick pasificeres
			}										

						
			if (t.onclick) 	
			{					
				t.setAttribute('cF',''); t.cF=xnavn(t.onclick.toString());		// udtræk af funktionsnavn				
				t.setAttribute('cA',''); t.cA=xarg(t.onclick.toString());		// udtræk af argumenter som liste
				t.onclick=null;											    // onclick pasificeres
			}

			if (t.onmousedown) 	
			{					
				t.setAttribute('dF',''); t.dF=xnavn(t.onmousedown.toString());		// udtræk af funktionsnavn				
				t.setAttribute('dA',''); t.dA=xarg(t.onmousedown.toString());		// udtræk af argumenter som liste
				t.onmousedown=null;											    // onclick pasificeres
			}

			
			if (t.onmouseup) 	
			{					
				t.setAttribute('upF',''); t.upF=xnavn(t.onmouseup.toString());		// udtræk af funktionsnavn				
				t.setAttribute('upA',''); t.upA=xarg(t.onmouseup.toString());		// udtræk af argumenter som liste
				t.onmouseup=null;											    // onclick pasificeres
			}


				t.setAttribute('oF',''); t.oF='resT('+n.toString()+');';			// bliver altid sat i mouseover .. fødes med resT()
				t.setAttribute('oA',''); t.oA='';

				t.setAttribute('uA',''); t.uA='';
				t.setAttribute('uF',''); t.uF='setT('+n.toString()+');';			// knappen 'født' MED setT(lag)
                				



			if (t.onmouseover)
			{												
				t.oA=xarg(t.onmouseover.toString());							// udtræk af argumenter som liste
				t.oF+=xnavn(t.onmouseover.toString());						// udtræk af funktionsnavn .. +timer
				t.onmouseover=null;							                    // onclick pasificeres				
			}
			else
			{
				t.oA='';
				t.oF+='on';										                // hvis ej 'drop' eller andet .. så 'on'			
			}
			

			if (t.onmouseout)
			{								
//				t.uA=xarg(t.onmouseout.toString());								// udtræk af argumenter som liste
				t.uA += xarg(t.onmouseout.toString());								// udtræk af argumenter som liste
				t.uF += xnavn(t.onmouseout.toString());						// udtræk af funktionsnavn
				t.onmouseout = null;							                    // onclick pasificeres				
			}
			else if ( !(t.oF).match(/drop/) )
			{
				t.uA = '';
				t.uF += 'off';										            // hvis ej noget andet .. så 'off'			
			}


// -------- her starter registrering af knapfunktioner  -------------------------

function checkRadioBar(s)                             // s er elementet, hvorfra søgning på lag starter 
{       
    var bar = opadID( s, 'radioBar' , m[ s.dwli ][0][0] );
    
    if ( bar != null)                                 // var der nogen .. registrering i 27
    {                

        var m27len = ( m[ s.dwli ][27] ).length;      // m27 længde .. antal af registrerede radioBar's
        
        if (  bar.getAttribute('radio',2) == null  )    // der var INGEN attribut på selve radioBar'en
        {                                      
            bar.setAttribute('radio',m27len); bar.radio = m27len;  // bar'en får 'radio' attribut
            m[ s.dwli ][27][ m27len ] = new Array();   // allokerer ny array til knapper                    
        }
        
        s.setAttribute( 'radio', (bar.radio).toString() ); // 'radio' attributerne på bar og knap synkroniseres
        s.radio = (bar.radio).toString();

        var m27lenU = m[ s.dwli ][27][ bar.radio ].length;  // under array længde
        
        m[ s.dwli ][27][ bar.radio ][ m27lenU ]  = s;     // hvor s parkeres
        
        s.setAttribute( 'radioK' , m27lenU );            // .. og følgelig plads-ref til under-array
        s.radioK = m27lenU;        
    }
}

				if ( t.dF == 'check' || t.cF == 'check' )       // check .. (næsten) altid på 'mousedown'
				{
           var def = ( t.dF && t.dF == 'check' ? t.dA : t.cA);     // default .. check(on), check(off)
           
           t.setAttribute( 'check' , def ); t.check = def;
           
           if ( def == 'on' )
           {
             childCheck(t,'_a');                       // 'tænd' knap, hvis default 'on'
           }
           checkRadioBar(t);
        }

// ---- registrering og indexereing af knapper med 'serverPOP' i m[28]... 'conditional' select --------------

        if ( t.cF == 'serverPOP' || t.cF == 'hentHTML' )             
        {
 
            var slen = m[t.dwli][28].length;

//            m[t.dwli][28][slen] = new Array( t.id , t );  // oprindelig ID i [0] .. reference til selve knap
            m[t.dwli][28][slen] = new Array();
            m[t.dwli][28][slen][0] = t.id;
            m[t.dwli][28][slen][1] = t;
//alert('rk() .. '+t.id+'\n\n'+m[t.dwli][28][slen][1].cA);
        }
// ---- registrering af evt. 'wan' (wanna-be-vindue) knapper ----------




// --------------------

 
			if ( t.parentNode != null && ((t.parentNode).id).match('timer') != null )						// ligger knapperne på en timer-div ??
			{
				if (m[n][24][0]==null)											// registrerer antal mili sekunder .. første gang !
				{
					m[n][24][0]=new Array;
					m[n][24][0][0]='';                                         // reserver plads til timer
          m[n][24][0][1]=parseInt(   ((t.parentNode).id).slice(5)    );	// .. antal ms, som parkeres i m[n][24][1]
          m[n][24][0][2]=-1;                                         // reserver plads til aktiv knap Nr          
//          m[n][24][0][3]=new Array;                                   
          m[n][24][0][3]=false;       // timer24 flag

          m[n][24][0][4]=new Array;       // prevSlideFlag .. medfører denne knap en 'tændt' slide ?
          m[n][24][0][5]=new Array;
				}
				m[n][24][0][5][m[n][24][0][5].length]=t;			// parker knappperne i [5] 
			}

if ( t.cF && t.cF != 'select' )
{
    m[n][3][ m[n][3].length ] = t;   // parkeret i knaparray .. [0] er ALTID 'dummeLukker'
}




// -------- her starter registrering af opstart-knapper og skabeloner (CDSO'er) -------------------------
//alert('er i rk() .. FØR dropInit()');

      dropInit(t);
//alert('er i rk() .. EFTER dropInit()');
 
			if ( kid == 'start' || kid == 'pop' )
			{
  				switch(t.cF)
  				{
//  					case 'CSSkolonne':{CSSkolonne(t);break;};					// udvikler en 'kolonne' .. egentlig en class-repeater på en div
  					case 'hentHTML':{hentHTML(t);break;}			            // det var en opstart i 'container'-tilstand .. derfor i [0]
  					case 'serverPOP':{serverPOP(t);break;}                          // hent noget HTML som 'selv-lukker' (vindue)
//  				  case 'select':{select(t);break;}
          }
			}
		
//alert('er i rk() .. EFTER dropInit() og lige FØR nyt gennemløb');
			knapInit(n,kid,kn,fli);			// recursive, idet id-attributten fjern i start af procedure .. så den ikke fanges ved næste gennemløb !
		}
		else								                                    // allersidste 'opstart' ER færdig , OBS eb 
		{      
      if (kid=='start')		                                            // VI ER FÆRDIGE
			{
				lboff();				
			}			
		}	                                                                    // .. end knapInit()

// -------------------------------- hjælpefunktioner til knapInit() -----------------------------------		

}	                                                     // HUSK .. afslut på knapInit()!!
// -----------------------------------------------------------------------------------------------------
		

	
	function lukm(s,l)							      // luk undermenu (alle de åbne drop'er) .. s er TIL-elementet
	{
		var lag = l;					              // da lukm() kan operere over flere lag
		var flag = true;						        // how to return .. default 'true'

				if ( s != null )   
				{
					var len = m[lag][5].length;		// tDrop-array'ens længde  = antal tændte drop'er
          // til-niveau på evt. drop
//					var tn = (((s.parentNode!=null)&&(s.parentNode.niv!=null)&&(s.parentNode.niv!='')) ? parseInt(s.parentNode.niv):0);

// -----------------------------------------------
          // søg på 'forældre' .. ellers null
          var tn = ( (  s.parentNode != null  && s.parentNode.niv != null &&  s.parentNode.niv != '' ) ?  parseInt(s.parentNode.niv) : null );

          // .. hvis 'forældre' = null .. søg hos 'bedsteforældre' .. ellers null
          if ( tn == null && s.parentNode != null )   // .. og selfølgelig KUN når første parent
          {
              tn = (  s.parentNode.parentNode != null  && s.parentNode.parentNode.niv != null &&  s.parentNode.parentNode.niv != ''  ?  parseInt(s.parentNode.parentNode.niv) : null );
          }
          
          tn = ( tn != null ? tn : 0 );
// -----------------------------------------------
 
 if (s.cF && (s.cF).match(/select/) && s.evtyp == 'click'){tn--;}					

          var lf = len - tn;					  // forskel mellem antal (længde af array) tændte drop'er og TIL-niveau	


					if (lf > 0)						        // der skal lukkes drop'er  
					{
						// er TIL-knap registreret i tRoot ? .. havnet på ROOT eller HEAD .. 
            if ( s == m[lag][6][tn] )
//            if ( s == m[lag][6][tn] && !(s.cF && (s.cF).match(/drop/) && (s.className).match(/_a/) && s.evtyp == 'click' ) )	
						{               						   
    					 flag = false;				  // .. og tænder dem følgelig ikke
               if ( !( s.cF && (s.cF).match(/drop/) ) )
               {
    							tn++;                 // til-niveau sættes 1 op før kald til lukDrop()
    					 }

						}
                        
						lukDrop();
					}

                      
				}
				else			                      // giver ingen syncron-problemer ????
				{
					flag = false;
				}
				
				return flag;
		
	// ----------------------------- hjælpe-funktion til lukm() -------------------------------------

								
							function lukDrop()									// hjælpe funktion til lukm()
							{
  								var idx = len - 1;									// .. bemærk offset
  
  								for (var i = idx; i >= tn; i--)     // til og med til-niveau
  								{
                            // luk IKKE drop, når rod HAR click-drop .. default
                      if ( ( !( m[lag][6][i].cF  && (m[lag][6][i].cF).match(/drop/)   )  
                            &&                  
                            // ej heller, hvis click PÅ mouseover-drop rod
                            !( m[lag][6][i] == s &&  s.oF  && (s.oF).match(/drop/) && s.evtyp == 'click' )  )
                            ||
                            // men luk hvis der aktiveres en ANDEN click-drop (kun en drop AF SAMME TYPE på sendefladen)
                            ( m[lag][6][i] != s && m[lag][6][i].cF  && (m[lag][6][i].cF).match(/drop/) &&  
                            // .. og hvis der click'es på AKTIV rod med click-drop
                               s.cF && (s.cF).match(/drop/) && s.evtyp == 'click'  )
                            ||
                            // eller, hvis click på AKTIV click-drop
                            ( m[lag][6][i] == s && s.cF && (s.cF).match(/drop/) && s.evtyp == 'click' )
                            ||
                            (s.cF && (s.cF).match(/select/) && s.evtyp == 'click')
                         )   
  
                         {
                            m[lag][5][i].style.visibility = 'hidden';
                                                        
                            if ( m[lag][6][i].cF  && (m[lag][6][i].cF).match(/drop/))   // click-drop må gerne være aktiv
                            {
//if (s.cF && (s.cF).match(/select/) && s.evtyp == 'click') {alert('luk CLICK  '+m[lag][6][i].psbase+'\n\n'+m[lag][6][i].psinner);}
//                                m[lag][6][i].className = m[lag][6][i].nclass;   // .. resten er sat i select()
                                childCheck(m[lag][6][i],'');   // .. vi er stadig PÅ knappen .. derfor '_o'
                            }
                            else   
                            {
                                off(m[lag][6][i]);
//alert(m[lag][6][i].id);
                            }    
                            
                            
          								  m[lag][5].length = i;
          									m[lag][6].length = i;  
                         }
  							  }			
               }
	// ------------------------------------------------------------------------------------------------		
	}	                                                                        // <-- husk	afslutning på lukm() !!


	function xnavn(s)			                    // udtræk af functionsnavn
	{
        var ts=s.slice(s.indexOf('{')+1,s.lastIndexOf('(')).replace(/\x20/g,'');
        ts=ts.replace(/\n/g,'');
        return ts;
//alert(ts);
	}
		

	function xarg(s)			                    // udtræk af functionens argumenter .. returnerer som csv, eks. url,10,50
	{
//alert('xarg IN .. '+s);
		var arg=s.slice(s.lastIndexOf('(')+1,s.lastIndexOf(')')).replace(/\x20/g,'');    // fjern whitespace's
        arg=arg.replace(/\n/g,'');
//alert('xarg UD .. '+arg);
        return arg;
	}


		function dropInit(s)		                                            //  .. drop på 'mouseover' eller 'click'
		{			
			if ((s.oF).match(/drop/) || (s.cF && (s.cF).match(/drop/)))           // både over og click registreres
			{
		    var a=((s.oF).match(/drop/)  ? (s.oA).split(',') : (s.cA).split(','));		 // udtræk argumenter til array

				var dc=window.document.getElementById(a[0]);

				if (dc)													        // .. hvis nogen
				{                    
/*            if (dc.title)               // er denne drop-div titlet som 'scrollVindue'
            {
                dc.id = dc.title;     // swap .. droppen er registreret i [4] .. 'scrollVindue' til scrollInit()
                dc.removeAttribute('title');
            }
            else
            {
               dc.id = '';
            }
*/


//					dc.removeAttribute('id');		 //  .. og drop-id fjernes .. og det gør den så ikke .. genbrug                    
			        dc.setAttribute('oF',''); dc.oF='resT('+(s.dwli).toString()+');';	// bliver altid sat i mouseover .. fødes med resT()
			        dc.setAttribute('oA','');
			        dc.setAttribute('uF',''); dc.uF='setT('+(s.dwli).toString()+');';	//  'født' med setT(lag)	
			        dc.setAttribute('uA','');
					dc.setAttribute('niv',''); dc.niv='';				        // 'niv' sættes 'online' - bemærk ej NaN !!!
												
					var drl=m[s.dwli][4].length;
					s.setAttribute('dri',drl); s.dri=drl;			    // knappen får ref til dropliste via attribut 'dri'
					m[s.dwli][4][drl]=dc;									        // drop i drop-liste [4]
				}
			}
		}

 
	function drop(s)
	{
		var lag = s.dwli;							                            // event fanger aktive lag ved click
//		var a=((s.oF).match(/drop/)  ? (s.oA).split(',') : (s.cA).split(','));		 // udtræk argumenter til array

		if (lukm(s,lag))		                    // lukker drop'er ved mouseover(enter), drop'en aktiveres/tændes kun, når lukm() returnerer 'true'
		{		
		  var a=((s.oF).match(/drop/)  ? (s.oA).split(',') : (s.cA).split(','));		 // udtræk argumenter til array
			var d=m[lag][4][s.dri];					                            // hent drop i array		
			var dl=m[lag][5].length;				                            // længde af tDrop

			var sar=lagkoord(s,s.dwli);                              // droppen koordinater sættes dynamisk
//alert(sar[0]+'\n\n'+sar[1]);
					
			d.style.left=(parseInt(a[1])+sar[0]).toString()+'px';
			d.style.top=(parseInt(a[2])+sar[1]).toString()+'px';
//alert('er i drop .. lag: '+lag+'\n\n'+sar[0]+'\n\n'+sar[1]);
			m[lag][5][dl]=d;						                            // parkeres i m .. tændte drop'er ..  efter at længde er beregnet!
			d.niv=dl+1;								                            // drop'ens niveau sættes .. array-index +1
			d.style.zIndex=+30;								                    // dropen sættes øverst - dynamisk !

			d.style.visibility = 'visible';			                            // .. og gøres synlig !	
//			if (s.className.indexOf('_a')==-1) { s.className=s.nclass+'_o' };	// knappen tændes .. OBS ej on() !!
			if (s.className.indexOf('_a')==-1) { childCheck(s,'_o'); };	// knappen tændes .. OBS ej on() !!
      			
			if (s.cF && s.cF == 'drop')		                                    // hvis 'drop' fra click
			{
//        akt(s);							                                //  .. knap aktiv
         childCheck(s,'_a');
			}			
			m[lag][6][dl]=s;						                            // .. og registreres i tRoot
		}
		
/*		else    // check om vi står på en click-drop, der ER aktiveret .. luk
		{
      if (s.cF && (s.cF).match(/drop/) && (s.className).match(/_a/))    // det var en drop fra click og denne er aktiv
      {
         var hertil = m[lag][4][s.dri].niv;
         s.className = s.nclass;                                // luk knap
         m[lag][4][s.dri].style.visibility = 'hidden';       // .. og dertil hørende drop
         m[lag][5].length = hertil-1;
         m[lag][6].length = hertil-1;
      }    
    }      */
    
	}
	
// ----------------- bemærk, at følgende funktioner checker om knap er AKTIV !-----------------	


	function on(s)						            // tænd knap
	{		
		if (lukm(s,s.dwli))
		{
			// knap EJ aktiv og EJ toggle (check)
      if ( s.className.indexOf('_a') == -1 && !s.check ) 
			{
         childCheck(s,'_o');
			}
			// toggle-knap
      else if ( s.check && ( s.evtyp == 'click' || s.evtyp == 'mousedown' || s.evtyp == 'mouseup' || s.evtyp == 'keydown' )  )
			{			   
         // er toggle-knap aktiv .. og der skiftes forbi '_o' .. og direkte til nclass
         if ( (s.className).match(/_a/) )
         {
            childCheck(s,'');         
         }
         // toggle-knap EJ aktiv .. og der skiftes forbi '_o' .. og direkte til '_a'
         else
         {
            childCheck(s,'_a');         
         }      
      }
		}
	}


	function off(s)								    // sluk knap
	{			
		if ( s.className.indexOf('_a') == -1  )		    // .. altså hvis knap EJ 
		{
//			s.className=s.nclass;
         childCheck(s,'');
		}
	}

	
	function akt(s)						            // knap aktiv .. dvs. blokerer for on() og off()
	{
//		s.className=s.nclass+'_a';
//		if (!s.bufi && !s.check)		    // .. altså hvis knap EJ 'bufi' eller 'check'
		{
         childCheck(s,'_a');
    }
	}
	
	



		function select(s)													
		{

		    if (s.className.indexOf('_a')==-1)		                    // .. altså hvis knap EJ aktiv
		    {
            var kb,flag,j;                                 // drop'ens kaldeknap
            var stopfl = true;
            if ( ( s.parentNode.niv && s.parentNode.niv != null )      // select-knap ligger på drop
                 ||
                 ( s.parentNode.parentNode.niv && s.parentNode.parentNode.niv != null )
               )
            {

                kb = m[s.dwli][6][0];     // select() .. ALTID rod-0 !

                flag = true;
            }
            else                          // select-knap ligger på et lag, hentet af kb [serverPOP()]
            {
                kb = m[m[s.dwli][1][0]][9][m[s.dwli][2][0]];     // 'knap bagved' på foregående lag
                flag = false;
                // og select-knappen lag gøre usynligt FØR sletning .. ellers blink
                // .. virker IKKE med drop !!!!!
                m[s.dwli][0][0].style.visibility = 'hidden';

            }
            
            // byt præferencer .. men check om kb ligger i en 'buffer' .. combo



            childCheck( kb , '' );      // og sluk 'rod' knappen FØR tildeling af variable .. blinker
            if ( !kb.bufi )
            {
                kb.id = s.id;
                
                if (kb.tagName == 'INPUT')        // modtager er input
                {
                    kb.name = (s.tagName == 'INPUT' ? s.name : '');  // sender som input .. (kun) ved serverPOP()
                    kb.value = (s.tagName == 'INPUT' ? s.value : getInnerHtml(s));
                }                               
                else                             // modtager er andet element .. evt. i 'buffer'
                {

                    kb.psinner = getInnerHtml(s);
                    kb.innerHTML = ( kb.psbase ? kb.psbase : '' ) + kb.psinner;
  
//alert(kb.className);
                }            
            }
            else    // .. byt præferencer med buffer .. combo
            {
                var buf = m[kb.dwli][25][kb.bufi];  // bufferen hentet .. som ALTID er <input>
                buf.id = s.id;
                buf.name = (s.tagName == 'INPUT' ? s.name : '');  // sender som input .. (kun) ved serverPOP()
                buf.value = (s.tagName == 'INPUT' ? s.value : getInnerHtml(s));                
            }
            

// -----------------  select( [ søgteId | nyId | default | (onclick) url ], .. )
// hvis url 'tom' .. 3 arg .. GetById( lag, Id ) .. og udskift præferencer
// hvis url .. 4 arg .. udskift 'rod' .. søg efter url i m28, hvor alle knapper med hentHTML() og serverPOP() er reg.

// --------- hjælper -----                
                function idarrcheck( kb , idarr)
                {

                    if (idarr.length > 3)         // der var et 4 argument
                    {      
                        var tfl = true;
        
                        // søg efter knap på 'bagved' lag, og som havde oprindelig id = idarr[0] i m[28]
                        for ( var i = 0; i < ( m[kb.dwli][28].length) && tfl; i++ )
                        {
                            if ( m[kb.dwli][28][i][0] == idarr[0] )         // den var der
                            {
                                tlf = false;                                // tælleren og loop'en stoppes
        
                                if ( m[kb.dwli][28][i][1].cA != idarr[1] )  // reference til element i idarr[1]
                                {
                                    m[kb.dwli][28][i][1].cA = idarr[1];
                                    // og knap 'sættes' eller 'resettes'
                                    // var der et 3' argument med ID 
                                    if ( idarr[2] ) { m[kb.dwli][28][i][1].id = idarr[2]; }
        
                                    m[kb.dwli][28][i][1].psinner = ( idarr[3] ? idarr[3] : '' );
                                    
                                    m[kb.dwli][28][i][1].innerHTML = m[kb.dwli][28][i][1].psbase + m[kb.dwli][28][i][1].psinner;
                                } 
                            }   
                        }
                    }
                    else             // der var 3 argumenter .. og det vi søger behøver IKKE at være knap
                    {
                        var sel = GetById( m[kb.dwli][0][0] , idarr[0] );    // fang det (søgte) elementet by Id

                        if ( sel != null)
                        {
                           sel.id = idarr[1];       // skift id
                           if ( sel.psinner )  // det var en knap
                           {

                               sel.psinner = ( idarr[2] ? idarr[2] : '' );
                               // converter
                               sel.psinner = (sel.psinner).substring(1,sel.psinner.length-1);
                               sel.innerHTML = sel.psbase + sel.psinner;

                           }
                           else
                           {

                               if ( sel.tagName == 'INPUT')
                               {
                                  
                                  sel.value = unescape( idarr[2] ? idarr[2] : '' );
                                  // converter
                                  sel.value = (sel.value).substring(1,sel.value.length-1);

                               }
                               else
                               {
                                  sel.innerHTML = ( idarr[2] ? idarr[2] : '' );
                                  // converter
                                  sel.innerHTML = (sel.innerHTML).substring(1,sel.innerHTML.length-1);
                               }
                           }
                        }
                    }
                 }                 
// ----------------                 


            if ( s.cA != '' )   // har select-knappen 'conditional' argument
            {

//alert(escape(s.cA));
                var idarr = new Array();                           // id-array
                
                var argarr = (s.cA).split(']');    // argument-array select( [][]..[] )

                if ( argarr.length - 1 > 0 )       // der VAR flere grupper[] af argumenter .. OBS offset
                {
                    for ( var q = 0; q < argarr.length - 1; q++)   // OBS offset 
                    {
                        argarr[q] = argarr[q].substring(1);     // rens for '['
                        

                        
//                s.cA = (s.cA).replace('"','');                                                                     
                        idarr = (argarr[q]).split('|');          

/*
                        for (var pq = 0; pq < idarr.length; pq++)   // INDHOLD af array to string !!
                        {
                            idarr[pq] = (idarr[pq]).toString();
                        }
*/

                        idarrcheck(kb,idarr);
                        
                                                
                    }
                }
                else                              // der er kun EN gruppe af argumenter .. minus []
                {
                    idarr = (s.cA).split('|');                
                    idarrcheck(kb,idarr);
                }
                
            }   // slut på if (cA)



// -----------------            
                                   
            if (flag)             // drop blev aktiveret af drop() .. lukmenu og knap
            {
                lukm(s,s.dwli);   // .. og luk i bund
            }
            else                  // drop blev aktiveret af hentHTML() eller serverPOP()
            {
                // og select-knappen lag gøre usynligt FØR sletning .. ellers blink
//                m[s.dwli][0][0].style.visibility = 'hidden';
                
                if ( kb.cF == 'hentHTML' )        // .. der lukkes via 'dummeLukker' og 'dummeDiv'
                {
                    kb = GetById( m[kb.dwli][0][0] , 'dummeLukker');

//alert(kb.cA);
                    eb++;
                    load(kb.cA,kb.dwli,0,kb,'');  // .. som downloades her !                                      
                }            
                else if ( kb.cF == 'serverPOP' )  // .. der lukkes med exit()
                {
                    exit(s);    // knappen ligger på lag, der skal lukkes .. hvorved evt. timer24 nustilles                
                    lukm(m[kb.dwli][0][0],kb.dwli);     // .. og luk i bund
                }

            }
            
            
		    }		    
		}


// -------------------------- goBack funktioner --------------------------------------------------

	function exit(s)
	{
		var lag = s.dwli;							                // event fanger aktive lag ved click
		var h=m[lag][1][0];											// index til bavedliggende lag[1] ('hinter')
		var bk=m[lag][2][0];										// index til knap[2], der kaldte laget
//alert('er i exit(): '+lag);
    rydoplag(m[lag][0][0].fli,m[lag][0][0].flslt); // der rydes op på laget vi er ved at lukke
    
//		.className=m[h][9][bk].nclass;					// knap	tilbage til normal	
    childCheck(m[h][9][bk],'');
	}




function sentinelSubmit(s,ft)   // basis-function for .. sentinel, submit  og RSsentinel
{
    var kb;                     // refererer til kaldeknap
    var str = '';

    var ea = eventInfo(s);      // array med præferencer til aktuel event
            
    if (ea != '')               // hvis event
    { 
        if ( ea[2] == '' || ea[2] == 'dummeLukker' )         
        {
            kb = m[m[s.dwli][1][0]][9][m[s.dwli][2][0]];      // 'knap bagved' på foregående lag
            
            if ( ea[2] == 'dummeLukker' )  // det var et kald til 'dummelukker' .. der søges lokalt
            {
                kb = GetById( m[kb.dwli][0][0] , 'dummeLukker' );  
            }
        }
        else                    // ref. by AJid
        {
          kb = window.document.getElementById(ea[2]);       // den 'egentlige' download-knap
        }
        str = reqstr(kb,s);     // vi fanger hovedknapperne

    //--------------
        if (ft == 'submit')
        {   
          var a = new Array('','','');          
          // til-knappen (kb med ETag) føres med .. ETag benyttes af md5 beregningerne foretaget i travers()
          travers(a,m[s.dwli][0][0],kb);   // returnerer alle <input> og title="input", dog ej dem på drop
          str += '&Fid='+a[0] + '&Fname='+a[1] + '&Fvalue='+a[2];       // Form eller Felt elementer, der er læst af submit()

        }

    //--------------        

    }
    else     // .. kb ER fundet og AKTIVERET af RSsentinel() .. eller aktiveret af select()
    {

        kb = s;        
        str += reqstr(kb,'');
    }                      
    
    if (kb.cF == 'hentHTML')
    {
      eb++;
      kb.cA = ((kb.cA).split(','))[0];  // hvis flere ',' separerede argumenter i kb.cA .. brug kun første [0]
//alert(ea[0]+'\n\n'+ea[1]+'\n\n'+ea[2]+'\n\n'+kb.cA);
      load(kb.cA,kb.dwli,0,kb,str);     // .. og vi reloader knappen 'kb'
    }
    else if (kb.cF == 'serverPOP')
    {
      eb++;      
      kb.cA = ((kb.cA).split(','))[0];  // hvis flere ',' separerede argumenter i kb.cA .. brug kun første [0]
      load(kb.cA,kb.dwli,m[kb.dwli][9].length,kb,str);   // .. og vi reloader knappen 'kb'    
    }
}


function sentinel(s)
{
  sentinelSubmit(s,'sentinel');
}

function submit(s)
{
  sentinelSubmit(s,'submit');
}

function RSsentinel(sid)                       // .. den der bliver sendt tilbage .. og aktiver i iFrame
{
    iFrameAktiv = false;

//alert('RSsentinel\n\n'+sid);
    var kb = window.document.getElementById(sid);   // fang elementet på det rigtige lag
    sentinelSubmit(kb,'sentinel');             // præferencer fra kaldeknap sendes med via global var 'pref'
}


// foretager 'rigtig' submit ..   
function formSubmit(s)    // er ALDRIG <input> .. ellers kunne oprindelig benyttes !
{    
    var postForm = m[s.dwli][0][0];    // en 'rigtig' form er et <FORM> element .. OG har sit eget lag !!
    
    iFrameAktiv = true;
    var a = new Array('','','');    
    travers(a,m[s.dwli][0][0],s);    

// her sættes GLOBAL 'pref' .. som først sendes med næste kald  .. bemærk formatet, da den skal flettes 
//    pref = s.dwli + '|' + s.ETag + '|' + urlencode(s.id) + '||' + s.psinner + '|' + '&Fid='+a[0] + '&Fname='+a[1] + '&Fvalue='+a[2]; 

    // GET-parametre med POST'en
    postForm.action += reqstr(s,'') + '&Fid='+ a[0] + '&Fname=' + a[1] + '&Fvalue=' + a[2];
//alert(postForm.action);
    eval( 'document.' + postForm.name +'.submit();' );     // fanger form ved 'name'
}



function opdaterServer(s)    // s er ALDRIG input .. giver ingen mening .. se kombiKnap .. og har INGEN indflydelse på kaldeknap
{
   // (opdater) knappens præferencer .. basis streng
   var str = '?session='+Ssession+'&UA='+UA+'&dwli='+s.dwli+'&ETag='+s.ETag+'&AJid='+urlencode(s.id);   
   var ea = eventInfo(s);    // array med præferencer til aktuel event
// bemærk 'click' på vindueMove
   if ( (ea[0] == 'click' && s.mF && s.mF == 'wanMove') // function aktiveret af mouseUP på en vindue-move-knap
      ||
      ( (ea[0] == 'mouseup' || ea[0] == 'mousedown') && s.cF && s.cF == 'exit')  
      ||
      ( (ea[0] == 'mouseup' || ea[0] == 'mousedown')  && s.cF && s.cF == 'wanMin')      
      ||
      ( (ea[0] == 'mouseup' || ea[0] == 'mousedown')  && s.cF && s.cF == 'wanMax')      

      )
   {

       s.mflag = false;   // stopper move
       
       var lag = m[s.dwli][0][0];

         // parker AKTUEL vindue info .. 6 første parametre .. sendes med kald som 'vindueInfo'
         lag[0] = parseInt(getStyle(lag,'left'));
         lag[1] = parseInt(getStyle(lag,'top'));
         lag[2] = parseInt(getStyle(lag,'width'));       
         lag[3] = parseInt(getStyle(lag,'height'));       
         lag[4] = parseInt(getStyle(lag,'z-index'));
         
         lag[5] = parseInt(getStyle(m[s.dwli][21][1],'top'));   // aktuel scroll-position
//alert('z-index .. '+lag[4]);         
//         lag[6] = m[s.dwli][21][20];                            // hvor stor VAR scrollBar ?
         // brøk af 'scrbH' fra top' .. eller hvor var scrollerten 
//         lag[6] = ( parseInt(getStyle(m[s.dwli][21][1],'top')) / m[s.dwli][21][20] ).toFixed(3);
   
       str += '&vindueInfo=' + lag[0] +'|'+ lag[1] +'|'+ lag[2] +'|'+ lag[3] +'|'+ lag[4] +'|'+ lag[5] +'|';
//alert(str)
   }
   else if ( ( ea[0] == 'mousedown' && s.check ) 
             ||
             ( ea[0] == 'click' && s.check )
             ||
             ( ea[0] == 'mouseup' && s.check )
           )
           {
               str += '&value=' + s.getAttribute('check',2);
           }
/*
   //  .. eller det er en 'opdater' på en 'form' .. - fileupload, derfor ALTID via 'submit()'
   else
   {
      var a = new Array('','','');          
      travers(a,m[s.dwli][0][0],s);   // returnerer alle <input> og title="input", dog ej dem på drop

      if (a != null)                            // der VAR input's
      {
          str += '&Fid='+a[0] + '&Fname='+a[1] + '&Fvalue='+a[2];   // Form eller Felt elementer, der skal sendes med      
      }   
   }
   
*/

   eb++;
   load(ea[2],s.dwli,null,s,str);
}


// -------------------------------- goForward funktioner ------------------------------------------


/*
	function serverPOP(s)					                            //  'Selv-Lukkende-Vindue'
	{
		if (s.className.indexOf('_a') == -1 || s.bufi)		  // .. altså hvis knap EJ aktiv .. eller har 'bufi'
		{
			var a = ( s.cA ? s.cA : s.kA ).split(',');       // reagerer også på keydown
//			var a = (s.cA).split(',');
			var str;
			
			if (a.length == 3)                                     // hvis 3 argumenter .. ellers 1
			{
          s.setAttribute('offsL',a[1]); s.offsL = a[1];     // offset føres med op til load()
          s.setAttribute('offsT',a[2]); s.offsT = a[2];
      }
                        
      eb++;						                            // bloker mus-handlers				
			load(a[0],s.dwli,m[s.dwli][9].length,s,reqstr(s,''));				
		}
	}
	

	function hentHTML(s)				                            // .. hent html i 'container'-tilstand
	{
		if (s.className.indexOf('_a') == -1 || s.bufi)		    // .. altså hvis knap EJ aktiv .. eller har 'bufi'
		{            
			var a = ( s.cA ? s.cA : s.kA ).split(',');       // reagerer også på keydown
//			var a = (s.cA).split(',');
			var str;
			
			if (a.length == 3)                                     // hvis 3 argumenter .. ellers 1
			{
          s.setAttribute('offsL',a[1]); s.offsL = a[1];     // offset føres med op til load()
          s.setAttribute('offsT',a[2]); s.offsT = a[2];
      }


			eb++;						                            // bloker mus-handlers				
//			load(( s.cA ? s.cA : s.kA ),s.dwli,0,s,reqstr(s,''));    // reagerer også på keydown
			load(a[0],s.dwli,m[s.dwli][9].length,s,reqstr(s,''));
		}
	}
*/	
  
	
  
  function hentHTML(s)					                            
	{
	   downlBasis(s,0);
  }


	function serverPOP(s)					                            //  'Selv-Lukkende-Vindue'
	{
	   downlBasis(s,1);
  }


              function conHTML(s)					                            
            	{
            	   downlBasis(s,0);
              }

              function wanHTML(s)					                            
            	{
            	   downlBasis(s,1);
              }

              function conDSO(s)					                            
            	{
            	   downlBasis(s,0);
              }

              function wanDSO(s)					                            
            	{
            	   downlBasis(s,0);
              }



  
  function downlBasis(s,n)
  {
		if (s.className.indexOf('_a') == -1 || s.bufi)		    // .. altså hvis knap EJ aktiv .. eller har 'bufi'
		{            
//s.className += '_a';        // hurtig blokering ??
			var a = ( s.cA ? s.cA : s.kA ).split(',');       // reagerer også på keydown

			var str;
			
			if (a.length == 3)                                     // hvis 3 argumenter .. ellers 1
			{
          s.setAttribute('offsL',a[1]); s.offsL = a[1];     // offset føres med op til load()
          s.setAttribute('offsT',a[2]); s.offsT = a[2];
      }

			eb++;						                            // bloker mus-handlers				
			
			if ( n == 0)
      {
          load(a[0],s.dwli,0,s,reqstr(s,''));      // hentHTML
      }
      else                                         // serverPOP
      {
			     load(a[0],s.dwli,m[s.dwli][9].length,s,reqstr(s,''));
      }
    }
  }


	function init()
	{
		var a = init.arguments;
    Ssession=a[0];				// her registreres session-id . eller global variabel, der sendes til server ved hvert kald $GET[0] / $POST[0] / header[session]
		_l=0; eb=1;			                        // public variable sættes under init()
		
		if (a.length > 1)
    {
      cms = true;
      load('/includes/javascript/Ajax/AJindex.asp',null,0,null,'');   // opstart-side til ajax fra CMS ... som ALTID ligger i rod !
    }
    else
    {
      cms = false;
		  load('AJindex.php',null,0,null,'');      // opstart-side til ajax er 'ajax.php' ... som ALTID ligger i rod !
    }
	}
  
  
//---------------------- event handler system ----------------------------------------------
/*
function e1(s)			// her registreres 'laget', hvorpå event fyres .. og global variabel _l sættes ! - denne funct affyres først !
{
//	_l=parseInt(s.id);							    // her sættes _l i IE
  _l = s.lnr;
}
*/

function e2()
{
  var srcEl=window.event.srcElement;				        // registrer lige source-elementet !
  _l = this.lnr;

	srcEl.evtyp = window.event.type;			                // .. og event type
	srcEl.frael = window.event.fromElement;
	srcEl.tilel = window.event.toElement;
	srcEl.absX = window.event.clientX;
	srcEl.absY = window.event.clientY;

  window.event.cancelBubble = true; 


  if (srcEl.bufi && srcEl.evtyp=='keydown' && ((event.keyCode)? event.keyCode: ((event.charCode)? event.charCode: event.which))==13)
  {
    srcEl = m[_l][26][srcEl.bufi];
    srcEl.evtyp = 'click';
  }
	
	if (srcEl.evtyp!='keydown' || (srcEl.evtyp=='keydown' && ((event.keyCode)? event.keyCode: ((event.charCode)? event.charCode: event.which))==13))
	{
		e4(_l,srcEl, srcEl.frael, srcEl.evtyp);		// fyr de andre events
	}


}



function e3(event)
{	
	var srcEl=event.target;				            // registrer lige source-elementet !
	_l=event.currentTarget.lnr;
	
	srcEl.evtyp = event.type;			                // .. og event type	
	srcEl.frael = event.target;        // event-attributter sættes her
	srcEl.tilel = event.relatedTarget;
	srcEl.absX = event.clientX;
	srcEl.absY = event.clientY;

  event.stopPropagation();

  		

  // rediregering af kF .. hvis den ligger i 'buffer'
  if (srcEl.bufi && srcEl.evtyp=='keydown' && ((event.keyCode)? event.keyCode: ((event.charCode)? event.charCode: event.which))==13)
  {
    srcEl = m[_l][26][srcEl.bufi];
    srcEl.evtyp = 'click';
  }
   
  //  ENTER funktion på knap
	if (srcEl.evtyp!='keydown' || (srcEl.evtyp=='keydown' && ((event.keyCode)? event.keyCode: ((event.charCode)? event.charCode: event.which))==13))
	{
      e4(_l ,srcEl, srcEl.frael, srcEl.evtyp);		// fyr de andre events

  }

}


function e4(l,s,rt,t)									// <-- prøv at medtage det nyligt registrerede lag-index !
{	
 
	if ( !iFrameAktiv )             // blokering af event-systemet under iFrame upload ??
//	if (eb==0)             // blokering af event-systemet under download ??
	{
		var lag=l;
				
		switch(t)
		{

			case 'mouseover': 
			{								
        // bloker mouseover, hvis fra.cF ='sentinel' OG frael.cA = 'dummeDiv'  
        // ELLER, hvis frael.cF ='exit'
        
				if ( ( s.oF && s.oF != '' )   
             &&
             rt && !( rt.cF == 'sentinel' &&  rt.cA == 'dummeDiv' )
             &&             
             rt && !( rt.cF == 'exit' )
           )
        {

            if (s.cF)   // vi er i scrollsystemet .. og IKKE scrollert
            {
                if (s.cF && (s.cF == 'scrollOP' || s.cF == 'scrollNED'))  // det var OP eller NED knappen
                {

//                    var a = m[s.dwli][21][s.scrn];   // fang scroll-arrayen
                    var a = m[s.dwli][21];   // fang scroll-arrayen                    
//alert(a[2].className);
                    if (s == a[2])                    // var det scrollOP knappen ?
                    {
                       if (parseInt(a[1].style.top) != a[0].ytoprel)     // vi har IKKE bonget top

//                       if (parseInt(a[2].style.top) >= a[0].ytoprel - checkV('pre',a[2],'MT'))     // vi har IKKE bonget top
                       {
                           eval(s.oF+'(s);');
                       }
                    }
                    else if (s == a[3])                                    // var det scrollNED knappen ?
                    {
                       if (parseInt(a[1].style.top) != a[0].ybundrel)     // vi har IKKE bonget bund
//                       if (parseInt(a[2].style.top) >= a[0].ybundrel)     // vi har IKKE bonget bund
                       {
                           eval(s.oF+'(s);');
                       }                
                    }
                }
                else   // det var ikke scrollert, OP eller NED .. men selve scrollbaren
                {
                    eval(s.oF+'(s);');            
                }                
             }   
             else   // vi er udenfor scrollsystemet .. kører normalt
             {
                  eval(s.oF+'(s);');            
             }                             
        }
				break;
		  }

/*
			case 'dragstart': 
			{ 													
				if (s.drF && s.drF!='')
        {
            eval(s.drF+'(s);');
        }
				break;
			}

			case 'draggable': 
			{ 													
				if (s.draF && s.draF!='')
        {
            eval(s.draF+'(s);');
        }
				break;
			}
*/

			case 'mouseenter':        // IE
			{ 													
				if (s.eF && s.eF!='')
        {
            eval(s.eF+'(s);');
        }
				break;
			}

			case 'mouseleave':       // IE
			{ 													
				if (s.lF && s.lF!='')
        {
            eval(s.lF+'(s);');
        }
				break;
			}


			case 'mouseout': 
			{ 													
				if (s.uF && s.uF!='')
        {
            eval(s.uF+'(s);');
        }
				break;
			}

			case 'mousedown': 
			{ 													
				if (s.dF && s.dF!='')
        {
          eval(s.dF+'(s);');
        }
				break;
			}

			case 'mouseup': 
			{ 													
    smNull();           // SKAL med pga. 'move'
        if (s.upF && s.upF!='')
        {
          eval(s.upF+'(s);');
        }
				break;
			}


			case 'click': 
			{ 							
				if (s.cF && s.cF!='')						
				{
					eval(s.cF+'(s);');					// der er involveret en download eller andet ? ..  indeholder eb--
				} 
				else
				{
					lukm(s,lag);
				}
				break;
		 	}


			case 'keydown': 
			{ 							
				if ( s.kF && s.cF != '')						
				{
				  eval(s.kF+'(s);');					// der er involveret en download eller andet ? ..  indeholder eb--
				} 
				else
				{
					
          
          lukm(s,lag);
				}
				break;
			}


			case 'resize': 
			{ 							
				if (s.resF && s.resF != '')						
				{
          eval(s.resF+'(s);');					// der er involveret en download eller andet ? ..  indeholder eb--
				} 
				break;
		 	}
				



				
			case 'mousemove': 
			{ 							
				if (s.mF && s.mF != '')		// kan kun 'move' når mousedown				
				{
          eval(s.mF+'(s);');					// der er involveret en download eller andet ? ..  indeholder eb--
				} 
				break;
		 	}
				
		}
	}
}



// ------- timer funktion til menuen ---------


var tout=2000;				                                                    // timeout

function resT(lag)
{
	if( m[lag][20][0] != null )						// timer resettes, hvis noget at resette
	{
//	    window.clearTimeout(m[lag][20][0]);
	    window.clearTimeout(m[ parseInt(lag) ][20][0]);
//alert('resT  '+m[parseInt(lag)][20][0]);
	}
}


function setT(lag)
{	

//    if( m[lag][20][0] != null )               viker IKKE !!
//    if( m[parseInt(lag)][20][0] != null )
    {    

      m[lag][20][0]=window.setTimeout('lukm(m['+lag+'][0][0],'+lag+')',tout);	// start countdown for lukning af menu
//      m[lag][20][0]=window.setTimeout('lukm(m[0][0][0],'+lag+')',tout);	// start countdown for lukning af menu
    }
//alert(m[parseInt(lag)][20][0]);
}


// -------- loadcounter ... busy ---------


function lbon()			                                                        // 'busy on' .. loadbar TÆNDES .. eb er allerede incrementeret (!= 0) 
{
	if (_lbar!=null) 
	{		
		_lbar.style.visibility='visible';
	}
}

function lboff()			                    // 'busy on' .. loadbar SLUKKES og eb vedligeholdes
{
	eb--;
	if (eb==0 && _lbar!=null) 
	{		
		_lbar.style.visibility='hidden';
	}
}

// ----------------------- AUX funktioner -------------------------------------------------

function eventInfo(s)       // returnerer indholdet i aktuel event .. s.evtyp [0] .. s.xF [1] .. s.xA [2] 
{
  var a = new Array();
  var typ = s.evtyp;
  
  switch (typ)
  {
     case 'click': a[0] = typ; a[1] = s.cF; a[2] = s.cA; break;
     case 'mouseover': a[0] = typ; a[1] = s.oF; a[2] = s.oA; break;
     case 'keydown': a[0] = typ; a[1] = s.kF; a[2] = s.kA; break;
     case 'mousedown': a[0] = typ; a[1] = s.dF; a[2] = s.dA; break;
     case 'mouseup': a[0] = typ; a[1] = s.upF; a[2] = s.upA; break;
  }
  
  return a;
}


function getInnerHtml(s)             // returnerer SAMLET innerHTML fra knap og kombiknap
{   
   return ( s.getAttribute('psinner') != null ? s.psinner : s.innerHTML );
}

function getInnerText(s)              // .. kun oprindelig innerHTML .. psinner trukket fra
{
  return ((s.innerHTML).substring( ( 0, (s.innerHTML).lastIndexOf('>') +1 ) ) ).replace(/^\s+|\s+$/g, '');
}

function travers(a,dut,s) // array a .. 'Device Under Test'  .. dut .. returnerer FORM-data, separeret med '|'
{
    var dutboern = (brt ? dut.children : dut.childNodes);	  // dut .. 'børn'

		for (var i=0; (i < dutboern.length); i++)
		{
			// det var en <INPUT> eller et <TEXTAREA> med readonly="false" (default)

//      if ( ( (s == 'true'  ) && ( dutboern[i].tagName == 'INPUT' || ( dutboern[i].tagName == 'TEXTAREA' && dutboern[i].readonly == false ) ) ) )
//      if ( ( dutboern[i].tagName == 'INPUT' ||  dutboern[i].tagName == 'TEXTAREA'  ) )
      if (  dutboern[i].tagName == 'INPUT'  )
      {      
          if ( dutboern[i].type != 'hidden' &&  dutboern[i].type != 'submit' )        
     			{  
              a[0] += urlencode(dutboern[i].id) + '|';
              a[1] += urlencode(dutboern[i].name) + '|';        // input's har altid name-attribut
              
              if ( dutboern[i].tagName == 'INPUT' )
              {          
                  a[2] += ( dutboern[i].type != 'password' ? urlencode(dutboern[i].value) : lille( dutboern[i].value + s.ETag ) ) + '|';
              }
/*              else if ( dutboern[i].tagName == 'TEXTAREA' )      // .. eller et textareal
              {
if ( !brt && dutboern[i].firstChild.nodeType == 3 ){alert(dutboern[i].firstChild.nodeValue);}


                  a[2] += ( brt ? urlencode(dutboern[i].innerText) : urlencode(dutboern[i].textContent) ) + '|';
//                  a[2] += urlencode(dutboern[i].innerText) + '|';          

              }
*/
          }

/*          else if (dutboern[i].type == 'hidden' )
          {
              a[3] = dutboern[i];  // hvis <input type=hidden> .. parker i a[3] .. value tilskriver, når færdig

          }    
*/
      }                                              // div's tagget som input .. men ej dem i drop'er
      else
      { 
          // det er en knap med id="inputXX" eller df/cF = "check" .. starter med 'input' .. resten kan betragtes som 'aktuel' ID
          if ( ( (dutboern[i].parentNode).getAttribute('niv') == null) && (dutboern[i].id && ( dutboern[i].id ).substring(0,5) == 'input' ) ||  dutboern[i].dF && dutboern[i].dF == 'check' || dutboern[i].cF && dutboern[i].cF == 'check'    ) 
    			{
              // fjern 'input fra 'id'
              a[0] += urlencode( ( dutboern[i].id ).substring(5) ) + '|';              
//              a[0] += urlencode(dutboern[i].id) + '|';
              a[1] += '|';                                   // name = ''
              a[2] += ( ( dutboern[i].dF && dutboern[i].dF == 'check' || dutboern[i].cF && dutboern[i].cF == 'check' ) ? dutboern[i].check : urlencode( getInnerHtml(dutboern[i]) ) ) + '|';    // value = innerHTML                            							                       
    			}
			}
      travers(a,dutboern[i],s);					
		}
    
 }




function reqstr(til,fra)  // request streng .. parametre til server ..
{    
    // grundstreng .. og HER CHECKES om der allerede er et '?' i s.cF eller s.kF
    var str = ( (til.cF && (til.cF).match(/\?/)) || (til.kF && (til.kF).match(/\?/)) ? '&' : '?');
    str += 'session='+Ssession+'&UA='+UA;

    var strfra = '';      // fra.innerHTML eller fra.value .. hvis kombiknap

    if (til.tagName == 'INPUT')
    {
        if (fra != '')     // hvis der er en 'fra'
        {
            if (fra.tagName == 'INPUT')
            {
                str += '&dwli='+til.dwli+'|'+fra.dwli+'|'+'&ETag='+til.ETag+'|'+fra.ETag+'|'+'&AJid='+til.id+'|'+fra.id+'|'+'&name='+urlencode(til.name)+'|'+urlencode(fra.name)+'|'+'&value='+urlencode(til.value)+'|'+urlencode(fra.value)+'|';
            }
            else      
            {
                str += '&dwli='+til.dwli+'|'+fra.dwli+'|'+'&ETag='+til.ETag+'|'+fra.ETag+'|'+'&AJid='+urlencode(til.id)+'|'+urlencode(fra.id)+'|'+'&name='+urlencode(til.name)+'||'+'&value='+urlencode(til.value)+'|'+urlencode(getInnerHtml(fra))+'|';
           
                if (fra.bufi) 
                {
                    str += '&buffer=' + urlencode(m[fra.dwli][25][fra.bufi].value);
                }
            }
        }
        else                 // der var ingen 'fra'
        {
            str += '&dwli='+til.dwli+'&ETag='+til.ETag+'&AJid='+urlencode(til.id)+'&name='+urlencode(til.name)+'&value='+urlencode(til.value);
        }
    }
    else    // til != <input>
    {    

        if (fra != '')       // hvis der er en 'fra'
        {
// ----- her checkes om 'til' er indeholdt i et element med id="buffer" ('til' kan ALDRIG være input !)
// buffer.value er enten fra.innerHTML eller fra.value   


            if (fra.tagName == 'INPUT')
            {                 
                if (til.getAttribute('bufi') != null) 
                { 
                    // hvis 'buffer' .. tildel value og buffer-paramater
                    (m[til.dwli][25][til.bufi]).value = urlencode(fra.value); 
                    strfra = '&buffer=' + (m[til.dwli][25][til.bufi]).value;
                }       

                if (fra.type == 'password')
                {
                    str += '&dwli='+til.dwli+'|'+fra.dwli+'|'+'&ETag='+til.ETag+'|'+fra.ETag+'|'+'&AJid='+urlencode(til.id)+'|'+urlencode(fra.id)+'|'+'&name='+'|'+urlencode(fra.name)+'&value='+urlencode(getInnerHtml(til))+'|'+''+'|'+strfra;                
                }
                else
                {
                    str += '&dwli='+til.dwli+'|'+fra.dwli+'|'+'&ETag='+til.ETag+'|'+fra.ETag+'|'+'&AJid='+urlencode(til.id)+'|'+urlencode(fra.id)+'|'+'&name='+'||'+urlencode(fra.name)+'&value='+urlencode(getInnerHtml(til))+'|'+urlencode(fra.value)+'|'+strfra;                
                }
            }
            else       // her kan 'kombiknap' forekomme i 'password-mode' .. som 'fra' og 'buffer' medtages
            {
                if (til.getAttribute('bufi') != null) 
                { 
                    m[til.dwli][25][til.bufi].value = getInnerText(fra);
                    strfra = '&buffer=' + urlencode(m[til.dwli][25][til.bufi].value);
                }
                str += '&dwli='+til.dwli+'|'+fra.dwli+'|'+'&ETag='+til.ETag+'|'+fra.ETag+'|'+'&AJid='+urlencode(til.id)+'|'+urlencode(fra.id)+'|'+'&name='+'||'+'&value='+urlencode(getInnerHtml(til))+'|'+urlencode(getInnerHtml(fra))+'|'+strfra;
            }
        }
        else                // der var ingen 'fra'
        {
            if (til.getAttribute('bufi') != null) 
            { 
                strfra = '&buffer=' + urlencode(m[til.dwli][25][til.bufi].value);
            }            
            str += '&dwli='+til.dwli+'&ETag='+til.ETag+'&AJid='+urlencode(til.id)+'&name='+'&value='+urlencode(getInnerHtml(til))+strfra;
        }
    }

    return str;
}




  function rydoplag(fli,flslt)  // nulstiller evt. timer på lag, lukker og fjerner laget fra DOM
  {
//alert(m[ m[fli][10][flslt].lnr ][3][1].id+'\n\n');
      var aktKnId = '';          // csv streng med id på aktive knapper         
      var narr = new Array();    // array med index til lag, der skal null'es
      
      function travers(lag)
      {
          m[lag][21] = null;                        // og scrollbar fjernes .. kun IE8
          m[lag][24][0] = null;                     // .. og vi nulstiller timeren 'manuelt' .. VIP !!
          
          narr[ narr.length ] = lag;                // lagnr. parkeret

          for (var i = 0; i < m[lag][10].length; i++)   // har laget selv lag ?
          {                                      

              for ( var q = 0; q < m[lag][9].length; q++ )
              {
                   // kun aktive knapper registreres  m[9]
                   if ( m[lag][10][i] )
                   {                   
                      aktKnId += ( m[lag][9][q] ? m[lag][9][q].id + ',' : '' );

                   }
              }

                                      			        			
              if ( m[lag][10][i] )     // og vi fortsætter fra lag, hvis noget
              {                                                    
                  travers(m[lag][10][i].lnr); 
              } 
          }

       }
              
       travers(m[fli][10][flslt].lnr); // input er lagNr, der skal fjernes og hvorpå vi STARTER oprydningen
/*
			if (brt){m[fli][10][flslt].removeNode(true)}					      // IE    .. og selve laget, hvorpå det hele startede
			else {  m[fli][0][0].removeChild(m[fli][10][flslt]) } 				// Gecko  
*/
      m[fli][0][0].removeChild(m[fli][10][flslt]);


      for (var j = 0; j < narr.length; j++)      // FF har problemer ??
      {
         m[ narr[j] ][0][0] = null;                   // og vi rydder op i m
      }

      psMinHeight(fli);    // .. og der korrigeres, HVIS fra-lag er tagget med 'min-height' attribut
  }


	function lagkoord(s,lag)		            // finder elementets absolute koordinat ifht. lag .. returnerer array
	{
	  var dut=s;
		var ar=new Array(0,0);
		do
		{
        if (UA>=8)                   // IE 8
        {
  			   ar[0]+=dut.offsetLeft;
  			   ar[1]+=dut.offsetTop;
  			}
  			else                                // Gecko og <IE8
  			{
             ar[0]+=dut.offsetLeft+checkV('pre',dut,'BL'); ar[1]+=dut.offsetTop+checkV('pre',dut,'BT');
        }
        
			  dut=dut.offsetParent;
		}
		while (dut != m[lag][0][0] && dut!=null)  

    if (UA == 8)            // IE8 .. der trækkes FRA .. IE7 OK !
    {
       ar[0]-=checkV('pre',m[lag][0][0],'BL'); ar[1]-=checkV('pre',m[lag][0][0],'BT');   // IE8
    }
    else          // Gecko .. der lægges TIL hos Firefox, men ikke Chrome .. som IE7
    {
       if (UA == 0)
       {       
          ar[0]+=checkV('pre',m[lag][0][0],'BL'); ar[1]+=checkV('pre',m[lag][0][0],'BT');   // Firefox
       }
    }
		return(ar);
	}


// søg OPAD i træet efter element med id="strID" .. start ved 'til' .. stop ved fundet element .. ellers ved 'til'
function opadID(fra,strID,til)   
{
   var ret = null;
   var dut = fra;                     // vi starter normalt med s som 'fra' 
   var fl = true;
    
   do
   {
      if ( dut.parentNode && dut.parentNode != null )     // er der en parent ?
      {
         if ( dut.id && dut.id == strID )
         {            
            ret = dut;
            fl = false;                          // skip
         }
         dut = dut.parentNode;
      }
      else
      {
         fl = false;      
      }
   }
   while ( dut != til && fl )
      
   return ret;
}

/*
function GetById(dut,idstr)         // element og id  .. og returnerer først forekomne element, på lag-nr. , med id=idstr
{
    var el = window.document.getElementById(idstr);
    return el;
}

*/
function GetById(dut,idstr)         // element og id  .. og returnerer først forekomne element, på lag-nr. , med id=idstr
{
//if (idstr=='dummeLukker'){alert(dut.innerHTLM)}
   var ret = null;                   

        function travers(dut)           // 'Device Under Test'  .. dut
        {
            var dutboern = ( brt ? dut.children : dut.childNodes );	      // dut .. 'børn'
						for (var i=0; (i < dutboern.length && ret == null); i++)
						{
							if (dutboern[i].id && dutboern[i].id == idstr)    // 
							{
                  ret = dutboern[i];       // vi har fanget først forekomne element på laget med id=idstr							                       
							}
							else                      // .. ellers fortsættes tråden
							{
							   travers(dutboern[i]);                        // .. og vi fanger deres 'børn'
              }
						}
         }

   travers(dut);
   return ret;
}


function CSH(s)    // xx.currentStyle.height .. bemærk 'auto' hos Gecko
{
    var ret;
    
    if ( brt )
    {
       ret = s.currentStyle.height;
    }
    else
    {
       ret = document.defaultView.getComputedStyle(s, "").getPropertyValue("height");
       if ( ret == '0px' ) { ret = 'auto'} 
    }
//alert(( brt ? s.currentStyle.height : document.defaultView.getComputedStyle(s, "").getPropertyValue("height") ));
//   return ( brt ? s.currentStyle.height : document.defaultView.getComputedStyle(s, "").getPropertyValue("height") );
    return ret;
}


function checkV()   // checkV('pre',xx,..) .. xx.style.xx  --  (IE) checkV('post',xx,..) .. xx.currentStyle.xx
{ 
  var a = checkV.arguments;            
  var t = 0;                          // tæller
  // .. a[0] 'device under test' er ALTID første argument
//  var s0 = 'a[0].style.';             

  // .. a[0] 'device under test' er ALTID ANDET argument
  var s0 = ( brt ? ( a[0] == 'pre' ? 'a[1].style.' :  'a[1].currentStyle.') : 'document.defaultView.getComputedStyle(a[1], "").getPropertyValue("' );             

  var sut = '';                       // 'string under test'
  
  for (var i = 2; i < a.length; i++)  // bemærk offset
  {
     switch (a[i].charAt(0))          // første bogstav (P, B, M)
     {
       case 'P': sut = s0 + 'padding'; break;
       case 'B': sut = s0 + 'border'; break;
       case 'M': sut = s0 + 'margin'; break;
     }

     switch (a[i].charAt(1))          // næste (sidste) bogstav (T, B, R, L)
     {
/*       case 'T': sut += 'Top'; break;
       case 'R': sut += 'Right'; break;
       case 'B': sut += 'Bottom'; break;
       case 'L': sut += 'Left'; break;
*/
       case 'T': sut += ( brt ? 'Top' : '-top")' ); break;
       case 'R': sut += ( brt ? 'Right' : '-right")' ); break;
       case 'B': sut += ( brt ? 'Bottom' : '-bottom")' ); break;
       case 'L': sut += ( brt ? 'Left' : '-left")' ); break;


     }

     if (a[i].charAt(0) == 'B' && brt) // vi tester Border og det var 'brutalis'
     {
	        eval( 'if (' + sut + '&&' + sut + '!= ""){t+=ieBorder(' + sut + ');}' );
     }
     else    
     {      
	     if (UA != 1)          // forskellig fra 'Chrome'
	     {
          eval( 'if (' + sut + '&&' + sut + '!= ""){t+=parseInt(' + sut + ');}' );
       }
       else if (UA == 1)                                 // Chrome .. registrerer IKKE borderLeft .. kun border
       {
           switch (a[i].charAt(1))          // næste (sidste) bogstav (T, B, R, L)
           {
             case 'T': sut = sut.replace('borderTop','border') ;
             case 'R': sut = sut.replace('borderRight','border'); break;
             case 'B': sut = sut.replace('borderBottom','border'); break;
             case 'L': sut = sut.replace('borderLeft','border') ; break;
           }  
          eval( 'if (' + sut + '&&' + sut + '!= ""){t+=parseInt(' + sut + ');}' );       
       }
     }
  }
  
        function ieBorder(str)														// tester border i IE
        {
        	return parseInt(str.slice(str.indexOf(' ')+1,str.lastIndexOf('px')));	// extraherer værdi fra composit border-str
        }
          
	return t;
}



function check(s)
{
    // s.cA eller s.dA' lig med idstr på laget
//    var radiobar = getById( m[ s.dwli ][0][0] ,( s.cF && s.cF == 'check' ? '"' +s.cA + '"' : '"' +s.dA + '"' ) ); 

    if (s.radio && s.check == 'off')  // ligger denne check-knap på en radioBar ?
    {
       for ( var i = 0; i < m[s.dwli][27][s.radio].length; i++)   // løb listen igennem .. og sluk knapper
       {
           m[s.dwli][27][s.radio][i].setAttribute('check','off'); m[s.dwli][27][s.radio][i].check = 'off';
           childCheck( m[s.dwli][27][s.radio][i] , '' );                     
       }
       // .. og tænd (toggle?) aktuelle knap
       m[s.dwli][27][s.radio][s.radioK].setAttribute('check','on'); m[s.dwli][27][s.radio][s.radioK].check = 'on';   
       childCheck(m[s.dwli][27][s.radio][s.radioK],'_a');
    }
    else          // ligger IKKE på radioBar .. alm. toggle
    {
        if ( s.check == 'off' ) // man LÆSER på 'direkte' attribut .. dog ej i event-handler, getAttribute anvendes
        {
           s.setAttribute('check','on'); s.check = 'on';   // man SKRIVER via setAttribute !
           childCheck(s,'_a');
        }
        else 
        {
           s.setAttribute('check','off'); s.check = 'off';
           childCheck(s,'');              
        }
    }    

}	
	
	
	
// -------------- DSO-------------------------------------


function flet(lag,url,dpid)                		// dso-typen fulgt med fra checkcsi()      
{

// lag++;     // prøv, at incrementere lag-nr., som er det aktuelle include-lag

/*				følgende DSO kan opfattes som et <tBody>-element i et <table>-element (fra-laget)
		
				fra start og hertil = 'header'
				
				@			<-- OBS, føste delimiter for at indikerer start på repeater
				<div>
					<input value=@></input>		<-- data indsættes ved delimiter nr. 2
					<div>@</div>				<-- ... og så fremdeles
				</div>
				@			<-- OBS, sidste delimiter for at indikerer slut på repeater
				
				herfra og til slut = 'footer'
*/
	var retur;
	var ar=url.split(',');                      // dso argumenter i array .. ar[0]:dso-url .. ar[1]:csv-url .. ar[2]:csv Client/Server
	if (ar.length==2)								// det var en <csi>
	{
		retur=dsof(ar,lag);
	}
	else
	{
		var dso=dsof(ar,lag);
		var csv=csvf(ar,lag);
	


// ----------- DSO og CSV ----------    
    	var head = dso.shift();   					// første element fjernet fra dso og lagt i head
    	var foot = dso.pop();     					// sidste element fjernet fra dso og lagt i foot
/*
      if ( m[lag][0][1] != null )         // der var 'header-info'
      {
          var hdataar = (m[lag][0][1]).split('|');    // split data
          var headar = head.split('|');               // split head
          
          for ( var q = 0; q < headar.length; q++)    // flet
          {
              head += headar[q] + hdataar[q];
          }          

      }
*/
		  var rep = dso;            					// resten af dso er nu repeateren som array

    	var ftdso = rep.length-1;   					// 'flette-tæller-dso' .. rep.length angiver antal variable pr. record, idet første og sidste record er header og footer
    	var ftcsv = csv.length-1;   					// 'flette-tæller-csv' .. en csv-fil afsluttes ALTID med 'separator'

// ----- her checkes for <drop> ----------

		if (dpid != null)							// OBS ! 'omklamrer' div'en får også ID ?????
		{
			head = head.substr(10);
			head = '<div id = "' + dpid + '"' + head;
		}

// ------------------------------------------------
    	retur = head;                 				// return-string fra flet() .. starter med header
    	var i = 0;                        			// interne csv-tæller
   	 	var j;                          			// interne dso-tæller

    	if (ftcsv > -1)                   			// hvis csv ej tom .. bemærk offset !
    	{
        	do
        	{
            	for (j = 0; j < ftdso; j++)
            	{
                	retur += rep[j]+csv[i].replace(/\r\n/,'');
                	i++;
            	}
            	retur += rep[j];          			// sidste 'repeater-del'
        	}
        	while(i < ftcsv);
	    	retur += foot;
    	}
    }
	return retur;
}   												// slut flet()


// ---------------------------- hjælpe funktioner til flet --------------------------------------------------

	function find(lag,url,nr)					//  .. input er url til dso [22] .. eller url til csv [23]
	{
		var ta=m[lag][nr];
		var ta1=new Array;		
		var ta2=new Array;
		var i=0;
		if (ta.length >0)
		{
		    for (i; i<ta.length; i++)		// søger efter dso i [22]
		    {
		        if (ta[i][0].toString()==url)	// OBS ! type-check
			    {
		    		ta2=ta1.concat(ta[i]);		// kopi af tom array ta1 og ta[i] .. er lig med ta[i] .. minus url
		    	    ta2.splice(0,1);
		    	    break;
		        }
		        else
		        {
		        	ta2=null;		        	
		        }
		    }		
		}
		else
		{
			ta2=null;
		}
		return [ta2,i];
	}



function dsof(ar,lag)	// dso argumenter i array .. ar[0]:dso-url .. ar[1]: 'G', 'g' (gælder for 'drop' og 'csi')
{
    var retur;
    var lay = ( ar[1] == 'G' || ar[1] == 'g' ? 0 : lag ); // check for global [0] eller lokal [lag] dso
    var tmp = find( lay , ar[0] , 22 )[0];               // returnerer selve dso'en, hvis nogen fra aktuelle lag .. ellers null
    if ( tmp != null )                              		 // der var en dso (globalt eller lokalt)
    {
        retur = tmp;
    }
    else                                  
    {
        var ta = new Array; ta[0] = ar[0];                // dso-url i [0]
        retur = sync(ar[0]).split('@');                   // selve dso array.. bruges til flet med csv 
        m[lay][22][m[lay][22].length] = ta.concat(retur); // dso er nu parkeret globalt eller lokalt i m[][22]
    }
    return retur;												// returnerer selve dso'en
}



function csvf(ar,lag)
{
    var retur;
	var lay=(ar[3]=='G'||ar[3]=='g'?0:lag);     				// og der undersøges fra hvilket lag .. check for global m[0][23] eller lokal m[lag][23] 

    var tmp=find(lay,ar[2],23);                 				// returnerer csv-data, hvis nogen fra aktuelle lag .. ellers null .. bemærk tmp er en array

	if (ar[4]=='S'||ar[4]=='s')
	{
		retur=sync(ar[2]).split('|');                 			//  .. csv array hentes fra SERVER

		if (tmp[0]!=null)										// der var en csv i [23]
		{
        	var ta=new Array; ta[0]=ar[2];                    	// csv-url i [3]
        	m[lay][23][tmp[1]]=ta.concat(retur);      	// csv er nu parkeret globalt eller lokalt i m[][23]
		}
		else													// .. ellers parker
		{
        	var ta1=new Array; ta1[0]=ar[2];                    	// csv-url i [3]
        	m[lay][23][m[lay][23].length]=ta1.concat(retur);      	// csv er nu parkeret globalt eller lokalt i m[][23]
		}
		
	}
	else if (ar[4]=='C'||ar[4]=='c')        						// hvis ren client C .. 
	{
			retur=tmp[0];                 
	}

    return retur;												// returnerer selve csv'en
}
	
	
// ----------- CSSkolonne --------
function CSSkolonne(s)
{
	var tr,i,ti,j,tj,a2;
	
	var pnod=s.parentNode;					// fang parentNode, hvori kolonnen udvikler sig
	var clss=s.className;					// default class
	var a1=(s.cA).split(',');				// CSSkolonne(16) .. CSSkolonne(4/classX,5/classXX,1/classXXX) -> 4 med classX, 5 stk. med classXX osv...

	s.style.display='none';					// knappen har udtjent sin værnepligt og fjernes fra DOM
	
	if (a1.length==1)						// den korte version .. CSSkolonne(16) .. 16 ens
	{
		ti=parseInt(a1[0]);
		for (i=0; i<ti; i++)
		{
			tr=window.document.createElement('DIV');		// alloker en DIV
				tr.className=clss;							// styres 100% af class .. ingen inline-attributer
			pnod.appendChild(tr);							// .. og lægges i DOM 			
		}
	}
	else													// den lange version .. CSSkollone(4,classXX|5,classXX|1,classXXX|)
	{		
		for (i=0; i<a1.length; i++)
		{
			a2=a1[i].split('/');			// 4,classX .. a[0]=4 (hvor mange).. a[1]=classX  .. og vi starter ved 1 mht. numerering af elementer i kolonne
			
			tj=parseInt(a2[0]);								// antal fortløbende ens elementer med samme class
			for (j=0; j<tj; j++)
			{
				tr=window.document.createElement('DIV');	// alloker en DIV
				tr.className=a2[1];
				pnod.appendChild(tr);						// .. og lægges i DOM 			
			}
		}
	}
}



// ---------- timer24 ... bemærk, at timere referer til LAGET og ikke til KNAP -----------


function timer24(lag)
{
   if (m[lag][24][0] != null)     // kun hvis der er defineret en timer
   {
    	if (m[lag][24][0][2] < m[lag][24][0][5].length-1)			// check om vi har bonget loftet .. aktiv[2] .. antal[5]
    	{
    	   m[lag][24][0][2]++;	              // aktiv incrementeres FØR check .. offset -1	
    	}
    	else
    	{
    		m[lag][24][0][2]=0;								// starter forfra 
    	}
    	
    	hentHTML(m[lag][24][0][5][  m[lag][24][0][2]  ]);				// vi starter med at aktivere første knap i listen [5]	
 if (m[lag][24][0][3][  m[lag][24][0][2]  ].ETag == 'off')		// check knappen's ETag .. hvis 'OFF' .. spring over
   {
	   timer24(lag);    // hurtigt videre til næste slide
//	   m[lag][24][0][0]=window.setTimeout('timer24('+(lag).toString()+')',0);	// aktiver time24 noch einmal (pseudo recursiv)   
   }
   else  // kører 'normalt'
   {
	   m[lag][24][0][0]=window.setTimeout('timer24('+(lag).toString()+')',m[lag][24][0][1]);	// aktiver time24 noch einmal (pseudo recursiv)   
   }

    		
    	m[lag][24][0][0]=window.setTimeout('timer24('+(lag).toString()+')',m[lag][24][0][1]);	// aktiver time24 noch einmal (pseudo recursiv)
  }
}


function clrTimer24(lag)
{
   if (m[lag][24][0] != null)     // kun hvis der er defineret en timer
   {
	   window.clearTimeout(m[lag][24][0][0]);
	 }
}




/* --- specielle EVENT funktioner til timer24() .. argumentet er lag-nr., der sættes på SERVER eller manuelt  */

//var flag24=false;                       // boolean knyttet til timer24 .. true=go
//var flagtimer24;                        // delay timer til mouseOut .. problemer med tilstødende elementer


function overStop24(s)           // virker kun på mouseOVER .. og stopper timer24
{
//  flag24=false;
//  m[s.oA][24][0][3] = false; 

  if (s.oA != '')                // hvis argument i funktionskaldet .. overStop24(lag) .. clear timer24 på angivne lag 
  {
    m[s.oA][24][0][3] = false;
    
    clrTimer24(s.oA);
  }
  else                           // .. hvis tomt .. overStop24() .. clear timer24 på knappens eget lag 
  {
    m[s.dwli][24][0][3] = false;
    clrTimer24(s.dwli);
  }	
}


function overStop24click(s)        // virker kun på mouseOVER .. og stopper timer24 på EGET lag .. og simulerer onclick
{                                 
    m[s.dwli][24][0][3] = false;
    
    clrTimer24(s.dwli);
	  if (s.className.indexOf('_a')==-1)		// .. altså hvis knap EJ aktiv
    {
			eb++;						                            // bloker mus-handlers				
			load(s.cA,s.dwli,0,s,reqstr(s,''));            // bemærk, der loades på s.cA .. husk parametre
	  }  
}


function outStart24(s)           // virker kun på mouseOUT .. og genstarter timer24
{
  var f;                       // intern flag ..
  // forlod vi en div, der blev kaldt af menuknap, altså laget, hvor timeren IKKE er defineret .. if = false
  // .. eller forlod vi en knap (menuknap) på laget, hvor timeren ER defineret .. if = true
  // [3] = true, timer24 har start-tilladelse .. [4] er selve delayOut-timeren
 
  if (s.uA != '')
  {
    f = false;
    m[s.uA][24][0][3] = true;   // er på lag UDENFOR timer .. og timer lagNr. sendes ned som argument s.uA 
  }
  else
  {
    f =true;
    m[s.dwli][24][0][3] = true; // er på timer lag, derfor menuknappens s.dwli     
  }

  window.setTimeout(delayOut,50);


   function delayOut()
   {  
     var flag24 = (f ? m[s.dwli][24][0][3] : m[s.uA][24][0][3]); // hvor er vi OG har vi stadig start-tilladelse efter 50ms ?

 	   if (flag24 && eb == 0)    // kun hvis delay24 er overstået ved exit .. og efter X ms .. er blokeret under download
 	   {
        if (!f)
        {
            timer24(s.uA);           
        }
        else
        {
            timer24(s.dwli);           
        }
     }
   }
}

// -------------------- benyttes også af scroll-system ----------------

      function childCheck(s,ts)   // hjælpe funktion til  barHoverOn(s) og scrollout(s) .. ts - tænd: '_o' .. sluk:''
      {
         var ar = eventInfo(s);
//         if ( ( !( s.frael ).cF == 'sentinel' && ( s.frael ).cA == 'dummeDiv' ) )
         {
             s.className = s.nclass + ts;         
             var p = (brt ? s.children : s.childNodes);
             // bare ikke scrollBar's
             if ( p && p.length != 0 && !(s.cF && s.cF == 'scrollBAR') )   
             {
                 for (var i = 0; i < p.length; i++)
                 {
    //                if ( p[i].tagName == 'DIV' )
                    if ( p[i].nodeType == 1 )
                    {
                      p[i].className = p[i].getAttribute('nclass') + ts;                  
                    }
                  } 
              }
          }
      }



// --------  specielle funktioner til <form file> og <input>  ------------- 

/*
    <div id="transparent input over div" class="abs" style="width:auto; height:18px; left:50px; top:50px;">
        <div id="knap" class="abs ver f11 c k18M" style="width:8px;">
          <div class="k18L"></div>
          <div class="k18R"></div>
        </div>
        <input type="text" name="" value="0" maxlength="1" size="1" class="abs ver c inp18hack" style="background:transparent; border:none;" onmouseover="inpover(this)" onmouseout="inpud(this)" />
    </div>


   <div id="fileupload" class="abs" style="left:20px; top:80px; width:auto; height:20px;">
      <div id="knap" title="fileupload 1" class="abs ver f11 c k18M" style="left:0px; top:0px; width:128px">
        <div class="k18L"></div><div class="k18R"></div>          
       - fil 1 -
      </div>  
   </div>  
  

  	<div id="buffer" style="position:absolute; left:50px; width:85px; top:48px; height:18px;">
          <div id="knap" class="abs ver f11 c k18M" style="left:0px; top:0px; width:30px;">
            <div class="k18L"></div>
            <div class="k18R"></div>
          </div>        
          <input type="password" name="" value="" maxlength="3" size="3" id="knap" class="abs ver c inp18hack" style="left:0px; top:0px; background:transparent; border:none;" onmouseover="inpover(this)" onmouseout="inpud(this)" onkeydown="hentHTML(test/HTM/scroll-gen.php)" />		
          <div id="knap" title="GO" class="flr ver f12 c pinH" style="height:18px; width:16px; background:url(../test/IMG/retur.png) center no-repeat; margin:0px 0px 0px 0px;" onclick="sentinel()"></div>
  	</div>

*/

function clearvalue(s)          // clear til fileupload
{
    // knappen
    var dut = ( brt || cms ? s.parentNode.firstChild.firstChild : s.parentNode.firstChild.nextSibling.firstChild.nextSibling );
    // clear knap
    dut.psinner = '';
    dut.innerHTML = dut.psbase;
    // clear <input value=""> .. og den ligger med garanti som nextChild
    dut = ( brt || cms ? dut.nextSibling : dut.nextSibling.nextSibling);
    dut.value = '';
}


function fileupload(f)     // <div =fileupload> med indsat <input type=file> 
{

//    var kn = f.parentNode;
    var s = ( brt ? f.parentElement.children[0] : f.parentNode.childNodes[1] );

        s.psinner = f.value;
        s.innerHTML = s.psbase + s.psinner;



/*
    var cn = ( brt ? f.parentElement.children : f.parentNode.childNodes);

    // firstChild er knappen
    var s = ( brt ? f.parentElement.firstChild : f.parentNode.childNodes[1] ); 

    s.innerHTML = ( brt ? f.parentElement.firstChild.psbase : cn[1].psbase ) + f.value;
//alert(f.parentNode.innerHTML);
*/
    childCheck(s,'');
//alert(f.value);
}



function inpover(f)
{
//     var s = f.parentNode;
//    var s = ( brt ? f.parentElement.children[0] : f.parentNode.childNodes[1] ); 

    if ( brt )
    {
        s = ( f.type != 'file' ? f.parentElement : f.parentElement.children[0] );    
    }
    else
    {
        s = ( f.type != 'file' ? f.parentNode : f.parentNode.childNodes[1] );    
    }
//alert(s.innerHTML);    
    childCheck(s,'_o');
}


function inpud(f)          // <input type=alle input's> UD <div>
{
//      var s = f.parentNode;
//    var  s = ( brt ? f.parentElement.children[0] : f.parentNode.childNodes[1] );

    if ( brt )
    {
        s = ( f.type != 'file' ? f.parentElement : f.parentElement.children[0] );    
    }
    else
    {
        s = ( f.type != 'file' ? f.parentNode : f.parentNode.childNodes[1] );    
    }
        
    childCheck(s,'');
}




// ---------------- cursor position input, textArea -----------------------

// c(ursor)start .. cursor start-pos ved onfocus -- c(ursor)range .. angiver SLUT-pos, hvorfra der kan selectes 
function setSelRange(s, cstart, crange) 
{ 
 	if (brt)            // IE
	{ 
//alert(getCaret(s));
  		var range = s.createTextRange(); 
  		range.collapse(true); 
  		range.moveEnd('character', crange); 
  		range.moveStart('character', cstart); 
  		range.select(); 
 	} 
	else               // Gecko
	{ 
//alert(getCaret(s));
  		s.focus(); 
  		s.setSelectionRange(cstart, crange); 
 	} 
}


/*
function getCaret(s) 
{ 
    if (brt)          // IE
    { 
      s.focus(); 

      var r = document.selection.createRange(); 
      if (r == null) 
      { 
        return 0; 
      } 

      var re = s.createTextRange(), 
      rc = re.duplicate(); 
      re.moveToBookmark(r.getBookmark()); 
      rc.setEndPoint('EndToStart', re); 
      return rc.text.length; 
    }
    else              // Gecko                 
    { 
      return s.selectionStart; 
    } 
      
    return 0; 
}
*/

function getStyle(s,styleProp)
{

    if (window.getComputedStyle)
    {
        var y = document.defaultView.getComputedStyle(s,null).getPropertyValue(styleProp); 
    }  
    else if (s.currentStyle)
    {
        var y = s.currentStyle[styleProp];
//        var y = eval( 's.currentStyle' + styleProp );
    }                     

    return y;
}

