function checkForm(form)
{
  var errorAmount = 0;
  var errorArrText = new Array();
  var collection = $("input, select, radio, textarea", form);

  var radioListProsecced = new Array();

  collection.each(function() {
    var element = $(this);
    var value = $.trim(element.attr('value'));
    var textValue = element.text();
    var isBlank = false;
    var defaultValue = element.attr('data-default')
    var limitG = element.attr('data-g');
    var limitGE = element.attr('data-ge');
    var limitL = element.attr('data-l');
    var limitLE = element.attr('data-le');
    var limitMaxCount = element.attr('data-maxcount');

    if(element.hasClass('wysiwyg')) {
      textValue = $('iframe[id*=IFrame]').contents().find('body').text();
    }

    if(value == '' || value == defaultValue) {
      isBlank = true;
    }
    if(element.attr('type') == 'radio' && !element.attr('checked')) {
      var radioName = element.attr('name');
      $radioList = $('input[name="' + radioName +  '"]', form);
      if($.inArray(radioName, radioListProsecced) == -1) {
        isBlank = true;
        radioListProsecced.push(radioName);
        $radioList.each(function(){
          if($(this).attr('checked')) {
            isBlank = false;
          }
        });
      }
    }

    if(element.attr('type') == 'checkbox' && !element.attr('checked')) {
      isBlank = true;
    }
    if(element.hasClass('not_blank') && (isBlank)) {
      element.addClass('inputError');
      errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_required'));
      errorAmount++;
    } else {
      element.removeClass('inputError');
    }

    if(limitMaxCount && textValue.length > limitMaxCount) {
      element.addClass('inputError');
      errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_max_count'));
      errorAmount++;
    }

    //E-Mail Validation
    if(element.attr('name').match(/.*mail.*/i)) {
      var emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
      if(!value.match(emailRegex)) {
        element.addClass('inputError');
        errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_not_valid'));
        errorAmount++;
      } else {
        element.removeClass('inputError');
      }
    }
    //Datum pr�fen
    if(element.hasClass('date')) {
      var matches = value.match(/^(\d{1,2})([\.\/])(\d{1,2})[\.\/](\d{2,4})$/);
      if(matches) {
        var delimiter = matches[2];
        var day = matches[1];
        var month = matches[3];
        var year = matches[4];
        if(delimiter == '/') {
          day = matches[3];
          month = matches[1];
          year = matches[4];
        }

        var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
        if((year%4 == 0)&&((year%100 != 0)||(year%400 == 0))) {
          daysInMonth[1]= 29;
        }
        if(month < 1 || month > 12 ||
          day < 1 || day > daysInMonth[month-1] ||
          year < 0) {
          element.addClass('inputError');
          errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_not_valid'));
          errorAmount++;
        }

        // limiter
        if(limitG || limitGE || limitL || limitLE) {
          var matchesLimiter = limitGE.match(/^(\d{1,2})([\.\/])(\d{1,2})[\.\/](\d{2,4})$/);
          if(matches) {
            var limiterDelimiter = matchesLimiter[2];
            var limiterDay = matchesLimiter[1];
            var limiterMonth = matchesLimiter[3];
            var limiterYear = matchesLimiter[4];
            if(limiterDelimiter == '/') {
              limiterDay = matchesLimiter[3];
              limiterMonth = matchesLimiter[1];
              limiterYear = matchesLimiter[4];
            }
          }
          var valueDate = new Date(year, month-1, day);
          var limiterDate = new Date(limiterYear, limiterMonth-1, limiterDay);
          if(!(valueDate >= limiterDate)) {
            element.addClass('inputError');
            errorArrText.push($('label[for=' + element.attr('name') + ']').text()
              + " " + t('txt_limiter_ge') + " " + limitGE);
            errorAmount++;
          }
        }

      } else {
        element.addClass('inputError');
        errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_not_valid'));
        errorAmount++;
      }
    //alert(day + "." + month + "." + year);
    }

    // Zeit pr�fen
    if(element.hasClass('time')) {
      var timeMatches = value.match(/^(\d{1,2})\:(\d{1,2})$/);
      if(timeMatches) {
        var hour = timeMatches[1];
        var minute = timeMatches[2];
        if(!(hour >= 0 && hour < 24)
          || !(minute >= 0 && minute < 60)) {
          element.addClass('inputError');
          errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_not_valid'));
          errorAmount++;
        }
      } else {
        element.addClass('inputError');
        errorArrText.push($('label[for=' + element.attr('name') + ']').text() + " " + t('txt_not_valid'));
        errorAmount++;
      }

    }

  });
  //Passw�rter auf �bereinstimmung pr�fen (wenn zwei Passwortfelder forhanden)
  pass1 = $(':password:first', form);
  pass2 = $(':password:eq(1)', form);
  if(pass2.length && pass1.attr('value') != pass2.attr('value')) {
    pass1.addClass('inputError');
    pass2.addClass('inputError');
    errorArrText.push(t('txt_password_not_equal'));//("Passw�rter stimmen nicht �berein");
    errorAmount++;
  } else {
    if(pass1.attr('value') != '') {
      pass1.removeClass('inputError');
      pass2.removeClass('inputError');
    }
  }
  if(errorAmount) {
    var header = t('txt_hinweis'); //"Hinweis";
    var message = t('txt_error') + "<br />";
    for(var i = 0; i < errorArrText.length; i++) {
      message += errorArrText[i] + "<br />";
    }
    message += "<div class=\"p10 middle\"><input type=\"button\" class= \"button\" " +
    "onClick='closeAlert();' value=\"OK\" /></div>";
    alertBox(header, message);
    return false;
  } else {
    return true;
  }
}



// $input - single value submitted, not form
function submitAjaxForm($submitButton, $input) {
  var $form = $submitButton.parents('form');
  var formMethod = $form.attr('method');
  var action = $form.attr('action');
  if(!checkForm($form)) {
    return false;
  }

  var beforeSubmitFunction = $submitButton.attr('beforeSubmitFunction');

  if(beforeSubmitFunction) {
    eval(beforeSubmitFunction);
  }

  var updateElement = $submitButton.attr('update');
  var updateFunction = $submitButton.attr('updateFunction');
  var $update = $(updateElement);
  var dataType = $submitButton.attr('dataType') ? $submitButton.attr('dataType') : 'html';

  var json = 'json=';
  if (dataType == 'json') {
    json += 'true';
  }

  var $formElements = $('input, select, textarea', $form);
  var serialized = "";
  $formElements.each(function(){
    defaultValue = $(this).attr('data-default') || "";
    if($(this).val() != defaultValue && $(this).val() != "" && $(this).serialize() != "") {
      serialized += "&" + $(this).serialize();
    }
  });

  if(typeof $input != 'undefined') {
    serialized = $input.serialize();
  }

  $.ajax({
    type: formMethod,
    url: action,
    data: 'ajax=true&' + json + '&' + serialized,
    dataType: dataType,
    success: function(data){
      if(updateFunction) {
        eval(updateFunction + "(data);");
      } else if(updateElement) {
        $update.html(data);
        $('.tablesorter').tablesorter()
        .tablesorterPager({
          container: $("#pager")
        });
      } else {
        $('body').append("<div>" + data + "</div>");
      }
    }
  });
  return false;
}



function ajaxLink($element) {
  var action = $element.attr("href");
  var updateElement = $element.attr('update');
  var updateFunction = $element.attr('updateFunction');
  var $update = $(updateElement);
  var dataType = $element.attr("data-type") || 'html';
  $.ajax({
    type: 'POST',
    url: action,
    data: 'ajax=true',
    dataType: dataType,
    success: function(data){
      if(updateFunction) {
        eval(updateFunction + "(data, $element);");
      } else if ($update.size()){
        $update.html(data);
      } else {
        $('body').append(data);
      }
    }
  });
  return false;
}

function t(key) {
  if(typeof aText != 'undefined' && aText[key]) {
    return aText[key];
  }
  return '[' + key + ']';
}

UTF8 = {
  encode: function(s){
    for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
      s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
    );
    return s.join("");
  },
  decode: function(s){
    for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
      ((a = s[i][c](0)) & 0x80) &&
      (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
        o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
    );
    return s.join("");
  }
};

function parseURL(url) {
  var a =  document.createElement('a');
  a.href = url;
  return {
    source: url,
    protocol: a.protocol.replace(':',''),
    host: a.hostname,
    port: a.port,
    query: a.search,
    params: (function(){
      var ret = {},
      seg = a.search.replace(/^\?/,'').split('&'),
      len = seg.length, i = 0, s;
      for (;i<len;i++) {
        if (!seg[i]) {
          continue;
        }
        s = seg[i].split('=');
        ret[s[0]] = s[1];
      }
      return ret;
    })(),
    file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
    hash: a.hash.replace('#',''),
    path: a.pathname.replace(/^([^\/])/,'/$1'),
    relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
    segments: a.pathname.replace(/^\//,'').split('/')
  };
}

function log(value) {
  if (typeof value == 'object') {
    log(JSON.stringify(value));
    return true;
  }
  $('#log').html(value);
  return console.log(value);
}
