var qr_reader = { gCtx : null, gCanvas : null, c : 0, stype : 0, gUM : false, webkit : false, moz : false, video_area : null, div_msg : null, callback : null, calling_server : false, init : function(e){ console.log('qr_reader.init()'); if(qr_reader.is_canvas_supported() && window.File && window.FileReader) { qr_reader.init_canvas(e); var callback = (typeof(e.callback) != 'undefined' && e.callback != null) ? e.callback : qr_reader.read; qrcode.callback = callback; qr_reader.set_webcam(); } else { var html ='

QR code scanner for HTML5 capable browsers


'+ '

sorry your browser is not supported



'+ '

try or or

'; /*$("#mainbody").style.display="inline";*/ $("#mainbody").show(); $("#mainbody").html(html); } qr_reader.div_msg = (typeof(e.div_msg) != 'undefined') ? e.div_msg : 'div_msg_qr_reader'; qr_reader.callback = (typeof(e.callback) != 'undefined') ? e.callback : null; }, init_canvas : function(e){ qr_reader.gCanvas = $("#qr-canvas"); qr_reader.gCanvas.width(e.w); qr_reader.gCanvas.height(e.h); qr_reader.width = e.w; qr_reader.height = e.h; var canvas = qr_reader.gCanvas[0]; canvas.style.width = e.w + "px"; canvas.style.height = e.h + "px"; qr_reader.gCtx = canvas.getContext("2d"); /*qr_reader.gCtx.clearRect(0, 0, (e.w * 2), (e.h * 2));*/ /* qr_reader.gCtx.clearRect(100, 100, (e.w * 2), (e.h * 2));*/ }, paint_to_canvas: function(){ /*const width = qr_reader.video_area.videoWidth; const height = qr_reader.video_area.videoHeight; qr_reader.gCanvas.width = width; qr_reader.gCanvas.height = height;*/ return setInterval(() => { /*qr_reader.gCtx.drawImage(qr_reader.video_area, 0, 0, width, height);*/ qr_reader.gCtx.drawImage(qr_reader.video_area,0,0,qr_reader.width,qr_reader.height); }, 16); }, set_webcam : function(e){ console.log('qr_reader.set_webcam()'); $("#result").html("- scanning -"); $("#outdiv").html(""); if(qr_reader.stype==1){ setTimeout(qr_reader.capture_to_canvas, 500); return; } var n = navigator; qr_reader.video_area = document.getElementById('video_area'); if(n.getUserMedia) { n.getUserMedia({video: {facingMode: 'environment'}, audio: false}, qr_reader.success, qr_reader.error); } else if(n.mediaDevices.getUserMedia){ n.mediaDevices.getUserMedia({video: {facingMode: 'user'}, audio: false}).then(localMediaStream => { if ('srcObject' in qr_reader.video_area) { qr_reader.video_area.srcObject = localMediaStream; } else { qr_reader.video_area.src = URL.createObjectURL(localMediaStream); } qr_reader.video_area.play(); qr_reader.video_area.addEventListener('canplay', qr_reader.paint_to_canvas); qr_reader.gUM = true; setTimeout(qr_reader.capture_to_canvas, 250); }).catch(e => { console.log('set_webcam Error =>', e); }); } else if(n.webkitGetUserMedia){ qr_reader.webkit = true; n.webkitGetUserMedia({video: {facingMode: 'environment'}, audio: false}, qr_reader.success, qr_reader.error); } else if(n.mozGetUserMedia) { qr_reader.moz = true; n.mozGetUserMedia({video: {facingMode: 'environment'}, audio: false}, qr_reader.success, qr_reader.error); } /* $('#video_area').css('transform', 'rotateY(180deg)'); */ /* $('#video_area').css('-webkit-transform', 'rotateY(180deg)'); */ /* Safari and Chrome */ /* $('#video_area').css('-moz-transform', 'rotateY(180deg)'); */ /* Firefox */ $("#qrimg").fadeTo( "slow" , 0.2); $("#webcamimg").fadeTo( "slow" , 1.0); qr_reader.stype = 1; setTimeout(qr_reader.capture_to_canvas, 500); }, success : function(stream){ if(qr_reader.webkit) { qr_reader.video_area.src = window.webkitURL.createObjectURL(stream); } else if(qr_reader.moz) { qr_reader.video_area.mozSrcObject = stream; qr_reader.video_area.play(); } else { /*qr_reader.video_area.src = window.URL.createObjectURL(stream);*/ /*var binaryData = []; binaryData.push(stream);*/ /*qr_reader.video_area.src = window.URL.createObjectURL(new Blob(binaryData, {type: "application/zip"}));*/ /*qr_reader.video_area.src = stream;*/ /*qr_reader.video_area.src = stream;*/ /*const mediaSource = new MediaStream();*/ try { qr_reader.video_area.srcObject = stream; qr_reader.video_area.play(); } catch (error) { qr_reader.video_area.src = URL.createObjectURL(stream); qr_reader.video_area.play(); } } qr_reader.gUM = true; setTimeout(qr_reader.capture_to_canvas, 250); }, error : function(e){ qr_reader.gUM = false; return; }, capture_to_canvas : function(){ if(qr_reader.stype != 1){ return; } if(qr_reader.gUM){ try{ /*qr_reader.gCtx.scale(2,2);*/ qr_reader.gCtx.drawImage(qr_reader.video_area,0,0,qr_reader.width,qr_reader.height); try{ qrcode.decode(); } catch(e){ setTimeout(qr_reader.capture_to_canvas, 250); }; } catch(e){ setTimeout(qr_reader.capture_to_canvas, 250); }; } }, html_entities : function(str){ return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); }, read : function(a){ var html = "
"; var result = $("#result"); var elem = result[0]; var attr = JSON.parse(JSON.stringify(elem.dataset)); var dataString = { attr, send : true , credential : qr_reader.html_entities(a) }; if(qr_reader.calling_server == false){ qr_reader.update_status({calling_server:true}); $.ajax({ type : "POST", url : attr.url, data : dataString, dataType : "json", cache : false, success : function(data){ qr_reader.update_status({calling_server:false}); var div_msg = (typeof(data.div_msg) != 'undefined') ? data.div_msg : qr_reader.div_msg; if (data.status == 'ok') { var new_msg = data.msg; if(typeof(data.user_image) != 'undefined'){ new_msg += '

' + data.user_image; } set_msg(div_msg,new_msg,'ok'); }else{ set_msg(div_msg,data.msg,'error'); } setTimeout(qr_reader.capture_to_canvas, 3000); } ,error: function(xhr, status, error) { qr_reader.update_status({calling_server:false}); set_msg(qr_reader.div_msg,error,'error'); setTimeout(qr_reader.capture_to_canvas, 5000); }, }); } }, is_canvas_supported : function(e){ var elem = document.createElement('canvas'); console.log('qr_reader.is_canvas_supported()'); return !!(elem.getContext && elem.getContext('2d')); }, update_status : function(e){ console.log(e); qr_reader.calling_server = e.calling_server; var loading = $('.qr_reader_loading').html(); console.log(loading); if(e.calling_server == true){ $('#marks_middle_cell').html(loading); }else{ $('#marks_middle_cell').html(''); } console.log('status updated'); }, alert : { show : function(e){ $("#dialog-alert").html("
" + e.msg + "
"); $("#dialog-alert").dialog({ dialogClass: 'no-close-button', resizable: false, modal: true, title: '', height: 250, width: 400, buttons: [ { text: "Cerrar", icons: { primary: "ui-icon-close" }, click: function() { $( this ).dialog( "close" ); $('#div_dark').hide(); }, 'class': 'dialog_button' } ] }); $('#div_dark').show(); if(typeof(e.auto_hide_timeout) != 'undefined'){ console.log('e.auto_hide_timeout: ' + e.auto_hide_timeout); setTimeout(function(){ $("#dialog-alert").delay().dialog("close"); $('#div_dark').delay(e.auto_hide_timeout).hide(); },e.auto_hide_timeout); } }, hide : function(e){ $('#div_dark').hide(); }, z : '' }, z : '' };