var subscriptions = function() {
  var subscriptions = $('#subscription-form');

  var find_required_fields = function() {
    var required = subscriptions.find('.required').filter(':not(span)');

    required.each(function() {
      $(this).after('<span class="required">*</span>');
    });
  };

  var validate = function() {
    var publications  = $('div.publications');

    var publication_is_not_selected = function() {
      return publications.find('div.selections input[type="checkbox"]').is(':checked') ? false : true;
    };

    var pref_is_not_selected = function(pref) {
      return !$(pref).find('input[type=checkbox]').is(':checked');
    };

    subscriptions.find('form').bind('submit', function(event) {
      event.preventDefault();

      var submit_form = true;

      var pub_validation = function() {
        var info_center = publications.find('div.info_center');

        info_center.find('div.publication.error').remove();
        publications.removeClass('error');

        if(publication_is_not_selected()) {
          publications.addClass('error');
          info_center.prepend('<div class="publication error">Please choose at least one publication from the list</div>');
          submit_form = false;
        }
      }();

      var con_prefs = function() {
        var prefs  = subscriptions.find('div.conference_prefs div.selections'),
            toggle = subscriptions.find('div.conference input[type="checkbox"]'),
            errors = false;

        subscriptions.find('div.conference').removeClass('error');
        subscriptions.find('div.conference div.error').remove();

        if(toggle.is(':checked')) {

          if(pref_is_not_selected(prefs[0])) {
            subscriptions.find('div.conference div.geographic').append('<div class="geographic error">Please choose your geographic preference.</div>');
            errors = true;
            submit_form = false;
          }

          if(pref_is_not_selected(prefs[1])) {
            subscriptions.find('div.conference div.interest').append('<div class="interest error">Please choose an area of interest.</div>');
            errors = true;
            submit_form = false;
          }

          errors ? subscriptions.find('div.conference').addClass('error') : subscriptions.find('div.conference').removeClass('error');

        }


      }();

      var email = function() {
        var email = $('input.email'),
            info_center = subscriptions.find('div.personal_info div.info_center');

        email.removeClass('error');
        info_center.find('div.error').remove();
        info_center.removeClass('error');


        if(!email.val().match(/^[^@]*?@.*$/)) {
          email.addClass('error');
          info_center.addClass('error');
          info_center.prepend('<div class="email error">I am sorry but a valid email address is required.</div>');
          submit_form = false;
        }
      }();

      if(submit_form) {
        $(this).find('*[title]').filter(function() {
            return $(this).attr('title') === $(this).val() ? true : false;
          }).val('');
        this.submit();
      }

    });
  };

  var con_prefs = function() {
    var prefs  = subscriptions.find('div.conference_prefs'),
        toggle = subscriptions.find('div.conference input[type="checkbox"]');

    var toggle_prefs = function() {
      toggle.is(':checked') ? prefs.slideDown() : prefs.slideUp();
    };

    toggle.bind('click', toggle_prefs);

    toggle_prefs();

  };

  if(subscriptions.length > 0) {
    find_required_fields();
    validate();
    con_prefs();
  }

};


//Connexus validation and error handling
var connexus = function() {
  var connexus = $('div#connexus_form');

  var toggler = function() {
    if($('div.online>input[type="checkbox"]:checked').length > 0) {
      $('div.online>input[type="checkbox"]:checked').nextAll('div.subscription_info').slideDown('fast');
    }

    if($('div.print>input[type="checkbox"]:checked').length > 0) {
      connexus.find('div.personal_info div.address').slideDown('fast');
    }

    $('div.online>input[type="checkbox"]').bind('click', function() {
      if($(this).is(':checked')) {
        $(this).nextAll('div.subscription_info').slideDown('fast');
      }
      else {
        $(this).nextAll('div.subscription_info').slideUp();
      }
    });

    $('div.print>input[type="checkbox"]').bind('click', function() {
      if($(this).is(':checked')) {
        connexus.find('div.personal_info div.address').slideDown('fast');
      }
      else {
        connexus.find('div.personal_info div.address').slideUp();
      }
    });
  };

  var find_required_fields = function() {
    var required = connexus.find('.required').filter(':not(span)');

    required.each(function() {
      $(this).after('<span class="required">*</span>');
    });
  };

  var validate = function() {
    var required_errors = function(ele) {
      var fields = $('div.personal_info').find('select.required, input.required').filter(":visible"),
          error = false;

      fields.each(function() {
        remove_error(this);

        if($(this).val() === $(this).attr('title') || $(this).val() === '') {
          add_error(this, "I'm sorry but this field is required");
          error = true;
        }
      });

      return error;
    };

    var email_errors = function(ele) {
      var fields = $(ele).nextAll('div.subscription_info').find('input.email'),
          error = false;

      fields.each(function() {
        if($(this).parent().find('div.error').length === 0) {
          if(!fields.val().match(/^[^@]*?@.*$/)) {
            add_error(this, "A valid email address is required");
            error = true;
          }
        }
      });

      return error;
    };

    var add_error = function(item, message) {
      $(item).addClass('error');
      $(item).parent().prepend('<div class="error">' + message + '</div>');
    };

    var remove_error = function(item) {
      $(item).removeClass('error');
      $(item).parent().find('div.error').remove();
    };

    connexus.find('form').bind('submit', function(event) {
      event.preventDefault();

      var error = false,
          divs = $('div.online, div.print'),
          info_box = connexus.find('div.info_center'),
          checked = $('div.online>:checked, div.print>:checked');

      divs.removeClass('error');
      info_box.removeClass('error');
      info_box.find('div.error').remove();

      if(checked.length === 0) {
        error = true;
        divs.addClass('error');
        info_box.addClass('error');
        info_box.prepend('<div class="error">Please make at least one selection from the list on the left</div>');
      }

      checked.each(function() {
        if(required_errors(this)) error = true;
        if(email_errors(this)) error = true;
      });

      if(!error)  {
        $(this).find('*[title]').filter(function() {
            return $(this).attr('title') === $(this).val() ? true : false;
          }).val('');
        this.submit();
      }
    });
  };

  if(connexus.length > 0) {
    toggler();
    find_required_fields();
    validate();
  }

};

// TotalDepth validation and erros handling
var total_depth = function() {

  var total_depth = $('div#total_depth_form');


  var find_required_fields = function() {
    var required = total_depth.find('.required').filter(':not(span)');

    required.each(function() {
      $(this).after('<span class="required">*</span>');
    });
  };

  var validate = function() {
      

    var required_errors = function(ele) {
      var fields = $('div.general').find('select.required, input.required').filter(":visible"),
          error = false;

      fields.each(function() {
        remove_error(this);

        if($(this).val() === $(this).attr('title') || $(this).val() === '') {
          add_error(this, "I'm sorry but this field is required");
          error = true;
        }
      });

      return error;
    };

    var email_errors = function(ele) {
      var fields = $('div#total_depth_form form').find('input.email');
          error = false;

      fields.each(function() {
        if($(this).parent().find('div.error').length === 0) {
          if(!fields.val().match(/^[^@]*?@.*$/)) {
            add_error(this, "A valid email address is required");
            error = true;
          }
        }
      });

      return error;
    };

    var add_error = function(item, message) {
      $(item).addClass('error');
      $(item).parent().prepend('<div class="error">' + message + '</div>');
    };

    var remove_error = function(item) {
      $(item).removeClass('error');
      $(item).parent().find('div.error').remove();
    };

    total_depth.find('form').bind('submit', function(event) {
      event.preventDefault();

      var error = false;
      //all we really care about on this form is email
      if(email_errors(this)) error = true;

      if(!error)  {
        $(this).find('*[title]').filter(function() {
            return $(this).attr('title') === $(this).val() ? true : false;
          }).val('');
        this.submit();
      }
    });
  };
  

  if(total_depth.length > 0) {
    find_required_fields();
    validate();
  }

};

$(function() {
  subscriptions();
  connexus();
  total_depth();
});


