// Google Maps Api Beispiele:
// http://econym.org.uk/gmap/custom.htm

// Polygon-Editor:
// http://gsak.net/google/polygoneditor.html





var sidebar_html = ""; // Inhalt der Seitenleiste
var markers = [];
var icons = [];
var htmls = [];
var map = null;
var PATH_MARKER_IMAGES = 'app/assets/marker/';


// TODO: Refactor
var aDtlBundeslaender = new Array(
{
    'land': 'Baden-Württemberg',
    'farbe': '',
    'lat': 48.693,
    'lng': 9.14,
    'zoom': 7
},
{
    'land': 'Bayern',
    'farbe': '',
    'lat': 49.040,
    'lng': 11.50,
    'zoom': 7
},
{
    'land': 'Berlin',
    'farbe': 'EF7F1A',
    'lat': 52.520,
    'lng': 13.386,
    'zoom': 10
},
{
    'land': 'Brandenburg',
    'farbe': 'F5B5D2',
    'lat': 52.480,
    'lng': 13.210,
    'zoom': 7
},
{
    'land': 'Bremen',
    'farbe': '',
    'lat': 53.079,
    'lng': 8.805,
    'zoom': 10
},
{
    'land': 'Hamburg',
    'farbe': '',
    'lat': 53.554,
    'lng': 9.997,
    'zoom': 9
},
{
    'land': 'Hessen',
    'farbe': '',
    'lat': 50.441,
    'lng': 9.030,
    'zoom': 7
},
{
    'land': 'Mecklenburg-Vorpommern',
    'farbe': 'F1DB00',
    'lat': 53.857,
    'lng': 12.600,
    'zoom': 7
},
{
    'land': 'Niedersachsen',
    'farbe': '00A8E7',
    'lat': 52.687,
    'lng': 8.991,
    'zoom': 7
},
{
    'land': 'Nordrhein-Westfalen',
    'farbe': '00A8E7',
    'lat': 51.489,
    'lng': 7.701,
    'zoom': 7
},
{
    'land': 'Rheinland-Pfalz',
    'farbe': '',
    'lat': 50.002,
    'lng': 7.508,
    'zoom': 7
},
{
    'land': 'Saarland',
    'farbe': '',
    'lat': 49.388,
    'lng': 6.943,
    'zoom': 8
},
{
    'land': 'Sachsen',
    'farbe': 'B0CB1F',
    'lat': 51.115,
    'lng': 13.452,
    'zoom': 7
},
{
    'land': 'Sachsen-Anhalt',
    'farbe': 'E51A4B',
    'lat': 52.030,
    'lng': 11.540,
    'zoom': 7
},
{
    'land': 'Schleswig-Holstein',
    'farbe': '',
    'lat': 54.131,
    'lng': 9.755,
    'zoom': 7
},
{
    'land': 'Thüringen',
    'farbe': 'FECC00',
    'lat': 50.873,
    'lng': 11.167,
    'zoom': 7
}
);

/* -----------------------------------------------------------------------------
 * O B J E K T E   U N D   C O N T A I N E R
 * ----------------------------------------------------------------------------- */

/*
 * Container-Objekt: Bundesländer
 * Hinzufügen von Städten zu Bundesländern
 * TODO: Refactor
 */
var Bundeslaender = {
    laender: new Array(),
    staedte: new Array(),
    addLand: function(land){
        this.laender.push(land);
        this.staedte[land] = new Array();
    },
    addStadt: function(land, stadt, point){
        if (!this.staedte[land])
        {
            this.addLand(land);
        }
        // @see http://api.jquery.com/jQuery.inArray/
        var found = false;
        jQuery.each(this.staedte[land],function(i,land){
           if (land.stadt == stadt)
               found = true;
        });
        
        //if (jQuery.inArray(stadt, this.staedte[land]) == -1)
        if (!found)
        {
            this.staedte[land].push({
                'stadt': stadt,
                'point': point
            });
        }
    },
    getLaender: function(){
        return this.laender;
    },
    hasStaedte: function(land){
        return jQuery.inArray(land, this.laender);
    },
    getStaedte: function(land){
        // @see http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/
        this.staedte[land].sort(function(a, b) {
            return (a.stadt < b.stadt) ? -1 : (a.stadt > b.stadt) ? 1 : 0;
        });
        return this.staedte[land];
    }
};
// @see http://api.jquery.com/jQuery.each/

/*
 * Objekt = eine Gästewohnung
 */
function Objekt(marker, point, bundesland, titel, plz, ort, strasse, anbieter, url, bilder, id, mail, bildtexte, onlinebuchung)
{
    this.marker     = marker;
    this.point      = point;
    this.bundesland = bundesland;
    this.titel      = titel;
    this.plz        = plz;
    this.ort        = ort;
    this.strasse    = strasse;
    this.anbieter   = anbieter;
    this.url        = url;
    this.bilder     = bilder;
    this.id         = id;
    this.mail       = mail;
    this.bildtexte  = bildtexte;
    this.onlinebuchung = onlinebuchung;

    /*
     * Liefert Array mit {'image': ?, 'thumb': ?} Objekten aller Bilder
     */
    this.getImages  = function(){
        var bilder = this.bilder.split(/:/);
        var texte = this.bildtexte.split(/¶/);
        var arr = new Array();
        for (var i=0;i<bilder.length;i++)
        {
            if (bilder[i] == '')
                continue;
            thumb = bilder[i].replace(/_gross./g, '_klein.');
            arr[arr.length] = {
                'image':bilder[i],
                'thumb':thumb,
                'text':texte[i]
            };
        }
        return arr;
    };
}

/*
 * Container-Objekt - Gästewohnungspool
 */
var Gaestewohnungspool = {
    objekte: new Array(),
    objekte_by_id: new Array(),
    addObjekt: function(objekt){
        this.objekte_by_id[objekt.id] = objekt;
        if (!this.objekte[objekt.bundesland])
        {
            this.objekte[objekt.bundesland] = new Array();
        }
        if(!this.objekte[objekt.bundesland][objekt.ort])
        {
            this.objekte[objekt.bundesland][objekt.ort] = new Array();
        }
        this.objekte[objekt.bundesland][objekt.ort].push(objekt);
    }
};

/* -----------------------------------------------------------------------------
 * A U S G A B E F U N K T I O N E N
 * ----------------------------------------------------------------------------- */

function hideAll()
{
    $("#display_orte").hide();
    $("#display_bundeslaender").hide();
    $("#display_anfrage").hide();
    $("#display_anfrage_danke").hide();
    $("#back-deutschlandkarte").hide();
    $("#display_gaestewohnung").hide();
    $("#back-bundeslandkarte").hide();
    $("#display_anfrage_error").hide();
}

function outputBewertung(bewertung)
{
    var output = "<dt>"+bewertung.name+"";
    output += '<div class="sterne">';
    for(var i=1; i<=bewertung.mittel; i++)
    {
        output += '<img src="/app/assets/images/award_star_gold_1.png" />';
    }
    output += '</div>';

    output += "</dt>";
    output += "<dd>"+bewertung.kommentar+"</dd>";
    return output;
}

/*
 * Anzeige einer Gästewohnung
 * -----------------------------------------------------------------------------
 */
function displayGaestewohnung(obj, id)
{

    if (id)
    {
        obj = Gaestewohnungspool.objekte_by_id[id];
    }
    $("#gaestewohnung-titel").html(obj.titel);
    $("#adresse").html(obj.strasse + "<br />" + obj.plz + ' ' + obj.ort + "<br />");
    $("#button-gaestebucheintrag").attr('href', 'gaestebuch.php?do=gaestewohnung&objekt='+obj.id);
    $("#button-gaestebuch").attr('href', 'gaestebuch.php?do=filter&hide_layout=true&objekt='+obj.id);
    $("#bewertung_gaestewohnung_id").val(obj.id);
    
    $.get('/dispatch.php?do=count-gaestebucheintraege&gaestewohnung_id='+obj.id, function(data){
        var text = '';
        if (data == 0)
            $("#button-gaestebuch").hide();
        else if (data == 1)
            $("#button-gaestebuch").html(data + ' Gästebucheintrag vorhanden').show();
        else
            $("#button-gaestebuch").html(data + ' Gästebucheinträge vorhanden').show();
    });

    $.get('/dispatch.php?do=bewertung-mittel&gaestewohnung_id='+obj.id, function(data){
        if (data == 0)
            {
                $("#gaestewohnung-bewertung-gesamt").hide();
                $("h3#liste-bewertungen").hide();
                return;
            }
            
        var output = 'Bewertung: ';
        for(var i=1; i<=data; i++)
        {
            //output += '<img src="/app/assets/images/award_star_gold_1.png" />';
            output += '<span class="stern-gold">&nbsp;</span>'
        }
        for(var i=data; i<5; i++)
        {
            //output += '<img src="/app/assets/images/award_star_gold_1.png" />';
            output += '<span class="stern-semi">&nbsp;</span>'
        }

        $("#gaestewohnung-bewertung-gesamt").html(output);
        $("#gaestewohnung-bewertung-gesamt").show();
        $("h3#liste-bewertungen").show();
        
    });

    // ·········································································
    // Ausgabe der Bewertungskommentare
    // ·········································································
    $.getJSON('/dispatch.php?do=bewertungen&gaestewohnung_id='+obj.id, function(data){
        var output = '';
        var text = ''
        if (data.anzahl == 0)
            text = '';
        else if (data.anzahl == 1)
            text += "<p>Es wurde "+data.anzahl+' Bewertung abgegeben:</p>';
        else
            text += "<p>Es wurden insgesamt "+data.anzahl+' Bewertungen abgegeben:</p>';
        
        output += text + '<dl class="liste-bewertungen">';
        
        // Ausgabe der Einträge, die einen Kommentar enthalten:
        $.each(data.bewertungen, function(index, bewertung){
                {
                    output += outputBewertung(bewertung);
                }
        });

        $("#uebersicht-bewertungen").html(output+"</dl>");
    });


    $("#anbieter").html(obj.anbieter);
    if (obj.url)
    {
        $("#url a").attr('href', obj.url);
        $("#url").show();
    }
    else
    {
        $("#url").hide();
    }
    $("#bilder").html("");

    if (obj.onlinebuchung == 1)
        $("#onlinebuchung").show();
    else
        $("#onlinebuchung").hide();

    //var arrBilder = getImages (obj.bilder);
    var arrBilder = obj.getImages();
    var galerie = '<div class="galerie">';
    jQuery.each(arrBilder,function(i,bild){
        if (i % 3 == 0)
        {
            galerie += '<div style="clear:left;height: 20px;"></div>';
        }
        galerie += '<div class="objektbild">';
        galerie += '<a href="app/assets/objektfotos/' + bild.image + '" rel="lightbox">';
        galerie += '<img src="app/assets/objektfotos/' + bild.thumb + '" class="objektfotos" /></a> ';
        if (bild.text)
            galerie += '<p>' + bild.text + '</p>';
        galerie += '</div>';
    });
    $("#bilder").html(galerie);

    $(".galerie a").fancybox({
        'titleShow'     : false,
        'transitionIn'	: 'elastic',
        'transitionOut'	: 'elastic'
    });

    map.setCenter(obj.point, 15);

    $("#button-buchungsanfrage").unbind("click");

    //console.log(obj);
    if (obj.mail != '')
    {
        $("#button-buchungsanfrage").show();
        $("#button-buchungsanfrage").click(function(){
            display_buchungsanfrage(obj);
        });
    }
    else
    {
        $("#button-buchungsanfrage").hide();
    }
    // TODO: Kapseln
    hideAll();
    $("#display_gaestewohnung").fadeIn("fast");
    $("#back-bundeslandkarte").attr("href", 'javascript:displayBundesland(0, "' + obj.bundesland + '");');
    $("#back-bundeslandkarte .bundesland-name").html(obj.bundesland);
    $("#back-bundeslandkarte").fadeIn("slow");
}

function display_buchungsanfrage(obj)
{
    var objekt = obj.plz + " " + obj.ort + " " + obj.strasse; // + " (" + obj.titel + ")";
    //name
    //telefon
    //anschrift
    //email
    $("#anreise").val("");
    $("#abreise").val("");
    $("#personen").val("");
    $("#mitteilung").val("");
    $("#gaestewohnung").val(objekt);
    $("#gaestewohnung_id").val(obj.id);
    $("#gaestewohnung_view").val(objekt);

    if (obj.onlinebuchung == true)
        $("#onlinebuchung_moeglich").html("Bei diesem Anbieter sind Onlinebuchungen <strong>m&ouml;glich</strong>.");
    else
        $("#onlinebuchung_moeglich").html("Bei diesem Anbieter sind Onlinebuchungen <strong>nicht m&ouml;glich</strong>.");
    
    hideAll();
    $("#display_anfrage").fadeIn("fast");

    $("#form_buchungsanfrage").unbind("submit");
    $("#form_buchungsanfrage").submit(function(){
        // Daten serialisieren
        var d = {
            'do': 'buchungsanfrage',
            'name': $("#form_buchungsanfrage #name").val(),
            'mail_to': obj.mail,
            'anschrift': $("#form_buchungsanfrage #anschrift").val(),
            'telefon': $("#form_buchungsanfrage #telefon").val(),
            'email': $("#form_buchungsanfrage #email").val(),
            'anreise': $("#form_buchungsanfrage #anreise").val(),
            'abreise': $("#form_buchungsanfrage #abreise").val(),
            'personen': $("#form_buchungsanfrage #personen").val(),
            'mitteilung': $("#form_buchungsanfrage #mitteilung").val(),
            'gaestewohnung': $("#form_buchungsanfrage #gaestewohnung").val(),
            'gaestewohnung_id': $("#form_buchungsanfrage #gaestewohnung_id").val()
        };

        var s = jQuery.param(d);
        $.ajax({
            type: "GET",
            url: "app/lib/servicebroker.php",
            data: s,
            dataType: "script"
        });
        
        return false;
    });
}

function displayBuchungsanfrageDanke()
{
    hideAll();
    $("#display_anfrage_danke").fadeIn("fast");
}

function displayBuchungsanfrageError()
{
    hideAll();
    $("#display_anfrage_error").fadeIn("fast");
}

// Marker hervorheben
function highlight(id, bool)
{
    obj = Gaestewohnungspool.objekte_by_id[id];
    if(bool)
    {
        obj.marker.setImage(PATH_MARKER_IMAGES+'home_highlight.png');
    }
    else
    {
        obj.marker.setImage(PATH_MARKER_IMAGES+'home.png');
    }
}

/*
 * Anzeige eines Bundeslandes mit Zentrierung der Karte und Ausgabe der Orte
 * -----------------------------------------------------------------------------
 */
function displayBundesland(bundesland_id, bundesland_text)
{
    var bundesland;
    if (bundesland_text)
    {
        jQuery.each(aDtlBundeslaender,function(i,l){
            if (l["land"] == bundesland_text)
                bundesland = aDtlBundeslaender[i];
        });
    }
    else
    {
        bundesland = aDtlBundeslaender[bundesland_id];
    }
    var staedte = Bundeslaender.getStaedte(bundesland["land"]);

    var html = ''; //<a href="javascript:displayBundeslaender();">Zur Deutschlandkarte</a><br />';
    html += '<h2>' + bundesland["land"] + '</h2>';
    html += '<ul class="staedte">';
    jQuery.each(staedte, function(i,struct){
        
        var point = struct['point'];
        html = html + '<li><a href="#" onclick="map.setCenter(new GLatLng(' + point.lat() + ',' + point.lng() + '),12)">' + struct['stadt'] + '</a><br />';
        jQuery.each(Gaestewohnungspool.objekte[bundesland["land"]][struct['stadt']], function(i, obj){
            html += '<a id="objekt-link-'+obj.id+'" class="gaestewohnung-objekt-link" onmouseover="highlight('+obj.id+',true)" onmouseout="highlight('+obj.id+',false)" href="javascript:displayGaestewohnung(null, ' + obj.id + ')">';
            html += obj.strasse + " in " + obj.ort;
            html += "</a>";
            if (obj.anbieter != undefined)
            {
                var x = obj.anbieter.split("<br />");
            }
            else { var x = ''; }
            
            html += '<br /><small class="gaestewohnung-objekt-wg">'+x[0]+'</small>';
            html += "";
        });

        html += '</li>';
    });

    //console.log(Gaestewohnungspool);

    html += '</ul>';
    map.setCenter(new GLatLng(bundesland["lat"],bundesland["lng"]), bundesland["zoom"]);
    $("#display_orte").html(html);

    // TODO: Kaspeln

    hideAll();
    $("#display_orte").fadeIn("slow");
    $("#back-deutschlandkarte").attr("href", "javascript:displayBundeslaender();");
    $("#back-deutschlandkarte").fadeIn("slow");
}



/*
 * Ausgabe aller Bundesländer als Linkliste + Zentrierung der Karte auf
 * ganz Deutschland
 * -----------------------------------------------------------------------------
 */
function displayBundeslaender()
{
    hideAll();
    
    // Erzeugen der Ausgabe der Bundesländer
    // -------------------------------------------------------------------
    var spalte1 = $("#display_bundeslaender .spalte1 ul");
    var spalte2 = $("#display_bundeslaender .spalte2 ul");
    var html_spalte1 = '';
    var html_spalte2 = '';
    jQuery.each(aDtlBundeslaender,function(i,val){
        var html = '<li>';
        if (Bundeslaender.hasStaedte(val["land"]) != -1)
        {
            //console.log(val);
            html = html + '<a href="javascript:displayBundesland(' + i + ');">' + val["land"] + '</a>';
            //Overlay-Daten für Bundesländer nachladen
            
            $.ajax({
                type: "GET",
                url: "app/lib/servicebroker.php",
                data: "do=polygone&bundesland="+val["land"]+"&farbe="+val["farbe"],
                dataType: "script"
            });
        }
        else
        {
            html = html + val["land"];
        }
        html = html + '</li>';
        if (i<8)
        {
            html_spalte1 = html_spalte1 + html;
        }
        else
        {
            html_spalte2 = html_spalte2 + html;
        }
    });
    spalte1.html(html_spalte1);
    spalte2.html(html_spalte2);

    $("#display_bundeslaender").fadeIn("slow");
    map.setCenter(new GLatLng( 51.2, 11), 5);
}


/*
// Ein- bzw. Ausblenden der Marker einer Kategorie
function toggleCategory (checkbox, category)
{
    if (checkbox.checked)
    {
        showCategory (category);
    }
    else
    {
        hideCategory (category);
    }
}

// Einblenden aller Marker einer Kategorie
function showCategory (category)
{
    markers.each (function (m) {
        if (m.mycategory == category) m.show ();
    });
}

// Versteckt alle Marker einer Kategorie
function hideCategory (category)
{
    markers.each (function (m) {
        if (m.mycategory == category) m.hide ();
    });
    map.closeInfoWindow ();
}
*/

/* -----------------------------------------------------------------------------
 * INIT
 * ----------------------------------------------------------------------------- */



