function blockshow (element) {
  // because element.show() fails when the element started with display: none;
  $(element).setStyle({display: 'block'});
}

function atleastone (ev, fields, errel) {
  errel.hide();
  var stop = true;
  if (fields) {
    fields.each(function (field) {
      if (field.checked) stop = false;
    });
  }
  if (stop) {
    blockshow(errel);
    ev.stop();
  }
}

function hasvalue (ev, field, errel) {
  errel.hide();
  if (!field.getValue()) {
    blockshow(errel);
    ev.stop();
  }
}

function containsa (ev, has, field, errel) {
  errel.hide();
  if (field.getValue().toArray().indexOf(has)==-1) {
    blockshow(errel);
    ev.stop();
  }
}

var validators = {
  addethnicity: function (ev) {
    atleastone(ev, $('addethnicity').getInputs('checkbox', 'ethnicity[]'), $('onlyselected'));
  },
  addgender: function (ev) {
    atleastone(ev, $('addgender').getInputs('radio', 'gender'), $('onlyselected'));
  },
  changeactivity: function (ev) {
    atleastone(ev, $('changeactivity').getInputs('checkbox', 'activity[]'), $('onlyselected'));
  },
  changebuild: function (ev) {
    hasvalue(ev, $($('changebuild').build), $('onlyselected'));
  },
  changeemail: function (ev) {
    containsa(ev, '@', $($('changeemail').newemail), $('invalidemail'));
  },
  changehaircolor: function (ev) {
    atleastone(ev, $('changehaircolor').getInputs('checkbox', 'haircolor[]'), $('onlyselected'));
  },
  changename: function (ev) {
    hasvalue(ev, $($('changename').name), $('empty'));
  },
  changeseeking: function (ev) {
    atleastone(ev, $('changeseeking').getInputs('checkbox', 'seeking[]'), $('onlyselected'));
  },
  addcomment: function (ev) {
    hasvalue(ev, $($('addcomment').newcomment), $('empty'));
  },
  passreset: function (ev) {
    containsa(ev, '@', $($('passreset').resetemail), $('invalidemail'));
  },
  passreset2: function (ev) {
    hasvalue(ev, $($('passreset2').resetpassword), $('nopassword'));
  },
  sendmail: function (ev) {
    var mailform = $('sendmail');
    var errel = $('empty');
    errel.hide();
    if (!mailform.subject.getValue() && !mailform.body.getValue()) {
      blockshow(errel);
      ev.stop();
    }
  },
  signup: function (ev) {
    var sform = $('signup');
    containsa(ev, '@', $(sform.signupemail), $('invalidemail'));
    hasvalue(ev, $(sform.signuppassword), $('nopassword'));
    hasvalue(ev, $(sform.zip), $('nozip'));
    hasvalue(ev, $(sform.bornMonth), $('monthoutofrange'));
    hasvalue(ev, $(sform.bornDay), $('dayoutofrange'));
    hasvalue(ev, $(sform.bornYear), $('yearoutofrange'));
  }
}

Event.observe(window, 'load', function () {
  var tovalid = $$('form.validated');
  tovalid.each(function (el) {
    el.observe('submit', validators[el['id']]);
  });
});
