/**
 *	SignaturePad: A jQuery plugin for assisting in the creation of an HTML5 canvas
 *	based signature pad. Records the drawn signature in JSON for later regeneration.
 *
 *	Dependencies: excanvas, json2, jquery-1.3.2+
 *	
 *	@project	ca.thomasjbradley.applications.signaturepad
 *	@author		Thomas J Bradley <hey@thomasjbradley.ca>
 *	@link		http://thomasjbradley.ca/lab/signature-pad
 *	@link		http://github.com/thomasjbradley/signature-pad
 *	@copyright	Copyright MMX–, Thomas J Bradley
 *	@license	New BSD License
 *	@version	1.3.0
 */

(function($){function SignaturePad(selector,options){var self=this;var settings=$.extend({},$.fn.signaturePad.defaults,options);var context=$(selector);var canvas=$(settings.canvas,context);var element=canvas.get(0);var canvasContext=null;var previous={'x':null,'y':null};var output=[];$(settings.typed,context).bind('selectstart.signaturepad',function(e){return $(e.target).is(':input');});canvas.bind('selectstart.signaturepad',function(e){return $(e.target).is(':input');});if(!element.getContext){G_vmlCanvasManager.initElement(element);}if(element.getContext){canvasContext=element.getContext('2d');$(settings.sig,context).show();if(!settings.displayOnly){if(!settings.drawOnly){$(settings.name,context).bind('keyup.signaturepad',function(){type($(this).val());});$(settings.name,context).bind('blur.signaturepad',function(){type($(this).val());});$(settings.drawIt,context).bind('click.signaturepad',function(e){drawIt();return false;});}if(settings.drawOnly||settings.defaultAction=='drawIt'){drawIt();}else
{typeIt();}if($(selector).is('form')){$(selector).bind('submit.signaturepad',function(){return validateForm();});}else
{$(selector).parents('form').bind('submit.signaturepad',function(){return validateForm();});}$(settings.typeItDesc,context).show();$(settings.sigNav,context).show();setTimeout(clearCanvas,50);}if(canvas.children('div').length>0){canvas.children('div').css('overflow','visible');}}$.extend(self,{regenerate:function(paths){self.clearCanvas();$(settings.typed,context).hide();if(typeof paths==='string'){paths=JSON.parse(paths);}for(var i in paths){if(typeof paths[i]==='object'){canvasContext.beginPath();canvasContext.moveTo(paths[i].mx,paths[i].my);canvasContext.lineTo(paths[i].lx,paths[i].ly);canvasContext.stroke();}}},clearCanvas:function(){clearCanvas();},getSignature:function(){return output;},getSignatureString:function(){return JSON.stringify(output);},getSignatureImage:function(){return element.toDataURL();}});function drawIt(){$(settings.typed,context).hide();clearCanvas();canvas.bind('mousedown.signaturepad',function(e){startDrawing(e,this);});canvas.bind('mouseup.signaturepad',function(e){stopDrawing();});if(typeof this.ontouchstart!='undefined'){canvas.each(function(){this.ontouchstart=function(e){e.preventDefault();startDrawing(e,this);};this.ontouchend=function(e){stopDrawing();};this.ontouchcancel=function(e){stopDrawing();};});}$(settings.clear,context).bind('click.signaturepad',function(e){clearCanvas();return false;});$(settings.typeIt,context).bind('click.signaturepad',function(e){typeIt();return false;});$(settings.drawIt,context).unbind('click.signaturepad');$(settings.drawIt,context).bind('click.signaturepad',function(e){return false;});$(settings.typeIt,context).removeClass(settings.currentClass);$(settings.drawIt,context).addClass(settings.currentClass);$(settings.sig,context).addClass(settings.currentClass);$(settings.typeItDesc,context).hide();$(settings.drawItDesc,context).show();$(settings.clear,context).show();}function disableCanvas(){canvas.unbind('mousedown.signaturepad');canvas.unbind('mouseup.signaturepad');canvas.unbind('mousemove.signaturepad');$(settings.clear,context).unbind('click.signaturepad');}function typeIt(){clearCanvas();disableCanvas();$(settings.typed,context).show();$(settings.drawIt,context).bind('click.signaturepad',function(e){drawIt();return false;});$(settings.typeIt,context).unbind('click.signaturepad');$(settings.typeIt,context).bind('click.signaturepad',function(e){return false;});$(settings.output,context).val('');$(settings.drawIt,context).removeClass(settings.currentClass);$(settings.typeIt,context).addClass(settings.currentClass);$(settings.sig,context).removeClass(settings.currentClass);$(settings.drawItDesc,context).hide();$(settings.clear,context).hide();$(settings.typeItDesc,context).show();}function type(val){$(settings.typed,context).html(val.replace(/>/g,'&gt;').replace(/</g,'&lt;'));while($(settings.typed,context).width()>element.width){var oldSize=$(settings.typed,context).css('font-size').replace(/px/,'');$(settings.typed,context).css('font-size',oldSize-1+'px');}}function startDrawing(e,o){canvas.bind('mousemove.signaturepad',function(ev){drawLine(ev,this);});if(typeof this.ontouchstart!='undefined'){canvas.each(function(){this.ontouchmove=function(ev){drawLine(ev,this);};});}}function stopDrawing(){canvas.unbind('mousemove.signaturepad');if(typeof this.ontouchstart!='undefined'){canvas.each(function(){this.ontouchmove=null;});}previous.x=null;previous.y=null;$(settings.output,context).val(JSON.stringify(output));}function drawLine(e,o){var offset=$(o).offset(),newX,newY;if(typeof e.changedTouches!='undefined'){newX=Math.floor(e.changedTouches[0].pageX-offset.left);newY=Math.floor(e.changedTouches[0].pageY-offset.top);}else
{newX=Math.floor(e.pageX-offset.left);newY=Math.floor(e.pageY-offset.top);}if(previous.x===null){previous.x=newX;}if(previous.y===null){previous.y=newY;}canvasContext.beginPath();canvasContext.moveTo(previous.x,previous.y);canvasContext.lineTo(newX,newY);canvasContext.stroke();canvasContext.closePath();output.push({'lx':newX,'ly':newY,'mx':previous.x,'my':previous.y});previous.x=newX;previous.y=newY;}function clearCanvas(){stopDrawing();canvasContext.clearRect(0,0,element.width,element.height);canvasContext.fillStyle=settings.bgColour;canvasContext.fillRect(0,0,element.width,element.height);if(!settings.displayOnly){drawSigLine();}canvasContext.lineWidth=settings.penWidth;canvasContext.strokeStyle=settings.penColour;$(settings.output,context).val('');output=[];}function drawSigLine(){canvasContext.beginPath();canvasContext.lineWidth=settings.lineWidth;canvasContext.strokeStyle=settings.lineColour;canvasContext.moveTo(settings.lineMargin,settings.lineTop);canvasContext.lineTo(element.width-settings.lineMargin,settings.lineTop);canvasContext.stroke();canvasContext.closePath();}function validateForm(){var valid=true;$('p.'+settings.errorClass,context).remove();context.removeClass(settings.errorClass);$('input, label',context).removeClass(settings.errorClass);if(settings.drawOnly&&output.length<1){$(selector).prepend('<p class="'+settings.errorClass+'">'+settings.errorMessageDraw+'</p>');valid=false;}if($(settings.name,context).val()===''){$(selector).prepend('<p class="'+settings.errorClass+'">'+settings.errorMessage+'</p>');$(settings.name,context).focus();$(settings.name,context).addClass(settings.errorClass);$('label[for='+$(settings.name).attr('id')+']',context).addClass(settings.errorClass);valid=false;}return valid;}}$.fn.signaturePad=function(options){var api=null;this.each(function(){api=new SignaturePad(this,options);});return api;};$.fn.signaturePad.defaults={defaultAction:'typeIt',displayOnly:false,drawOnly:false,canvas:'canvas',sig:'.sig',sigNav:'.sigNav',bgColour:'#fff',penColour:'#145394',penWidth:2,lineColour:'#ccc',lineWidth:2,lineMargin:5,lineTop:35,name:'.name',typed:'.typed',clear:'.clearButton',typeIt:'.typeIt a',drawIt:'.drawIt a',typeItDesc:'.typeItDesc',drawItDesc:'.drawItDesc',output:'.output',currentClass:'current',errorClass:'error',errorMessage:'Please enter your name',errorMessageDraw:'Please sign the document'};})(jQuery);
