var SenderId = "";
function setSenderId(id) {
    SenderId = id;
}

/*	da z.T. Probleme mit Mozilla-Installationen auftreten, wo der Flash-
	player grunsätzlich läuft, aber die Scripting-Fähigkeit aufgrund
	fehlerhafter Installation fehlt, wird mit typeof(sender.GetVariable)
	die korrekte Installation getestet
 
	window.document.<SenderId>		HTMLEmbedElement
	document.getElementById(SenderId)	HTMLObjectElement
	document.getElementsByName(SenderId)[0]	HTMLEmbedElement
 */
function getSender() {
    var sender = document.getElementsByName(SenderId)[0];
    if (!sender) {
	return null;
    }

    if(typeof(sender.GetVariable) == "undefined") {
	alert("Der Flashplayer ist nicht korrekt installiert.\n"
		+ "eine Neuinstallation (www.macromedia.com)\n"
		+ "könnte das Problem beseitigen");
    }
    return sender;
}

/*	Javascript: showWindow:
	Parameter window: String der Form "epsg,xlu,ylu,xro,yro"
 */
var requestClass = function () {
	this.loadState = "unload";
	this.initXml = "";
	this.closewin = false;
	this.send = function (xml,closewin) {
	    switch (this.loadState) {
		case "unload":
		   xml = '<request closewin="' + 
		           closewin +'">' + xml + '</request>';
		   this.loadState = "loading";
		   createSender("initxml=" + escape(xml) + "&initCallback=requestObject.onInit");
		break;
		case "loading":
                   this.initXml += xml;
	           if(closewin)
                      this.closewin = closewin;
		break;
		case "loaded":
		var sender = getSender();
		if(sender != null) {
		    sender.sendRequest('<request closewin="' + closewin + 
				       '">' + xml + "</request>");
	        } else {
		    alert("Kein Scriptaufruf des Flashplugins möglich. Evt. behebt eine Neuinstallation des Plugins das Problem");
		}
		break;
	    }
	}
	this.onInit = function() {
	       this.loadState = "loaded";
	       if(this.initXml != "") {
	         var ret = '<request closewin="' + 
		           this.closewin +'">' + this.initXml + '</request>';
                 this.initXml = "";
	         this.closewin = false;
	         return ret;
	       } else {
		 return null;
	       }
        }
}

var requestObject = new requestClass();


function showWindow(win,closewin) {
    list = win.split(',');
    var xml = '<showWindow><Array><Window epsg="' + list[0] + 
	'" x0="' + list[1] +
	'" y0="' + list[2] +
	'" x1="' + list[3] +
	'" y1="' + list[4] +
	 '"/></Array></showWindow>';
    requestObject.send(xml,closewin);  
}

/*	Javascript: showGDBElem:
	das Flash-Movie "sender.swf" ruft im Sekundentakt die Funktion
	'checkConn' im Viewer auf. Bei Erfolg wird automatisch die Variable
	"status" auf "status" gesetzt. Bei Nichterfolg "error" oder "unknown".
	Der eigentliche Funktionsaufruf geschieht über den Frame
	"sendRequest" oder "sendRequestAndClose".
	Die XML-Anfrage wird dabei vorher in die Variable "request"
	geschrieben und dann der Frame aufgerufen "sendRequestAndClose"
	schließt anschließend das Browserfenster. Ist die Verbindung zum
	Viewer nicht vorhanden, wird "url" in einem neuen Fenster aufgerufen.
*/
function showGDBElem(objlist,zoommode,closewin) {
    if(zoommode == undefined)
	zoommode = true;

    var xml = "<addSelection><Array><Array>";
    for (var i in objlist) {
	xml += "<Object>";
	    for (var j in objlist[i]) {
		xml += '<Member name="' + j + '"><String>' + objlist[i][j] + '</String></Member>';
	    }
	    xml += "</Object>";
    }
    xml += "</Array><Boolean>" + zoommode + "</Boolean>" +
	"</Array></addSelection>";
    requestObject.send(xml,closewin);
}

function editGDBElem(gdbobject,fdkey,closewin) {
    var xml = "<edit>" +
	"<gdbobject>" + gdbobject + "</gdbobject>" +
	"<fdkey>" + fdkey + "</fdkey>" +
	"</edit>";
    requestObject.send(xml,closewin);
}

/*	Javascript: setSession:
	Parameter typ:  SERVER   Werte in der Session auf dem 
	                         Server speichern
	                CLIENT   Werte nur im Viewer speichern
	                SRVCLT   Werte im Viewer und auf dem Server
	                         speichern
*/           
function setSession(typ,namevaluelist) {
    var xml = "<setSession typ=\"" + typ + "\"><Array><Array>";
    while ((value = namevaluelist.pop()) != undefined) {
	xml += '<Object><Member name="key"><String>' + 
	    namevaluelist.pop() + 
	    '</String></Member><Member name="value"><String>' +
	    value + '</String></Member></Object>';
    }
    xml += "</Array></Array></setSession>";
    requestObject.send(xml,false);
}

// Kompatibilität mit Seiten die auch in v3 verwendet werden
function activateTheme(themes) {
    var tl = themes.split(',');
    xml = "<activateThemes><Array><Array>";
    for(var i in tl) {
	xml += "<String>" + tl[i] + "</String>";
    }
    xml += "</Array></Array></activateThemes>";
    requestObject.send(xml,false);
}

function activateThemes(themes) {
    xml = "<activateThemes><Array><Array>";
    for(var i in themes) {
	xml += "<String>" + themes[i] + "</String>";
    }
    xml += "</Array></Array></activateThemes>";
    requestObject.send(xml,false);
}


function redisplay(themes,closewin) {
    var xml = "<redisplay>" + themes + "</redisplay>";
    requestObject.send(xml,closewin);
}

function setmode(mode,closewin) {
    var xml = "<setmode>" + mode + "</setmode>";
    requestObject.send(xml,closewin);
}

/* Quelle: http://www.faqts.com/knowledge_base/view.phtml/aid/969/fid/124 */
function parseQueryString (loc) {
    if (!loc) {
	loc = location.search;
    }
    var query = loc.charAt(0) == '?' ? loc.substring(1) : loc;
    var args = new Object();
    if (query) {
	var fields = query.split('&');
	for (var f = 0; f < fields.length; f++) {
	    var field = fields[f].split('=');
	    args[unescape(field[0].replace(/\+/g, ' '))] = unescape(field[1].replace(/\+/g, ' '));
	}
    }
    return args;
}

function createQueryString (params) {
    var str = "";
    
    for (var i in params) {
	if (str.length) {
	    str += "&";
	}
	str += escape(i)+"="+escape(params[i]);
    }
    
    return str;
}

// Original-pluginspage http://www.adobe.com/go/getflashplayer
//
// ACHTUNG, NOCHMAL PRÜFEN: Unter Solaris und Linux funktioniert das
// Installations-Movie nicht mit Flash-Version 6.0.80.
//
function addFlashObject(objId,id,width,height,srcurl,flashvars,flashCodebase,
			flashVersion,flashPluginspage,background,vcheck) {
    var obj = document.getElementById(objId);
    if (obj == null) {
	alert ("Code kann nicht zu Element "+objId+" zugefügt werden!");
	return;
    }
    /* Anzeige funktioniert in FF nur mit absoluter URL */
    var i = location.href.indexOf("?");
    var newsrcurl = (i<0) ? location.href : location.href.slice(0,i);
    if ((i = newsrcurl.lastIndexOf("/")) >= 0) newsrcurl = newsrcurl.slice(0,i);
    newsrcurl += "/" + srcurl;

    setSenderId(id);
    
    if (vcheck) {
	var reqVer = flashVersion.split(",");
	var versionStr = GetSwfVer();
	var hasRequestedVersion = ibbDetectFlashVer(reqVer[0], reqVer[1], reqVer[2], versionStr);
	if (!hasRequestedVersion) {
	    var infoURL = "info?info=" +
			(ibbDetectFlashVer(0, 0, 0, versionStr) ?
				"upgradeFlash" : "installFlash") +
			"&found="+versionStr +
			"&url="+escape(window.location);

	    var args = parseQueryString ();
	    if (args["SessionId"])
		infoURL += "&SessionId=" + args["SessionId"];

	    if ( ibbDetectFlashVer (6, 0, 65, versionStr) ) {
		var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
		var MMredirectURL = window.location;
		document.title = document.title.slice(0, 47) + " - Flash Player Installation";
		var MMdoctitle = document.title;

		document.write('<center>'+
			'Die Express-Installation wird nun aufgerufen.<br>' +
			'Falls dabei Probleme auftreten sollten, rufen '+
			'Sie bitte unsere <a href="'+infoURL+'">'+
			'Info-Seite</a> auf,<br>' +
			'und verwenden Sie den dortigen Link, um die '+
			'Installation durchzuführen.</center><br>' +
			AC_FL_RunContent("id", id,
			"src", "viewer/playerProductInstall",
			"name", id,
			"type", "application/x-shockwave-flash",
			"width", "100%",
			"height", "70%",
			"salign", "tl",
			"quality", "high",
			"bgcolor", background,
			"codebase", flashCodebase,
			"pluginspage", flashPluginspage,
			"swLiveConnect", "true",
			"allowScriptAccess", "sameDomain",
			"FlashVars", "MMredirectURL="+MMredirectURL+
	                             '&MMplayerType='+MMPlayerType+
	                             '&MMdoctitle='+MMdoctitle+
	                             '&cancelURL=' + escape(infoURL)+
	                             '&failedURL=' + escape(infoURL)));
	    } else {
		location.replace (infoURL);
	    }
	    return;
	}
    }

    obj.innerHTML = AC_FL_RunContent(
			"id", id,
			"src", newsrcurl,
			"name", id,
			"type", "application/x-shockwave-flash",
			"width", width,
			"height", height,
			"salign", "tl",
			"quality", "high",
			"bgcolor", background,
			"codebase", flashCodebase,
			"pluginspage", flashPluginspage,
			"swLiveConnect", "true",
			"allowScriptAccess", "sameDomain",
			"allowFullScreen", "true",
			"FlashVars", flashvars);
    if (isIE == true) {
	// Fokus setzen: klappt z.Z. nur unter dem IE
	var obj = document.getElementById(id);
	if (obj != null)
	    if ((typeof obj.focus) != "undefined")
		obj.focus();
    }
}

function OldOsName () {
    var Skip = new Array ("Windows NT 5", "Windows XP", "Win 9x", "Windows 95/");
    for (var i = 0; i < Skip.length; i++)
	if (navigator.userAgent.lastIndexOf(Skip[i]) >= 0)
	    return ""; /* ok oder nicht entscheidbar */
  
    if (navigator.userAgent.lastIndexOf("Windows 95") >= 0)
	return "Windows 95";
  
    if ((navigator.userAgent.lastIndexOf("Windows NT;") >= 0) ||
	(navigator.userAgent.lastIndexOf("Windows NT)") >= 0) ||
	(navigator.userAgent.lastIndexOf("WinNT4") >= 0))
	return "Windows NT 4.0";
    
    return ""; /* ok */
}

function checkOs (strict) {
    var osname = OldOsName ();
    if (osname.length > 0) {
	if (strict) {
	    var infoUrl = "info?info=wrongOs&os="+osname+"&url="+escape(window.location);
	    var args = parseQueryString ();
	    if (args["SessionId"])
		infoURL += "&SessionId=" + args["SessionId"];
	    location.replace(infoUrl);
	    return false;
	}
	alert ("Warnung:\n\nSie verwenden ein nicht\nunterstütztes Betriebssystem:\n"+osname);
    }
    return true;
}

function checkBrowser(strict) {
    return true; // vorerst keine Prüfung mehr
    // Wenn es Opera ist direkt weiter leiten
    if (navigator.userAgent.lastIndexOf("Opera") >= 0) {
	// eigentlich ab Version 9.0.2
	return true;
    }
    var infoUrl = "info?";
    var args = parseQueryString ();
    if (args["SessionId"])
	infoUrl += "SessionId=" + args["SessionId"] + "&";

    if (navigator.appName == "Microsoft Internet Explorer") {
	ArrVer = navigator.appVersion.split(";");
	var msieVer = ArrVer[1].substring(5,ArrVer[1].length);
	if (msieVer < 5.5) {
	    if (strict) {
		location.replace(infoUrl+'info=wrongBrowserVerExp&url='+escape(window.location));
		return false;
	    }
	    alert ("Warnung:\n\nSie verwenden eine nicht\nunterstützte Internet-Explorer-Version!");
	    return true;
	}
    } else if (navigator.appName == "Netscape") {
	geckoIndex = navigator.userAgent.lastIndexOf("Gecko");
	browserdate = navigator.userAgent.substring(geckoIndex+6, navigator.userAgent.length);
	if (browserdate < "20040601") {
	    if (strict) {
		location.replace(infoUrl+'info=wrongBrowserVerGecko&url='+escape(window.location));
		return false;
	    }
	    alert ("Warnung:\n\nSie verwenden eine nicht\nunterstützte Netscape-Version!");
	    return true;
	}
    } else {
	// alle anderen Browser ab Version 9.0.0durchlassen
	// Probleme mit ExternalAPI meldet der Viewer
	return true

	if (strict) {
	    location.replace(infoUrl+'info=wrongBrowser&url='+escape(window.location));
	    return false;
	}
	alert ("Warnung:\n\nSie verwenden einen\nnicht unterstützter Browser!");
    }
    return true;
}

var newwin = new Array();

// URL- eines evt. vorhandenen Fensters umsetzen
function winLocation(winurl,winname,winfeatures) {
    // Fenster noch nicht geöffnet ? -> neu öffnen
    if(newwin[winname] == null || newwin[winname].closed) {
	launchwin(winurl,winname,winfeatures);
    } else {
	newwin[winname].location.replace(winurl);
    }
}

// Inhalt eines evt. vorhandenen Fensters setzen
function writeWin(html,winname,winfeatures) {
    // Fenster noch nicht geöffnet ? -> neu öffnen
    if(newwin[winname] == null || newwin[winname].closed) {
	launchwin("about:blank",winname,winfeatures);
    } 

    if(newwin[winname] != null) {
	newwin[winname].document.open();
	newwin[winname].document.write(html);
	newwin[winname].document.close();
        newwin[winname].focus();
    }
}
// ändert src-url des unsichtbaren iframes "gtilaunch"
function openInBackground(url) {
    var pos = url.indexOf("?");
    
    if (pos < 0) {
	url += "?format=html-background";
    } else {
	var params = parseQueryString(url.slice(pos+1));
	params["format"] = "html-background";
	url = url.slice(0,pos+1) + createQueryString(params);
    }
    
    document.getElementById("viewerBackground").src = url;
}

// neues Fenster öffnen
function launchwin(winurl,winname,winfeatures) {
    if (winname == null) {
	winname = "_blank";
    }
    // z.T. liefert der Zugriff auf alte Window-Objekte
    // einen Laufzeitfehler, deshalb mit try abfangen
    try {
	if (newwin[winname]) {
	    if(newwin[winname].closed != true) {
		// NS: Fehler newwin.close is not a function
		// bei geschl. Fenster
		// beim IE ist der Typ ein Object
		if((typeof newwin[winname].close) == "function" || (typeof newwin[winname].close) == "object") {
		    newwin[winname].close();
		}
	    }
	}
    } catch (e) {
    }
    if(winfeatures != null) {
	var wfl = winfeatures.split(",");
	if(wfl.length > 1) {
	    var w = wfl[0].split("=")[1]; // Breite
	    var h = wfl[1].split("=")[1]; // Höhe
	    var top  = (parseInt(screen.height) / 2) - (parseInt(h) / 1.5);
	    var left = (parseInt(screen.width) / 2)  - (parseInt(w) / 2);
	    winfeatures += ",top=" + top + ",left=" + left;
	}
	newwin[winname] = window.open(winurl,winname,winfeatures);
    } else {
	newwin[winname] = window.open(winurl,winname);
    }
    if(newwin[winname] == null) {
	alert("Es konnte kein neues Fenster geöffnet werden. Um dieses Funktion nutzen zu können, müssen Sie Pop-up Fenster von dieser Website erlauben");
    }
}


window.onbeforeunload = confirmExit;

function confirmExit() {
 // The reference to the flash object can fail if we are unloading the page after
 // going through Express Install (because we had an old version of the player.)
 // So catch any failure and fail silently.
 try {
   if(SenderId != null) {
     if (getSender() != null && getSender().unsavedChanges != null) {
       var ret = getSender().unsavedChanges();
       // return null erzeugt trotzdem die Nachfrage
       // nur wenn kein return aufgerufen wird, wird
       // die Abfrage übergangen

       if(ret != null) {
         return ret;
       }
     }
   }
 }
 catch (err) {
    alert("Fehler " + err);
 }
}



// Check auf firebug
function hasFirebug() {
   if (window.console && window.console.firebug) {
      return true;
   } else {
      return false;
   }
}

// PDF anzeigen per embed

function showPDF (pdfurl,winname,winfeatures) {
  html = "<html><head></head><body><embed src='" +
         pdfurl +"' width='100%' height='100%'/>"
  writeWin(html,winname,winfeatures);
}


//TerraExplorer Starten

function TELoadURL (url, win) {
  if (! window.external) {
    alert ("Diese Funktion erfordert ein ActiveX-Control\
		und lässt sich daher leider nur mit dem\
		Microsoft Internet Explorer nutzen.");
    return;
  }
  
  var koords = win.split(","); // epsg,xlu,ylo,xro,yro
  var xlu = koords[1];
  var ylu = koords[2];
  var xro = koords[3];
  var yro = koords[4];

  var w2 = (xro - xlu) / 2.0;
  var x = xlu + w2;
  var y0 = ylu + (yro - ylu) / 2.0;

  // blickrichtung 270 -> nach unten , 360 nach vorn
  var view = (w2 > 3000) ? 270 : 330;
  var alpha = (view -270.0) * 3.1414926 / 180.0;

  // tan des Blickfeldes (53 deg / 2)
  var tb = Math.tan(26.5 * 3.1414926 / 180.0);
  var ta = Math.tan(alpha);

  var h = w2 * Math.cos(alpha) / tb;
  var dist = ta * h;
  var y = y0 - dist;
  
  var tObj = new ActiveXObject ("TerraExplorer2.TerraExplorer");

  if (!tObj)
    window.open ("http://www.skylinesoft.com/corporate/technology/technology_terraexplorer.asp","download");
  else {
    tObj.Load (url);

    /* interface scheint ein reserviertes Schlüssel zu sein
       (Problem Konqueror) -> deshalb ["interface"] statt .interface */
    var IPlane = tObj["interface"]("IPlane");

    var mask = "X Z Height Yaw Pitch Roll CameraDeltaYaw CameraDeltaPitch";
    IPlane.SetUpdateMask (mask);
    IPlane.X = x;
    IPlane.Z = y;
    IPlane.Height = h;
    IPlane.Yaw = 360;
    IPlane.Pitch = 0;
    IPlane.Roll = 0;
    IPlane.CameraDeltaYaw = 360;
    IPlane.CameraDeltaPitch = view;
    IPlane.UpdateData(0);
    IPlane.FlyTo (x,y,h,100,360,view,mask);
  }
}

function closeWin () {
    /* Wenn man window.close für den FF grundsaetzlich zulassen will,
       dann muss 'dom.allow_scripts_to_close_windows' auf true gesetzt werden. */
    window.close();
}
