(function($){
   var toggleChecked = function(){
     $('input[name='+$(this).attr('name')+']').siblings('.dependent').addClass('disabled').find("input").attr('disabled', 'disabled');
     if($(this).is(':checked'))
       $(this).siblings('.dependent').removeClass('disabled').find("input").removeAttr('disabled');
   };

   var validator = {
     fields: "choice benefit age vesting time_deductible length subsidy premiums".split(' '),
     dependent: {},
     allfields: "choice benefit age vesting time_deductible length subsidy premiums".split(' '),
     valid: function(){
       validator.errors = [];
       // All fields except disabled are required
       $.each(validator.fields, function(i, val){
                if(!$('input[name='+val+']').filter(':checked').val()){
                  validator.errors.push(val);
                }
              });
       $.each(validator.dependent, function(i,val){
                if($('input[name='+val.field+']').filter(':checked').val() == val.value && !$('input[name='+i+']').filter(':checked').val()){
                  validator.errors.push(i);
                }
              });
       return validator.errors.length == 0;
     },
     showErrors: function(){
       $('fieldset.error').removeClass('error');
       if(!validator.valid()){
         $.each(validator.errors, function(i,val){
           $('input[name='+val+']').parents('fieldset').eq(0).addClass('error');
         });
         $('fieldset.error').eq(0).scrollTo();
       }
     },
     target: function(){
       var target = '';
       $.each(validator.allfields, function(i, val){
                var field = $('input[name='+val+']').filter(':checked');
                if(field.is(':enabled') && field.val())
                  target += field.val();
              });
       return target;
     }
   };

   $.fn.scrollTo = function(callback){
     var duration = arguments[0] || 1000;
     $('html, body').animate({scrollTop: $(this).offset().top}, duration, callback);
     return $(this);
   };

   $(function(){
       $('input[type=radio]').click(toggleChecked).click(function(){
                                                           validator.valid();
                                                           if(validator.errors.indexOf($(this).attr('name')) == -1)
                                                             $(this).parents('fieldset.error').removeClass('error');
                                                         }).each(toggleChecked);
       $('form.create, form.create input').change(function(){
                          if(validator.valid()){
                            $('#model_link').removeClass('disabled').attr('href',validator.target()+'.html');
                          } else
                            $('#model_link').addClass('disabled').attr('href', '');
                        });
       $('#model_link').click(function(){
                                if(validator.valid())
                                  return true;
                                else
                                  validator.showErrors();
                                return false;
                              });
       $('a.popup').overlay({close: '.close'});
       $('#text-size li#normal_size').click(function(){
                                              $(this).siblings('li').removeClass('selected');
                                              $(this).addClass('selected');
                                              $(document.body).removeClass('medium').removeClass('large');
                                            });
       $('#text-size li#medium_size').click(function(){
                                              $(this).siblings('li').removeClass('selected');
                                              $(this).addClass('selected');
                                              $(document.body).removeClass('large').addClass('medium');
                                            });
       $('#text-size li#large_size').click(function(){
                                             $(this).siblings('li').removeClass('selected');
                                             $(this).addClass('selected');
                                             $(document.body).removeClass('medium').addClass('large');
                                           });
     });
 })(jQuery);
