/*
 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: FlashCanvas 1.5, 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 MMXI, Thomas J Bradley
 @license New BSD License
 @version 2.0.4
*/
(function(b){function B(l,o){function r(c,e,i,p){var m=b(e).offset();clearTimeout(n);n=false;if(typeof c.changedTouches!=="undefined"){e=Math.floor(c.changedTouches[0].pageX-m.left+i.left);c=Math.floor(c.changedTouches[0].pageY-m.top+i.top)}else{e=Math.floor(c.pageX-m.left);c=Math.floor(c.pageY-m.top)}if(g.x===e&&g.y===c)return true;if(g.x===null)g.x=e;if(g.y===null)g.y=c;if(p)c+=p;f.beginPath();f.moveTo(g.x,g.y);f.lineTo(e,c);f.lineCap=a.penCap;f.stroke();f.closePath();j.push({lx:e,ly:c,mx:g.x,my:g.y});
g.x=e;g.y=c}function q(){h.unbind("mousemove.signaturepad");typeof this.ontouchstart!=="undefined"&&h.each(function(){this.ontouchmove=null});g.x=null;g.y=null;j.length>0&&b(a.output,d).val(JSON.stringify(j))}function s(){q();f.fillStyle=a.bgColour;f.fillRect(0,0,k.width,k.height);if(!a.displayOnly){f.beginPath();f.lineWidth=a.lineWidth;f.strokeStyle=a.lineColour;f.moveTo(a.lineMargin,a.lineTop);f.lineTo(k.width-a.lineMargin,a.lineTop);f.stroke();f.closePath()}f.lineWidth=a.penWidth;f.strokeStyle=
a.penColour;b(a.output,d).val("");j=[]}function u(c){var e;e=b(document).scrollTop();var i=0,p,m,v;if(e>0){p=c.offsetTop-b(c).offset().top;b(document).scrollTop(0);i=c.offsetTop-b(c).offset().top;b(document).scrollTop(e)}e=b(document).scrollLeft();m=0;if(e>0){v=c.offsetLeft-b(c).offset().left;b(document).scrollLeft(0);m=c.offsetLeft-b(c).offset().left;b(document).scrollLeft(e)}return{top:p!==i?b(document).scrollTop():0,left:v!==m?b(document).scrollLeft():0}}function w(c,e){h.bind("mousemove.signaturepad",
function(i){r(i,this)});if(typeof this.ontouchstart!=="undefined"){h.each(function(){this.ontouchmove=function(i){r(i,this,u(this))}});r(c,e,u(e),1)}else r(c,e,null,1)}function t(){b(a.typed,d).hide();s();h.bind("mousedown.signaturepad",function(c){w(c,this)});h.bind("mouseup.signaturepad",function(){q()});h.bind("mouseleave.signaturepad",function(){n||(n=setTimeout(function(){q();clearTimeout(n);n=false},200))});typeof this.ontouchstart!=="undefined"&&h.each(function(){this.ontouchstart=function(c){c.preventDefault();
w(c,this)};this.ontouchend=function(){q()};this.ontouchcancel=function(){q()}});b(a.clear,d).bind("click.signaturepad",function(){s();return false});b(a.typeIt,d).bind("click.signaturepad",function(){x();return false});b(a.drawIt,d).unbind("click.signaturepad");b(a.drawIt,d).bind("click.signaturepad",function(){return false});b(a.typeIt,d).removeClass(a.currentClass);b(a.drawIt,d).addClass(a.currentClass);b(a.sig,d).addClass(a.currentClass);b(a.typeItDesc,d).hide();b(a.drawItDesc,d).show();b(a.clear,
d).show()}function x(){s();h.unbind("mousedown.signaturepad");h.unbind("mouseup.signaturepad");h.unbind("mousemove.signaturepad");h.unbind("mouseleave.signaturepad");b(a.clear,d).unbind("click.signaturepad");b(a.typed,d).show();b(a.drawIt,d).bind("click.signaturepad",function(){t();return false});b(a.typeIt,d).unbind("click.signaturepad");b(a.typeIt,d).bind("click.signaturepad",function(){return false});b(a.output,d).val("");b(a.drawIt,d).removeClass(a.currentClass);b(a.typeIt,d).addClass(a.currentClass);
b(a.sig,d).removeClass(a.currentClass);b(a.drawItDesc,d).hide();b(a.clear,d).hide();b(a.typeItDesc,d).show()}function y(c){for(b(a.typed,d).html(c.replace(/>/g,"&gt;").replace(/</g,"&lt;"));b(a.typed,d).width()>k.width;){c=b(a.typed,d).css("font-size").replace(/px/,"");b(a.typed,d).css("font-size",c-1+"px")}}function z(){var c=true;b("p."+a.errorClass,d).remove();d.removeClass(a.errorClass);b("input, label",d).removeClass(a.errorClass);if(a.drawOnly&&j.length<1){b(l).prepend('<p class="'+a.errorClass+
'">'+a.errorMessageDraw+"</p>");c=false}if(b(a.name,d).val()===""){b(l).prepend('<p class="'+a.errorClass+'">'+a.errorMessage+"</p>");b(a.name,d).focus();b(a.name,d).addClass(a.errorClass);b("label[for="+b(a.name).attr("id")+"]",d).addClass(a.errorClass);c=false}return c}function C(){b(a.typed,d).bind("selectstart.signaturepad",function(c){return b(c.target).is(":input")});h.bind("selectstart.signaturepad",function(c){return b(c.target).is(":input")});!k.getContext&&FlashCanvas&&FlashCanvas.initElement(k);
if(k.getContext){f=k.getContext("2d");b(a.sig,d).show();if(!a.displayOnly){if(!a.drawOnly){b(a.name,d).bind("keyup.signaturepad",function(){y(b(this).val())});b(a.name,d).bind("blur.signaturepad",function(){y(b(this).val())});b(a.drawIt,d).bind("click.signaturepad",function(){t();return false})}a.drawOnly||a.defaultAction==="drawIt"?t():x();if(a.validateFields)b(l).is("form")?b(l).bind("submit.signaturepad",function(){return z()}):b(l).parents("form").bind("submit.signaturepad",function(){return z()});
b(a.sigNav,d).show()}}}var A=this,a=b.extend({},b.fn.signaturePad.defaults,o),d=b(l),h=b(a.canvas,d),k=h.get(0),f=null,g={x:null,y:null},j=[],n=false;b.extend(A,{init:function(){C()},regenerate:function(c){A.clearCanvas();b(a.typed,d).hide();if(typeof c==="string")c=JSON.parse(c);for(var e in c)if(typeof c[e]==="object"){f.beginPath();f.moveTo(c[e].mx,c[e].my);f.lineTo(c[e].lx,c[e].ly);f.lineCap=a.penCap;f.stroke();f.closePath();j.push({lx:c[e].lx,ly:c[e].ly,mx:c[e].mx,my:c[e].my})}b(a.output,d).length>
0&&b(a.output,d).val(JSON.stringify(j))},clearCanvas:function(){s()},getSignature:function(){return j},getSignatureString:function(){return JSON.stringify(j)},getSignatureImage:function(){return k.toDataURL()}})}b.fn.signaturePad=function(l){var o=null;this.each(function(){o=new B(this,l);o.init()});return o};b.fn.signaturePad.defaults={defaultAction:"typeIt",displayOnly:false,drawOnly:false,canvas:"canvas",sig:".sig",sigNav:".sigNav",bgColour:"#ffffff",penColour:"#145394",penWidth:2,penCap:"round",
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",validateFields:true,errorClass:"error",errorMessage:"Please enter your name",errorMessageDraw:"Please sign the document"}})(jQuery);

