(function () {
  // globals
  var $ = jQuery;
  var lib = hsp;
  // configuration
  var containerSelector = '#centerview-content';
  var formId = 'kuenform';
  var errorClass = 'error';
  var disabledClass = 'disabled';
  var ajaxUrl = '/centerviews/kuendigungsschutz/formular.php';

  var $form;

  // this must not be called before document.ready
  lib.initKuenform = function initKuenform() {
    // uncomment to disable javascript on this form:
    // return

    // check dependencies
    if (!$.isFunction(lib.info)) {
      console.log('Error: needs ff.logger.js');
    }
    // variables
    $form = $('#'+formId);

    if ($form.length != 1) {
      //      lib.info('form not found: '+formId);
      return;
    }
    // check if the form has been initialized already
    var done = $form.attr('data-initialized');
    if (done) {
      lib.info('Form has been initialized already');
      return;
    }
    $form.attr('data-initialized','ok');

    var $container = $form.parents(containerSelector);
    if ($container.length != 1) {
      lib.error('could not select container: '+containerSelector);
      return;
    } else {
    //alert('found container');
    }
    // check for validation object
    if (!lib.validation) {
      lib.error('no validation object found');
      return;
    }

    if (!lib.form_keys) {
      lib.error('Error: No form_keys found');
      return;
    }
    attachHandlers();
    
    $form.submit(function (ev) {
      ev.preventDefault();
      try {
        lib.info('submit');

        var cleaned_data = cleanedData();
        var validate_ok = validate(cleaned_data,lib.validation);
        if (validate_ok) {
          lib.info('form validation ok');
          // disable input and add class to container to trigger layout changes showing the
          // sending process
          var $submit = $('input[type=submit]',$form);
          $submit.attr('disabled','disabled');
          $container.addClass(disabledClass);
          
          var success = function success(data, status, request ) {
            $container.removeClass(disabledClass);
            $container.html(data);
          };

          var error = function error(request, status, error) {
            lib.error('ajax error');
            var response = request.responseText;
            $container.removeClass(disabledClass);
            if (response) {
              $container.html(request.responseText);
            } else {
              // TODO replace this with configurable
              $container.html("Es ist ein Fehler aufgetreten. Fehlercode: "+status);
            }
          }

          $.ajax({
            type: 'POST',
            async: true,
            url: ajaxUrl,
            data : cleaned_data,
            success: success,
            error:error
          });
        }
        // if mail ok, show success
        return false;
      } catch (e) {
        lib.handle(e)
      }
    });
  }



  function validate(data, validation) {
    //    console.log(validation);
    var id;
    var message;
    var res = true;
    for (id in validation) {
      message = validateName(id,data[id],validation);
      if (message) {
        res = false;
      }
    }
    return res;
  }

  function validateName(id,data, validation) {
    var formElem = getFormElemByName(id);
    var errorElem = $('#'+id+'-error');
    if (!errorElem.length) {
      console.log('Error: no error elem found with name = '+id+'-error');
      return undefined;
    }
    // clear error message
    errorElem.html('');
    formElem.removeClass(errorClass);
    var message = validateInput(validation[id],data);
    if (message) {
      errorElem.html(message);
      formElem.addClass(errorClass);
      return message;
    } else {
      return undefined;
    }
  }

  function getFormElemByName(name) {
    var res = $('[name="'+name+'"]',$form);
    if (!res.length) {
      console.log('Error: no input found with name = '+name);
      return undefined;
    } else {
      return res;
    }
  }

  
  function validateInput(vali,data) {
    // if validation fails, return the most important message, else return nothing
    var trimmed = $.trim(data);
    if (!trimmed) {
      // we assume that there is a notempty constraint
      var message = vali['notempty']['message'];
      return message;
    }

    if (vali.hasOwnProperty('email')) {
      message = validateEmail(vali['email'],trimmed);
      if (message) {
        return message;
      }
    }
    return undefined;
  }

  function validateEmail(emailVali, trimmed) {
    var reg=/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
    var res= '';
    var a = reg.exec(trimmed);
    if (!a) {
      res = emailVali['message'];
    }
    return res;
  };


  var clean = function clean(userinput) {
    var res = userinput.replace(/[^A-Za-z\d\.,!;:@"'\-%&?üöäÜÖÄß\+\*#&§()€/ \n]/g, '');
    return res;
  }

  var cleanElemVal = function cleanElemVal() {
    var elem = $(this);
    var cleaned = clean(elem.val());
    elem.val(cleaned);
  }

  var validateElem = function validateElem() {
    var elem = $(this);
    var cleaned = clean(elem.val());
    elem.val(cleaned);
    var name = elem.attr('name');
    if (name) {
      validateName(name,cleaned, lib.validation);
    }
  }

  function keysArray() {
    var res = [];
    var index;
    for (index in lib.form_keys) {
      res.push(lib.form_keys[index]);
    }
    return res;
  }

  function cleanedData() {
    var res = {};
    var keys = keysArray();
    var id;
    var i;
    var inputElem;
    for (i = 0 ; i<keys.length ; i++) {
      id = keys[i];
      inputElem = $('[name="'+id+'"]',$form);
      if (!inputElem.length) {
        console.log('Error: no input found with name = '+id);
      } else {
        if (inputElem.length > 1) {
          // we have to handle radio buttons seperately
          inputElem.each(function(){
            var has = $(this).attr('checked');
            if (has) {
              res[id] = $(this).attr('value');
            }
          });
        } else {
          res[id] = clean(inputElem.val());
        }
      }
    }
    return res;
  }

  function attachHandlers() {
    var keys = keysArray();
    var id;
    var i;
    var inputElem;
    for (i = 0 ; i<keys.length ; i++) {
      id = keys[i];
      inputElem = $('[name="'+id+'"]',$form);
      if (!inputElem.length) {
        console.log('Error: no input found with name = '+id);
      } else {
        inputElem.blur(validateElem);
        inputElem.keydown(cleanElemVal);
      }
    }
  }
})();
