// global variables
var ge;
var mapElement = 'map3d';
var language;

var server1 = 'http://blc.shc.eu/3d/GE/citymodel/_generated/';
var server2 = 'http://blc.shc.eu/3d/GE/projects/berlin_wall/_generated_plugin_mauer3d/';

// store the object loaded for the given file... initially none of the objects
// is loaded, so initialize these to null
var mauer = null;

var doku = null;
var gedenk = null;
var grenz = null;
var kunst = null;
var reste = null;
var geschi = null;
var orte = null;
var objekt = null;

var aerials = null;

var buildings = null;
var aktuell = null;
var neunundachtzig = null;

var aerialsCheckedState = null;

var state = null;

// initialize GE plugin   
google.load("earth", "1");

function init(lang) {
    MM_preloadImages(
        'images/l_aktiv.jpg',
        'images/r_aktiv.jpg',
        'images/hintergrund.jpg',
        'images/pixelw.jpg',
        'images/reload1.gif'
    );
    
    language = (lang == null) ? 'de' : lang;
    
    // initialize
    google.earth.createInstance(mapElement, initCallback, failureCallback);
}

function initCallback(instance) {
    // initialize    
    ge = instance;
    ge.getWindow().setVisibility(true);
    ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);

    // set up function for displaying data loading progress      
    setInterval(
        function() {
            var streamingPercent = ge.getStreamingPercent();
            var progressBar = document.getElementById('progress-bar');
            if (streamingPercent == 100) {
               // streaming complete, hide the progress bar
                progressBar.className = 'complete';
                progressBar.style.width = '180px';
                javascript:document.getElementById('fertig').style.visibility='visible';
                javascript:document.getElementById('unfertig').style.visibility='hidden';
            } else {
                // show the progress bar
                progressBar.className = 'running';
                progressBar.style.width = (180 * ((streamingPercent == 0) ? (Math.random() * 20) : streamingPercent) / 100) + 'px';
                javascript:document.getElementById('unfertig').style.visibility='visible';
                javascript:document.getElementById('fertig').style.visibility='hidden';
            }
        }, 
        100
    );
 
    // load data   
    loadData(language);

    // enable/disable layers
    if (mauer != null) mauer.setVisibility(document.options.mauer.checked);
    if (doku != null) doku.setVisibility(document.options.doku.checked);
    if (gedenk != null) gedenk.setVisibility(document.options.gedenk.checked);
    if (grenz != null) grenz.setVisibility(document.options.grenz.checked);
    if (kunst != null) kunst.setVisibility(document.options.kunst.checked);
    if (reste != null) reste.setVisibility(document.options.reste.checked);
    if (geschi != null) geschi.setVisibility(document.options.geschi.checked);
    if (orte != null) orte.setVisibility(document.options.orte.checked);
    if (objekt != null) objekt.setVisibility(document.options.objekt.checked);

    // disabled historic aerial images in current setting
    if (aerials != null) aerials.setVisibility(document.options.aerials.checked);

    // buildings
    if (aktuell != null) aktuell.setVisibility(document.options.buildings.checked);
    if (neunundachtzig != null) neunundachtzig.setVisibility(false);

    // roads layer
	ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, document.options.roads.checked);
    
    // enable todays situation
    enableToday();
    
    updateOptions();

    setTimeout(
        function() {
            // set initial camera position    
            flyToStartPosition();
        },
        2500
    );    

    // due to problem with visualization of wall geometry
    mauer.setVisibility(false);
    setTimeout(
        function() {
            mauer.setVisibility(true);
        },
        5000
    );    
}

function loadData(language) {
    // points of interests
    doku =      getNL(server2 + language + '/mauer/POI/Dokumentationszentren/data/poi_mauer_doku.kmz');
    gedenk =    getNL(server2 + language + '/mauer/POI/Gedenkstaetten/data/poi_mauer_gedenk.kmz');
    grenz =     getNL(server2 + language + '/mauer/POI/Grenzuebergaenge/data/poi_mauer_grenz.kmz');
    kunst =     getNL(server2 + language + '/mauer/POI/Kuenstlerische_Markierungen/data/poi_kunst.kmz');
    reste =     getNL(server2 + language + '/mauer/POI/Mauerreste/data/poi_mauer_reste.kmz');
    geschi =    getNL(server2 + language + '/mauer/POI/Geschichtsmeile/data/poi_geschi.kmz');
    orte =      getNL(server2 + language + '/mauer/POI/wichtigeOrte/data/poi_orte.kmz');
    objekt =    getNL(server2 + language + '/mauer/POI/sonstige_Objekte/data/poi_objekt.kmz');
    
    // historical aerials
    aerials = getNL(server1 + 'en/mauer/Luftbilder_1989/data/aerials.kmz');    

    // current buildings
    aktuell = getNL(server2 + language + '/Buildings/data/Buildings.kmz');

    // former buildings (1989)
    neunundachtzig = getNL(server2 + language + '/Buildings89/Gebaeude1989.kmz');

    // Berlin Wall
    mauer = getNL(server2 + language + '/mauer/mauerverlauf/Mauer1989.kmz');
    //mauer = getNL(server2 + language + '/mauer/mauerverlauf_LinesAndPolygons/Mauer1989_LinesAndPolygons.kmz');
}

// creates a network link element and returns it
function getNL(kmlURL) {
   var nl = ge.createNetworkLink("");
   var link = ge.createLink("");
   link.setHref(kmlURL);
   nl.setLink(link);
   ge.getGlobe().getFeatures().appendChild(nl);
   return nl;
}

function enableToday() {
    state = 'today';
    
    // buildings
	buildings = aktuell;
	buildings.setVisibility(document.options.buildings.checked);
	neunundachtzig.setVisibility(false);
	
	// historical aerials	
	aerials.setVisibility(false);
	// cannot change visibility of current aerials from Google, so disable and hide checkbox
	// store users settings before
    enableLayerItem('aerials', false);
    if (aerialsCheckedState != null) {
        aerialsCheckedState = document.options.aerials.checked;
    }
	document.options.aerials.checked = false;
	document.options.aerials.disabled = true;

    // roads
    enableLayerItem('roads', true);
    document.options.roads.disabled = false;
    // change background image
    document.getElementById('tabs').className = 'left';
}

function enable1989() {
	state = 'historic';
	
	// buildings
	buildings = neunundachtzig;
	buildings.setVisibility(document.options.buildings.checked);
	aktuell.setVisibility(false);
	
	// historical aerials	
	//if (aerialsCheckedState == null) {
    	// first switch to 1989 state, so enable aerials
    enableLayerItem('aerials', true);
    document.options.aerials.disabled = true;
	aerialsCheckedState = true;
	//}
	aerials.setVisibility(aerialsCheckedState);
    document.options.aerials.checked = aerialsCheckedState;
	//document.options.aerials.disabled = false;

    // roads
    enableLayerItem('roads', false);
    document.options.roads.checked = false;
    document.options.roads.disabled = true;
    ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, false);
    
    // change background image
    document.getElementById('tabs').className = 'right';
}

function enableLayerItem(layer, enable) {
    try {
        // get object by layer name
        var l = document.getElementById(layer);
        if (l != null) {
            l.style.visibility = enable ? 'visible' : 'hidden';
        }
    } catch (ex) {
        displayError(ex.message);
    }
}

function updateLayer(layer) {
    try {
        // get object by layer name
        var o = eval(document.options[layer]);
        if (o != null) {
            if (layer != 'roads') {
                var l = eval(layer);
                l.setVisibility(o.checked);
            } else {
                ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, o.checked);
            }
        }
    } catch (ex) {
        displayError(ex.message);
    }
}

function updateOptions() {
	// GE plugin settings
	var options = ge.getOptions();
	if (document.options.nav.checked) {
    	ge.getNavigationControl().setVisibility(ge.VISIBILITY_SHOW);
    	ge.getNavigationControl().getScreenXY().setXUnits(ge.UNITS_PIXELS);
        ge.getNavigationControl().getScreenXY().setYUnits(ge.UNITS_PIXELS);
	} else {
    	ge.getNavigationControl().setVisibility(ge.VISIBILITY_HIDE);
	}
}
		
function failureCallback(errorCode) {
    displayError('Error code: ' + errorCode);
}

function displayError(msg) {
    alert('An error occured:\n' + msg)
}

// navigates to a given point with a given distance (optional)
function flyTo(lat, lon, range) {
    // set default value if range is not set
    range = (range == null) ? 500.0 : range;
    try {
        var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
        lookAt.setLatitude(lat);
        lookAt.setLongitude(lon);
        lookAt.setRange(range);
        ge.getView().setAbstractView(lookAt);
    }
    catch(exception)
    {
        displayError(exception);
    }
}

function flyToStartPosition() {
    var la = ge.createLookAt('');
    la.set( 52.516282926947, 13.3783744844708, 0, ge.ALTITUDE_RELATIVE_TO_GROUND, 2.694, 60, 300);
    ge.getView().setAbstractView(la);
}

function flyById(id) {
    switch(id) {
        // Dokumentationszentren 
        case 1: { flyTo(52.5401952955971, 13.404361459686); break; }    // Galeriewand Bernauer / Ecke Schwedter Strasse
        case 2: { flyTo(52.5354827330538, 13.3905357715105); break; }   // Galeriewand Bernauer/Ackerstrasse
        case 3: { flyTo(52.5354665196025, 13.3897042477123); break; }   // Dokumentationszentrum Berliner Mauer
        case 4: { flyTo(52.5319299367712, 13.3892554987792); break; }   // Geisterbahnhöfe: Ausstellungim S-Bahnhof Nordbahnhof
        case 5: { flyTo(52.5164711241084, 13.380498081793); break; }    // Mauerinformation Brandenburger Tor
        case 6: { flyTo(52.5079768997427, 13.3899931757677); break; }   // Open-Air-Ausstellung am Checkpoint Charlie
        case 7: { flyTo(52.506974462354, 13.3908083421852); break; }    // Mauermuseum - Museum Hausam Checkpoint Charlie
        // Gedenkstaetten
        case 8: { flyTo(52.5207466786026, 13.3772505099731); break; }   // Parlament der Bäume gegen Krieg und Gewalt
        case 9: { flyTo(52.5336531127403, 13.3898041368899); break; }   // Gedenkstätte Berliner Mauer an der Bernauer Strasse
        case 10: { flyTo(52.5351884670642, 13.3687707515592); break; }  // Gedenkstätte Günter Litfin
        case 11: { flyTo(52.5196272430172, 13.3767984741097); break; }  // Gedenkort Weiße Kreuze / Deutscher Bundestag
        case 12: { flyTo(52.5069230834001, 13.393469755492); break; }   // Gedenkstätte Peter Fechte
        // Grenzuebergang
        case 13: { flyTo(52.5545790431369, 13.3991436272332); break; }  // Bornholmer Strasse
        case 14: { flyTo(52.5366362171444, 13.3757487037555); break; }  // Chausseestrasse
        case 15: { flyTo(52.5278593322046, 13.3741316659904); break; }  // Invalidenstrasse
        case 16: { flyTo(52.5202458577796, 13.3870818169332); break; }  // Bahnhof Friedrichstrasse
        case 17: { flyTo(52.5078186025353, 13.390387139878); break; }   // Friedrichstrasse (Checkpoint Charlie)
        case 18: { flyTo(52.5052450356687, 13.4118725543206); break; }  // Heinrich-Heine-Strasse
        case 19: { flyTo(52.5018150764768, 13.4453556805107); break; }  // Oberbaumbrücke
        case 20: { flyTo(52.4613663534867, 13.4793615545269); break; }  // Sonnenallee
        // Kuenstlerische Markierungen
        case 21: { flyTo(52.5545540807577, 13.3982750409685); break; }  // Mind the Gap, (e.) Twin Gabriel, 1999
        case 22: { flyTo(52.5369976590755, 13.374666630916); break; }   // Kaninchenfeld, Karla Sachse, 1999
        case 23: { flyTo(52.5278217573849, 13.3737461567757); break; }  // Wahre Geschichte, Gabriele Basch, 1999
        case 24: { flyTo(52.5075680871192, 13.3903634587881); break; }  // Ohne Titel (Leuchtkasten), Frank Thiel, 1998
        case 25: { flyTo(52.5065191194721, 13.4125984813382); break; }  // Übergang zur Untergrundbahn, Susanne Ahner, 1999
        case 26: { flyTo(52.5017646180923, 13.4456641629); break; }     // Stein-Papier-Schere, Thorsten Goldberg, 1997
        // Mauerreste 
        case 27: { flyTo(52.5548246711607, 13.400201326206); break; }   // Hinterlandmauer an der Bornholmer Strasse - Zeuge des 9. November 1989
        case 28: { flyTo(52.5427874941256, 13.4041691456824); break; }  // Mauerpark
        case 29: { flyTo(52.5339673200658, 13.3886484186996); break; }  // auf dem Sophien-Friedhof
        case 30: { flyTo(52.5325498791411, 13.3697735192225); break; }  // auf dem Invalidenfriedhof
        case 31: { flyTo(52.5085193184115, 13.3796754308346); break; }  // Einzelne Mauersegmente, erhaltener Wachturm
        case 32: { flyTo(52.5070724851357, 13.3831258114526); break; }  // Erhaltene Vorderlandmauer
        case 33: { flyTo(52.5038646780064, 13.4427547884166); break; }  // 1990 bemalte Hinterlandmauer
        case 34: { flyTo(52.4957105888235, 13.4506721533398); break; }  // Führungsstelle Schlesischer Busch - Vom Wachturm zum Kunstturm
        case 35: { flyTo(52.5395590290311, 13.3793636490478); break; }  // Friedhöfe St. Hedwig und Französische Domgemeinde
        // Geschichtsmeile
        case 36: { flyTo(52.5548238250034, 13.3972214033522); break; }  // Grenzübergang Bornholmer Strasse
        case 37: { flyTo(52.53741210267, 13.3929995419205); break; }    // Bernauer Strasse
        case 38: { flyTo(52.5376130863659, 13.3756696507857); break; }  // Grenzübergang Chausseestrasse
        case 39: { flyTo(52.5278840951725, 13.3734707002277); break; }  // Grenzübergang Invalidenstrasse
        case 40: { flyTo(52.5194249644921, 13.3765543439401); break; }  // Gedenkort Weisse Kreuze
        case 41: { flyTo(52.5167410717339, 13.3768735845339); break; }  // Brandenburger Tor
        case 42: { flyTo(52.5094800427523, 13.3750018691067); break; }  // Berliner Mauer
        case 43: { flyTo(52.5073481532457, 13.385688638236); break; }   // Innerstädtischer Verlauf der Berliner Mauer
        case 44: { flyTo(52.5076263203231, 13.3901450004913); break; }  // Grenzübergang Friedrichstrasse
        case 45: { flyTo(52.5080574480099, 13.3967828725634); break; }  // Gedenkort Peter Fechter
        case 46: { flyTo(52.5050211180622, 13.4114532268962); break; }  // Grenzübergang Heinrich-Heine-Strasse
        case 47: { flyTo(52.5011336447653, 13.4444259890259); break; }  // Grenzübergang Oberbaumbrücke
        case 48: { flyTo(52.4963373716656, 13.4500969864403); break; }  // Berliner Mauer
        case 49: { flyTo(52.462064072064, 13.477727633038); break; }    // Grenzübergang Sonnenallee
        // Weitere wichtige Orte
        case 50: { flyTo(52.5431036452466, 13.4028999117303); break; }  // Mauerpark
        case 51: { flyTo(52.5393111544638, 13.39882457666); break; }    // Gedenkstätte für Opfer der Berliner Mauer
        case 52: { flyTo(52.516282926947, 13.3783744844708); break; }   // Brandenburger Tor und Pariser Platz
        case 53: { flyTo(52.5095614306373, 13.3769260867268); break; }  // Potsdamer und Leipziger Platz
        case 54: { flyTo(52.5066995871323, 13.3846921481896); break; }  // Topographie des Terrors
        case 55: { flyTo(52.5059648878314, 13.4399350860104); break; }  // East-Side-Gallery
        case 56: { flyTo(52.497529492052, 13.4485735291424); break; }   // Vor dem Schlesischen Tor
        // Sonstige Objekte
        case 57: { flyTo(52.5542652220083, 13.4000750341652); break; }  // Gedenkstein zum Mauerfall 1989
        case 58: { flyTo(52.535793136788, 13.3919485332511); break; }   // Kapelle der Versöhnung
        case 59: { flyTo(52.5375840265498, 13.3746745134757); break; }  // Denkmal Wiedervereinigung, Hildegard Leest
        case 60: { flyTo(52.5294504118535, 13.3761091507478); break; }  // Die Sinkende Mauer
        case 61: { flyTo(52.5274862309975, 13.3734811131749); break; }  // Gedenkstein für Günter Litfin
        case 62: { flyTo(52.5201344563628, 13.3866695812665); break; }  // Foto-Installation zum Bahnhof Friedrichstrasse
        case 63: { flyTo(52.5155295413492, 13.3795949573124); break; }  // Die Akademie der Künste am Pariser Platz 4
        case 64: { flyTo(52.5160523839232, 13.3742707490726); break; }  // Der Rufer
        case 65: { flyTo(52.5166155490845, 13.3719092416059); break; }  // Sowjetisches Ehrenmal
        case 66: { flyTo(52.5099705148291, 13.3770832976528); break; }  // Ausstellung zum Mauergedenken
        case 67: { flyTo(52.5012997621935, 13.4441010446953); break; }  // Gedenkstein für Udo Düllick
        case 68: { flyTo(52.4861352276986, 13.4719481712705); break; }  // Das Sowjetische Ehrenmal im Treptower Park
        // Startansicht
        default : { flyToStartPosition(); }        // Startansicht Brandenburger Tor
    }
}

function reloadPage() { 
    window.location.reload()
}

function show(id) {
    if (document.getElementById(id).style.display == 'none') {
        document.getElementById(id).style.display = 'block';
    } else {
        document.getElementById(id).style.display = 'none';
    }
}

function showContextMenu(id, show) {
    show = (show == null) ? show = true : show;
    var o = eval(document.options[id]);
    if (o != null && show == true) {
        if (o.checked != true) return;
    }
    var menu = document.getElementById(id + 'context');
    menu.style.visibility = show ? 'visible' : 'hidden';
}

function hideContextMenus() {
    document.getElementById('ortecontext').style.visibility='hidden';
    document.getElementById('dokucontext').style.visibility='hidden';
    document.getElementById('gedenkcontext').style.visibility='hidden';
    document.getElementById('grenzcontext').style.visibility='hidden'; 
	document.getElementById('kunstcontext').style.visibility='hidden';
	document.getElementById('restecontext').style.visibility='hidden';
	document.getElementById('geschicontext').style.visibility='hidden';
	document.getElementById('objektcontext').style.visibility='hidden';
}

// 

/* <![CDATA[ */
function mouseReallyOut(oThis, e) {
    if (e.relatedTarget) {
        return(e.relatedTarget != oThis && e.relatedTarget.parentNode != oThis);
    }
    return(e.toElement != oThis && e.toElement.parentNode != oThis);
}
/* ]]> */

// Hide from older browsers
<!--
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
    if (init==true) with (navigator) {
        if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
            document.MM_pgW=innerWidth; 
            document.MM_pgH=innerHeight; 
            onresize=MM_reloadPage; 
        }
    } else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) {
        location.reload();
    }
}

MM_reloadPage(true);

function MM_preloadImages() { //v3.0
    var d = document; 
    if (d.images) { 
        if(!d.MM_p) d.MM_p = new Array();
        var i, j = d.MM_p.length;
        var a = MM_preloadImages.arguments;
        for (i = 0; i < a.length; i++) {
            if (a[i].indexOf("#") != 0) {
                d.MM_p[j] = new Image;
                d.MM_p[j++].src = a[i];
            }
        }
    }
}

function MM_swapImgRestore() { //v3.0
    var i, x, a = document.MM_sr;
    for (i = 0; a && i < a.length &&(x = a[i]) && x.oSrc; i++) {
        x.src = x.oSrc;
    }
}

function MM_findObj(n, d) { //v4.01
    var p, i, x;
    if (!d) d = document;
    if ((p = n.indexOf("?")) > 0 && parent.frames.length) {
        d = parent.frames[n.substring(p + 1)].document;
        n = n.substring(0,p);
    }
    if (!(x = d[n]) && d.all) x=d.all[n];
    for (i = 0; !x && i < d.forms.length; i++) x = d.forms[i][n];
    for (i = 0; !x && d.layers && i < d.layers.length; i++) x = MM_findObj(n, d.layers[i].document);
    if (!x && d.getElementById) x = d.getElementById(n);
    return x;
}

function MM_swapImage() { //v3.0
    var i, j = 0;
    var x, a = MM_swapImage.arguments;
    document.MM_sr = new Array;
    for (i = 0; i < (a.length - 2); i+=3) {
        if ((x = MM_findObj(a[i])) != null) {
            document.MM_sr[j++] = x;
            if (!x.oSrc) x.oSrc = x.src;
            x.src=a[i+2];
        }
    }
}
//-->
