$.fn.markAsInvalid = function () {
  $(this).addClass ('invalid');
}

function isArray (obj) {
  return obj.constructor == Array;
}

/* Form validation
 */ 
function validateForm (jQueryForm, notEmpty, selected, emails, passwords, checkBoxes) {
  // optional parameter handling
  if (!notEmpty) { notEmpty = null; }
  if (!selected) { selected = null; }
  if (!emails) { emails = null; }
  if (!passwords) { passwords = null; }
  if (!checkBoxes) { checkBoxes = null; }
  //cleanup
  $('span.error', jQueryForm).remove ();
  $('.invalid', jQueryForm).removeClass ('invalid');
  
  var showMessages = true;
  var isValid = true;
  /*var emptyMessage = '<span class="error">Ovo polje mora biti ispunjeno!</span>';
  var selectMessageOne = '<span class="error">Ovo polje mora biti označeno!</span>';
  var selectMessageMultiple = '<span class="error">Ova polja moraju biti označena!</span>';
  var errorMessage = '<span class="error">Ovo polje nije pravilno ispunjeno!</span>';
  var passwordMessage = '<span class="error">Ponovljena lozinka je krivo unesena!</span>';
  var checkBoxesMessage = '<span class="error">Ovo polje se mora označiti!</span>';*/
  var emptyMessage = 'Ovo polje mora biti ispunjeno!';
  var selectMessageOne = '<span class="error">Ovo polje mora biti označeno!</span>';
  var selectMessageMultiple = '<span class="error">Ova polja moraju biti označena!</span>';
  var errorMessage = 'Ovo polje nije pravilno ispunjeno!';
  var passwordMessage = 'Ponovljena lozinka je krivo unesena!';
  var checkBoxesMessage = '<span class="error">Ovo polje se mora označiti!</span>';
 
  // Check if non empty elmeents are empty
  if (notEmpty !== null) {
    for (var i in notEmpty) {
      if (notEmpty[i].val() === '' 
        || notEmpty[i].val() === emptyMessage) {
        if (showMessages) {
          notEmpty[i].val (emptyMessage);
        }
        else { notEmpty[i].val (notEmpty[i].data ('default').value); }
        notEmpty[i].markAsInvalid ();
        isValid = false;
      }
    }
  }
  // Check if select elements are properly selcted
  if (selected !== null) {
    var messageShown = false;
    i = 0;
    for (i in selected) {
      if (isArray(selected[i])) {
        for (var j in selected[i]) {
          if (selected[i][j].val() === '0') {
            if (showMessages && !messageShown) {
              selected[i][0].before (selectMessageMultiple);
              messageShown = true;
            }
            selected[i][j].markAsInvalid ();
            isValid = false;
          }
        }
      }
      else {
        if (selected[i].val() === '0') {
          if (showMessages) {
            selected[i].before (selectMessage);
          }
          selected[i].markAsInvalid ();
          isValid = false;
        }
      }
    }
  }
  // Check if email elements are correctly inputed
  if (emails !== null) {
    i = 0;
    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    for (i in emails) {
      emails[i].val ().replace (/&#64;/, "@");
      if (!filter.test (emails[i].val())) {
        if (showMessages) {
          emails[i].val (errorMessage);
        }
        emails[i].markAsInvalid ();
        isValid = false;
      }
    }
  }
  // Check if passwords are inputed correctly
  if (passwords !== null) {
    i = 0;
    for (i in passwords) {
      if (passwords[i].password.val() !== passwords[i].confirmation.val()) {
        passwords[i].confirmation.markAsInvalid ();
        isValid = false;
      }
      if (passwords[i].password.val() === emptyMessage ||
        passwords[i].password.val() === emptyMessage) {
        passwords[i].password
          .val ('')
        passwords[i].confirmation
          .val ('')
      }
    }
  }
  // Check if checkboxes are checked
  if (checkBoxes !== null) {
    i = 0;
    for (i in checkBoxes) {
      if (!checkBoxes[i].attr ('checked')) {
        if (showMessages) {
          checkBoxes[i].before (checkBoxesMessage)
        }
        checkBoxes[i].markAsInvalid ();
        isValid = false;
      }
    }
  }
  
  // Message next to submit button
  if (!isValid) {
    $('input[type=submit]').after ('<span class="error">Ispravi crveno označena polja!</span>');
  }
  
  return isValid;
}