<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -40,10 +40,11 @@
 						}
 					}
 				});
-				$('#examples li:nth(6)').editable({ save: function() {
-					alert('About to save');
-					return true;
-				} });
+				$('#examples li:nth(6)').editable({
+					validation: function(val) {
+						return confirm('Allow saving?');
+					}
+				});
 			});
 		&lt;/script&gt;
 	&lt;/head&gt;
@@ -65,7 +66,7 @@
 					&lt;li&gt;Triggers on Double Click, use buttons to save + cancel&lt;/li&gt;
 					&lt;li&gt;&lt;span&gt;Triggers on Double Click, syncs with input&lt;/span&gt; &lt;input style=&quot;font-size: 0.4em&quot; value=&quot;&quot; type=&quot;text&quot; disabled /&gt;&lt;/li&gt;
 					&lt;li&gt;&lt;span&gt;Triggers on Double Click, uses buttons&lt;/span&gt; &lt;input style=&quot;font-size: 0.4em&quot; value=&quot;&quot; type=&quot;text&quot; disabled /&gt;&lt;/li&gt;
-					&lt;li&gt;Custom save function (Double Click)&lt;/li&gt;
+					&lt;li&gt;Custom Validation&lt;/li&gt;
 				&lt;/ol&gt;
 			&lt;/div&gt;
 		&lt;/div&gt;</diff>
      <filename>index.html</filename>
    </modified>
    <modified>
      <diff>@@ -26,23 +26,24 @@ $.widget('ui.editable', {
 			$input.keydown(function(e) {
 				if( elem.editable('option', 'finishOnKey') &amp;&amp; e.keyCode == elem.editable('option', 'finishOnKey')) $(this).trigger('blur', true);
 			});
+			elem.trigger(this.widgetEventPrefix + 'Start');
 		}
 	},
 	finish: function() {
 		var elem = this.element;
-		if( elem.data('editing') &amp;&amp; ( !elem.editable('option', 'validation') || (elem.editable('option', 'validation') &amp;&amp; elem.editable('option', 'validation').test( elem.find('input').val() ))) ) {
-			if(this.options.sync) {
-				$(this.options.sync).val( elem.find('input').val() );
-				elem.text( elem.find('input').val() );
-				elem.data('editing', false);
-			} else {
-				/*
-					TODO Fix double save when using blur &amp; enter
-				*/
-				if( this.options.save() ) {
+		if( elem.data('editing') ) {
+			var validation = elem.editable('option', 'validation');
+			var val = elem.find('input').val();
+			if( ($.isFunction( validation ) &amp;&amp; validation(val)) || ($.isFunction(validation.test) &amp;&amp; validation.test(val)) || !validation) {
+				if(this.options.sync) {
+					$(this.options.sync).val( elem.find('input').val() );
+					elem.text( elem.find('input').val() );
+					elem.data('editing', false);
+				} else {
 					elem.text( elem.find('input').val() );
 					elem.data('editing', false);
 				}
+				elem.trigger(this.widgetEventPrefix + 'Finish');
 			}
 		}
 	},
@@ -51,6 +52,7 @@ $.widget('ui.editable', {
 		if( elem.data('editing') ) {
 			elem.text( elem.find('span').attr('title') );
 			elem.data('editing', false);
+			elem.trigger(this.widgetEventPrefix + 'Cancel');
 		}
 	},
 	_buildButtons: function() {
@@ -67,6 +69,7 @@ $.widget('ui.editable', {
 
 $.extend($.ui.editable, {
 	version: &quot;0.1&quot;,
+	eventPrefix: 'edit',
 	defaults: {
 		finishOnKey: 13,
 		finishOnBlur: true,
@@ -75,8 +78,7 @@ $.extend($.ui.editable, {
 		eventStart: 'dblclick',
 		validation: false,
 		buttons: {},
-		sync: false,
-		save: function() { return true; }
+		sync: false
 	}
 });
 </diff>
      <filename>js/ui.editable.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8ac32e9c17178b2ff8694aa8864c29daa61bdaa1</id>
    </parent>
  </parents>
  <author>
    <name>Stuart Loxton</name>
    <email>stuart.loxton@googlemail.com</email>
  </author>
  <url>http://github.com/stuartloxton/jquery-ui-editable/commit/634913288d71d8ff192c352843ea16abe46d87f3</url>
  <id>634913288d71d8ff192c352843ea16abe46d87f3</id>
  <committed-date>2009-04-14T06:16:23-07:00</committed-date>
  <authored-date>2009-04-14T05:47:44-07:00</authored-date>
  <message>Removed save config and instead allows validation to be a function with the val as the first param</message>
  <tree>118a2cdc7f31639481d85dcd3eb5581ab843b7fa</tree>
  <committer>
    <name>Stuart Loxton</name>
    <email>stuart.loxton@googlemail.com</email>
  </committer>
</commit>
