Teste de formulário de aquisição de dados

Teste de formulário de aquisição de dados

Edwaldo Queiroz BH/MG

<!DOCTYPE html>

<html>

 <head>

  <meta charset="utf-8">

  <meta http-equiv="X-UA-Compatible" content="IE=edge">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>Contact form</title>

  <meta name="generator" content="DA-Formmaker 4.7.1">

  <!--TEMPLATE:4.2-->

  <link rel="stylesheet" href="https://www.w3schools.com/lib/w3.css">

  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>

  <script src="https://code.jquery.com/ui/1.11.2/jquery-ui.min.js"></script>


  <script>

   $(function() {

     $('#Data').datepicker({

    prevText: '<back', prevStatus: '',

    prevJumpText: '&#x3c;&#x3c;', prevJumpStatus: '',

    nextText: 'Next>', nextStatus: '',

    nextJumpText: '&#x3e;&#x3e;', nextJumpStatus: '',

    currentText: 'today', currentStatus: '',

    todayText: 'today', todayStatus: '',

    clearText: '-', clearStatus: '',

    closeText: 'close', closeStatus: '',

    monthNames: ['January','February','March','April','May','June',

'July','August','September','October','November','December'],

    monthNamesShort: ['Jan','Feb','Mar','Apr','May',

'Jun','Jul','Aug','Sep','Oct','Nov','Dez'],

    dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],

    dayNamesShort: ['Su','Mo','Tu','We','Th','Fr','Sa'],

    dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],

    showMonthAfterYear: false,

    changeMonth: true,

    changeYear: true,  

    yearRange: "2019:2019",  

    dateFormat:'dd.mm.yy'

  } 

 );





   });

  </script>  


<style type="text/css">

body { background-color:#ffffff;}

h1 { color:#2196f3; font-family:Segoe UI,Arial,sans-serif; font-size:30pt; }

p { color:#000000; font-family:Segoe UI,Arial,sans-serif; font-size:12pt; }


/* Interaction Cues

----------------------------------*/

.ui-state-disabled {

cursor: default !important;

}



/* Icons

----------------------------------*/


/* states and images */

.ui-icon {

display: block;

text-indent: -99999px;

overflow: hidden;

background-repeat: no-repeat;

}



/* Misc visuals

----------------------------------*/


/* Overlays */

.ui-widget-overlay {

position: fixed;

top: 0;

left: 0;

width: 100%;

height: 100%;

}

.ui-datepicker {

width: 17em;

padding: .2em .2em 0;

display: none;

}

.ui-datepicker .ui-datepicker-header {

position: relative;

padding: .2em 0;

}

.ui-datepicker .ui-datepicker-prev,

.ui-datepicker .ui-datepicker-next {

position: absolute;

top: 2px;

width: 1.8em;

height: 1.8em;

}

.ui-datepicker .ui-datepicker-prev-hover,

.ui-datepicker .ui-datepicker-next-hover {

top: 1px;

}

.ui-datepicker .ui-datepicker-prev {

left: 2px;

}

.ui-datepicker .ui-datepicker-next {

right: 2px;

}

.ui-datepicker .ui-datepicker-prev-hover {

left: 1px;

}

.ui-datepicker .ui-datepicker-next-hover {

right: 1px;

}

.ui-datepicker .ui-datepicker-prev span,

.ui-datepicker .ui-datepicker-next span {

display: block;

position: absolute;

left: 50%;

margin-left: -8px;

top: 50%;

margin-top: -8px;

}

.ui-datepicker .ui-datepicker-title {

margin: 0 2.3em;

line-height: 1.8em;

text-align: center;

}

.ui-datepicker .ui-datepicker-title select {

font-size: 1em;

margin: 1px 0;

}

.ui-datepicker select.ui-datepicker-month,

.ui-datepicker select.ui-datepicker-year {

width: 45%;

}

.ui-datepicker table {

width: 100%;

font-size: .9em;

border-collapse: collapse;

margin: 0 0 .4em;

}

.ui-datepicker-week-end,

.ui-datepicker th {

padding: .7em .3em;

text-align: center;

font-weight: bold;

color: #000000;

border: 0;

}

.ui-datepicker td {

border: 0;

padding: 1px;

}

.ui-datepicker td span,

.ui-datepicker td a {

display: block;

padding: .2em;

text-align: right;

text-decoration: none;

}

.ui-datepicker .ui-datepicker-buttonpane {

background-image: none;

margin: .7em 0 0 0;

padding: 0 .2em;

border-left: 0;

border-right: 0;

border-bottom: 0;

}

.ui-datepicker .ui-datepicker-buttonpane button {

float: right;

margin: .5em .2em .4em;

cursor: pointer;

padding: .2em .6em .3em .6em;

width: auto;

overflow: visible;

}

.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {

float: left;

}



/* icon support */

.ui-menu-icons {

   position: relative;

}

.ui-menu-icons .ui-menu-item {

   padding-left: 2em;

}


/* left-aligned */

.ui-menu .ui-icon {

   position: absolute;

   top: 0;

   bottom: 0;

   left: .2em;

   margin: auto 0;

}


/* right-aligned */

.ui-menu .ui-menu-icon {

   left: auto;

   right: 0;

}


/* Component containers

----------------------------------*/

.ui-widget {

   font-family: Arial,Helvetica,Geneva; /*FONTCAL*/

}

.ui-widget .ui-widget {

   font-size: 1em;

}

.ui-widget input,

.ui-widget select,

.ui-widget textarea,

.ui-widget button {

   font-family: Arial,Helvetica,Geneva; /*FONTCAL*/

   font-size: 1em;

}

.ui-widget-content {

   border: 1px solid #000000; /*BORDERCAL*/

   background: #EEEEEE; /*BGCAL*/

   color: #000000; /*TEXTCAL*/

}


.ui-widget-header {

   border: 1px solid #000000;

   background: #CCCCCC;/*BGHEADINGCAL*/

   color: #000000;

   font-weight: normal;

}



/* Interaction states

----------------------------------*/

.ui-state-default,

.ui-widget-content .ui-state-default,

.ui-widget-header .ui-state-default {

   border: 1px solid #000000; /*FONTCAL*/

   background: #B6CDE9; /*BGDAYCAL*/

   font-weight: normal;

   color: #000000;/*TEXTCAL*/

}


/* Misc visuals

----------------------------------*/


/* Corner radius */

.ui-corner-all,

.ui-corner-top,

.ui-corner-left,

.ui-corner-tl {

   border-top-left-radius: 4px;

}

.ui-corner-all,

.ui-corner-top,

.ui-corner-right,

.ui-corner-tr {

   border-top-right-radius: 4px;

}

.ui-corner-all,

.ui-corner-bottom,

.ui-corner-left,

.ui-corner-bl {

   border-bottom-left-radius: 4px;

}

.ui-corner-all,

.ui-corner-bottom,

.ui-corner-right,

.ui-corner-br {

   border-bottom-right-radius: 4px;

}


/* Icons

----------------------------------*/


/* states and images */

.ui-icon {

   width: 16px;

   height: 16px;

}

.ui-icon,

.ui-widget-content .ui-icon {

   background-image: url("https://code.jquery.com/ui/1.11.2/themes/smoothness/images/ui-icons_222222_256x240.png");

}

.ui-widget-header .ui-icon {

   background-image: url("https://code.jquery.com/ui/1.11.2/themes/smoothness/images/ui-icons_222222_256x240.png");

}


.ui-state-hover .ui-icon,

.ui-state-focus .ui-icon {

   background-image: url("https://code.jquery.com/ui/1.11.2/themes/smoothness/images/ui-icons_454545_256x240.png");

}

.ui-state-active .ui-icon {

   background-image: url("https://code.jquery.com/ui/1.11.2/themes/smoothness/images/ui-icons_454545_256x240.png");

}


/* positioning */

.ui-icon-circle-triangle-e { background-position: -48px -192px; }

.ui-icon-circle-triangle-w { background-position: -80px -192px; }


.ui-state-hover,

.ui-widget-content .ui-state-hover,

.ui-widget-header .ui-state-hover,

.ui-state-focus,

.ui-widget-content .ui-state-focus,

.ui-widget-header .ui-state-focus {

/*border: 1px solid #999999;*/

border: 1px solid #000000;


font-weight: normal;

color: #212121;

}


div.ui-datepicker{

font-family: Arial,Helvetica,Geneva;

font-size:10px;

}

.m-signature-pad--body3 canvas {

 position: relative;

 left: 0;

 top: 0;

 width: 100%;

 height: 175px;

 border: 1px solid #CCCCCC;

 }




/* Landscape phones and down */

@media (max-width: 480px) { 

  .mainContainer  {

   width: 100%;

  }

}


@media (min-width: 768px) { 

  .mainContainer  {

    width: 80%;

    margin-left: auto; margin-right: auto;

  }

}


.internal { display: none; }


</style>


<script type="text/javascript">

function addHiddenField(formID, name, value)

{

var input = document.createElement("input");

input.setAttribute("type", "hidden");

input.setAttribute(name, "name_you_want");

input.setAttribute(value, "value_you_want");

document.getElementById(formID).appendChild(input);

}


function GetCookie(cookie_name)

{

 if (document.cookie.length>0)

  {

  cookie_start=document.cookie.indexOf(cookie_name + "=");

  if (cookie_start!=-1)

   { 

   cookie_start=cookie_start + cookie_name.length+1; 

   cookie_end=document.cookie.indexOf(";",cookie_start);

   if (cookie_end==-1) cookie_end=document.cookie.length;

   return unescape(document.cookie.substring(cookie_start,cookie_end));

   } 

  }

 return "";

}


function str_replace(search, replace, subject) {

return subject.split(search).join(replace);

}

</script>



<!-- DAFORMJSBEGIN -->


<!-- JSCAPTCHAREFRESH -->


<script type="text/javascript">  


function SetCookieValues()

{


}


function SetCookies()

{

    

}

  

</script>


<script type="text/javascript">

function chkFormular()

{

document.getElementById('Assinatura').value = signaturePad3.toDataURL();


document.forms["DAFORM"].submit();

return(true);

}

</script>




</head>

<body onLoad="SetCookieValues();">

  

<div class="w3-card-12 w3-white mainContainer">

 <!-- FORMTITLE_BEGIN -->

 <div class="w3-container w3-sand">

   <h1>Contact form</h1>

 </div>

<!-- FORMTITLE_END -->

<!-- EINLEITUNGTEXT_BEGIN -->

 <div class="w3-container">

   <p class="textend">Use this form to contact us.</p>

 </div>

<!-- EINLEITUNGTEXT_END -->


 <form class="w3-container" action="https://www.ekiwi-scripts.de/form/v4/formmail_v4.php" method="POST" name="DAFORM" onSubmit="SetCookies();return chkFormular();" enctype="multipart/form-data" target="_self">

 <input type="hidden" name="formid" value="730508">

 <input type="hidden" name="settings" value="cXZ7ZHJrcXZ7ZHI=">

 <input type="hidden" name="redirect" value="https://www.ekiwi.de/form/danke.htm">

 <input type="hidden" name="subject" value="Contact form">

 <input type="hidden" name="admin" value="ZHJicGJ2e3N2V3B6dn57OXR4eg==">

 <input type="hidden" name="admin1" value="">

 <input type="hidden" name="admin2" value="">

 <input type="hidden" name="typemail" value="html">

 <input type="hidden" name="crypt" value="1">

 <input type="hidden" name="conf_csv" value="0">

 <input type="hidden" name="einleittext" value="">

 <input type="hidden" name="copyfields" value="-1">

 <input type="hidden" name="copyip" value="-1">

 <input type="hidden" name="hide_empty_fields" value="0">

 <input type="hidden" name="settings_encoding" value="utf-8">  

 <input type="hidden" name="ReturnToSender" value="0">

  <input type="hidden" name="label__Queiroz" value="X1F1ZWlyb3o=">

  <input type="hidden" name="label__Mensagem" value="SW5mb3JtZSBzdWEgcmVjbGFtYWNhbw==">

  <input type="hidden" name="label__Data" value="UGVyw61vZG8=">

  <input type="hidden" name="label__Assinatura" value="QXNzaW5l">


  

<p>

<label>_Queiroz</label>

<input class="w3-input w3-white" type="text" name="Queiroz" id="Queiroz" value="defaultV" maxLength="100">

<p class="w3-opacity">Text after</p>

</p>


<p>

<label>Informe sua reclamacao</label>

<textarea class="w3-input w3-white" type="text" style="resize:none" name="Mensagem" id="Mensagem" value="" rows="5"></textarea></p>


<p>

<label>Período</label>

<input class="w3-input w3-white" type="text" name="Data" id="Data" value="">

</p>


<p>

<label>Assine</label>

<br>

 <div id="signature-pad3" class="m-signature-pad3">

  <div class="m-signature-pad--body3">

   <canvas></canvas>

   <button type="button" class="w3-btn w3-red" data-action="clear">Clear</button>

    <input type="hidden" name="Assinatura" id="Assinatura" value="">

  </div>

 </div>

</p>



<!-- CAPTCHA -->


  <p class="textend"></p>

 <hr/>


 <p>

  <button type="submit" class="w3-btn w3-blue-grey">Send</button>    

  <button type="reset" onclick="resetForm();" class="w3-btn w3-red">Reset</button>

  <!-- PRINTBUTTON -->   

 </p>

</form>


</div>




<script type="text/javascript">

/*!

 * Signature Pad v2.2.0

 * https://github.com/szimek/signature_pad

 *

 * Copyright 2017 Szymon Nowak

 * Released under the MIT license

 *

 * The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:

 * http://corner.squareup.com/2012/07/smoother-signatures.html

 *

 * Implementation of interpolation using cubic Bézier curves is taken from:

 * http://benknowscode.wordpress.com/2012/09/14/path-interpolation-using-cubic-bezier-and-control-point-estimation-in-javascript

 *

 * Algorithm for approximated length of a Bézier curve is taken from:

 * http://www.lemoda.net/maths/bezier-length/index.html

 *

 */


(function (global, factory) {

typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :

typeof define === 'function' && define.amd ? define(factory) :

(global.SignaturePad = factory());

}(this, (function () { 'use strict';


function Point(x, y, time) {

 this.x = x;

 this.y = y;

 this.time = time || new Date().getTime();

}


Point.prototype.velocityFrom = function (start) {

 return this.time !== start.time ? this.distanceTo(start) / (this.time - start.time) : 1;

};


Point.prototype.distanceTo = function (start) {

 return Math.sqrt(Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2));

};


function Bezier(startPoint, control1, control2, endPoint) {

 this.startPoint = startPoint;

 this.control1 = control1;

 this.control2 = control2;

 this.endPoint = endPoint;

}


// Returns approximated length.

Bezier.prototype.length = function () {

 var steps = 10;

 var length = 0;

 var px = void 0;

 var py = void 0;


 for (var i = 0; i <= steps; i += 1) {

  var t = i / steps;

  var cx = this._point(t, this.startPoint.x, this.control1.x, this.control2.x, this.endPoint.x);

  var cy = this._point(t, this.startPoint.y, this.control1.y, this.control2.y, this.endPoint.y);

  if (i > 0) {

   var xdiff = cx - px;

   var ydiff = cy - py;

   length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);

  }

  px = cx;

  py = cy;

 }


 return length;

};


/* eslint-disable no-multi-spaces, space-in-parens */

Bezier.prototype._point = function (t, start, c1, c2, end) {

 return start * (1.0 - t) * (1.0 - t) * (1.0 - t) + 3.0 * c1 * (1.0 - t) * (1.0 - t) * t + 3.0 * c2 * (1.0 - t) * t * t + end * t * t * t;

};


/* eslint-disable */


// http://stackoverflow.com/a/27078401/815507

function throttle(func, wait, options) {

 var context, args, result;

 var timeout = null;

 var previous = 0;

 if (!options) options = {};

 var later = function later() {

  previous = options.leading === false ? 0 : Date.now();

  timeout = null;

  result = func.apply(context, args);

  if (!timeout) context = args = null;

 };

 return function () {

  var now = Date.now();

  if (!previous && options.leading === false) previous = now;

  var remaining = wait - (now - previous);

  context = this;

  args = arguments;

  if (remaining <= 0 || remaining > wait) {

   if (timeout) {

    clearTimeout(timeout);

    timeout = null;

   }

   previous = now;

   result = func.apply(context, args);

   if (!timeout) context = args = null;

  } else if (!timeout && options.trailing !== false) {

   timeout = setTimeout(later, remaining);

  }

  return result;

 };

}


function SignaturePad(canvas, options) {

 var self = this;

 var opts = options || {};


 this.velocityFilterWeight = opts.velocityFilterWeight || 0.7;

 this.minWidth = opts.minWidth || 0.5;

 this.maxWidth = opts.maxWidth || 2.5;

 this.throttle = 'throttle' in opts ? opts.throttle : 16; // in miliseconds


 if (this.throttle) {

  this._strokeMoveUpdate = throttle(SignaturePad.prototype._strokeUpdate, this.throttle);

 } else {

  this._strokeMoveUpdate = SignaturePad.prototype._strokeUpdate;

 }


 this.dotSize = opts.dotSize || function () {

  return (this.minWidth + this.maxWidth) / 2;

 };

 this.penColor = opts.penColor || 'black';

 this.backgroundColor = opts.backgroundColor || 'rgba(0,0,0,0)';

 this.onBegin = opts.onBegin;

 this.onEnd = opts.onEnd;


 this._canvas = canvas;

 this._ctx = canvas.getContext('2d');

 this.clear();


 // We need add these inline so they are available to unbind while still having

 // access to 'self' we could use _.bind but it's not worth adding a dependency.

 this._handleMouseDown = function (event) {

  if (event.which === 1) {

   self._mouseButtonDown = true;

   self._strokeBegin(event);

  }

 };


 this._handleMouseMove = function (event) {

  if (self._mouseButtonDown) {

   self._strokeMoveUpdate(event);

  }

 };


 this._handleMouseUp = function (event) {

  if (event.which === 1 && self._mouseButtonDown) {

   self._mouseButtonDown = false;

   self._strokeEnd(event);

  }

 };


 this._handleTouchStart = function (event) {

  if (event.targetTouches.length === 1) {

   var touch = event.changedTouches[0];

   self._strokeBegin(touch);

  }

 };


 this._handleTouchMove = function (event) {

  // Prevent scrolling.

  event.preventDefault();


  var touch = event.targetTouches[0];

  self._strokeMoveUpdate(touch);

 };


 this._handleTouchEnd = function (event) {

  var wasCanvasTouched = event.target === self._canvas;

  if (wasCanvasTouched) {

   event.preventDefault();

   self._strokeEnd(event);

  }

 };


 // Enable mouse and touch event handlers

 this.on();

}


// Public methods

SignaturePad.prototype.clear = function () {

 var ctx = this._ctx;

 var canvas = this._canvas;


 ctx.fillStyle = this.backgroundColor;

 ctx.clearRect(0, 0, canvas.width, canvas.height);

 ctx.fillRect(0, 0, canvas.width, canvas.height);


 this._data = [];

 this._reset();

 this._isEmpty = true;

};


SignaturePad.prototype.fromDataURL = function (dataUrl) {

 var _this = this;


 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};


 var image = new Image();

 var ratio = options.ratio || window.devicePixelRatio || 1;

 var width = options.width || this._canvas.width / ratio;

 var height = options.height || this._canvas.height / ratio;


 this._reset();

 image.src = dataUrl;

 image.onload = function () {

  _this._ctx.drawImage(image, 0, 0, width, height);

 };

 this._isEmpty = false;

};


SignaturePad.prototype.toDataURL = function (type) {

 var _canvas;


 switch (type) {

  case 'image/svg+xml':

   return this._toSVG();

  default:

   for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {

    options[_key - 1] = arguments[_key];

   }


   return (_canvas = this._canvas).toDataURL.apply(_canvas, [type].concat(options));

 }

};


SignaturePad.prototype.on = function () {

 this._handleMouseEvents();

 this._handleTouchEvents();

};


SignaturePad.prototype.off = function () {

 this._canvas.removeEventListener('mousedown', this._handleMouseDown);

 this._canvas.removeEventListener('mousemove', this._handleMouseMove);

 document.removeEventListener('mouseup', this._handleMouseUp);


 this._canvas.removeEventListener('touchstart', this._handleTouchStart);

 this._canvas.removeEventListener('touchmove', this._handleTouchMove);

 this._canvas.removeEventListener('touchend', this._handleTouchEnd);

};


SignaturePad.prototype.isEmpty = function () {

 return this._isEmpty;

};


// Private methods

SignaturePad.prototype._strokeBegin = function (event) {

 this._data.push([]);

 this._reset();

 this._strokeUpdate(event);


 if (typeof this.onBegin === 'function') {

  this.onBegin(event);

 }

};


SignaturePad.prototype._strokeUpdate = function (event) {

 var x = event.clientX;

 var y = event.clientY;


 var point = this._createPoint(x, y);


 var _addPoint = this._addPoint(point),

   curve = _addPoint.curve,

   widths = _addPoint.widths;


 if (curve && widths) {

  this._drawCurve(curve, widths.start, widths.end);

 }


 this._data[this._data.length - 1].push({

  x: point.x,

  y: point.y,

  time: point.time,

  color: this.penColor

 });

};


SignaturePad.prototype._strokeEnd = function (event) {

 var canDrawCurve = this.points.length > 2;

 var point = this.points[0];


 if (!canDrawCurve && point) {

  this._drawDot(point);

 }


 if (typeof this.onEnd === 'function') {

  this.onEnd(event);

 }

};


SignaturePad.prototype._handleMouseEvents = function () {

 this._mouseButtonDown = false;


 this._canvas.addEventListener('mousedown', this._handleMouseDown);

 this._canvas.addEventListener('mousemove', this._handleMouseMove);

 document.addEventListener('mouseup', this._handleMouseUp);

};


SignaturePad.prototype._handleTouchEvents = function () {

 // Pass touch events to canvas element on mobile IE11 and Edge.

 this._canvas.style.msTouchAction = 'none';

 this._canvas.style.touchAction = 'none';


 this._canvas.addEventListener('touchstart', this._handleTouchStart);

 this._canvas.addEventListener('touchmove', this._handleTouchMove);

 this._canvas.addEventListener('touchend', this._handleTouchEnd);

};


SignaturePad.prototype._reset = function () {

 this.points = [];

 this._lastVelocity = 0;

 this._lastWidth = (this.minWidth + this.maxWidth) / 2;

 this._ctx.fillStyle = this.penColor;

};


SignaturePad.prototype._createPoint = function (x, y, time) {

 var rect = this._canvas.getBoundingClientRect();


 return new Point(x - rect.left, y - rect.top, time || new Date().getTime());

};


SignaturePad.prototype._addPoint = function (point) {

 var points = this.points;

 var tmp = void 0;


 points.push(point);


 if (points.length > 2) {

  // To reduce the initial lag make it work with 3 points

  // by copying the first point to the beginning.

  if (points.length === 3) points.unshift(points[0]);


  tmp = this._calculateCurveControlPoints(points[0], points[1], points[2]);

  var c2 = tmp.c2;

  tmp = this._calculateCurveControlPoints(points[1], points[2], points[3]);

  var c3 = tmp.c1;

  var curve = new Bezier(points[1], c2, c3, points[2]);

  var widths = this._calculateCurveWidths(curve);


  // Remove the first element from the list,

  // so that we always have no more than 4 points in points array.

  points.shift();


  return { curve: curve, widths: widths };

 }


 return {};

};


SignaturePad.prototype._calculateCurveControlPoints = function (s1, s2, s3) {

 var dx1 = s1.x - s2.x;

 var dy1 = s1.y - s2.y;

 var dx2 = s2.x - s3.x;

 var dy2 = s2.y - s3.y;


 var m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };

 var m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0 };


 var l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);

 var l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);


 var dxm = m1.x - m2.x;

 var dym = m1.y - m2.y;


 var k = l2 / (l1 + l2);

 var cm = { x: m2.x + dxm * k, y: m2.y + dym * k };


 var tx = s2.x - cm.x;

 var ty = s2.y - cm.y;


 return {

  c1: new Point(m1.x + tx, m1.y + ty),

  c2: new Point(m2.x + tx, m2.y + ty)

 };

};


SignaturePad.prototype._calculateCurveWidths = function (curve) {

 var startPoint = curve.startPoint;

 var endPoint = curve.endPoint;

 var widths = { start: null, end: null };


 var velocity = this.velocityFilterWeight * endPoint.velocityFrom(startPoint) + (1 - this.velocityFilterWeight) * this._lastVelocity;


 var newWidth = this._strokeWidth(velocity);


 widths.start = this._lastWidth;

 widths.end = newWidth;


 this._lastVelocity = velocity;

 this._lastWidth = newWidth;


 return widths;

};


SignaturePad.prototype._strokeWidth = function (velocity) {

 return Math.max(this.maxWidth / (velocity + 1), this.minWidth);

};


SignaturePad.prototype._drawPoint = function (x, y, size) {

 var ctx = this._ctx;


 ctx.moveTo(x, y);

 ctx.arc(x, y, size, 0, 2 * Math.PI, false);

 this._isEmpty = false;

};


SignaturePad.prototype._drawCurve = function (curve, startWidth, endWidth) {

 var ctx = this._ctx;

 var widthDelta = endWidth - startWidth;

 var drawSteps = Math.floor(curve.length());


 ctx.beginPath();


 for (var i = 0; i < drawSteps; i += 1) {

  // Calculate the Bezier (x, y) coordinate for this step.

  var t = i / drawSteps;

  var tt = t * t;

  var ttt = tt * t;

  var u = 1 - t;

  var uu = u * u;

  var uuu = uu * u;


  var x = uuu * curve.startPoint.x;

  x += 3 * uu * t * curve.control1.x;

  x += 3 * u * tt * curve.control2.x;

  x += ttt * curve.endPoint.x;


  var y = uuu * curve.startPoint.y;

  y += 3 * uu * t * curve.control1.y;

  y += 3 * u * tt * curve.control2.y;

  y += ttt * curve.endPoint.y;


  var width = startWidth + ttt * widthDelta;

  this._drawPoint(x, y, width);

 }


 ctx.closePath();

 ctx.fill();

};


SignaturePad.prototype._drawDot = function (point) {

 var ctx = this._ctx;

 var width = typeof this.dotSize === 'function' ? this.dotSize() : this.dotSize;


 ctx.beginPath();

 this._drawPoint(point.x, point.y, width);

 ctx.closePath();

 ctx.fill();

};


SignaturePad.prototype._fromData = function (pointGroups, drawCurve, drawDot) {

 for (var i = 0; i < pointGroups.length; i += 1) {

  var group = pointGroups[i];


// like _strokeBegin

  this._data.push([]); 

  if (group.length > 1) {

   for (var j = 0; j < group.length; j += 1) {

    var rawPoint = group[j];

    var point = new Point(rawPoint.x, rawPoint.y, rawPoint.time);

// start like _strokeUpdate

    this._data[this._data.length - 1].push({ 

      x: point.x,

      y: point.y,

      time: point.time

    }); 

// end like _strokeUpdate

    var color = rawPoint.color;


    if (j === 0) {

     // First point in a group. Nothing to draw yet.

     this._reset();

     this._addPoint(point);

    } else if (j !== group.length - 1) {

     // Middle point in a group.

     var _addPoint2 = this._addPoint(point),

       curve = _addPoint2.curve,

       widths = _addPoint2.widths;


     if (curve && widths) {

      drawCurve(curve, widths, color);

     }

    } else {

     // Last point in a group. Do nothing.

    }

   }

  } else {

   this._reset();

   var _rawPoint = group[0];

   drawDot(_rawPoint);

  }

 }

};


SignaturePad.prototype._toSVG = function () {

 var _this2 = this;


 var pointGroups = this._data;

 var canvas = this._canvas;

 var ratio = Math.max(window.devicePixelRatio || 1, 1);

 var minX = 0;

 var minY = 0;

 var maxX = canvas.width / ratio;

 var maxY = canvas.height / ratio;

 var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');


 svg.setAttributeNS(null, 'width', canvas.width);

 svg.setAttributeNS(null, 'height', canvas.height);


 this._fromData(pointGroups, function (curve, widths, color) {

  var path = document.createElement('path');


  // Need to check curve for NaN values, these pop up when drawing

  // lines on the canvas that are not continuous. E.g. Sharp corners

  // or stopping mid-stroke and than continuing without lifting mouse.

  if (!isNaN(curve.control1.x) && !isNaN(curve.control1.y) && !isNaN(curve.control2.x) && !isNaN(curve.control2.y)) {

   var attr = 'M ' + curve.startPoint.x.toFixed(3) + ',' + curve.startPoint.y.toFixed(3) + ' ' + ('C ' + curve.control1.x.toFixed(3) + ',' + curve.control1.y.toFixed(3) + ' ') + (curve.control2.x.toFixed(3) + ',' + curve.control2.y.toFixed(3) + ' ') + (curve.endPoint.x.toFixed(3) + ',' + curve.endPoint.y.toFixed(3));


   path.setAttribute('d', attr);

   path.setAttribute('stroke-width', (widths.end * 2.25).toFixed(3));

   path.setAttribute('stroke', color);

   path.setAttribute('fill', 'none');

   path.setAttribute('stroke-linecap', 'round');


   svg.appendChild(path);

  }

 }, function (rawPoint) {

  var circle = document.createElement('circle');

  var dotSize = typeof _this2.dotSize === 'function' ? _this2.dotSize() : _this2.dotSize;

  circle.setAttribute('r', dotSize);

  circle.setAttribute('cx', rawPoint.x);

  circle.setAttribute('cy', rawPoint.y);

  circle.setAttribute('fill', rawPoint.color);


  svg.appendChild(circle);

 });


 var prefix = 'data:image/svg+xml;base64,';

 var header = '<svg' + ' xmlns="http://www.w3.org/2000/svg"' + ' xmlns:xlink="http://www.w3.org/1999/xlink"' + (' viewBox="' + minX + ' ' + minY + ' ' + maxX + ' ' + maxY + '"') + (' width="' + maxX + '"') + (' height="' + maxY + '"') + '>';

 var body = svg.innerHTML;


 // IE hack for missing innerHTML property on SVGElement

 if (body === undefined) {

  var dummy = document.createElement('dummy');

  var nodes = svg.childNodes;

  dummy.innerHTML = '';


  for (var i = 0; i < nodes.length; i += 1) {

   dummy.appendChild(nodes[i].cloneNode(true));

  }


  body = dummy.innerHTML;

 }


 var footer = '</svg>';

 var data = header + body + footer;


 return prefix + btoa(data);

};


SignaturePad.prototype.fromData = function (pointGroups) {

 var _this3 = this;


 this.clear();


 this._fromData(pointGroups, function (curve, widths) {

  return _this3._drawCurve(curve, widths.start, widths.end);

 }, function (rawPoint) {

  return _this3._drawDot(rawPoint);

 });

};


SignaturePad.prototype.toData = function () {

 return this._data;

};


return SignaturePad;


})));


var wrapper3 = document.getElementById("signature-pad3"),

  clearButton3 = wrapper3.querySelector("[data-action=clear]"),

  canvas3 = wrapper3.querySelector("canvas"),

  signaturePad3;


function resizeCanvas3() {

  var oldContent = signaturePad3.toData();

  var ratio = Math.max(window.devicePixelRatio || 1, 1);

  canvas3.width = canvas3.offsetWidth * ratio;

  canvas3.height = canvas3.offsetHeight * ratio;

  canvas3.getContext("2d").scale(ratio, ratio);

  signaturePad3.clear();

  signaturePad3.fromData(oldContent);

}


var signaturePad3 = new SignaturePad(canvas3);

signaturePad3.minWidth = 1;

signaturePad3.maxWidth = 5;

signaturePad3.penColor = "#000000";

signaturePad3.backgroundColor = "#FFFFFF";


  clearButton3.addEventListener("click", function (event) {

    signaturePad3.clear();

  });


function resizeCanvas()

{

resizeCanvas3();

}


window.onresize = resizeCanvas;

resizeCanvas();


function resetForm()

{

signaturePad3.clear();

document.forms["DAFORM"].reset();

}


</script>


</body>

</html>


Report Page