function signature(settings){

	var s = $.extend({
		id: 'signatureHolder',
		lColor: '#000000',
		lWidth: 1
	}, settings || {});

	var canvasId = 'signatureCanvas';
	var canvas = document.getElementById(canvasId);

	if(!canvas.getContext){return false;}

	var ctx = canvas.getContext('2d');
	var repository = $('#' + s.id);

	var coordinatesValue = repository.val().length > 0 ? repository.val().split(')')[1] + ';' : '';
	var coordinatesArray = [];
	var lineArray = [];
	var coordinates = '';
	var line = '';
	var tool = new tool_pencil();

	if(repository.val().length > 0){
		var values = repository.val().split(')');
		if(!values[1]) return false;
		var points = values[1].split(';');
		var point = [];
		var point2 = [];
		ctx.strokeStyle = s.lColor;
		ctx.lineWidth = s.lWidth;
		ctx.beginPath();
		for(var i = 0; i < points.length; i++){
			point = points[i].split('|');
			pointXY = point[0].split(',');
			ctx.moveTo(pointXY[0], pointXY[1]);
			for (var n = 0; n < point.length; n++){
				pointXY = point[n].split(',');
				ctx.lineTo(pointXY[0], pointXY[1]);
			}
		}
		ctx.stroke();
	}

	if(typeof document.ontouchstart != 'undefined'){

		var pos = $('#' + canvasId).offset();
		canvas.addEventListener('touchstart', touchDown, false);
		canvas.addEventListener('touchmove', touchMove, false);
		canvas.addEventListener('touchend', touchUp, false);

		function touchDown(ev){
			if (ev.targetTouches.length < 1) return false;
			var relOffsetX = ev.targetTouches[0].pageX - pos.left;
			var relOffsetY = ev.targetTouches[0].pageY - pos.top;
			ctx.strokeStyle = s.lColor;
			ctx.lineWidth = s.lWidth;
			ctx.beginPath();
			ctx.moveTo(relOffsetX, relOffsetY);
		}

		function touchMove(ev){
			if (ev.targetTouches.length < 1) return false;
			var relOffsetX = Math.abs(ev.targetTouches[0].pageX - pos.left);
			var relOffsetY = Math.abs(ev.targetTouches[0].pageY - pos.top);
			ctx.lineTo(relOffsetX, relOffsetY);
			ctx.stroke();
			if (relOffsetX != 'undefined' && relOffsetX != undefined) lineArray.push(relOffsetX + ',' + relOffsetY);
			ev.preventDefault();
		};

		function touchUp(ev){
			setValue();
		};

	}

	$('#' + canvasId).bind('mousedown mousemove mouseup', ev_canvas);

	function tool_pencil(){

		var tool = this;
		this.started = false;

		this.mousedown = function(ev){
			tool.started = true;
			ctx.strokeStyle = s.lColor;
			ctx.lineWidth = s.lWidth;
			ctx.beginPath();
			ctx.moveTo(ev._x, ev._y);
		};

		this.mousemove = function(ev){
			if(!tool.started) return false;
			ctx.lineTo(ev._x, ev._y);
			ctx.stroke();
			if(ev._x != 'undefined' && ev._x != undefined) lineArray.push(ev._x + ',' + ev._y);
		};

		this.mouseup = function(ev){
			setValue();
		};

	}

	function setValue(){
		tool.started = false;
		if(!lineArray.length) return false;
		line = lineArray.join('|');
		coordinatesArray.push(line);
		coordinates = coordinatesArray.join(';');
		var result = '(' + canvas.clientWidth + ',' + canvas.clientHeight + ')' + coordinatesValue + coordinates;
		repository.val(clearData(result));
		lineArray = [];
		line = '';
	}

	$('body').mouseup(function(ev){
		setValue();
	});
	$('#signatureClose').mouseup(function(ev){
		tool.started = false;
	});
	$('#signatureClose').click(function(ev){
		ctx.clearRect(0, 0, canvas.clientWidth, canvas.clientHeight);
		repository.val('');
		coordinatesValue = '';
		coordinatesArray = [];
		coordinates = '';
		ev.preventDefault();
	});

	function ev_canvas(ev){
		if(ev.layerX){//Firefox
			ev._x = ev.layerX;
			ev._y = ev.layerY;
		}else if(ev.offsetX){//Opera
			ev._x = ev.offsetX;
			ev._y = ev.offsetY;
		}
		if(document.all && !self.opera){ //IE 9
			ev._y = ev.layerY - document.documentElement.scrollTop;
		}
		var func = tool[ev.type];
		if(func){ func(ev); }
	}

	function clearData(data) {
	    return data.replace(/undefined,.*?\W/mgi, '')
            .replace(/\Wundefined,.*?$/mgi, '')
            .replace(/\W.*?,undefined\W/mgi, '');
	}
}
