Index: /Users/mh/Documents/workspace/slimpy/HTML/EN/html/settings.js =================================================================== --- /Users/mh/Documents/workspace/slimpy/HTML/EN/html/settings.js (revision 12253) +++ /Users/mh/Documents/workspace/slimpy/HTML/EN/html/settings.js (working copy) @@ -107,9 +107,9 @@ new Event.observe(window, 'load', function(){ // add event handlers to all fields which have a validator - [%- FOREACH item = validate %] - new Event.observe('[% item %]', 'blur', function(){ prefValidate($('[% item %]')); } ); - [%- END %] + [%- FOREACH pref = validate; IF pref.value %] + new Event.observe('[% pref.key %]', 'blur', function(){ prefValidate($('[% pref.key %]')); } ); + [%- END; END %] // try to redirect all form submissions by return key to the default submit button // listen for keypress events on all form elements except submit @@ -129,15 +129,33 @@ new Event.observe(window, 'resize', function(){resizeSettingsSection();}); new Event.observe('saveSettings', 'click', function(e){ - [%- FOREACH item = validate %] - prefValidate($('[% item %]'), true); - [%- END %] + Event.stop(e); + $('settingsForm').request({ + parameters: { useAJAX: 1 }, + onComplete: function(response) { + var results = parseData(response.responseText); - // if validation fails and user doesn't force the submit, cancel - if (!validateAll && !confirm("[% "SETUP_VALIDATION_FAILED" | string %]")) { - Event.stop(e); - validateAll = true; - } + $('statusarea').update(results['warning']); + resizeSettingsSection(); + + // highlighted fields + for (field in results) { + if ($(field)) { + if (results[field] == '0') { + $(field).style.background = '#ffcccc'; + } + else { + new Effect.Highlight(field, { + duration: 0.5, + startcolor: '#99ff99', + endcolor: '#ffffff', + restorecolor: '#ffffff' + }); + } + } + } + } + }); }); resizeSettingsSection(); Index: /Users/mh/Documents/workspace/slimpy/HTML/EN/settings/ajaxSettings.txt =================================================================== --- /Users/mh/Documents/workspace/slimpy/HTML/EN/settings/ajaxSettings.txt (revision 0) +++ /Users/mh/Documents/workspace/slimpy/HTML/EN/settings/ajaxSettings.txt (revision 0) @@ -0,0 +1,4 @@ +warning|[% warning%] +[%- FOREACH valid = validated %] +[% valid.key %]|[% valid.value %] +[%- END %] \ No newline at end of file Index: /Users/mh/Documents/workspace/slimpy/HTML/EN/settings/header.html =================================================================== --- /Users/mh/Documents/workspace/slimpy/HTML/EN/settings/header.html (revision 12253) +++ /Users/mh/Documents/workspace/slimpy/HTML/EN/settings/header.html (working copy) @@ -21,6 +21,7 @@ [% pageHeaderScripts %] + [% END %] @@ -28,7 +29,7 @@ [% pagetitle = page | string; pageicon = 'settings'; noSpacer = 1; PROCESS pageheader.html %] -
+
[% IF warning %] [% warning %] [% END %] @@ -37,6 +38,7 @@
+ [% IF playerid %][% END %] [% IF player %][% END %] Index: /Users/mh/Documents/workspace/slimpy/HTML/ExBrowse3/header.html =================================================================== --- /Users/mh/Documents/workspace/slimpy/HTML/ExBrowse3/header.html (revision 12253) +++ /Users/mh/Documents/workspace/slimpy/HTML/ExBrowse3/header.html (working copy) @@ -14,6 +14,7 @@ + [% END %] Index: /Users/mh/Documents/workspace/slimpy/Slim/Utils/Prefs.pm =================================================================== --- /Users/mh/Documents/workspace/slimpy/Slim/Utils/Prefs.pm (revision 12256) +++ /Users/mh/Documents/workspace/slimpy/Slim/Utils/Prefs.pm (working copy) @@ -261,7 +261,7 @@ $prefs->init(\%defaults); # set validation functions - $prefs->setValidate( 'num', qw(displaytexttimeout browseagelimit remotestreamtimeout) ); + $prefs->setValidate( 'num', qw(displaytexttimeout browseagelimit remotestreamtimeout screensavertimeout) ); $prefs->setValidate( 'dir', qw(cachedir playlistdir audiodir artfolder) ); $prefs->setValidate( 'array', qw(guessFileFormats titleFormat disabledformats) ); Index: /Users/mh/Documents/workspace/slimpy/Slim/Web/Settings.pm =================================================================== --- /Users/mh/Documents/workspace/slimpy/Slim/Web/Settings.pm (revision 12256) +++ /Users/mh/Documents/workspace/slimpy/Slim/Web/Settings.pm (working copy) @@ -66,7 +66,7 @@ # Handle the simple case where validation is done by prefs obj. my ($prefsClass, @prefs) = $class->prefs($client); - my @doValidate; + my (@valid); for my $pref (@prefs) { @@ -74,19 +74,19 @@ my (undef, $ok) = $prefsClass->set($pref, $paramRef->{$pref}); - if (!$ok) { + if ($ok) { + $paramRef->{'validated'}->{$pref} = 1; + } + else { $paramRef->{'warning'} .= sprintf(Slim::Utils::Strings::string('SETTINGS_INVALIDVALUE'), $paramRef->{$pref}, $pref) . '
'; + $paramRef->{'validated'}->{$pref} = 0; } } - push @doValidate, $pref if $prefsClass->hasValidator($pref); - + $paramRef->{'validate'}->{$pref} = $prefsClass->hasValidator($pref); $paramRef->{'prefs'}->{$pref} = $prefsClass->get($pref); } - # values that can be validated client-side - $paramRef->{'validate'} = \@doValidate; - if ($prefsClass) { $paramRef->{'namespace'} = $prefsClass->namespace; } @@ -101,7 +101,7 @@ $paramRef->{'playername'} = $client->name(); } - return Slim::Web::HTTP::filltemplatefile($class->page, $paramRef); + return Slim::Web::HTTP::filltemplatefile($paramRef->{'useAJAX'} ? 'settings/ajaxSettings.txt' : $class->page, $paramRef); } 1;