var iscenterwin = false;

var line = 0;

function debug(text) {
   var debug = document.getElementById('debug');
   if (debug != null && debug != undefined) if (debug.style.visibility != 'visible') return;
   var db = document.getElementById('debugtext');
   if (db == null || db == undefined) return;
   var txt = db.value;
   if (txt == undefined || txt == null) return;
   db.value += line + ": " + text + "\n"; line++;
   db.scrollTop = db.scrollHeight - db.clientHeight;
}

var center_win_timeout = null;

function center_wait() {
	
	if (ispreload){
		setTimeout('center_wait();',200);
		return;
	}
	
	var b = bounds(menu[0],1,1);
	if (b == null || b == undefined) return;
	var w = document.getElementById('waiting');
	var bw = bounds('waiting');
	w.style.top = b[0] + b[3] +  "px";
	w.style.left = b[1] + "px";
	w.style.width = b[2] + "px";
	
	
	
}

function center_win(outer,inner) {
   if (iscenterwin)  {
	   //if (center_win_timeout != null) clearTimeout(center_win_timeout);
	   center_win_timeout = setTimeout('center_win("'+outer+'","'+inner+'");',300);
	   return;
   }
   iscenterwin = true;
    var e = document.getElementById(inner);
    var f = document.getElementById(outer);
    if (e == null || f == null) { iscenterwin = false; return; }

    debug("center_win (" + outer + ", " + inner + ");");
    
    var eheight = (f.offsetHeight - e.offsetHeight) / 2;
    var ewidth = (f.offsetWidth - e.offsetWidth) / 2;
    
    if (eheight == 0) {
    
        eheight = f.clientHeight / 2 - e.clientHeight / 2;
        ewidth = f.clientWidth / 2 - e.clientWidth / 2;
        
    }
    
    if (eheight < 0) eheight = 0;
    if (ewidth < 0) ewidth = 0;
    
    e.style.top = eheight + "px";
    e.style.left = ewidth + "px";
    e.style.marginTop = "0px";
    e.style.marginLeft = "0px";

    iscenterwin = false;
}

var myrad = 0;
var iscenter = false;
var iscentermap = false;
var lastjustation = 0;
var lastangle = 0;
var timeout = 0;



function center_map(object) {
	if (iscentermap) return;
    debug("center_map (" + object[0].toString() + ");");
	iscentermap = true;
    var e = document.getElementById(object[0].toString());
    if (e == undefined || e == null) { iscentermap = false; return; }
    resetobjectdiv();
    var b = bounds(object[0].toString(),false);
    var divb = bounds('largediv',true);
    e.style.top = "10px";
    //e.style.top = (divb[3] - b[3] - 10) + "px";
    e.style.left = (divb[2] / 2 - b[2] / 2) + "px";
    e.style.visibility='visible';
    
    e = document.getElementById('karte');
    e.style.left = "10px";
    e.style.top = 10 + b[3] + 10 + "px";
    e.style.width = divb[2] - (20) + "px";
    e.style.height = divb[3] - (20 + b[3]) + "px";

    e = document.getElementById('karte_content');
    e.style.height = divb[3] - (20 + b[3] + 30) + "px";
    e.style.width = divb[2] - (20 + 30) + "px";
    
	  var container = getcontainer(e);
	  if (container != null && container != undefined) {
	    var ascript = document.getElementById('scriptpart_' + container.id);
	    if (ascript != null && ascript != undefined) {
	      var vscript = ascript.getAttribute("resizescript");
	      if (vscript != null && vscript != undefined) {
	        eval(vscript);
		  }
	    }
	  }
    
    
    iscentermap = false;
}

function bounds(objectid, useclient, useoffset) {
	if (useclient == null || useclient == undefined) useclient = 0;
	if (useoffset == null || useoffset == undefined) useoffset = 0;
	var e = document.getElementById(objectid);
	if (e == null || e == undefined) return;
	
    var width;
    var height;

    if (useclient == 0) {
        width = parseInt(e.offsetWidth.toString().replace("/px/g",""));
        height = parseInt(e.offsetHeight.toString().replace("/px/g",""));
    } else {
        width = parseInt(e.clientWidth.toString().replace("/px/g",""));
        height = parseInt(e.clientHeight.toString().replace("/px/g",""));    
    }
    
    var top = parseInt(e.style.top.toString().replace("/px/g",""));
    var left = parseInt(e.style.left.toString().replace("/px/g",""));
    if (isNaN(top)) { 
    	top = parseInt(e.style.marginTop.toString().replace("/px/g",""));
    	if (isNaN(top))	top = 0;
    }
    if (isNaN(left)) {
    	left = parseInt(e.style.marginLeft.toString().replace("/px/g",""));
    	if (isNaN(left))	left = 0;
    }
    if (useoffset) {
    	top = e.offsetTop;
    	left = e.offsetLeft;
    }
    
    return Array(top,left,width,height);
}

function resetobjectdiv(ob) {
	debug('resetobjectdiv();');
	var ld = document.getElementById('largediv');
	ld.style.top = "0px";
	ld.style.left = "0px";
	ld.style.marginTop = "0px";
	ld.style.marginLeft = "0px";
  	if (ob != null) { center_win('largediv',ob); document.getElementById(ob).style.visibility='visible'; }
}

var radiuschanged = false;
var mobj = null;
function center_base(object,justation,dontsetrad, dontjustate, iter, setlaststate) {
	mobj = object;
	if (object == null || object == undefined) return;
	if (iscenter) {
		alert("rueckkopplung");
		return;
	}
	
	iscenter = true;
	
	
	if (iter == null || iter == undefined) iter = 0;
    if (dontsetrad == null || dontsetrad == undefined) dontsetrad = false;
    if (dontjustate == null || dontjustate == undefined) dontjustate = false;
    if (setlaststate == null || setlaststate == undefined) setlaststate = false;
    if (justation == null || justation == undefined) justation = 0;

    var e = document.getElementById(object[0].toString());
    if (e == null || e == undefined) { iscenter = false; return; }
    if (object[1].length == 0) { iscenter = false; return; }
       
	if (ispreload) {
		iscenter = false;
		debug('center_base is waiting for preload...');
		setTimeout("center_base(mobj,"+justation+","+dontsetrad+","+dontjustate+","+iter+","+setlaststate+");",200);
		return;
	}

    
    var ldiv = document.getElementById('largediv');
    if (iter == 0) { iter++; clearTimeout(timeout); iscenter = false; resetobjectdiv(object[0].toString()); center_base(object,justation,dontsetrad,dontjustate,iter,setlaststate); return; }
    //if (iter == 1) { center_win('largediv',object[0].toString()); }
    iter++;
    debug("center_base (" + object[0].toString() + ", " + justation + ", " + dontsetrad + ", " + dontjustate + ", " + iter + ", " + setlaststate + ");");
    debug("myrad: " + myrad);
    var b = bounds(object[0].toString(),1,1);
    var top = b[0]; var left = b[1]; var width = b[2]; var height = b[3];

    var items = object[1];
    var angles = (Math.PI * 2) / items.length;   
    var curangle = angles;
    
    if (setlaststate) { curangle = lastangle; justation = lastjustation; }

    lastangle = curangle;

    curangle = angles + 2 * Math.PI;  //zu ausgangsposition setzen

    //formula:     pi/180 * deg = rad    180/pi * rad = deg 
    
    var maxwidth = 0; var maxheight = 0; var minx = 0; var miny = 0; var maxx = 0; var maxy = 0;
	var xpos = 0; var ypos = 0;
    
    for (var i = 0; i < items.length; i++) {
    	var f = document.getElementById(items[i]);
        if (f.offsetWidth > maxwidth) maxwidth = f.offsetWidth;
    	if (f.offsetHeight > maxheight) maxheight = f.offsetHeight;   	
    }


	if (!radiuschanged) myrad = Math.sqrt(maxwidth * maxwidth + maxheight * maxheight);
    var oldrad = myrad;
    
    if (!dontsetrad) {
    	for (var i = 0; i < items.length; i++) {
        	var f = document.getElementById(items[i]);
        	xpos = 0; ypos = 0;
        	if (items.length == 2) {
            	xpos = Math.cos(curangle) * (myrad);
            	ypos = Math.sin(curangle) * (myrad);   	
        	} else if (items.length == 3) {
            	xpos = Math.cos(curangle + 3 * Math.PI / 2) * (myrad);
            	ypos = Math.sin(curangle + 3 * Math.PI / 2) * (myrad);    	
        	} else {
            	xpos = Math.cos(curangle + 1 * Math.PI / 2) * (myrad);
            	ypos = Math.sin(curangle + 1 * Math.PI / 2) * (myrad);   	
        	}
        	
        	var newleft = left + (width / 2) + xpos - (f.offsetWidth / 2);
        	var newtop = top + (height / 2) + ypos - (f.offsetHeight / 2);
        	
        	f.style.top = newtop + "px";
        	f.style.left = newleft + "px";
    		curangle += angles;
        }

        var maxminusx = maxwidth; var maxminusy = maxheight;
        for (var i = 0; i < items.length; i++) {
        	var f = document.getElementById(items[i]);
            var ftop = parseInt(f.style.top.toString().replace("/px/g",""));
            var fleft = parseInt(f.style.left.toString().replace("/px/g",""));
            if (ftop < miny) miny = ftop;
            if (ftop + f.offsetHeight > maxy) maxy = ftop + f.offsetHeight;
            if (fleft < minx) minx = fleft;
            if (fleft + f.offsetWidth > maxx) maxx = fleft + f.offsetWidth;
        }
        
        //ueberragende abstaende berechnen
        if (miny < 0) miny = 0 - miny; else miny = 0;
        if (maxy > ldiv.offsetHeight) maxy = maxy - ldiv.offsetHeight; else maxy = 0;
        if (minx < 0) minx = 0 - minx; else minx = 0;
        if (maxx > ldiv.offsetWidth) maxx = maxx - ldiv.offsetWidth - maxwidth; else maxx = 0;

        if (maxx < 0) maxx = 0;
        if (maxy < 0) maxy = 0;
        
        maxx = Math.max(Math.abs(maxx),Math.abs(minx));
        maxy = Math.max(Math.abs(maxy),Math.abs(miny));
        
        maxwidth = maxwidth - maxx;
        maxheight = maxheight - maxy;
        
        
        myrad -= Math.max(maxx,maxy);
                
        curangle = lastangle;

    }
    if (Math.abs(oldrad - myrad) > 0) {
    	debug('radius changed: ' + Math.abs(oldrad - myrad));
    	radiuschanged = true;
    }

    var maxdegree = 360 / items.length;
    var step = 15;
    
    if (Math.abs(maxdegree - justation) <= step) {
    } else {
        if (!dontjustate) {
        	if ((maxdegree - (justation + step)) <= step) center_win('largediv',object[0].toString());
            curangle = (Math.PI / 180) * justation ;
            justation += step;
            clearTimeout(timeout);
            timeout = setTimeout('center_base(menu,' + justation + ',true,false,'+iter+');',30);
        }
    }
    
	for (var i = 0; i < items.length; i++) {
    	var f = document.getElementById(items[i]);
    	f.style.visibility='visible';
	}
    
	for (var i = 0; i < items.length; i++) {
    	var f = document.getElementById(items[i]);

    	xpos = 0; ypos = 0;
    	if (items.length == 2) {
        	xpos = Math.cos(curangle) * (myrad);
        	ypos = Math.sin(curangle) * (myrad);   	
    	} else if (items.length == 3) {
        	xpos = Math.cos(curangle + 3 * Math.PI / 2) * (myrad);
        	ypos = Math.sin(curangle + 3 * Math.PI / 2) * (myrad);    	
    	} else {
        	xpos = Math.cos(curangle + 1 * Math.PI / 2) * (myrad);
        	ypos = Math.sin(curangle + 1 * Math.PI / 2) * (myrad);   	
    	}
    	
    	var newleft = left + (width / 2) + xpos - (f.offsetWidth / 2);
    	var newtop = top + (height / 2) + ypos - (f.offsetHeight / 2);
    	
    	f.style.top = newtop + "px";
    	f.style.left = newleft + "px";
    	
    	curangle += angles;
    }
    
    lastjustation = justation;
    lastangle = curangle;
   
    iscenter = false;
   
}