/*
Autor:   Thomas Konrad
Version: 1.5b
Datum:   09.01.2011
*/

var Meldung = Class.create(
{
  initialize: function ()
  {
    this.idSafe = 0;
    this.voegel = new Array();
    this.errorContainer = new Hash();
    this.currentId = 0;
    this.taskFinished = false;
    this.extraText = '';
    this.controlState = false;
    this.loadedMeldung = '';
    this.maxVogel = [15, 2];

    //0 = optional, 1 = Pflicht, 2 = Pflicht mit Auswahlmenge
    this.dataPreset = new Hash(
    {
      artname: new Array(2, /^[a-zA-Z\- \(\)]*$/, 'Nur Artnamen aus der Liste sind erlaubt'),
      datum: new Array(1, /^(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d\d$/, 'Datum muss das Format TT.MM.JJJJ haben, z.B. 31.12.2009. Keine Daten in der Zukunft'), //Achtung: nicht dynamisch!
      gemeinde: new Array(1, /^[a-zA-Z\- ]*$/, 'Es sind nur Buchstaben, Leerzeichen und "-" erlaubt'),
      kreis: new Array(2, /^[a-zA-Z ()]*$/, 'Bitte w&auml;hlen Sie eine Option aus der Liste'),
      gewann: new Array(0, /^[a-zA-Z0-9.\- ]*$/, 'Es sind nur Buchstaben, Zahlen, Leerzeichen und "-" erlaubt'),
      anzahl_q: new Array(2, /^[a-zA-Z. ]*$/, 'Bitte w&auml;hlen Sie eine Option aus der Liste'),
      anzahl_n: new Array(1, /^[0-9]*$/, 'Es sind nur Zahlen erlaubt'),
      verhalten: new Array(0, /^[a-zA-Z0-9 ,.+\-:]{0,100}$/, 'Es sind Buchstaben, Zahlen, Leerzeichen und "-+:,." erlaubt (100 Zeichen)'),
      beobachter: new Array(1, /^[a-zA-Z ;.]{0,100}$/, 'Es sind Buchstaben, Leerzeichen und ";" erlaubt (100 Zeichen)'),
      bemerkungen: new Array(0, /^[a-zA-Z0-9 ,.;]{0,150}$/, 'Es sind Buchstaben, Zahlen, Leerzeichen und ",;." erlaubt (150 Zeichen)'),
      longi: new Array(1, /^[EW]: [0-9]{1,3}. [0-9]{1,2}\.[0-9]{1,3}'$/, 'Google Maps Karte benutzen'),
      lat: new Array(1, /^[SN]: [0-9]{1,3}. [0-9]{1,2}\.[0-9]{1,3}'$/, 'Google Maps Karte benutzen'),
      alt: new Array(1, /^[0-9]*m$/, 'Google Maps Karte benutzen')
    });

    this.loadOptions('artname');
    this.loadOptions('anzahl_q');
    this.loadOptions('kreis');
    this.iniLoad();
  },
  addVogel: function (force)
  {
    if (!force)
      if (!this.validateAll())
        return;

    //this.voegel.push(new vogel(this.dataPreset));
    this.voegel[this.idSafe] = new vogel(this.dataPreset);

    this.addButton(this.idSafe);
    this.extraText = 'Neue Vogeldaten hinzugef&uuml;gt. ';
    if (!force)
      this.setVogel(this.idSafe);
    this.idSafe++;
  },
  addButton: function (id)
  {
    var ele = new Element('div', { 'class': 'vogel', 'id': 'vogel_' + id }).update("- Neu -");
    $('voegel').appendChild(ele);

    Event.observe('vogel_' + id, 'click', function(event)
    {
      if (this.validateMaxVogel())
        this.setVogel(id);
    }.bind(this));
  },
  removeButton: function (id)
  {
    $('vogel_' + id).remove();
  },
  updateData: function (e)
  {
    if (this.validate(e))
    {
      this.setInputColour(e, 1);
      this.updateInfo(e, 1);
    }

    this.voegel[this.currentId].setValue(e, $F(e));
  },
  updateKoord: function (p)
  {
    this.voegel[this.currentId].koord = p;
  },
  setInputs: function (id)
  {
    this.getDataKeys().each(function (e)
    {
      $(e).value = this.voegel[id].get(e);
      this.setInputColour(e, 1, true);
    }.bind(this));
  },
  setVogel: function (id)
  {
    if (!this.controlState)
      if (!this.validateAll())
        return;

    if (this.idSafe != 0 && !this.controlState)
    {
      this.setLoading(0);
      this.sendVogel('vogel');
      this.taskFinished = false;
      watch_pe = new PeriodicalExecuter(function () { watchLoader(new Array(this.taskFinished), function () { this.voegel[this.currentId].isValid = true; this.setLoading(1); this.doSetVogel(id); this.updateInfo(this.extraText + 'Bisherige Meldung wurde zwischengespeichert', 3); this.extraText = ''; }.bind(this) ); }.bind(this), 0.1);
    }
    else
      this.doSetVogel (id);
  },
  doSetVogel: function (id)
  {
    this.setInputs (id);
    this.selectButton (id);
    if (gm_map && gm_marker) gm_marker.setMap(null);
    this.currentId = id;
    if (this.voegel[id].koord)
    {
      gm_newMarker(this.voegel[id].koord);
      gm_map.setCenter(this.voegel[id].koord);
    }
  },
  getDataKeys: function ()
  {
    return this.dataPreset.keys();
  },
  selectButton: function (id)
  {
    $$('.vogel', '.vogel_s').each(function (e)
    {
      e.className = (e.id == 'vogel_' + id) ? 'vogel_s' : 'vogel';
    });
  },
  setLoading: function (mode)
  {
    if (mode == 1)
      $('load_img').hide();
    else
      $('load_img').show();
  },
  validate: function (e)
  {
    v = $F(e);

    //Pflichtfeld darf nicht leer sein
    if (v == '' && this.dataPreset.get(e)[0] == 1)
    {
      this.errorM(e, 0);
      return false;
    }

    //Bei Auswahlmengen muss ein Element der Menge ausgewählt sein
    if (this.dataPreset.get(e)[0] == 2)
    {
      if (this.dataPreset.get(e)[3].indexOfX(v) == -1)
      {
        this.errorM(e, 1);
        return false;
      }
    }

    //erlaubte Sonderzeichen umwandeln, dank JS funktionieren nur die Unicodebezeichnungen
    v = v.replace(/\u00DF/g, "ss").replace(/\u00E4/g, 'ae').replace(/\u00C4/g, 'Ae').replace(/\u00F6/g, 'oe').replace(/\u00D6/g, 'Oe').replace(/\u00FC/g, 'ue').replace(/\u00DC/g, 'Ue');

    if (this.dataPreset.get(e)[1].test(v))
    {
      //Datum Extrawurst
      if (e == 'datum')
      {
        var date_o = v.split('.');
        var date_s = new Date(date_o[2], date_o[1]-1, date_o[0]);
        var date_m = new Date();
        if (date_s > date_m || (date_o[2] != date_s.getFullYear() || (date_o[1] - 1) != date_s.getMonth() || date_o[0] != date_s.getDate()))
        {
          this.errorM(e, 1);
          return false;
        }
      }

      this.errorM(e, 2);
      return true;
    }

    this.errorM(e, 1);
    return false;
  },
  validateAll: function ()
  {
    if (this.idSafe == 0)
      return true;

    var notValid = false;
    this.getDataKeys().each(function (e)
    {
      if (!this.validate(e))
      {
        this.setInputColour(e, 2);
        notValid = true;
      }
    }.bind(this));

    if (notValid)
    {
      fb_alert('Fehler', 'Es sind Fehler aufgetreten.<br />Bitte korrigieren Sie zun&auml;chst alle rot-markierten Felder.', 'Verstanden', 'fb_hide(1);');
      return false;
    }

    return true;
  },
  validateMaxVogel: function ()
  {
    try
    {
      var melde = (this.dataPreset.get('artname')[3][this.dataPreset.get('artname')[3].indexOfX($F('artname'))][2] == 1) ? 1 : 0;
      if (this.getVogelCount(melde) > this.maxVogel[melde])
      {
        fb_alert('Achtung', 'Sie haben die maximale Anzahl an Vogeldaten in dieser Meldung &uuml;berschritten. Sie k&ouml;nnen maximal ' + this.maxVogel[1] + ' meldepflichtige und ' + this.maxVogel[0] + ' nicht-meldepflichtige V&ouml;geldaten angeben.<br />Sollten Sie mehr Vogeldaten melden wollen, schicken Sie die bisherige Meldung bitte ab und erstellen eine weitere Meldung.', 'Verstanden', 'fb_hide(1);');
        $('artname').value = '';
        return false;
      }
    }
    catch (e)
    {
      return true;
    }

    return true;
  },
  loadOptions: function (list)
  {
    new Ajax.Request('ajax.php',
    {
      method: 'post',
      parameters:
      {
        'infotask': list
      },
      onSuccess: function (r)
      {
        var f = r.responseText.evalJSON();
        var a = this.dataPreset.get(list);
        a.push(f);
        this.dataPreset.set(list, a);

        //Liste erstellen
        var s = '';
        f.each(function (e)
        {
          s += '<option';
          if (list == 'artname' && e[2] == 1)
            s += ' class="mpflicht"'
          s += '>' + e[0] + '</option>';
        });
        $('liste_' + list).update(s);
      }.bind(this)
    });
  },
  //type: 0: Pflichtfeld fehlt, 1: Custom Fehler, 2: Fehler löschen
  errorM: function (e, type)
  {
    switch (type)
    {
      case 0:
        var b = 'Bitte dieses Pflichtfeld ausf&uuml;llen';
        break;

      case 1:
        var b = this.dataPreset.get(e)[2];
        break;

      case 2:
        var b = '';
        break;
    }

    this.errorContainer.set(e, b);
  },
  //type: 1: error, 2: notice, 3: success
  updateInfo: function (e, type)
  {
    switch (type)
    {
      case 1:
        var b = this.errorContainer.get(e);
        var c = '#c23347';
        break;

      case 2:
        var b = e;
        var c = '#d9a60d';
        break;

      case 3:
        var b = e;
        var c = '#00cc33';
        break;
    }
    $('infoline').update(b);
    $('infoline').setStyle({
      color: c
    });
  },
  sendVogel: function (task)
  {
    new Ajax.Request('ajax.php',
    {
      method: 'post',
      parameters: this.voegel[this.currentId].getAll().merge({ savetask: task, vid: this.currentId }),
      onSuccess: function (r)
      {
        if (r.responseText == '1')
          this.taskFinished = true;
        else
        {
          watch_pe.stop();
          fb_alert('Kritischer Fehler [01]', 'Beim &Uuml;bertragen ist ein Fehler aufgetreten. <br /><br />Aus technischen Gr&uuml;nden muss das Melden unterbrochen werden. Sie werden nun zur Startseite weitergeleitet, alle bereits gespeicherten V&ouml;gel k&ouml;nnen beim n&auml;chsten Aufruf des Meldezentrums wieder geladen werden.<br />Sollte der Fehler erneut auftreten, benachrichtigen Sie bitte den Administrator (info@meldezentrum.fosor.de).', 'Verstanden', 'window.location.href = \'index.php\';');
        }
      }.bind(this)
    });
  },
  deleteVogel: function ()
  {
    if (this.getVogelCount() == 1)
    {
      this.deleteMeldung();
      return;
    }

    fb_alert('Vogel l&ouml;schen', 'M&ouml;chten Sie die aktuellen Vogeldaten wirklich aus der Meldung l&ouml;schen?', 'L&ouml;schen', 'fb_hide(1); meldung.doDeleteVogel();', 'Abbrechen', 'fb_hide(1);');
  },
  doDeleteVogel: function ()
  {
    this.taskFinished = false;
    this.setLoading(0);
    watch_pe = new PeriodicalExecuter(function () { watchLoader(new Array(this.taskFinished), function () { this.voegel[this.currentId].isDeleted = true; this.setLoading(1); this.removeButton(this.currentId); this.doSetVogel(this.getHighestVid(this.currentId)); this.updateInfo('Vogel wurde aus der Meldung gel&ouml;scht', 3); }.bind(this) ); }.bind(this), 0.1);

    //Vogel überhaupt schon in DB?
    if (this.voegel[this.currentId].isValid)
    {
      new Ajax.Request('ajax.php',
      {
        method: 'post',
        parameters:
        {
          savetask: 'delete',
          vid: this.currentId
        },
        onSuccess: function (r)
        {
          if (r.responseText == '1')
            this.taskFinished = true;
          else
          {
            watch_pe.stop();
            fb_alert('Kritischer Fehler [02]', 'Beim L&ouml;schen ist ein Fehler aufgetreten. <br /><br />Aus technischen Gr&uuml;nden muss das Melden unterbrochen werden. Sie werden nun zur Startseite weitergeleitet, alle bereits gespeicherten V&ouml;gel k&ouml;nnen beim n&auml;chsten Aufruf des Meldezentrums wieder geladen werden.<br />Sollte der Fehler erneut auftreten, benachrichtigen Sie bitte den Administrator (info@meldezentrum.fosor.de).', 'Verstanden', 'window.location.href = \'index.php\';');
          }
        }.bind(this)
      });
    }
    else
    {
      this.taskFinished = true;
    }
  },
  breakMeldung: function ()
  {
    fb_alert('Meldung verlassen', 'M&ouml;chten Sie die Meldung wirklich verlassen?', 'Verlassen und L&ouml;schen', 'meldung.doDeleteMeldung();', 'Nur Verlassen', 'window.location.href=\'index.php\';', 'Abbrechen', 'fb_hide(1);');
  },
  deleteMeldung: function (force)
  {
    if (force)
      this.doDeleteMeldung(force);
    else
      fb_alert('Meldung l&ouml;schen', 'M&ouml;chten Sie die gesamte Meldung wirklich l&ouml;schen?', 'L&ouml;schen', 'meldung.doDeleteMeldung();', 'Abbrechen', 'fb_hide(1);');
  },
  doDeleteMeldung: function (force)
  {
    meldung.setLoading(0);
    new Ajax.Request('ajax.php',
    {
      method: 'post',
      parameters:
      {
        savetask: 'deleteAll'
      },
      onSuccess: function (r)
      {
        if (r.responseText == '1')
        {
          if (!force)
            window.location.href = 'http://meldezentrum.fosor.de/';
        }
        else
          fb_alert('Kritischer Fehler [03]', 'Beim L&ouml;schen ist ein Fehler aufgetreten. <br /><br />Aus technischen Gr&uuml;nden muss das Melden unterbrochen werden. Sie werden nun zur Startseite weitergeleitet, alle bereits gespeicherten V&ouml;gel k&ouml;nnen beim n&auml;chsten Aufruf des Meldezentrums wieder geladen werden.<br />Sollte der Fehler erneut auftreten, benachrichtigen Sie bitte den Administrator (info@meldezentrum.fosor.de).', 'Verstanden', 'window.location.href = \'index.php\';');
      }.bind(this)
    });
  },
  //gibt -1 zurück, wenn kein Vogel verbleibt
  getHighestVid: function (exclude)
  {
    var hvid = -1;
    var count = 0;
    this.voegel.each(function (v)
    {
      if (!v.isDeleted)
      {
        if (count != exclude)
          hvid = count;
      }
      count++;
    });
    return hvid;
  },
  getVogelCount: function (melde)
  {
    count = 0;
    this.voegel.each(function (v)
    {
      if (!v.isDeleted)
      {
        if (melde === 1 || melde === 0)
        {
          if (this.dataPreset.get('artname')[3][this.dataPreset.get('artname')[3].indexOfX(v.get('artname'))][2] === melde)
            count++;
        }
        else
          count++;
      }
    }.bind(this));
    return count;
  },
  iniLoad: function ()
  {
    new Ajax.Request('ajax.php',
    {
      method: 'post',
      parameters:
      {
        savetask: 'load'
      },
      onSuccess: function (r)
      {
        if (r.responseText != '0')
        {
          try
          {
            this.loadedMeldung = r.responseText.evalJSON();
          }
          catch (e)
          {
            fb_alert('Kritischer Fehler [04]', 'Beim Laden ist ein Fehler aufgetreten. <br /><br />Aus technischen Gr&uuml;nden muss das Melden unterbrochen werden. Sie werden nun zur Startseite weitergeleitet, bitte versuchen Sie es erneut.<br />Sollte der Fehler erneut auftreten, benachrichtigen Sie bitte den Administrator (info@meldezentrum.fosor.de).', 'Verstanden', 'window.location.href = \'index.php\';');
          }

          fb_alert('Meldung laden', 'Es wurde eine zwischengespeicherte, unfertige Meldung gefunden. M&ouml;chten Sie diese Meldung weiter bearbeiten?', 'Meldung laden', 'fb_hide(1); meldung.handleLoad();', 'Verwerfen und neue Meldung', 'fb_hide(1); meldung.noLoad();');
        }
        else
        {
          this.addVogel();
          this.taskFinished = true;
        }
      }.bind(this)
    });
  },
  noLoad: function ()
  {
    this.deleteMeldung(true);
    this.addVogel();
    this.taskFinished = true;
  },
  handleLoad: function (f)
  {
    if (!f)
      var f = this.loadedMeldung;
    e = $H(f.shift());

    this.idSafe = e.unset('vid');
    this.currentId = this.idSafe;
    this.addVogel(true);
    e.each(function (g)
    {
      if (g.key == 'anzahl_n' && g.value == '0')
        g.value = '';
      this.voegel[this.currentId].setValue(g.key, g.value);
    }.bind(this));
    this.voegel[this.currentId].isValid = true;
    $('vogel_' + meldung.currentId).update(displayArtname(e.get('artname')));
    var options =
    {
      address: e.get('lat').replace(':', '').replace('\'', '') + ' ' + e.get('longi').replace(':', '').replace('\'', '')
    };
    gm_geocoder.geocode(options, function(results, status)
    {
      if (status == google.maps.GeocoderStatus.OK)
      {
        this.voegel[this.currentId].koord = results[0].geometry.location;
        gm_map.setCenter(results[0].geometry.location);
        gm_map.setZoom(13);
      }
      this.doSetVogel(this.currentId);
      if (f.size() != 0)
        this.handleLoad(f);
      else
      {
        this.updateInfo('Alte Meldung wurde wiederhergestellt', 3);
        this.extraText = '';
        this.taskFinished = true;
      }
    }.bind(this));
  },
  progress: function (m)
  {
    switch (m)
    {
      case -1:

        fb_hide();
        this.controlState = false;
        this.updateInfo('Sie k&ouml;nnen nun weitere &Auml;nderungen vornehmen', 2);
        $('abbruch').show();
        $('next').show();
        $('delete').show();
        $('further').show();
        $('back').hide();
        $('sendit').hide();
        break;

      case 1:

        if (!this.validateAll())
          return;

        this.setLoading(0);
        this.sendVogel('vogel');
        this.taskFinished = false;
        watch_pe = new PeriodicalExecuter(function () { watchLoader(new Array(this.taskFinished), function () { this.voegel[this.currentId].isValid = true; this.setLoading(1); this.progress(2); }.bind(this) ); }.bind(this), 0.1);
        break;

      case 2:

        fb_show('container2', 'Um zwischen den V&ouml;geln zu wechseln, nutzen Sie die Buttons oben. Mit den unteren Buttons k&ouml;nnen Sie die Meldung wieder bearbeiten oder sie endg&uuml;ltig abschicken');
        this.controlState = true;
        this.updateInfo('Bitte kontrollieren Sie Ihre Meldung nochmals. Durch einen weiteren Klick unten wird die Meldung abgeschickt', 2);
        $('abbruch').hide();
        $('next').hide();
        $('delete').hide();
        $('further').hide();
        $('back').show();
        $('sendit').show();
        break;
    }
  },
  finish: function ()
  {
    var fehler = false;
    this.voegel.each(function (e)
    {
      if (!e.isDeleted)
        if (!e.isValid)
          fehler = true;
    }.bind(this));

    if (fehler)
    {
      fb_alert('Kritischer Fehler [05]', 'Aus technischen Gr&uuml;nden muss das Melden unterbrochen werden. Sie werden nun zur Startseite weitergeleitet, alle bereits gespeicherten V&ouml;gel k&ouml;nnen beim n&auml;chsten Aufruf des Meldezentrums wieder geladen werden.<br />Sollte der Fehler erneut auftreten, benachrichtigen Sie bitte den Administrator (info@meldezentrum.fosor.de).', 'Verstanden', 'window.location.href = \'index.php\';');
      return
    }

    new Ajax.Request('ajax.php',
    {
      method: 'post',
      parameters:
      {
        savetask: 'finish'
      },
      onSuccess: function (r)
      {
        if (r.responseText == '1')
          this.taskFinished = true;
        else
        {
          watch_pe.stop();
          fb_alert('Kritischer Fehler [06]', 'Beim Speichern ist ein Fehler aufgetreten. <br /><br />Aus technischen Gr&uuml;nden muss das Melden unterbrochen werden. Sie werden nun zur Startseite weitergeleitet, alle bereits gespeicherten V&ouml;gel k&ouml;nnen beim n&auml;chsten Aufruf des Meldezentrums wieder geladen werden.<br />Sollte der Fehler erneut auftreten, benachrichtigen Sie bitte den Administrator (info@meldezentrum.fosor.de).', 'Verstanden', 'window.location.href = \'index.php\';');
        }
      }.bind(this)
    });

    this.taskFinished = false;
    watch_pe = new PeriodicalExecuter(function () { watchLoader(new Array(this.taskFinished), function () { this.setLoading(1); window.location.href = 'index.php?page=finish'; }.bind(this) ); }.bind(this), 0.1);
  },
  setInputColour: function (e, mode, notFocused)
  {
    switch (mode)
    {
      case 1:

        var bg = '';
        var bo = '';
        break;

      case 2:

        var bg = '#f4e6e8';
        var bo = '1px solid #c23347';
        break;
    }
    if (!Prototype.Browser.IE || mode == 2)
    {
      Element.setStyle($(e),
      {
        backgroundColor: bg,
        border: bo
      });
      if (Prototype.Browser.IE)
      {
        Event.stopObserving($(e), 'focus', ie_style_foc_on);
        Event.stopObserving($(e), 'mouseover', ie_style_hov_on);
        Event.stopObserving($(e), 'mouseout', ie_style_hov_off);
        Event.stopObserving($(e), 'blur', ie_style_foc_off);
      }
    }
    else
    {
      if (notFocused)
      {
         Element.setStyle($(e),
         {
           backgroundColor: '',
           border: '1px solid #888888'
         });
      }
      else
      {
        if (e == 'longi' || e == 'lat' || e == 'alt')
          Element.setStyle($(e),
          {
            backgroundColor: '',
            border: '1px solid #888888'
          });
        else
          Element.setStyle($(e),
          {
            backgroundColor: '#e6e8f4',
            border: '1px solid #3347c2'
          });
      }
      Event.observe($(e), 'focus', ie_style_foc_on);
      Event.observe($(e), 'mouseover', ie_style_hov_on);
      if (notFocused)
        Event.observe($(e), 'mouseout', ie_style_hov_off);
      Event.observe($(e), 'blur', ie_style_foc_off);
    }
  },
  debug: function ()
  {
    this.validateMaxVogel();
  }
});

var vogel = Class.create(
{
  initialize: function (preset)
  {
    this.data = new Hash();
    preset.keys().each(function (e)
    {
      this.data.set(e, '');
    }.bind(this));
    this.data.set('beobachter', globalUser);
    this.koord = false;
    this.isDeleted = false;
    this.isValid = false;
  },
  setValue: function (obj, value)
  {
    this.data.set(obj, value);
  },
  get: function (e)
  {
    return this.data.get(e);
  },
  getAll: function ()
  {
    return this.data;
  }
});
