var SERVER_URL = 'http://modus.dmgroup.hu/v2/modus.php';

var MSG = [];
MSG.CITY = "Város nem található, változtassa meg, vagy válasszon a listából:";
MSG.STREET = "Cím nem található. változtassa meg, vagy válasszon a listából:";
MSG.DEFAULT = "A megadott adatok így helyesek";
MSG.CANCEL = "Mégsem";

var SEPARATOR = '|';

String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g,"");
}

var Modus = Class.create({
    initialize: function(output, form, options) {
      this.form = document.forms[form];
      this.output = $(output);
      this.options = options;
      Event.observe(this.form, 'submit', this.onSubmit.bind(this));
    },
    onSubmit: function() {
      this.output.innerHTML ='<div class="modus-loading"></div>';
      this.server();
    },
    submit: function() {
      this.form.submit();
    },
    cancel: function() {
      this.output.innerHTML = '';
    },
    server: function() {
      var sw = false;
      var queryString = '';
      for (var i in this.options) {
        if (sw) queryString += '&';
        if ($(i)) {
            queryString += (i + '=' + $F(i));
            sw = true;
        }
      }
      js = $('modus-js');
      if (js) js.remove();
      var js = document.createElement('script');
      Element.extend(js);
      js.id = 'modus-js';
      js.type = 'text/javascript';
      js.src = SERVER_URL + '?' + queryString;
      this.output.insert({after: js});
    },
    loadResult: function(result) {
      var html = '';    
      if (result.status == 'SD') {
        this.output.innerHTML =  '<input type="hidden" name="modus_server_status" value="KO" />';
        this.form.submit();
        return;
      } else if (result.status == 'OK') {
        html = this.html(result.data);
        this.output.innerHTML = html +
            '<input type="hidden" name="modus_server_status" value="OK" />' +
            '<input type="hidden" name="modus_verify" value="OK" />';
        this.form.submit();
        return;
      } else {
        var msg= '';
        var msgTitle = '';
        if (result.type == 'N') {
          this.form.submit();
          return;
        } if (result.type == 'C') {
          msgTitle = MSG.CITY;
          for (i = 0; i < result.candidates.length; i++) {
            txt = result.candidates[i].zipcode_u01 + ' ' + result.candidates[i].city_u01 +
                  ' (' + result.candidates[i].province_u01 + ')';
            txtData = result.candidates[i].zipcode_u01 + SEPARATOR + result.candidates[i].city_u01 + 
                      SEPARATOR + result.candidates[i].province_u01;
            txtData = txtData.replace("'", "\\'");
            msg += '<div><a href="javascript:modus.city(\'' + txtData + '\')">' + txt + '</a></div>';
          }
          msg += '<div class="cancel"><a href="javascript:modus.cancel();">' + MSG.CANCEL + '</a></div>';
        } else if (result.type == 'S') {
          nMsg = false;
          msgTitle = MSG.STREET;
          count = result.count;
          for (i = 0; i < result.candidates.length; i++) {
            txt = result.candidates[i].street_u02 + ' ' + result.candidates[i].suffix_u03 + ' ' +
                  result.candidates[i].number_u00 + ' (' + result.candidates[i].zipcode_u01 + ')';
            txtData = result.candidates[i].zipcode_u01 + SEPARATOR + result.candidates[i].suffix_u03 + SEPARATOR + 
                      result.candidates[i].street_u02 + SEPARATOR + result.candidates[i].number_u00;
            txtData = txtData.replace("'", "\\'");
            msg += '<div><a href="javascript:modus.street(\'' + txtData + '\')">' + txt + '</a></div>';
          }
          msg += '<div class="default"><a href="javascript:modus.submit();">' + MSG.DEFAULT + '</a></div>';
          msg += '<div class="cancel"><a href="javascript:modus.cancel();">' + MSG.CANCEL + '</a></div>';
        }
        msg = '<div class="box"><div class="title">' + msgTitle + '</div>' + msg + '</div>'
        html = this.html(result.data);
        this.output.innerHTML = msg + html +
            '<input type="hidden" name="modus_server_status" value="OK" />' +
            '<input type="hidden" name="modus_verify" value="KO" />';
      }
    },
    html: function (obj) {
      var html = '';
      for (var i in obj) {
        if (typeof obj[i] != "function") {
          value = obj[i].replace("'", "\\'");
          html += '<input type="hidden" name="modus_' + i + '" value="' + value + '" />';
         }
      }
      return html;
    },
    city: function(i) {
      values = i.split(SEPARATOR);
      if (this.options.zipcode && this.options.province) {
        if ($(this.options.zipcode).value == '') {
            $(this.options.zipcode).value = values[0];
        }
        $(this.options.city).value = values[1];
        $(this.options.province).value = values[2];
      } else {
        $(this.options.city).value = values[0] + ' ' + values[1] + ' ' + values[2];
      }
      this.output.innerHTML ='<div class="modus-loading"></div>';
      this.server();
    },
    street: function(i) {
      values = i.split(SEPARATOR);
      if (values[3] == '') {
        values[3] = 'SNC';
      }
      if (this.options.zipcode) {
        $(this.options.zipcode).value = values[0];
      }
      if (this.options.suffix && this.options.street && this.options.number) {
        $(this.options.suffix).value = values[1];
        $(this.options.street).value = values[2];
        $(this.options.number).value = values[3];
      } else if (this.options.street && this.options.number) {
        $(this.options.street).value = values[2] + ' ' + values[1];
        $(this.options.number).value = values[3];
      } else {
        $(this.options.street).value = values[2] + ' ' + values[1] + ', ' + values[3];
      }
      this.output.innerHTML ='<div class="modus-loading"></div>';
      this.server();
   }
});
