/** @license jSignature v2 jSignature's Undo Button and undo functionality plugin */ /** Copyright (c) 2011 Willow Systems Corp http://willow-systems.com MIT License */ ;(function(){ var apinamespace = 'jSignature' function attachHandlers(buttonRenderer, apinamespace, extensionName) { var $undoButton = buttonRenderer.call(this) ;(function(jSignatureInstance, $undoButton, apinamespace) { jSignatureInstance.events.subscribe( apinamespace + '.change' , function(){ if (jSignatureInstance.dataEngine.data.length) { $undoButton.show() } else { $undoButton.hide() } } ) })( this, $undoButton, apinamespace ) ;(function(jSignatureInstance, $undoButton, apinamespace) { var eventName = apinamespace + '.undo' $undoButton.bind('click', function(){ jSignatureInstance.events.publish(eventName) }) // This one creates new "undo" event listener to jSignature instance // It handles the actual undo-ing. jSignatureInstance.events.subscribe( eventName , function(){ var data = jSignatureInstance.dataEngine.data if (data.length) { data.pop() jSignatureInstance.resetCanvas(data) } } ) })( this , $undoButton , this.events.topics.hasOwnProperty( apinamespace + '.undo' ) ? // oops, seems some other plugin or code has already claimed "jSignature.undo" event // we will use this extension's name for event name prefix extensionName : // Great! we will use 'jSignature' for event name prefix. apinamespace ) } function ExtensionInitializer(extensionName){ // we are called very early in instance's life. // right after the settings are resolved and // jSignatureInstance.events is created // and right before first ("jSignature.initializing") event is called. // You don't really need to manupilate // jSignatureInstance directly, just attach // a bunch of events to jSignatureInstance.events // (look at the source of jSignatureClass to see when these fire) // and your special pieces of code will attach by themselves. // this function runs every time a new instance is set up. // this means every var you create will live only for one instance // unless you attach it to something outside, like "window." // and pick it up later from there. // when globalEvents' events fire, 'this' is globalEvents object // when jSignatureInstance's events fire, 'this' is jSignatureInstance // Here, // this = is new jSignatureClass's instance. // The way you COULD approch setting this up is: // if you have multistep set up, attach event to "jSignature.initializing" // that attaches other events to be fired further lower the init stream. // Or, if you know for sure you rely on only one jSignatureInstance's event, // just attach to it directly var apinamespace = 'jSignature' this.events.subscribe( // name of the event apinamespace + '.attachingEventHandlers' // event handlers, can pass args too, but in majority of cases, // 'this' which is jSignatureClass object instance pointer is enough to get by. , function(){ // hooking up "undo" button to lower edge of Canvas. // but only when options passed to jSignature('init', options) // contain "undoButton":renderingFunction pair. // or "undoButton":true (in which case default, internal rendering fn is used) if (this.settings[extensionName]) { var oursettings = this.settings[extensionName] if (typeof oursettings !== 'function') { // we make it a function. // we allow people to override the button rendering code, // but when developler is OK with default look (and just passes "truthy" value) // this defines default look for the button: // centered against canvas, hanging on its lower side. oursettings = function(){ // this === jSignatureInstance var undoButtonSytle = 'position:absolute;display:none;margin:0 !important;top:auto' , $undoButton = $('') .appendTo(this.$controlbarLower) // this centers the button against the canvas. var buttonWidth = $undoButton.width() $undoButton.css( 'left' , Math.round(( this.canvas.width - buttonWidth ) / 2) ) // IE 7 grows the button. Correcting for that. if ( buttonWidth !== $undoButton.width() ) { $undoButton.width(buttonWidth) } return $undoButton } } attachHandlers.call( this , oursettings , apinamespace , extensionName ) } } ) } var ExtensionAttacher = function(){ $.fn[apinamespace]( 'addPlugin' ,'instance' // type of plugin ,'UndoButton' // extension name ,ExtensionInitializer ) } // //Because plugins are minified together with jSignature, multiple defines per (minified) file blow up and dont make sense // //Need to revisit this later. // if ( typeof define === "function" && define.amd != null) { // // AMD-loader compatible resource declaration // // you need to call this one with jQuery as argument. // define(function(){return Initializer} ) // } else { ExtensionAttacher() // } })();