﻿var Suche = new Class({
    initialize: function() {
        this._dialog = $('dialog-suche');
        this._sucheIn = new SucheIn();
        this._sucheNach = new SucheNach();
        this._standpunkte = new Suche.Standpunkte();
        this._standpunkte.addEvent('onLoaded', this.standpunkteAnzeigen.bind(this));
        this._geocoder = new GClientGeocoder();

        this.addEvents();
    },

    addEvents: function() {
        var btn1 = $$('#kopfzeile .menubar .suche')[0];
        btn1.addEvent('click', function() {
            karteninhalt.dialogSchliessen();
            this.dialogAnzeigen()
        } .bind(this));

        var btn2 = $$('#dialog-suche div.suche-nach .btn')[0];
        btn2.addEvent('click', function() { this.ausfuehren() } .bind(this));
    },

    dialogAnzeigen: function() {
        if (!this._dialog.hasClass('geschlossen')) {
            return;
        }

        this._dialog.removeClass('geschlossen')
    },

    dialogSchliessen: function() {
        if (this._dialog.hasClass('geschlossen')) {
            return;
        }

        this._dialog.addClass('geschlossen')
    },

    ausfuehren: function() {
        var sucheIn = this._sucheIn.getValues();
        if (sucheIn == "") {
            alert("Bitte wählen Sie eine Kategorie unter <<1. Suchen in>> aus.");
            return;
        }
        var sucheNach = this._sucheNach.getValue();
        if (sucheNach == "") {
            alert("Bitte geben Sie einen Suchbegriff unter <<2. Suchen nach>> ein.");
            this._sucheNach.setFocus();
            return;
        }

        if (sucheIn == "Adressen") {
            var adresse = sucheNach + ", 77815 Bühl, Deutschland";
            this._geocoder.getLocations(adresse, this.adresseAnzeigen.bind(this));
        }
        else
            this._standpunkte.laden(sucheIn, sucheNach);
    },

    adresseAnzeigen: function(response) {

        map.clearOverlays();
        if (!response || response.Status.code != 200) {
            alert("Leider konnten wir keine Adresse für:\n" + this._sucheNach.getValue() + "\nfinden.");
        } else {
            place = response.Placemark[0];
            point = new GLatLng(place.Point.coordinates[1],
                            place.Point.coordinates[0]);
            //marker = new GMarker(point);
            marker = new GMarker(point, {
                icon: gibIcon("suche_0", 30, 30),
                title: place.address
            });
            map.addOverlay(marker);
            map.panTo(point)

            var parent = $$('#inhalt .seite')[0];
            parent.empty();

            // HTML aufbauen
            var h1 = new Element('h1', { 'class': 'karteninhalt', 'html': '1 Adresse gefunden' });
            parent.grab(h1);

            var pos = place.address.indexOf(',');
            var arr = place.address.split(', ');

            var strasse = arr[0];
            var ort = arr[1];


            var ul = new Element('ul', { 'class': 'standpunkte' });
            var li = new Element('li', { 'class': 'suche_0' });
            var h3 = new Element('h3', { 'html': strasse });
            var a = new Element('a', { 'title': 'Standort in der Karte anzeigen', 'href': '#' });
            a.grab(h3);
            a.addEvent('click', function() {
                alert(place.adresse);
            } .bind(this));

            li.grab(a);
            var p = new Element('p', { 'html': ort });
            li.grab(p);
            ul.grab(li);

            parent.grab(ul);

        }

        this.dialogSchliessen();
    },

    standpunkteAnzeigen: function() {
        var items = this._standpunkte.items();
        if (items.length != 0) {
            var seiten = new Suche.Seiten(items);
            this.dialogSchliessen();
        }
        else
            alert("Leider konnten wir keine Eintrag für:\n" + this._sucheNach.getValue() + "\nfinden.");


    }


});

var SucheNach = new Class({
    initialize: function() {
        this._sucheNach = $$('#dialog-suche div.suche-nach')[0];
        this._text = this._sucheNach.getElements('input')[0];
        this._default = "Geben hier Sie Ihren Suchbegriff ein";
        this._text.value = this._default;
        this.addEvents();
    },

    addEvents: function() {
        this._text.addEvent('focus', function() { this.clear(); } .bind(this));
        this._text.addEvent('blur', function() { this.setDefault(); } .bind(this));
    },

    clear: function() {
        if (this._text.value == this._default)
            this._text.value = "";
    },

    setFocus: function() {
        this._text.focus();
    },

    setDefault: function() {
        if (this._text.value == "")
            this._text.value = this._default;
    },

    getValue: function() {
        if (this._text.value == this._default)
            return "";
        else
            return this._text.value;
    }

});

var SucheIn = new Class({
    initialize: function() {
        this._sucheIn = $$('#dialog-suche div.suche-in')[0];
        this._items = this._sucheIn.getElements('input');
        this.addEvents();
    },

    addEvents: function() {
        this._items.each(function(item, index) {
            item.addEvent('click', function() {
                this.setCheckbox(item.value, item.checked);
            } .bind(this));
        } .bind(this));
    },

    setCheckbox: function(value, checked) {
        if (value == "alle") {
            this._items.each(function(item, index) {
                if (item.value == "Adressen")
                    item.checked = !checked;
                else
                    item.checked = checked;
            });

        }
        if (value == "Adressen") {
            this._items.each(function(item, index) {
                if (item.value != "Adressen")
                    item.checked = !checked;
            });          

        }
        else if (value != "alle") {
            var item = this._items[1];
            item.checked = false;
        }
    },

    getValues: function() {
        var str = "";
        this._items.each(function(item, index) {
            if (index != 1 && item.checked)
                str += ";" + item.value;
        });

        if (str != "")
            str = str.substr(1);

        return str;
    }


});

Suche.Seiten = new Class({
    initialize: function(items) {
        this._items = items;
        this._pageSize = 10;
        this._itemsCount = this._items.length;
        this.anzeigen(1);
    },

    anzahl: function() {
        if (this._itemsCount == this._pageSize)
            return 1;
        else
            return (Math.ceil(this._itemsCount / this._pageSize));
    },

    first: function() {
        if (this.isDisabled(this._first))
            return;
        this._startIndex = 0;
        this._currentPage = 1;
    },

    prev: function() {
        if (this.isDisabled(this._prev))
            return;
        this._startIndex -= this._pageSize;
        this._currentPage -= 1;
    },

    next: function() {
        if (this.isDisabled(this._next))
            return;
        this._startIndex += this._pageSize;
        this._currentPage += 1;
    },

    last: function() {
        if (this.isDisabled(this._last))
            return;
        this._startIndex = (this.pageCount() - 1) * this._pageSize;
        this._currentPage = this.pageCount();
    },

    anzeigen: function(index) {
        this._aktuelleSeite = index;

        var currentItems = new Array();
        var startIndex = (this._aktuelleSeite - 1) * this._pageSize;
        var endIndex = startIndex + (this._pageSize - 1);
        if (endIndex > (this._itemsCount - 1))
            endIndex = this._itemsCount - 1

        // alle Marker entfernen
        map.clearOverlays();

        var parent = $$('#inhalt .seite')[0];
        parent.empty();

        // HTML aufbauen
        var h1 = new Element('h1', { 'class': 'karteninhalt', 'html': this._items.length + ' Standpunkte ermittelt' });
        parent.grab(h1);

        var ul = new Element('ul', { 'class': 'standpunkte' });
        var j = 0;
        for (var i = startIndex; i <= endIndex; i++) {
            currentItems.push(this._items[i]);

            this._items[i].setSymbol("suche_" + j);

            var li = this._items[i].getListItem();
            ul.grab(li);

            this._items[i].addMarkerToMap();

            j++;
        }
        zoomToExtend(currentItems);

        parent.grab(ul);
        parent.grab(this.menuleiste());

    },

    menuleiste: function() {
        var anz = this.anzahl()
        var div = new Element('div', { 'class': 'paging' });
        var span = new Element('span', { 'html': 'Seite ' + this._aktuelleSeite + ' von ' + anz });
        div.grab(span);

        for (var i = 0; i < anz; i++) {
            var a = new Element('a', { 'html': i + 1, 'href': '#' });
            if ((i + 1) == this._aktuelleSeite)
                a.addClass('aktiv');
            div.grab(a);
        }

        //Events
        var items = div.getElements('a');
        items.each(function(item, index) {
            item.addEvent('click', function() {
                this.anzeigen(index+1)
            } .bind(this));
        } .bind(this));

        return div;
    }

});

Suche.Standpunkte = new Class({
    Implements: Events,
    initialize: function() {
        this._items = new Array();
    },

    laden: function(sucheIn, sucheNach) {
        this.clear();
        var req = new Request({
            url: 'requests/suche.aspx',
            data: 'aktion=ausfuehren&sucheIn=' + sucheIn + '&sucheNach=' + sucheNach,
            onSuccess: function(str) {
                var res = new Results(str);
                //alert(str);
                if (res.getValue("Status") != "ok") {
                    alert(res.toString());
                    return;
                }

                var name = res.getValues("Name");
                var kategorie = res.getValues("Kategorie");
                var strasse = res.getValues("Strasse");
                var hausnummer = res.getValues("Hausnummer");
                var ortsteil = res.getValues("Ortsteil");
                var plz = res.getValues("PLZ");
                var vorwahl = res.getValues("Vorwahl");
                var telefon = res.getValues("Telefon");
                //var symbol = res.getValues("Symbol");
                //var symbolHoehe = res.getValues("SymbolHoehe");
                //var symbolBreite = res.getValues("SymbolBreite");
                var lat = res.getValues("breite");
                var lon = res.getValues("laenge");

                if (name!=null){
                    for (var i = 0; i < name.length; i++) {
                        var item = new Standpunkt();
                        item.setName(name[i]);
                        item.setKategorie(kategorie[i]);
                        item.setStrasse(strasse[i]);
                        item.setHausnummer(hausnummer[i]);
                        item.setOrtsteil(ortsteil[i]);
                        item.setPLZ(plz[i]);
                        item.setVorwahl(vorwahl[i]);
                        item.setTelefon(telefon[i]);
                        item.setSymbol("suche_" + i);
                        item.setSymbolHoehe(28);
                        item.setSymbolBreite(25);
                        item.setLat(lat[i]);
                        item.setLon(lon[i]);

                        this.add(item);
                    }
                 }
                this.fireEvent('onLoaded')

            } .bind(this),
            onFailure: function() {
                alert('Fehler bei <<standpunkte-laden>>');
            }
        });
        req.send();
    },

    add: function(obj) {
        this._items.push(obj);
    },

    items: function() {
        return this._items;
    },

    count: function() {
        if (typeof (this._items) == "undefined")
            return null;
        else
            return this._items.length;
    },

    clear: function() {
        this._items.empty();
    }
});
