/** @license
jSignature v2 jSignature's Undo Button and undo functionality plugin

*/
/**
Copyright (c) 2011 Willow Systems Corp http://willow-systems.com
MIT License <http://www.opensource.org/licenses/mit-license.php>
*/

;(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 = $('<input type="button" value="撤销" style="'+undoButtonSytle+'" />')
								.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()
//	}

})();