$(document).ready(function() {

  // disable forms with disableable class until they change from their defaults and meet their requirements - jon

  function toggledisabled( form, initialvalues ) {
    if( anychanges(initialvalues) ) { 
      form.find(":submit:first").removeAttr('disabled').parent().removeClass('disabled');
    } else {
      form.find(":submit:first").attr('disabled',true).parent().addClass('disabled');
    }
  }

  function anychanges( initialvalues ){
    if( initialvalues['text'].length == 0 &&
        initialvalues['radio'].length == 0 &&
        initialvalues['select'].length == 0 &&
        initialvalues['checkbox'].length == 0 )
      return true;
    var changed = false;
    for( var i=0; i<initialvalues['text'].length; i++) {
      if( initialvalues['text'][i]['obj'].val() != initialvalues['text'][i]['val'] && initialvalues['text'][i]['obj'].val() != "" )
        changed = true;
      else
        if( initialvalues['text'][i]['obj'].is('.required') )
          return false;
    }
    for( var i=0; i<initialvalues['select'].length; i++) {
      if( initialvalues['select'][i]['obj'].val() != initialvalues['select'][i]['val'] && initialvalues['select'][i]['obj'].val() != "" )
        changed = true;
      else
        if( initialvalues['select'][i]['obj'].is('.required') )
          return false;
    }
    var radio_required = false;
    var radio_changed = false;
    for( var i = 0; i < initialvalues['radio'].length; i ++ ) {
      if( initialvalues['radio'][i]['obj'].is(':checked')    != initialvalues['radio'][i]['checked'] ) {
        changed = true;
        radio_changed = true;
      } else
        if( initialvalues['radio'][i]['obj'].is('.required') )
          radio_required = true;
    }
    // radio is required and none changed
    if( radio_required && !radio_changed )
      return false;
    for( var i = 0; i < initialvalues['checkbox'].length; i ++ ) {
      if( initialvalues['checkbox'][i]['obj'].is(':checked') != initialvalues['checkbox'][i]['checked'] )
        changed = true;
      else
        if( initialvalues['checkbox'][i]['obj'].is('.required') )
          return false;
    }
    return changed;

  }

  $('form.disableable').each( function() {
    var form = $(this);

    var initialvalues = {'text':[],'radio':[],'checkbox':[],'select':[]};
    form.find("input:text").not('.ignored').each( function() { 
      initialvalues['text'].push( {'obj':$(this),'val':$(this).val()});
    }).keyup(function(){toggledisabled(form,initialvalues)});
    form.find("select").not('.ignored').each( function() { 
      initialvalues['select'].push( {'obj':$(this),'val':$(this).val()});
    }).change(function(){toggledisabled(form,initialvalues)});
    form.find(":radio").not('.ignored').each( function() {
      initialvalues['radio'].push( {'obj':$(this),'checked':$(this).is(":checked")} );
    }).change(function(){toggledisabled(form,initialvalues)});
    form.find(":checkbox").not('.ignored').each( function() {
      initialvalues['checkbox'].push( {'obj':$(this),'checked':$(this).is(":checked")} );
    }).change(function(){toggledisabled(form,initialvalues)});
    toggledisabled( form, initialvalues )
  });

});

