diff --git a/dist/jpeg_camera.js b/dist/jpeg_camera.js index c465354..02ed86e 100644 --- a/dist/jpeg_camera.js +++ b/dist/jpeg_camera.js @@ -1,4 +1,4 @@ -/*! JpegCamera 1.3.3 | 2016-09-18 +/*! JpegCamera 1.3.3 | 2017-08-16 (c) 2013 Adam Wrobel https://amw.github.io/jpeg_camera */ (function() { @@ -266,7 +266,7 @@ } JpegCameraHtml5.prototype._engine_init = function() { - var error, failure, get_user_media_options, horizontal_padding, success, that, vertical_padding; + var default_media_options, error, failure, get_user_media_options, horizontal_padding, success, that, vertical_padding; this._debug("Using HTML5 engine"); vertical_padding = Math.floor(this.view_height * 0.2); horizontal_padding = Math.floor(this.view_width * 0.2); @@ -302,7 +302,7 @@ this._load_shutter_sound(this.options.shutter_mp3_url); } } - get_user_media_options = { + default_media_options = { video: { optional: [ { @@ -317,6 +317,11 @@ ] } }; + if (typeof this.options.get_media_options === 'function') { + get_user_media_options = this.options.get_media_options(default_media_options); + } else { + get_user_media_options = default_media_options; + } that = this; success = function(stream) { that._remove_message(); diff --git a/dist/jpeg_camera.min.js b/dist/jpeg_camera.min.js index 5eb1532..8ec3552 100644 --- a/dist/jpeg_camera.min.js +++ b/dist/jpeg_camera.min.js @@ -1,4 +1,4 @@ -/*! JpegCamera 1.3.3 | 2016-09-18 +/*! JpegCamera 1.3.3 | 2017-08-16 (c) 2013 Adam Wrobel https://amw.github.io/jpeg_camera */ -(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o={}.hasOwnProperty,p=function(a,b){function c(){this.constructor=a}for(var d in b)o.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a};if(a=function(){function a(a,b){if("string"==typeof a&&(a=document.getElementById(a.replace("#",""))),!a||!a.offsetWidth)throw"JpegCamera: invalid container";a.innerHTML="",this.view_width=parseInt(a.offsetWidth,10),this.view_height=parseInt(a.offsetHeight,10),this.container=document.createElement("div"),this.container.style.width="100%",this.container.style.height="100%",this.container.style.position="relative",a.appendChild(this.container),this.options=this._extend({},this.constructor.DefaultOptions,b),this._engine_init()}return a.DefaultOptions={shutter_ogg_url:"/jpeg_camera/shutter.ogg",shutter_mp3_url:"/jpeg_camera/shutter.mp3",swf_url:"/jpeg_camera/jpeg_camera.swf",on_debug:function(a){return console&&console.log?console.log("JpegCamera: "+a):void 0},quality:.9,shutter:!0,mirror:!1,timeout:0,retry_success:!1,scale:1},a._canvas_supported=!!document.createElement("canvas").getContext,a.canvas_supported=function(){return this._canvas_supported},a.prototype.ready=function(a){return this.options.on_ready=a,this.options.on_ready&&this._is_ready&&this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}),this},a.prototype._is_ready=!1,a.prototype.error=function(a){return this.options.on_error=a,this.options.on_error&&this._error_occured&&this.options.on_error.call(this,this._error_occured),this},a.prototype._error_occured=!1,a.StatsCaptureScale=.2,a.prototype.get_stats=function(b){var c,e;return c=new d(this,{}),this._engine_capture(c,!1,.1,a.StatsCaptureScale),e=this,c.get_stats(function(a){return b.call(e,a)})},a.prototype.capture=function(a){var b,c,e;return null==a&&(a={}),c=new d(this,a),this._snapshots[c.id]=c,e=c._options(),e.shutter&&this._engine_play_shutter_sound(),b=Math.min(1,e.scale),b=Math.max(.01,b),this._engine_capture(c,e.mirror,e.quality,b),c},a.prototype._snapshots={},a.prototype.show_stream=function(){return this._engine_show_stream(),this._displayed_snapshot=null,this},a.prototype.discard_all=function(){var a,b,c;this._displayed_snapshot&&this.show_stream(),c=this._snapshots;for(a in c)b=c[a],this._engine_discard(b),b._discarded=!0;return this._snapshots={},this},a.prototype._extend=function(a){var b,c,d,e,f,g;for(d=Array.prototype.slice.call(arguments,1),f=0,g=d.length;g>f;f++)if(c=d[f])for(b in c)e=c[b],a[b]=e;return a},a.prototype._debug=function(a){return this.options.on_debug?this.options.on_debug.call(this,a):void 0},a.prototype._display=function(a){return this._engine_display(a),this._displayed_snapshot=a},a.prototype._displayed_snapshot=null,a.prototype._discard=function(a){return this._displayed_snapshot===a&&this.show_stream(),this._engine_discard(a),a._discarded=!0,delete this._snapshots[a.id]},a.prototype._prepared=function(a,b){var c;return this.video_width=a,this.video_height=b,this._debug("Camera resolution "+this.video_width+"x"+this.video_height+"px"),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!0)},1)},a.prototype._wait_until_stream_looks_ok=function(a){return this.get_stats(function(b){var c;return b.std>2?(this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),this._debug("Camera is ready"),this._is_ready=!0,this.options.on_ready?this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}):void 0):(a&&this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!1)},100))})},a.prototype._got_error=function(a){return this._debug("Error - "+a),this._error_occured=a,this.options.on_error?this.options.on_error.call(this,this._error_occured):void 0},a.prototype._block_element_access=function(){return this._overlay=document.createElement("div"),this._overlay.style.width="100%",this._overlay.style.height="100%",this._overlay.style.position="absolute",this._overlay.style.top=0,this._overlay.style.left=0,this._overlay.style.zIndex=2,this.container.appendChild(this._overlay)},a.prototype._overlay=null,a.prototype.view_width=null,a.prototype.view_height=null,a._add_prefixed_style=function(a,b,c){var d;return d=b.charAt(0).toUpperCase()+b.slice(1),a.style[b]=c,a.style["Webkit"+d]=c,a.style["Moz"+d]=c,a.style["ms"+d]=c,a.style["O"+d]=c},a}(),navigator.getUserMedia||(navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia),window.AudioContext||(window.AudioContext=window.webkitAudioContext),h=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(h(),l="audio/ogg; codecs=vorbis",i="audio/mpeg; ",f=function(a){var b;return b=document.createElement("video"),!(!b.canPlayType||!b.canPlayType(a).replace(/no/,""))},c=function(b){function c(){return m=c.__super__.constructor.apply(this,arguments)}return p(c,b),c.prototype._engine_init=function(){var b,c,d,e,g,h,j;this._debug("Using HTML5 engine"),j=Math.floor(.2*this.view_height),e=Math.floor(.2*this.view_width),this.message=document.createElement("div"),this.message["class"]="message",this.message.style.width="100%",this.message.style.height="100%",a._add_prefixed_style(this.message,"boxSizing","border-box"),this.message.style.overflow="hidden",this.message.style.textAlign="center",this.message.style.paddingTop=""+j+"px",this.message.style.paddingBottom=""+j+"px",this.message.style.paddingLeft=""+e+"px",this.message.style.paddingRight=""+e+"px",this.message.style.position="absolute",this.message.style.zIndex=3,this.message.innerHTML="Please allow camera access when prompted by the browser.

Look for camera icon around your address bar.",this.container.appendChild(this.message),this.video_container=document.createElement("div"),this.video_container.style.width=""+this.view_width+"px",this.video_container.style.height=""+this.view_height+"px",this.video_container.style.overflow="hidden",this.video_container.style.position="absolute",this.video_container.style.zIndex=1,this.container.appendChild(this.video_container),this.video=document.createElement("video"),this.video.autoplay=!0,a._add_prefixed_style(this.video,"transform","scalex(-1.0)"),window.AudioContext&&(f(l)?this._load_shutter_sound(this.options.shutter_ogg_url):f(i)&&this._load_shutter_sound(this.options.shutter_mp3_url)),d={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},h=this,g=function(a){return h._remove_message(),window.URL?h.video.src=URL.createObjectURL(a):h.video.src=a,h._block_element_access(),h._wait_for_video_ready()},c=function(a){var b,c,d;h.message.innerHTML='You have denied camera access.

Look for camera icon around your address bar to change your decision.',b=a.code;for(c in a)if(d=a[c],"code"!==c)return void h._got_error(c);return h._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(d,g,c)}catch(k){return b=k,navigator.getUserMedia("video",g,c)}},c.prototype._engine_play_shutter_sound=function(){var a;if(this.shutter_buffer)return a=this.audio_context.createBufferSource(),a.buffer=this.shutter_buffer,a.connect(this.audio_context.destination),a.start(0)},c.prototype._engine_capture=function(a,b,c,d){var e,f,g;return g=this._get_capture_crop(),e=document.createElement("canvas"),e.width=Math.round(g.width*d),e.height=Math.round(g.height*d),f=e.getContext("2d"),f.drawImage(this.video,g.x_offset,g.y_offset,g.width,g.height,0,0,Math.round(g.width*d),Math.round(g.height*d)),a._canvas=e,a._mirror=b,a._quality=c},c.prototype._engine_display=function(b){return this.displayed_canvas&&this.container.removeChild(this.displayed_canvas),this.displayed_canvas=b._canvas,this.displayed_canvas.style.width=""+this.view_width+"px",this.displayed_canvas.style.height=""+this.view_height+"px",this.displayed_canvas.style.top=0,this.displayed_canvas.style.left=0,this.displayed_canvas.style.position="absolute",this.displayed_canvas.style.zIndex=2,a._add_prefixed_style(this.displayed_canvas,"transform","scalex(-1.0)"),this.container.appendChild(this.displayed_canvas)},c.prototype._engine_get_canvas=function(a){var b,c;return b=document.createElement("canvas"),b.width=a._canvas.width,b.height=a._canvas.height,c=b.getContext("2d"),c.drawImage(a._canvas,0,0),b},c.prototype._engine_get_image_data=function(a){var b,c;return b=a._canvas,c=b.getContext("2d"),c.getImageData(0,0,b.width,b.height)},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._canvas,0,0)):f=a._canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return a._xhr&&a._xhr.abort(),delete a._xhr,delete a._canvas},c.prototype._engine_show_stream=function(){return this.displayed_canvas&&(this.container.removeChild(this.displayed_canvas),this.displayed_canvas=null),this.video_container.style.display="block"},c.prototype._engine_upload=function(a,b,c,d){return this._debug("Uploading the file"),a.get_blob(function(e){var f,g;return f=function(b){return delete a._xhr,a._status=b.target.status,a._response=b.target.responseText,a._status>=200&&a._status<300?a._upload_done():(a._error_message=b.target.statusText||"Unknown error",a._upload_fail())},g=new XMLHttpRequest,g.open("POST",b),g.timeout=d,c&&g.setRequestHeader("X-CSRF-Token",c),g.onload=f,g.onerror=f,g.onabort=f,g.send(e),a._xhr=g},"image/jpeg")},c.prototype._remove_message=function(){return this.message.style.display="none"},c.prototype._load_shutter_sound=function(a){var b,c;if(!this.audio_context)return this.audio_context=new AudioContext,b=new XMLHttpRequest,b.open("GET",a,!0),b.responseType="arraybuffer",c=this,b.onload=function(){return c.audio_context.decodeAudioData(b.response,function(a){return c.shutter_buffer=a})},b.send()},c.prototype._wait_for_video_ready=function(){var a,b,c,d;return d=parseInt(this.video.videoWidth),c=parseInt(this.video.videoHeight),d>0&&c>0?(this.video_container.appendChild(this.video),this.video_width=d,this.video_height=c,a=this._get_video_crop(),this.video.style.position="relative",this.video.style.width=""+a.width+"px",this.video.style.height=""+a.height+"px",this.video.style.left=""+a.x_offset+"px",this.video.style.top=""+a.y_offset+"px",this._prepared(this.video_width,this.video_height)):this._status_checks_count>100?this._got_error("Camera failed to initialize in 10 seconds"):(this._status_checks_count++,b=this,setTimeout(function(){return b._wait_for_video_ready()},100))},c.prototype._status_checks_count=0,c.prototype._get_video_crop=function(){var a,b,c,d,e;return c=this.video_width/this.video_height,e=this.view_width/this.view_height,c>=e?(this._debug("Filling height"),d=this.view_height/this.video_height,b=Math.round(this.video_width*d),{width:b,height:this.view_height,x_offset:-Math.floor((b-this.view_width)/2),y_offset:0}):(this._debug("Filling width"),d=this.view_width/this.video_width,a=Math.round(this.video_height*d),{width:this.view_width,height:a,x_offset:0,y_offset:-Math.floor((a-this.view_height)/2)})},c.prototype._get_capture_crop=function(){var a,b,c,d;return c=this.video_width/this.video_height,d=this.view_width/this.view_height,c>=d?(b=Math.round(this.video_height*d),{width:b,height:this.video_height,x_offset:Math.floor((this.video_width-b)/2),y_offset:0}):(a=Math.round(this.video_width/d),{width:this.video_width,height:a,x_offset:0,y_offset:Math.floor((this.video_height-a)/2)})},c}(a),window.JpegCamera=c),!window.swfobject)throw"JpegCamera: SWFObject is not loaded";k="9",j=!window.JpegCamera||!window.AudioContext||window.jpeg_camera_force_flash,g=function(){return window.swfobject&&swfobject.hasFlashPlayerVersion(k)},j&&g()&&(b=function(b){function c(){return n=c.__super__.constructor.apply(this,arguments)}return p(c,b),c._send_message=function(a,b){var c,d;return(d=this._instances[parseInt(a)])?(c=Array.prototype.slice.call(arguments,2),this.prototype[b].apply(d,c)):void 0},c._instances={},c._next_id=1,c.prototype._engine_init=function(){var a,b,c,d,e,f,g;return this._debug("Using Flash engine"),this._id=this.constructor._next_id++,this.constructor._instances[this._id]=this,this.view_width<215||this.view_height<138?void this._got_error("camera is too small to display privacy dialog"):(d="flash_object_"+this._id,f={loop:"false",allowScriptAccess:"always",allowFullScreen:"false",quality:"best",wmode:"opaque",menu:"false"},a={id:d,align:"middle"},e={id:this._id,width:this.view_width,height:this.view_height,shutter_url:this.options.shutter_mp3_url},g=this,b=function(a){return a.success?(g._debug("Flash loaded"),g._flash=document.getElementById(d)):g._got_error("Flash loading failed.")},c=document.createElement("div"),c.id="jpeg_camera_flash_"+this._id,c.style.width="100%",c.style.height="100%",this.container.appendChild(c),swfobject.embedSWF(this.options.swf_url,c.id,this.view_width,this.view_height,"9",null,e,f,a,b))},c.prototype._engine_play_shutter_sound=function(){return this._flash._play_shutter()},c.prototype._engine_capture=function(a,b,c,d){return this._flash._capture(a.id,b,c,d)},c.prototype._engine_display=function(a){return this._flash._display(a.id)},c.prototype._engine_get_canvas=function(a){var b,c;return a._image_data||(a._image_data=this._engine_get_image_data(a)),b=document.createElement("canvas"),b.width=a._image_data.width,b.height=a._image_data.height,c=b.getContext("2d"),c.putImageData(a._image_data,0,0),b},c.prototype._engine_get_image_data=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o;for(f=this._flash._get_image_data(b.id),a.canvas_supported()?(d=document.createElement("canvas"),d.width=f.width,d.height=f.height,e=d.getContext("2d"),l=e.createImageData(f.width,f.height)):l={data:[],width:f.width,height:f.height},o=f.data,h=m=0,n=o.length;n>m;h=++m)j=o[h],i=4*h,k=j>>16&255,g=j>>8&255,c=255&j,l.data[i+0]=k,l.data[i+1]=g,l.data[i+2]=c,l.data[i+3]=255;return l},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return a._extra_canvas||(a._extra_canvas=this._engine_get_canvas(a)),c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._extra_canvas,0,0)):f=a._extra_canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return this._flash._discard(a.id)},c.prototype._engine_show_stream=function(){return this._flash._show_stream()},c.prototype._engine_upload=function(a,b,c,d){return this._flash._upload(a.id,b,c,d)},c.prototype._flash_prepared=function(a,b){return this._block_element_access(),document.body.tabIndex=0,document.body.focus(),this._prepared(a,b)},c.prototype._flash_upload_complete=function(a,b,c,d){var e;return a=parseInt(a),e=this._snapshots[a],e._status=parseInt(b),e._response=d,e._status>=200&&e._status<300?e._upload_done():(e._error_message=c,e._upload_fail())},c}(a),window.JpegCamera=b),d=function(){function b(a,b){this.camera=a,this.options=b,this.id=this.constructor._next_snapshot_id++}return b._next_snapshot_id=1,b.prototype._discarded=!1,b.prototype.show=function(){return this._discarded&&raise("discarded snapshot cannot be used"),this.camera._display(this),this},b.prototype.hide=function(){return this.camera.displayed_snapshot()===this&&this.camera.show_stream(),this},b.prototype.get_stats=function(a){return this._discarded&&raise("discarded snapshot cannot be used"),this.get_image_data(function(b){return this._get_stats(b,a)})},b.prototype.get_canvas=function(b){var c;return this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,c=this,setTimeout(function(){return c._extra_canvas||(c._extra_canvas=c.camera._engine_get_canvas(c)),a._add_prefixed_style(c._extra_canvas,"transform","scalex(-1.0)"),b.call(c,c._extra_canvas)},1),!0},b.prototype._extra_canvas=null,b.prototype.get_blob=function(b,c){var d;return null==c&&(c="image/jpeg"),this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,d=this,setTimeout(function(){var a,e;return d._blob_mime!==c&&(d._blob=null),d._blob_mime=c,d._blob?b.call(d,d._blob):(a=d.options.mirror,e=d.options.quality,d.camera._engine_get_blob(d,c,a,e,function(a){return d._blob=a,b.call(d,d._blob)}))},1),!0},b.prototype._blob=null,b.prototype._blob_mime=null,b.prototype.get_image_data=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),b=this,setTimeout(function(){return b._image_data||(b._image_data=b.camera._engine_get_image_data(b)),a.call(b,b._image_data)},1),null},b.prototype._image_data=null,b.prototype.upload=function(a){var b;if(null==a&&(a={}),this._discarded&&raise("discarded snapshot cannot be used"),this._uploading)return void this.camera._debug("Upload already in progress");if(this._uploading=!0,this._retry=1,this._upload_options=a,b=this._options(),!b.api_url)throw this.camera._debug("Snapshot#upload called without valid api_url"),"Snapshot#upload called without valid api_url";return this._start_upload(b),this},b.prototype._upload_options={},b.prototype._uploading=!1,b.prototype._retry=1,b.prototype.done=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_done=a,b=this._options(),b.on_upload_done&&this._done&&b.on_upload_done.call(this,this._response),this},b.prototype._done=!1,b.prototype._response=null,b.prototype.fail=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_fail=a,b=this._options(),b.on_upload_fail&&this._fail&&b.on_upload_fail.call(this,this._status,this._error_message,this._response),this},b.prototype._fail=!1,b.prototype._status=null,b.prototype._error_message=null,b.prototype.discard=function(){return this.camera._discard(this),delete this._extra_canvas,delete this._image_data,void delete this._blob},b.prototype._options=function(){return this.camera._extend({},this.camera.options,this.options,this._upload_options)},b.prototype._start_upload=function(a){var b;return b="string"==typeof a.csrf_token&&a.csrf_token.length>0?a.csrf_token:null,this._done=!1,this._response=null,this._fail=!1,this._status=null,this._error_message=null,this.camera._engine_upload(this,a.api_url,b,a.timeout)},b.prototype._get_stats=function(a,b){var c,d,f,g,h,i,j,k,l,m,n;if(!this._stats){for(i=a.width*a.height,j=0,d=new Array(i),f=l=0;i>l;f=l+=1)g=4*f,c=.2126*a.data[g+0]+.7152*a.data[g+1]+.0722*a.data[g+2],c=Math.round(c),j+=c,d[f]=c;for(h=Math.round(j/i),k=0,m=0,n=d.length;n>m;m++)c=d[m],k+=Math.pow(c-h,2);this._stats=new e,this._stats.mean=h,this._stats.std=Math.round(Math.sqrt(k/i))}return b.call(this,this._stats)},b.prototype._stats=null,b.prototype._upload_done=function(){var a,b,c,d;return this.camera._debug("Upload completed with status "+this._status),this._done=!0,a=this._options(),c=a.retry_success&&a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_done?a.on_upload_done.call(this,this._response):void 0)},b.prototype._upload_fail=function(){var a,b,c,d;return this.camera._debug("Upload failed with status "+this._status),this._fail=!0,a=this._options(),c=a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_fail?a.on_upload_fail.call(this,this._status,this._error_message,this._response):void 0)},b}(),e=function(){function a(){}return a.prototype.mean=null,a.prototype.std=null,a}()}).call(this); \ No newline at end of file +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o={}.hasOwnProperty,p=function(a,b){function c(){this.constructor=a}for(var d in b)o.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a};if(a=function(){function a(a,b){if("string"==typeof a&&(a=document.getElementById(a.replace("#",""))),!a||!a.offsetWidth)throw"JpegCamera: invalid container";a.innerHTML="",this.view_width=parseInt(a.offsetWidth,10),this.view_height=parseInt(a.offsetHeight,10),this.container=document.createElement("div"),this.container.style.width="100%",this.container.style.height="100%",this.container.style.position="relative",a.appendChild(this.container),this.options=this._extend({},this.constructor.DefaultOptions,b),this._engine_init()}return a.DefaultOptions={shutter_ogg_url:"/jpeg_camera/shutter.ogg",shutter_mp3_url:"/jpeg_camera/shutter.mp3",swf_url:"/jpeg_camera/jpeg_camera.swf",on_debug:function(a){return console&&console.log?console.log("JpegCamera: "+a):void 0},quality:.9,shutter:!0,mirror:!1,timeout:0,retry_success:!1,scale:1},a._canvas_supported=!!document.createElement("canvas").getContext,a.canvas_supported=function(){return this._canvas_supported},a.prototype.ready=function(a){return this.options.on_ready=a,this.options.on_ready&&this._is_ready&&this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}),this},a.prototype._is_ready=!1,a.prototype.error=function(a){return this.options.on_error=a,this.options.on_error&&this._error_occured&&this.options.on_error.call(this,this._error_occured),this},a.prototype._error_occured=!1,a.StatsCaptureScale=.2,a.prototype.get_stats=function(b){var c,e;return c=new d(this,{}),this._engine_capture(c,!1,.1,a.StatsCaptureScale),e=this,c.get_stats(function(a){return b.call(e,a)})},a.prototype.capture=function(a){var b,c,e;return null==a&&(a={}),c=new d(this,a),this._snapshots[c.id]=c,e=c._options(),e.shutter&&this._engine_play_shutter_sound(),b=Math.min(1,e.scale),b=Math.max(.01,b),this._engine_capture(c,e.mirror,e.quality,b),c},a.prototype._snapshots={},a.prototype.show_stream=function(){return this._engine_show_stream(),this._displayed_snapshot=null,this},a.prototype.discard_all=function(){var a,b,c;this._displayed_snapshot&&this.show_stream(),c=this._snapshots;for(a in c)b=c[a],this._engine_discard(b),b._discarded=!0;return this._snapshots={},this},a.prototype._extend=function(a){var b,c,d,e,f,g;for(d=Array.prototype.slice.call(arguments,1),f=0,g=d.length;g>f;f++)if(c=d[f])for(b in c)e=c[b],a[b]=e;return a},a.prototype._debug=function(a){return this.options.on_debug?this.options.on_debug.call(this,a):void 0},a.prototype._display=function(a){return this._engine_display(a),this._displayed_snapshot=a},a.prototype._displayed_snapshot=null,a.prototype._discard=function(a){return this._displayed_snapshot===a&&this.show_stream(),this._engine_discard(a),a._discarded=!0,delete this._snapshots[a.id]},a.prototype._prepared=function(a,b){var c;return this.video_width=a,this.video_height=b,this._debug("Camera resolution "+this.video_width+"x"+this.video_height+"px"),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!0)},1)},a.prototype._wait_until_stream_looks_ok=function(a){return this.get_stats(function(b){var c;return b.std>2?(this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),this._debug("Camera is ready"),this._is_ready=!0,this.options.on_ready?this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}):void 0):(a&&this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!1)},100))})},a.prototype._got_error=function(a){return this._debug("Error - "+a),this._error_occured=a,this.options.on_error?this.options.on_error.call(this,this._error_occured):void 0},a.prototype._block_element_access=function(){return this._overlay=document.createElement("div"),this._overlay.style.width="100%",this._overlay.style.height="100%",this._overlay.style.position="absolute",this._overlay.style.top=0,this._overlay.style.left=0,this._overlay.style.zIndex=2,this.container.appendChild(this._overlay)},a.prototype._overlay=null,a.prototype.view_width=null,a.prototype.view_height=null,a._add_prefixed_style=function(a,b,c){var d;return d=b.charAt(0).toUpperCase()+b.slice(1),a.style[b]=c,a.style["Webkit"+d]=c,a.style["Moz"+d]=c,a.style["ms"+d]=c,a.style["O"+d]=c},a}(),navigator.getUserMedia||(navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia),window.AudioContext||(window.AudioContext=window.webkitAudioContext),h=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(h(),l="audio/ogg; codecs=vorbis",i="audio/mpeg; ",f=function(a){var b;return b=document.createElement("video"),!(!b.canPlayType||!b.canPlayType(a).replace(/no/,""))},c=function(b){function c(){return m=c.__super__.constructor.apply(this,arguments)}return p(c,b),c.prototype._engine_init=function(){var b,c,d,e,g,h,j,k;this._debug("Using HTML5 engine"),k=Math.floor(.2*this.view_height),g=Math.floor(.2*this.view_width),this.message=document.createElement("div"),this.message["class"]="message",this.message.style.width="100%",this.message.style.height="100%",a._add_prefixed_style(this.message,"boxSizing","border-box"),this.message.style.overflow="hidden",this.message.style.textAlign="center",this.message.style.paddingTop=""+k+"px",this.message.style.paddingBottom=""+k+"px",this.message.style.paddingLeft=""+g+"px",this.message.style.paddingRight=""+g+"px",this.message.style.position="absolute",this.message.style.zIndex=3,this.message.innerHTML="Please allow camera access when prompted by the browser.

Look for camera icon around your address bar.",this.container.appendChild(this.message),this.video_container=document.createElement("div"),this.video_container.style.width=""+this.view_width+"px",this.video_container.style.height=""+this.view_height+"px",this.video_container.style.overflow="hidden",this.video_container.style.position="absolute",this.video_container.style.zIndex=1,this.container.appendChild(this.video_container),this.video=document.createElement("video"),this.video.autoplay=!0,a._add_prefixed_style(this.video,"transform","scalex(-1.0)"),window.AudioContext&&(f(l)?this._load_shutter_sound(this.options.shutter_ogg_url):f(i)&&this._load_shutter_sound(this.options.shutter_mp3_url)),b={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},e="function"==typeof this.options.get_media_options?this.options.get_media_options(b):b,j=this,h=function(a){return j._remove_message(),window.URL?j.video.src=URL.createObjectURL(a):j.video.src=a,j._block_element_access(),j._wait_for_video_ready()},d=function(a){var b,c,d;j.message.innerHTML='You have denied camera access.

Look for camera icon around your address bar to change your decision.',b=a.code;for(c in a)if(d=a[c],"code"!==c)return void j._got_error(c);return j._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(e,h,d)}catch(m){return c=m,navigator.getUserMedia("video",h,d)}},c.prototype._engine_play_shutter_sound=function(){var a;if(this.shutter_buffer)return a=this.audio_context.createBufferSource(),a.buffer=this.shutter_buffer,a.connect(this.audio_context.destination),a.start(0)},c.prototype._engine_capture=function(a,b,c,d){var e,f,g;return g=this._get_capture_crop(),e=document.createElement("canvas"),e.width=Math.round(g.width*d),e.height=Math.round(g.height*d),f=e.getContext("2d"),f.drawImage(this.video,g.x_offset,g.y_offset,g.width,g.height,0,0,Math.round(g.width*d),Math.round(g.height*d)),a._canvas=e,a._mirror=b,a._quality=c},c.prototype._engine_display=function(b){return this.displayed_canvas&&this.container.removeChild(this.displayed_canvas),this.displayed_canvas=b._canvas,this.displayed_canvas.style.width=""+this.view_width+"px",this.displayed_canvas.style.height=""+this.view_height+"px",this.displayed_canvas.style.top=0,this.displayed_canvas.style.left=0,this.displayed_canvas.style.position="absolute",this.displayed_canvas.style.zIndex=2,a._add_prefixed_style(this.displayed_canvas,"transform","scalex(-1.0)"),this.container.appendChild(this.displayed_canvas)},c.prototype._engine_get_canvas=function(a){var b,c;return b=document.createElement("canvas"),b.width=a._canvas.width,b.height=a._canvas.height,c=b.getContext("2d"),c.drawImage(a._canvas,0,0),b},c.prototype._engine_get_image_data=function(a){var b,c;return b=a._canvas,c=b.getContext("2d"),c.getImageData(0,0,b.width,b.height)},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._canvas,0,0)):f=a._canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return a._xhr&&a._xhr.abort(),delete a._xhr,delete a._canvas},c.prototype._engine_show_stream=function(){return this.displayed_canvas&&(this.container.removeChild(this.displayed_canvas),this.displayed_canvas=null),this.video_container.style.display="block"},c.prototype._engine_upload=function(a,b,c,d){return this._debug("Uploading the file"),a.get_blob(function(e){var f,g;return f=function(b){return delete a._xhr,a._status=b.target.status,a._response=b.target.responseText,a._status>=200&&a._status<300?a._upload_done():(a._error_message=b.target.statusText||"Unknown error",a._upload_fail())},g=new XMLHttpRequest,g.open("POST",b),g.timeout=d,c&&g.setRequestHeader("X-CSRF-Token",c),g.onload=f,g.onerror=f,g.onabort=f,g.send(e),a._xhr=g},"image/jpeg")},c.prototype._remove_message=function(){return this.message.style.display="none"},c.prototype._load_shutter_sound=function(a){var b,c;if(!this.audio_context)return this.audio_context=new AudioContext,b=new XMLHttpRequest,b.open("GET",a,!0),b.responseType="arraybuffer",c=this,b.onload=function(){return c.audio_context.decodeAudioData(b.response,function(a){return c.shutter_buffer=a})},b.send()},c.prototype._wait_for_video_ready=function(){var a,b,c,d;return d=parseInt(this.video.videoWidth),c=parseInt(this.video.videoHeight),d>0&&c>0?(this.video_container.appendChild(this.video),this.video_width=d,this.video_height=c,a=this._get_video_crop(),this.video.style.position="relative",this.video.style.width=""+a.width+"px",this.video.style.height=""+a.height+"px",this.video.style.left=""+a.x_offset+"px",this.video.style.top=""+a.y_offset+"px",this._prepared(this.video_width,this.video_height)):this._status_checks_count>100?this._got_error("Camera failed to initialize in 10 seconds"):(this._status_checks_count++,b=this,setTimeout(function(){return b._wait_for_video_ready()},100))},c.prototype._status_checks_count=0,c.prototype._get_video_crop=function(){var a,b,c,d,e;return c=this.video_width/this.video_height,e=this.view_width/this.view_height,c>=e?(this._debug("Filling height"),d=this.view_height/this.video_height,b=Math.round(this.video_width*d),{width:b,height:this.view_height,x_offset:-Math.floor((b-this.view_width)/2),y_offset:0}):(this._debug("Filling width"),d=this.view_width/this.video_width,a=Math.round(this.video_height*d),{width:this.view_width,height:a,x_offset:0,y_offset:-Math.floor((a-this.view_height)/2)})},c.prototype._get_capture_crop=function(){var a,b,c,d;return c=this.video_width/this.video_height,d=this.view_width/this.view_height,c>=d?(b=Math.round(this.video_height*d),{width:b,height:this.video_height,x_offset:Math.floor((this.video_width-b)/2),y_offset:0}):(a=Math.round(this.video_width/d),{width:this.video_width,height:a,x_offset:0,y_offset:Math.floor((this.video_height-a)/2)})},c}(a),window.JpegCamera=c),!window.swfobject)throw"JpegCamera: SWFObject is not loaded";k="9",j=!window.JpegCamera||!window.AudioContext||window.jpeg_camera_force_flash,g=function(){return window.swfobject&&swfobject.hasFlashPlayerVersion(k)},j&&g()&&(b=function(b){function c(){return n=c.__super__.constructor.apply(this,arguments)}return p(c,b),c._send_message=function(a,b){var c,d;return(d=this._instances[parseInt(a)])?(c=Array.prototype.slice.call(arguments,2),this.prototype[b].apply(d,c)):void 0},c._instances={},c._next_id=1,c.prototype._engine_init=function(){var a,b,c,d,e,f,g;return this._debug("Using Flash engine"),this._id=this.constructor._next_id++,this.constructor._instances[this._id]=this,this.view_width<215||this.view_height<138?void this._got_error("camera is too small to display privacy dialog"):(d="flash_object_"+this._id,f={loop:"false",allowScriptAccess:"always",allowFullScreen:"false",quality:"best",wmode:"opaque",menu:"false"},a={id:d,align:"middle"},e={id:this._id,width:this.view_width,height:this.view_height,shutter_url:this.options.shutter_mp3_url},g=this,b=function(a){return a.success?(g._debug("Flash loaded"),g._flash=document.getElementById(d)):g._got_error("Flash loading failed.")},c=document.createElement("div"),c.id="jpeg_camera_flash_"+this._id,c.style.width="100%",c.style.height="100%",this.container.appendChild(c),swfobject.embedSWF(this.options.swf_url,c.id,this.view_width,this.view_height,"9",null,e,f,a,b))},c.prototype._engine_play_shutter_sound=function(){return this._flash._play_shutter()},c.prototype._engine_capture=function(a,b,c,d){return this._flash._capture(a.id,b,c,d)},c.prototype._engine_display=function(a){return this._flash._display(a.id)},c.prototype._engine_get_canvas=function(a){var b,c;return a._image_data||(a._image_data=this._engine_get_image_data(a)),b=document.createElement("canvas"),b.width=a._image_data.width,b.height=a._image_data.height,c=b.getContext("2d"),c.putImageData(a._image_data,0,0),b},c.prototype._engine_get_image_data=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o;for(f=this._flash._get_image_data(b.id),a.canvas_supported()?(d=document.createElement("canvas"),d.width=f.width,d.height=f.height,e=d.getContext("2d"),l=e.createImageData(f.width,f.height)):l={data:[],width:f.width,height:f.height},o=f.data,h=m=0,n=o.length;n>m;h=++m)j=o[h],i=4*h,k=j>>16&255,g=j>>8&255,c=255&j,l.data[i+0]=k,l.data[i+1]=g,l.data[i+2]=c,l.data[i+3]=255;return l},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return a._extra_canvas||(a._extra_canvas=this._engine_get_canvas(a)),c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._extra_canvas,0,0)):f=a._extra_canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return this._flash._discard(a.id)},c.prototype._engine_show_stream=function(){return this._flash._show_stream()},c.prototype._engine_upload=function(a,b,c,d){return this._flash._upload(a.id,b,c,d)},c.prototype._flash_prepared=function(a,b){return this._block_element_access(),document.body.tabIndex=0,document.body.focus(),this._prepared(a,b)},c.prototype._flash_upload_complete=function(a,b,c,d){var e;return a=parseInt(a),e=this._snapshots[a],e._status=parseInt(b),e._response=d,e._status>=200&&e._status<300?e._upload_done():(e._error_message=c,e._upload_fail())},c}(a),window.JpegCamera=b),d=function(){function b(a,b){this.camera=a,this.options=b,this.id=this.constructor._next_snapshot_id++}return b._next_snapshot_id=1,b.prototype._discarded=!1,b.prototype.show=function(){return this._discarded&&raise("discarded snapshot cannot be used"),this.camera._display(this),this},b.prototype.hide=function(){return this.camera.displayed_snapshot()===this&&this.camera.show_stream(),this},b.prototype.get_stats=function(a){return this._discarded&&raise("discarded snapshot cannot be used"),this.get_image_data(function(b){return this._get_stats(b,a)})},b.prototype.get_canvas=function(b){var c;return this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,c=this,setTimeout(function(){return c._extra_canvas||(c._extra_canvas=c.camera._engine_get_canvas(c)),a._add_prefixed_style(c._extra_canvas,"transform","scalex(-1.0)"),b.call(c,c._extra_canvas)},1),!0},b.prototype._extra_canvas=null,b.prototype.get_blob=function(b,c){var d;return null==c&&(c="image/jpeg"),this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,d=this,setTimeout(function(){var a,e;return d._blob_mime!==c&&(d._blob=null),d._blob_mime=c,d._blob?b.call(d,d._blob):(a=d.options.mirror,e=d.options.quality,d.camera._engine_get_blob(d,c,a,e,function(a){return d._blob=a,b.call(d,d._blob)}))},1),!0},b.prototype._blob=null,b.prototype._blob_mime=null,b.prototype.get_image_data=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),b=this,setTimeout(function(){return b._image_data||(b._image_data=b.camera._engine_get_image_data(b)),a.call(b,b._image_data)},1),null},b.prototype._image_data=null,b.prototype.upload=function(a){var b;if(null==a&&(a={}),this._discarded&&raise("discarded snapshot cannot be used"),this._uploading)return void this.camera._debug("Upload already in progress");if(this._uploading=!0,this._retry=1,this._upload_options=a,b=this._options(),!b.api_url)throw this.camera._debug("Snapshot#upload called without valid api_url"),"Snapshot#upload called without valid api_url";return this._start_upload(b),this},b.prototype._upload_options={},b.prototype._uploading=!1,b.prototype._retry=1,b.prototype.done=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_done=a,b=this._options(),b.on_upload_done&&this._done&&b.on_upload_done.call(this,this._response),this},b.prototype._done=!1,b.prototype._response=null,b.prototype.fail=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_fail=a,b=this._options(),b.on_upload_fail&&this._fail&&b.on_upload_fail.call(this,this._status,this._error_message,this._response),this},b.prototype._fail=!1,b.prototype._status=null,b.prototype._error_message=null,b.prototype.discard=function(){return this.camera._discard(this),delete this._extra_canvas,delete this._image_data,void delete this._blob},b.prototype._options=function(){return this.camera._extend({},this.camera.options,this.options,this._upload_options)},b.prototype._start_upload=function(a){var b;return b="string"==typeof a.csrf_token&&a.csrf_token.length>0?a.csrf_token:null,this._done=!1,this._response=null,this._fail=!1,this._status=null,this._error_message=null,this.camera._engine_upload(this,a.api_url,b,a.timeout)},b.prototype._get_stats=function(a,b){var c,d,f,g,h,i,j,k,l,m,n;if(!this._stats){for(i=a.width*a.height,j=0,d=new Array(i),f=l=0;i>l;f=l+=1)g=4*f,c=.2126*a.data[g+0]+.7152*a.data[g+1]+.0722*a.data[g+2],c=Math.round(c),j+=c,d[f]=c;for(h=Math.round(j/i),k=0,m=0,n=d.length;n>m;m++)c=d[m],k+=Math.pow(c-h,2);this._stats=new e,this._stats.mean=h,this._stats.std=Math.round(Math.sqrt(k/i))}return b.call(this,this._stats)},b.prototype._stats=null,b.prototype._upload_done=function(){var a,b,c,d;return this.camera._debug("Upload completed with status "+this._status),this._done=!0,a=this._options(),c=a.retry_success&&a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_done?a.on_upload_done.call(this,this._response):void 0)},b.prototype._upload_fail=function(){var a,b,c,d;return this.camera._debug("Upload failed with status "+this._status),this._fail=!0,a=this._options(),c=a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_fail?a.on_upload_fail.call(this,this._status,this._error_message,this._response):void 0)},b}(),e=function(){function a(){}return a.prototype.mean=null,a.prototype.std=null,a}()}).call(this); \ No newline at end of file diff --git a/dist/jpeg_camera_no_flash.js b/dist/jpeg_camera_no_flash.js index 5631570..ccc7953 100644 --- a/dist/jpeg_camera_no_flash.js +++ b/dist/jpeg_camera_no_flash.js @@ -1,4 +1,4 @@ -/*! JpegCamera 1.3.3 | 2016-09-18 +/*! JpegCamera 1.3.3 | 2017-08-16 (c) 2013 Adam Wrobel https://amw.github.io/jpeg_camera */ (function() { @@ -266,7 +266,7 @@ } JpegCameraHtml5.prototype._engine_init = function() { - var error, failure, get_user_media_options, horizontal_padding, success, that, vertical_padding; + var default_media_options, error, failure, get_user_media_options, horizontal_padding, success, that, vertical_padding; this._debug("Using HTML5 engine"); vertical_padding = Math.floor(this.view_height * 0.2); horizontal_padding = Math.floor(this.view_width * 0.2); @@ -302,7 +302,7 @@ this._load_shutter_sound(this.options.shutter_mp3_url); } } - get_user_media_options = { + default_media_options = { video: { optional: [ { @@ -317,6 +317,11 @@ ] } }; + if (typeof this.options.get_media_options === 'function') { + get_user_media_options = this.options.get_media_options(default_media_options); + } else { + get_user_media_options = default_media_options; + } that = this; success = function(stream) { that._remove_message(); diff --git a/dist/jpeg_camera_no_flash.min.js b/dist/jpeg_camera_no_flash.min.js index 01ad213..56e6dbd 100644 --- a/dist/jpeg_camera_no_flash.min.js +++ b/dist/jpeg_camera_no_flash.min.js @@ -1,4 +1,4 @@ -/*! JpegCamera 1.3.3 | 2016-09-18 +/*! JpegCamera 1.3.3 | 2017-08-16 (c) 2013 Adam Wrobel https://amw.github.io/jpeg_camera */ -(function(){var a,b,c,d,e,f,g,h,i,j={}.hasOwnProperty,k=function(a,b){function c(){this.constructor=a}for(var d in b)j.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a};a=function(){function a(a,b){if("string"==typeof a&&(a=document.getElementById(a.replace("#",""))),!a||!a.offsetWidth)throw"JpegCamera: invalid container";a.innerHTML="",this.view_width=parseInt(a.offsetWidth,10),this.view_height=parseInt(a.offsetHeight,10),this.container=document.createElement("div"),this.container.style.width="100%",this.container.style.height="100%",this.container.style.position="relative",a.appendChild(this.container),this.options=this._extend({},this.constructor.DefaultOptions,b),this._engine_init()}return a.DefaultOptions={shutter_ogg_url:"/jpeg_camera/shutter.ogg",shutter_mp3_url:"/jpeg_camera/shutter.mp3",swf_url:"/jpeg_camera/jpeg_camera.swf",on_debug:function(a){return console&&console.log?console.log("JpegCamera: "+a):void 0},quality:.9,shutter:!0,mirror:!1,timeout:0,retry_success:!1,scale:1},a._canvas_supported=!!document.createElement("canvas").getContext,a.canvas_supported=function(){return this._canvas_supported},a.prototype.ready=function(a){return this.options.on_ready=a,this.options.on_ready&&this._is_ready&&this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}),this},a.prototype._is_ready=!1,a.prototype.error=function(a){return this.options.on_error=a,this.options.on_error&&this._error_occured&&this.options.on_error.call(this,this._error_occured),this},a.prototype._error_occured=!1,a.StatsCaptureScale=.2,a.prototype.get_stats=function(b){var d,e;return d=new c(this,{}),this._engine_capture(d,!1,.1,a.StatsCaptureScale),e=this,d.get_stats(function(a){return b.call(e,a)})},a.prototype.capture=function(a){var b,d,e;return null==a&&(a={}),d=new c(this,a),this._snapshots[d.id]=d,e=d._options(),e.shutter&&this._engine_play_shutter_sound(),b=Math.min(1,e.scale),b=Math.max(.01,b),this._engine_capture(d,e.mirror,e.quality,b),d},a.prototype._snapshots={},a.prototype.show_stream=function(){return this._engine_show_stream(),this._displayed_snapshot=null,this},a.prototype.discard_all=function(){var a,b,c;this._displayed_snapshot&&this.show_stream(),c=this._snapshots;for(a in c)b=c[a],this._engine_discard(b),b._discarded=!0;return this._snapshots={},this},a.prototype._extend=function(a){var b,c,d,e,f,g;for(d=Array.prototype.slice.call(arguments,1),f=0,g=d.length;g>f;f++)if(c=d[f])for(b in c)e=c[b],a[b]=e;return a},a.prototype._debug=function(a){return this.options.on_debug?this.options.on_debug.call(this,a):void 0},a.prototype._display=function(a){return this._engine_display(a),this._displayed_snapshot=a},a.prototype._displayed_snapshot=null,a.prototype._discard=function(a){return this._displayed_snapshot===a&&this.show_stream(),this._engine_discard(a),a._discarded=!0,delete this._snapshots[a.id]},a.prototype._prepared=function(a,b){var c;return this.video_width=a,this.video_height=b,this._debug("Camera resolution "+this.video_width+"x"+this.video_height+"px"),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!0)},1)},a.prototype._wait_until_stream_looks_ok=function(a){return this.get_stats(function(b){var c;return b.std>2?(this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),this._debug("Camera is ready"),this._is_ready=!0,this.options.on_ready?this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}):void 0):(a&&this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!1)},100))})},a.prototype._got_error=function(a){return this._debug("Error - "+a),this._error_occured=a,this.options.on_error?this.options.on_error.call(this,this._error_occured):void 0},a.prototype._block_element_access=function(){return this._overlay=document.createElement("div"),this._overlay.style.width="100%",this._overlay.style.height="100%",this._overlay.style.position="absolute",this._overlay.style.top=0,this._overlay.style.left=0,this._overlay.style.zIndex=2,this.container.appendChild(this._overlay)},a.prototype._overlay=null,a.prototype.view_width=null,a.prototype.view_height=null,a._add_prefixed_style=function(a,b,c){var d;return d=b.charAt(0).toUpperCase()+b.slice(1),a.style[b]=c,a.style["Webkit"+d]=c,a.style["Moz"+d]=c,a.style["ms"+d]=c,a.style["O"+d]=c},a}(),navigator.getUserMedia||(navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia),window.AudioContext||(window.AudioContext=window.webkitAudioContext),f=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(f(),h="audio/ogg; codecs=vorbis",g="audio/mpeg; ",e=function(a){var b;return b=document.createElement("video"),!(!b.canPlayType||!b.canPlayType(a).replace(/no/,""))},b=function(b){function c(){return i=c.__super__.constructor.apply(this,arguments)}return k(c,b),c.prototype._engine_init=function(){var b,c,d,f,i,j,k;this._debug("Using HTML5 engine"),k=Math.floor(.2*this.view_height),f=Math.floor(.2*this.view_width),this.message=document.createElement("div"),this.message["class"]="message",this.message.style.width="100%",this.message.style.height="100%",a._add_prefixed_style(this.message,"boxSizing","border-box"),this.message.style.overflow="hidden",this.message.style.textAlign="center",this.message.style.paddingTop=""+k+"px",this.message.style.paddingBottom=""+k+"px",this.message.style.paddingLeft=""+f+"px",this.message.style.paddingRight=""+f+"px",this.message.style.position="absolute",this.message.style.zIndex=3,this.message.innerHTML="Please allow camera access when prompted by the browser.

Look for camera icon around your address bar.",this.container.appendChild(this.message),this.video_container=document.createElement("div"),this.video_container.style.width=""+this.view_width+"px",this.video_container.style.height=""+this.view_height+"px",this.video_container.style.overflow="hidden",this.video_container.style.position="absolute",this.video_container.style.zIndex=1,this.container.appendChild(this.video_container),this.video=document.createElement("video"),this.video.autoplay=!0,a._add_prefixed_style(this.video,"transform","scalex(-1.0)"),window.AudioContext&&(e(h)?this._load_shutter_sound(this.options.shutter_ogg_url):e(g)&&this._load_shutter_sound(this.options.shutter_mp3_url)),d={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},j=this,i=function(a){return j._remove_message(),window.URL?j.video.src=URL.createObjectURL(a):j.video.src=a,j._block_element_access(),j._wait_for_video_ready()},c=function(a){var b,c,d;j.message.innerHTML='You have denied camera access.

Look for camera icon around your address bar to change your decision.',b=a.code;for(c in a)if(d=a[c],"code"!==c)return void j._got_error(c);return j._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(d,i,c)}catch(l){return b=l,navigator.getUserMedia("video",i,c)}},c.prototype._engine_play_shutter_sound=function(){var a;if(this.shutter_buffer)return a=this.audio_context.createBufferSource(),a.buffer=this.shutter_buffer,a.connect(this.audio_context.destination),a.start(0)},c.prototype._engine_capture=function(a,b,c,d){var e,f,g;return g=this._get_capture_crop(),e=document.createElement("canvas"),e.width=Math.round(g.width*d),e.height=Math.round(g.height*d),f=e.getContext("2d"),f.drawImage(this.video,g.x_offset,g.y_offset,g.width,g.height,0,0,Math.round(g.width*d),Math.round(g.height*d)),a._canvas=e,a._mirror=b,a._quality=c},c.prototype._engine_display=function(b){return this.displayed_canvas&&this.container.removeChild(this.displayed_canvas),this.displayed_canvas=b._canvas,this.displayed_canvas.style.width=""+this.view_width+"px",this.displayed_canvas.style.height=""+this.view_height+"px",this.displayed_canvas.style.top=0,this.displayed_canvas.style.left=0,this.displayed_canvas.style.position="absolute",this.displayed_canvas.style.zIndex=2,a._add_prefixed_style(this.displayed_canvas,"transform","scalex(-1.0)"),this.container.appendChild(this.displayed_canvas)},c.prototype._engine_get_canvas=function(a){var b,c;return b=document.createElement("canvas"),b.width=a._canvas.width,b.height=a._canvas.height,c=b.getContext("2d"),c.drawImage(a._canvas,0,0),b},c.prototype._engine_get_image_data=function(a){var b,c;return b=a._canvas,c=b.getContext("2d"),c.getImageData(0,0,b.width,b.height)},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._canvas,0,0)):f=a._canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return a._xhr&&a._xhr.abort(),delete a._xhr,delete a._canvas},c.prototype._engine_show_stream=function(){return this.displayed_canvas&&(this.container.removeChild(this.displayed_canvas),this.displayed_canvas=null),this.video_container.style.display="block"},c.prototype._engine_upload=function(a,b,c,d){return this._debug("Uploading the file"),a.get_blob(function(e){var f,g;return f=function(b){return delete a._xhr,a._status=b.target.status,a._response=b.target.responseText,a._status>=200&&a._status<300?a._upload_done():(a._error_message=b.target.statusText||"Unknown error",a._upload_fail())},g=new XMLHttpRequest,g.open("POST",b),g.timeout=d,c&&g.setRequestHeader("X-CSRF-Token",c),g.onload=f,g.onerror=f,g.onabort=f,g.send(e),a._xhr=g},"image/jpeg")},c.prototype._remove_message=function(){return this.message.style.display="none"},c.prototype._load_shutter_sound=function(a){var b,c;if(!this.audio_context)return this.audio_context=new AudioContext,b=new XMLHttpRequest,b.open("GET",a,!0),b.responseType="arraybuffer",c=this,b.onload=function(){return c.audio_context.decodeAudioData(b.response,function(a){return c.shutter_buffer=a})},b.send()},c.prototype._wait_for_video_ready=function(){var a,b,c,d;return d=parseInt(this.video.videoWidth),c=parseInt(this.video.videoHeight),d>0&&c>0?(this.video_container.appendChild(this.video),this.video_width=d,this.video_height=c,a=this._get_video_crop(),this.video.style.position="relative",this.video.style.width=""+a.width+"px",this.video.style.height=""+a.height+"px",this.video.style.left=""+a.x_offset+"px",this.video.style.top=""+a.y_offset+"px",this._prepared(this.video_width,this.video_height)):this._status_checks_count>100?this._got_error("Camera failed to initialize in 10 seconds"):(this._status_checks_count++,b=this,setTimeout(function(){return b._wait_for_video_ready()},100))},c.prototype._status_checks_count=0,c.prototype._get_video_crop=function(){var a,b,c,d,e;return c=this.video_width/this.video_height,e=this.view_width/this.view_height,c>=e?(this._debug("Filling height"),d=this.view_height/this.video_height,b=Math.round(this.video_width*d),{width:b,height:this.view_height,x_offset:-Math.floor((b-this.view_width)/2),y_offset:0}):(this._debug("Filling width"),d=this.view_width/this.video_width,a=Math.round(this.video_height*d),{width:this.view_width,height:a,x_offset:0,y_offset:-Math.floor((a-this.view_height)/2)})},c.prototype._get_capture_crop=function(){var a,b,c,d;return c=this.video_width/this.video_height,d=this.view_width/this.view_height,c>=d?(b=Math.round(this.video_height*d),{width:b,height:this.video_height,x_offset:Math.floor((this.video_width-b)/2),y_offset:0}):(a=Math.round(this.video_width/d),{width:this.video_width,height:a,x_offset:0,y_offset:Math.floor((this.video_height-a)/2)})},c}(a),window.JpegCamera=b),c=function(){function b(a,b){this.camera=a,this.options=b,this.id=this.constructor._next_snapshot_id++}return b._next_snapshot_id=1,b.prototype._discarded=!1,b.prototype.show=function(){return this._discarded&&raise("discarded snapshot cannot be used"),this.camera._display(this),this},b.prototype.hide=function(){return this.camera.displayed_snapshot()===this&&this.camera.show_stream(),this},b.prototype.get_stats=function(a){return this._discarded&&raise("discarded snapshot cannot be used"),this.get_image_data(function(b){return this._get_stats(b,a)})},b.prototype.get_canvas=function(b){var c;return this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,c=this,setTimeout(function(){return c._extra_canvas||(c._extra_canvas=c.camera._engine_get_canvas(c)),a._add_prefixed_style(c._extra_canvas,"transform","scalex(-1.0)"),b.call(c,c._extra_canvas)},1),!0},b.prototype._extra_canvas=null,b.prototype.get_blob=function(b,c){var d;return null==c&&(c="image/jpeg"),this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,d=this,setTimeout(function(){var a,e;return d._blob_mime!==c&&(d._blob=null),d._blob_mime=c,d._blob?b.call(d,d._blob):(a=d.options.mirror,e=d.options.quality,d.camera._engine_get_blob(d,c,a,e,function(a){return d._blob=a,b.call(d,d._blob)}))},1),!0},b.prototype._blob=null,b.prototype._blob_mime=null,b.prototype.get_image_data=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),b=this,setTimeout(function(){return b._image_data||(b._image_data=b.camera._engine_get_image_data(b)),a.call(b,b._image_data)},1),null},b.prototype._image_data=null,b.prototype.upload=function(a){var b;if(null==a&&(a={}),this._discarded&&raise("discarded snapshot cannot be used"),this._uploading)return void this.camera._debug("Upload already in progress");if(this._uploading=!0,this._retry=1,this._upload_options=a,b=this._options(),!b.api_url)throw this.camera._debug("Snapshot#upload called without valid api_url"),"Snapshot#upload called without valid api_url";return this._start_upload(b),this},b.prototype._upload_options={},b.prototype._uploading=!1,b.prototype._retry=1,b.prototype.done=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_done=a,b=this._options(),b.on_upload_done&&this._done&&b.on_upload_done.call(this,this._response),this},b.prototype._done=!1,b.prototype._response=null,b.prototype.fail=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_fail=a,b=this._options(),b.on_upload_fail&&this._fail&&b.on_upload_fail.call(this,this._status,this._error_message,this._response),this},b.prototype._fail=!1,b.prototype._status=null,b.prototype._error_message=null,b.prototype.discard=function(){return this.camera._discard(this),delete this._extra_canvas,delete this._image_data,void delete this._blob},b.prototype._options=function(){return this.camera._extend({},this.camera.options,this.options,this._upload_options)},b.prototype._start_upload=function(a){var b;return b="string"==typeof a.csrf_token&&a.csrf_token.length>0?a.csrf_token:null,this._done=!1,this._response=null,this._fail=!1,this._status=null,this._error_message=null,this.camera._engine_upload(this,a.api_url,b,a.timeout)},b.prototype._get_stats=function(a,b){var c,e,f,g,h,i,j,k,l,m,n;if(!this._stats){for(i=a.width*a.height,j=0,e=new Array(i),f=l=0;i>l;f=l+=1)g=4*f,c=.2126*a.data[g+0]+.7152*a.data[g+1]+.0722*a.data[g+2],c=Math.round(c),j+=c,e[f]=c;for(h=Math.round(j/i),k=0,m=0,n=e.length;n>m;m++)c=e[m],k+=Math.pow(c-h,2);this._stats=new d,this._stats.mean=h,this._stats.std=Math.round(Math.sqrt(k/i))}return b.call(this,this._stats)},b.prototype._stats=null,b.prototype._upload_done=function(){var a,b,c,d;return this.camera._debug("Upload completed with status "+this._status),this._done=!0,a=this._options(),c=a.retry_success&&a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_done?a.on_upload_done.call(this,this._response):void 0)},b.prototype._upload_fail=function(){var a,b,c,d;return this.camera._debug("Upload failed with status "+this._status),this._fail=!0,a=this._options(),c=a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_fail?a.on_upload_fail.call(this,this._status,this._error_message,this._response):void 0)},b}(),d=function(){function a(){}return a.prototype.mean=null,a.prototype.std=null,a}()}).call(this); \ No newline at end of file +(function(){var a,b,c,d,e,f,g,h,i,j={}.hasOwnProperty,k=function(a,b){function c(){this.constructor=a}for(var d in b)j.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a};a=function(){function a(a,b){if("string"==typeof a&&(a=document.getElementById(a.replace("#",""))),!a||!a.offsetWidth)throw"JpegCamera: invalid container";a.innerHTML="",this.view_width=parseInt(a.offsetWidth,10),this.view_height=parseInt(a.offsetHeight,10),this.container=document.createElement("div"),this.container.style.width="100%",this.container.style.height="100%",this.container.style.position="relative",a.appendChild(this.container),this.options=this._extend({},this.constructor.DefaultOptions,b),this._engine_init()}return a.DefaultOptions={shutter_ogg_url:"/jpeg_camera/shutter.ogg",shutter_mp3_url:"/jpeg_camera/shutter.mp3",swf_url:"/jpeg_camera/jpeg_camera.swf",on_debug:function(a){return console&&console.log?console.log("JpegCamera: "+a):void 0},quality:.9,shutter:!0,mirror:!1,timeout:0,retry_success:!1,scale:1},a._canvas_supported=!!document.createElement("canvas").getContext,a.canvas_supported=function(){return this._canvas_supported},a.prototype.ready=function(a){return this.options.on_ready=a,this.options.on_ready&&this._is_ready&&this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}),this},a.prototype._is_ready=!1,a.prototype.error=function(a){return this.options.on_error=a,this.options.on_error&&this._error_occured&&this.options.on_error.call(this,this._error_occured),this},a.prototype._error_occured=!1,a.StatsCaptureScale=.2,a.prototype.get_stats=function(b){var d,e;return d=new c(this,{}),this._engine_capture(d,!1,.1,a.StatsCaptureScale),e=this,d.get_stats(function(a){return b.call(e,a)})},a.prototype.capture=function(a){var b,d,e;return null==a&&(a={}),d=new c(this,a),this._snapshots[d.id]=d,e=d._options(),e.shutter&&this._engine_play_shutter_sound(),b=Math.min(1,e.scale),b=Math.max(.01,b),this._engine_capture(d,e.mirror,e.quality,b),d},a.prototype._snapshots={},a.prototype.show_stream=function(){return this._engine_show_stream(),this._displayed_snapshot=null,this},a.prototype.discard_all=function(){var a,b,c;this._displayed_snapshot&&this.show_stream(),c=this._snapshots;for(a in c)b=c[a],this._engine_discard(b),b._discarded=!0;return this._snapshots={},this},a.prototype._extend=function(a){var b,c,d,e,f,g;for(d=Array.prototype.slice.call(arguments,1),f=0,g=d.length;g>f;f++)if(c=d[f])for(b in c)e=c[b],a[b]=e;return a},a.prototype._debug=function(a){return this.options.on_debug?this.options.on_debug.call(this,a):void 0},a.prototype._display=function(a){return this._engine_display(a),this._displayed_snapshot=a},a.prototype._displayed_snapshot=null,a.prototype._discard=function(a){return this._displayed_snapshot===a&&this.show_stream(),this._engine_discard(a),a._discarded=!0,delete this._snapshots[a.id]},a.prototype._prepared=function(a,b){var c;return this.video_width=a,this.video_height=b,this._debug("Camera resolution "+this.video_width+"x"+this.video_height+"px"),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!0)},1)},a.prototype._wait_until_stream_looks_ok=function(a){return this.get_stats(function(b){var c;return b.std>2?(this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),this._debug("Camera is ready"),this._is_ready=!0,this.options.on_ready?this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}):void 0):(a&&this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!1)},100))})},a.prototype._got_error=function(a){return this._debug("Error - "+a),this._error_occured=a,this.options.on_error?this.options.on_error.call(this,this._error_occured):void 0},a.prototype._block_element_access=function(){return this._overlay=document.createElement("div"),this._overlay.style.width="100%",this._overlay.style.height="100%",this._overlay.style.position="absolute",this._overlay.style.top=0,this._overlay.style.left=0,this._overlay.style.zIndex=2,this.container.appendChild(this._overlay)},a.prototype._overlay=null,a.prototype.view_width=null,a.prototype.view_height=null,a._add_prefixed_style=function(a,b,c){var d;return d=b.charAt(0).toUpperCase()+b.slice(1),a.style[b]=c,a.style["Webkit"+d]=c,a.style["Moz"+d]=c,a.style["ms"+d]=c,a.style["O"+d]=c},a}(),navigator.getUserMedia||(navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia),window.AudioContext||(window.AudioContext=window.webkitAudioContext),f=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(f(),h="audio/ogg; codecs=vorbis",g="audio/mpeg; ",e=function(a){var b;return b=document.createElement("video"),!(!b.canPlayType||!b.canPlayType(a).replace(/no/,""))},b=function(b){function c(){return i=c.__super__.constructor.apply(this,arguments)}return k(c,b),c.prototype._engine_init=function(){var b,c,d,f,i,j,k,l;this._debug("Using HTML5 engine"),l=Math.floor(.2*this.view_height),i=Math.floor(.2*this.view_width),this.message=document.createElement("div"),this.message["class"]="message",this.message.style.width="100%",this.message.style.height="100%",a._add_prefixed_style(this.message,"boxSizing","border-box"),this.message.style.overflow="hidden",this.message.style.textAlign="center",this.message.style.paddingTop=""+l+"px",this.message.style.paddingBottom=""+l+"px",this.message.style.paddingLeft=""+i+"px",this.message.style.paddingRight=""+i+"px",this.message.style.position="absolute",this.message.style.zIndex=3,this.message.innerHTML="Please allow camera access when prompted by the browser.

Look for camera icon around your address bar.",this.container.appendChild(this.message),this.video_container=document.createElement("div"),this.video_container.style.width=""+this.view_width+"px",this.video_container.style.height=""+this.view_height+"px",this.video_container.style.overflow="hidden",this.video_container.style.position="absolute",this.video_container.style.zIndex=1,this.container.appendChild(this.video_container),this.video=document.createElement("video"),this.video.autoplay=!0,a._add_prefixed_style(this.video,"transform","scalex(-1.0)"),window.AudioContext&&(e(h)?this._load_shutter_sound(this.options.shutter_ogg_url):e(g)&&this._load_shutter_sound(this.options.shutter_mp3_url)),b={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},f="function"==typeof this.options.get_media_options?this.options.get_media_options(b):b,k=this,j=function(a){return k._remove_message(),window.URL?k.video.src=URL.createObjectURL(a):k.video.src=a,k._block_element_access(),k._wait_for_video_ready()},d=function(a){var b,c,d;k.message.innerHTML='You have denied camera access.

Look for camera icon around your address bar to change your decision.',b=a.code;for(c in a)if(d=a[c],"code"!==c)return void k._got_error(c);return k._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(f,j,d)}catch(m){return c=m,navigator.getUserMedia("video",j,d)}},c.prototype._engine_play_shutter_sound=function(){var a;if(this.shutter_buffer)return a=this.audio_context.createBufferSource(),a.buffer=this.shutter_buffer,a.connect(this.audio_context.destination),a.start(0)},c.prototype._engine_capture=function(a,b,c,d){var e,f,g;return g=this._get_capture_crop(),e=document.createElement("canvas"),e.width=Math.round(g.width*d),e.height=Math.round(g.height*d),f=e.getContext("2d"),f.drawImage(this.video,g.x_offset,g.y_offset,g.width,g.height,0,0,Math.round(g.width*d),Math.round(g.height*d)),a._canvas=e,a._mirror=b,a._quality=c},c.prototype._engine_display=function(b){return this.displayed_canvas&&this.container.removeChild(this.displayed_canvas),this.displayed_canvas=b._canvas,this.displayed_canvas.style.width=""+this.view_width+"px",this.displayed_canvas.style.height=""+this.view_height+"px",this.displayed_canvas.style.top=0,this.displayed_canvas.style.left=0,this.displayed_canvas.style.position="absolute",this.displayed_canvas.style.zIndex=2,a._add_prefixed_style(this.displayed_canvas,"transform","scalex(-1.0)"),this.container.appendChild(this.displayed_canvas)},c.prototype._engine_get_canvas=function(a){var b,c;return b=document.createElement("canvas"),b.width=a._canvas.width,b.height=a._canvas.height,c=b.getContext("2d"),c.drawImage(a._canvas,0,0),b},c.prototype._engine_get_image_data=function(a){var b,c;return b=a._canvas,c=b.getContext("2d"),c.getImageData(0,0,b.width,b.height)},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._canvas,0,0)):f=a._canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return a._xhr&&a._xhr.abort(),delete a._xhr,delete a._canvas},c.prototype._engine_show_stream=function(){return this.displayed_canvas&&(this.container.removeChild(this.displayed_canvas),this.displayed_canvas=null),this.video_container.style.display="block"},c.prototype._engine_upload=function(a,b,c,d){return this._debug("Uploading the file"),a.get_blob(function(e){var f,g;return f=function(b){return delete a._xhr,a._status=b.target.status,a._response=b.target.responseText,a._status>=200&&a._status<300?a._upload_done():(a._error_message=b.target.statusText||"Unknown error",a._upload_fail())},g=new XMLHttpRequest,g.open("POST",b),g.timeout=d,c&&g.setRequestHeader("X-CSRF-Token",c),g.onload=f,g.onerror=f,g.onabort=f,g.send(e),a._xhr=g},"image/jpeg")},c.prototype._remove_message=function(){return this.message.style.display="none"},c.prototype._load_shutter_sound=function(a){var b,c;if(!this.audio_context)return this.audio_context=new AudioContext,b=new XMLHttpRequest,b.open("GET",a,!0),b.responseType="arraybuffer",c=this,b.onload=function(){return c.audio_context.decodeAudioData(b.response,function(a){return c.shutter_buffer=a})},b.send()},c.prototype._wait_for_video_ready=function(){var a,b,c,d;return d=parseInt(this.video.videoWidth),c=parseInt(this.video.videoHeight),d>0&&c>0?(this.video_container.appendChild(this.video),this.video_width=d,this.video_height=c,a=this._get_video_crop(),this.video.style.position="relative",this.video.style.width=""+a.width+"px",this.video.style.height=""+a.height+"px",this.video.style.left=""+a.x_offset+"px",this.video.style.top=""+a.y_offset+"px",this._prepared(this.video_width,this.video_height)):this._status_checks_count>100?this._got_error("Camera failed to initialize in 10 seconds"):(this._status_checks_count++,b=this,setTimeout(function(){return b._wait_for_video_ready()},100))},c.prototype._status_checks_count=0,c.prototype._get_video_crop=function(){var a,b,c,d,e;return c=this.video_width/this.video_height,e=this.view_width/this.view_height,c>=e?(this._debug("Filling height"),d=this.view_height/this.video_height,b=Math.round(this.video_width*d),{width:b,height:this.view_height,x_offset:-Math.floor((b-this.view_width)/2),y_offset:0}):(this._debug("Filling width"),d=this.view_width/this.video_width,a=Math.round(this.video_height*d),{width:this.view_width,height:a,x_offset:0,y_offset:-Math.floor((a-this.view_height)/2)})},c.prototype._get_capture_crop=function(){var a,b,c,d;return c=this.video_width/this.video_height,d=this.view_width/this.view_height,c>=d?(b=Math.round(this.video_height*d),{width:b,height:this.video_height,x_offset:Math.floor((this.video_width-b)/2),y_offset:0}):(a=Math.round(this.video_width/d),{width:this.video_width,height:a,x_offset:0,y_offset:Math.floor((this.video_height-a)/2)})},c}(a),window.JpegCamera=b),c=function(){function b(a,b){this.camera=a,this.options=b,this.id=this.constructor._next_snapshot_id++}return b._next_snapshot_id=1,b.prototype._discarded=!1,b.prototype.show=function(){return this._discarded&&raise("discarded snapshot cannot be used"),this.camera._display(this),this},b.prototype.hide=function(){return this.camera.displayed_snapshot()===this&&this.camera.show_stream(),this},b.prototype.get_stats=function(a){return this._discarded&&raise("discarded snapshot cannot be used"),this.get_image_data(function(b){return this._get_stats(b,a)})},b.prototype.get_canvas=function(b){var c;return this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,c=this,setTimeout(function(){return c._extra_canvas||(c._extra_canvas=c.camera._engine_get_canvas(c)),a._add_prefixed_style(c._extra_canvas,"transform","scalex(-1.0)"),b.call(c,c._extra_canvas)},1),!0},b.prototype._extra_canvas=null,b.prototype.get_blob=function(b,c){var d;return null==c&&(c="image/jpeg"),this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,d=this,setTimeout(function(){var a,e;return d._blob_mime!==c&&(d._blob=null),d._blob_mime=c,d._blob?b.call(d,d._blob):(a=d.options.mirror,e=d.options.quality,d.camera._engine_get_blob(d,c,a,e,function(a){return d._blob=a,b.call(d,d._blob)}))},1),!0},b.prototype._blob=null,b.prototype._blob_mime=null,b.prototype.get_image_data=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),b=this,setTimeout(function(){return b._image_data||(b._image_data=b.camera._engine_get_image_data(b)),a.call(b,b._image_data)},1),null},b.prototype._image_data=null,b.prototype.upload=function(a){var b;if(null==a&&(a={}),this._discarded&&raise("discarded snapshot cannot be used"),this._uploading)return void this.camera._debug("Upload already in progress");if(this._uploading=!0,this._retry=1,this._upload_options=a,b=this._options(),!b.api_url)throw this.camera._debug("Snapshot#upload called without valid api_url"),"Snapshot#upload called without valid api_url";return this._start_upload(b),this},b.prototype._upload_options={},b.prototype._uploading=!1,b.prototype._retry=1,b.prototype.done=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_done=a,b=this._options(),b.on_upload_done&&this._done&&b.on_upload_done.call(this,this._response),this},b.prototype._done=!1,b.prototype._response=null,b.prototype.fail=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_fail=a,b=this._options(),b.on_upload_fail&&this._fail&&b.on_upload_fail.call(this,this._status,this._error_message,this._response),this},b.prototype._fail=!1,b.prototype._status=null,b.prototype._error_message=null,b.prototype.discard=function(){return this.camera._discard(this),delete this._extra_canvas,delete this._image_data,void delete this._blob},b.prototype._options=function(){return this.camera._extend({},this.camera.options,this.options,this._upload_options)},b.prototype._start_upload=function(a){var b;return b="string"==typeof a.csrf_token&&a.csrf_token.length>0?a.csrf_token:null,this._done=!1,this._response=null,this._fail=!1,this._status=null,this._error_message=null,this.camera._engine_upload(this,a.api_url,b,a.timeout)},b.prototype._get_stats=function(a,b){var c,e,f,g,h,i,j,k,l,m,n;if(!this._stats){for(i=a.width*a.height,j=0,e=new Array(i),f=l=0;i>l;f=l+=1)g=4*f,c=.2126*a.data[g+0]+.7152*a.data[g+1]+.0722*a.data[g+2],c=Math.round(c),j+=c,e[f]=c;for(h=Math.round(j/i),k=0,m=0,n=e.length;n>m;m++)c=e[m],k+=Math.pow(c-h,2);this._stats=new d,this._stats.mean=h,this._stats.std=Math.round(Math.sqrt(k/i))}return b.call(this,this._stats)},b.prototype._stats=null,b.prototype._upload_done=function(){var a,b,c,d;return this.camera._debug("Upload completed with status "+this._status),this._done=!0,a=this._options(),c=a.retry_success&&a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_done?a.on_upload_done.call(this,this._response):void 0)},b.prototype._upload_fail=function(){var a,b,c,d;return this.camera._debug("Upload failed with status "+this._status),this._fail=!0,a=this._options(),c=a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_fail?a.on_upload_fail.call(this,this._status,this._error_message,this._response):void 0)},b}(),d=function(){function a(){}return a.prototype.mean=null,a.prototype.std=null,a}()}).call(this); \ No newline at end of file diff --git a/dist/jpeg_camera_with_dependencies.min.js b/dist/jpeg_camera_with_dependencies.min.js index 8346843..cd00749 100644 --- a/dist/jpeg_camera_with_dependencies.min.js +++ b/dist/jpeg_camera_with_dependencies.min.js @@ -6,7 +6,7 @@ var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;abf;f++)if(c=d[f])for(b in c)e=c[b],a[b]=e;return a},a.prototype._debug=function(a){return this.options.on_debug?this.options.on_debug.call(this,a):void 0},a.prototype._display=function(a){return this._engine_display(a),this._displayed_snapshot=a},a.prototype._displayed_snapshot=null,a.prototype._discard=function(a){return this._displayed_snapshot===a&&this.show_stream(),this._engine_discard(a),a._discarded=!0,delete this._snapshots[a.id]},a.prototype._prepared=function(a,b){var c;return this.video_width=a,this.video_height=b,this._debug("Camera resolution "+this.video_width+"x"+this.video_height+"px"),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!0)},1)},a.prototype._wait_until_stream_looks_ok=function(a){return this.get_stats(function(b){var c;return b.std>2?(this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),this._debug("Camera is ready"),this._is_ready=!0,this.options.on_ready?this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}):void 0):(a&&this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!1)},100))})},a.prototype._got_error=function(a){return this._debug("Error - "+a),this._error_occured=a,this.options.on_error?this.options.on_error.call(this,this._error_occured):void 0},a.prototype._block_element_access=function(){return this._overlay=document.createElement("div"),this._overlay.style.width="100%",this._overlay.style.height="100%",this._overlay.style.position="absolute",this._overlay.style.top=0,this._overlay.style.left=0,this._overlay.style.zIndex=2,this.container.appendChild(this._overlay)},a.prototype._overlay=null,a.prototype.view_width=null,a.prototype.view_height=null,a._add_prefixed_style=function(a,b,c){var d;return d=b.charAt(0).toUpperCase()+b.slice(1),a.style[b]=c,a.style["Webkit"+d]=c,a.style["Moz"+d]=c,a.style["ms"+d]=c,a.style["O"+d]=c},a}(),navigator.getUserMedia||(navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia),window.AudioContext||(window.AudioContext=window.webkitAudioContext),h=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(h(),l="audio/ogg; codecs=vorbis",i="audio/mpeg; ",f=function(a){var b;return b=document.createElement("video"),!(!b.canPlayType||!b.canPlayType(a).replace(/no/,""))},c=function(b){function c(){return m=c.__super__.constructor.apply(this,arguments)}return p(c,b),c.prototype._engine_init=function(){var b,c,d,e,g,h,j;this._debug("Using HTML5 engine"),j=Math.floor(.2*this.view_height),e=Math.floor(.2*this.view_width),this.message=document.createElement("div"),this.message["class"]="message",this.message.style.width="100%",this.message.style.height="100%",a._add_prefixed_style(this.message,"boxSizing","border-box"),this.message.style.overflow="hidden",this.message.style.textAlign="center",this.message.style.paddingTop=""+j+"px",this.message.style.paddingBottom=""+j+"px",this.message.style.paddingLeft=""+e+"px",this.message.style.paddingRight=""+e+"px",this.message.style.position="absolute",this.message.style.zIndex=3,this.message.innerHTML="Please allow camera access when prompted by the browser.

Look for camera icon around your address bar.",this.container.appendChild(this.message),this.video_container=document.createElement("div"),this.video_container.style.width=""+this.view_width+"px",this.video_container.style.height=""+this.view_height+"px",this.video_container.style.overflow="hidden",this.video_container.style.position="absolute",this.video_container.style.zIndex=1,this.container.appendChild(this.video_container),this.video=document.createElement("video"),this.video.autoplay=!0,a._add_prefixed_style(this.video,"transform","scalex(-1.0)"),window.AudioContext&&(f(l)?this._load_shutter_sound(this.options.shutter_ogg_url):f(i)&&this._load_shutter_sound(this.options.shutter_mp3_url)),d={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},h=this,g=function(a){return h._remove_message(),window.URL?h.video.src=URL.createObjectURL(a):h.video.src=a,h._block_element_access(),h._wait_for_video_ready()},c=function(a){var b,c,d;h.message.innerHTML='You have denied camera access.

Look for camera icon around your address bar to change your decision.',b=a.code;for(c in a)if(d=a[c],"code"!==c)return void h._got_error(c);return h._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(d,g,c)}catch(k){return b=k,navigator.getUserMedia("video",g,c)}},c.prototype._engine_play_shutter_sound=function(){var a;if(this.shutter_buffer)return a=this.audio_context.createBufferSource(),a.buffer=this.shutter_buffer,a.connect(this.audio_context.destination),a.start(0)},c.prototype._engine_capture=function(a,b,c,d){var e,f,g;return g=this._get_capture_crop(),e=document.createElement("canvas"),e.width=Math.round(g.width*d),e.height=Math.round(g.height*d),f=e.getContext("2d"),f.drawImage(this.video,g.x_offset,g.y_offset,g.width,g.height,0,0,Math.round(g.width*d),Math.round(g.height*d)),a._canvas=e,a._mirror=b,a._quality=c},c.prototype._engine_display=function(b){return this.displayed_canvas&&this.container.removeChild(this.displayed_canvas),this.displayed_canvas=b._canvas,this.displayed_canvas.style.width=""+this.view_width+"px",this.displayed_canvas.style.height=""+this.view_height+"px",this.displayed_canvas.style.top=0,this.displayed_canvas.style.left=0,this.displayed_canvas.style.position="absolute",this.displayed_canvas.style.zIndex=2,a._add_prefixed_style(this.displayed_canvas,"transform","scalex(-1.0)"),this.container.appendChild(this.displayed_canvas)},c.prototype._engine_get_canvas=function(a){var b,c;return b=document.createElement("canvas"),b.width=a._canvas.width,b.height=a._canvas.height,c=b.getContext("2d"),c.drawImage(a._canvas,0,0),b},c.prototype._engine_get_image_data=function(a){var b,c;return b=a._canvas,c=b.getContext("2d"),c.getImageData(0,0,b.width,b.height)},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._canvas,0,0)):f=a._canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return a._xhr&&a._xhr.abort(),delete a._xhr,delete a._canvas},c.prototype._engine_show_stream=function(){return this.displayed_canvas&&(this.container.removeChild(this.displayed_canvas),this.displayed_canvas=null),this.video_container.style.display="block"},c.prototype._engine_upload=function(a,b,c,d){return this._debug("Uploading the file"),a.get_blob(function(e){var f,g;return f=function(b){return delete a._xhr,a._status=b.target.status,a._response=b.target.responseText,a._status>=200&&a._status<300?a._upload_done():(a._error_message=b.target.statusText||"Unknown error",a._upload_fail())},g=new XMLHttpRequest,g.open("POST",b),g.timeout=d,c&&g.setRequestHeader("X-CSRF-Token",c),g.onload=f,g.onerror=f,g.onabort=f,g.send(e),a._xhr=g},"image/jpeg")},c.prototype._remove_message=function(){return this.message.style.display="none"},c.prototype._load_shutter_sound=function(a){var b,c;if(!this.audio_context)return this.audio_context=new AudioContext,b=new XMLHttpRequest,b.open("GET",a,!0),b.responseType="arraybuffer",c=this,b.onload=function(){return c.audio_context.decodeAudioData(b.response,function(a){return c.shutter_buffer=a})},b.send()},c.prototype._wait_for_video_ready=function(){var a,b,c,d;return d=parseInt(this.video.videoWidth),c=parseInt(this.video.videoHeight),d>0&&c>0?(this.video_container.appendChild(this.video),this.video_width=d,this.video_height=c,a=this._get_video_crop(),this.video.style.position="relative",this.video.style.width=""+a.width+"px",this.video.style.height=""+a.height+"px",this.video.style.left=""+a.x_offset+"px",this.video.style.top=""+a.y_offset+"px",this._prepared(this.video_width,this.video_height)):this._status_checks_count>100?this._got_error("Camera failed to initialize in 10 seconds"):(this._status_checks_count++,b=this,setTimeout(function(){return b._wait_for_video_ready()},100))},c.prototype._status_checks_count=0,c.prototype._get_video_crop=function(){var a,b,c,d,e;return c=this.video_width/this.video_height,e=this.view_width/this.view_height,c>=e?(this._debug("Filling height"),d=this.view_height/this.video_height,b=Math.round(this.video_width*d),{width:b,height:this.view_height,x_offset:-Math.floor((b-this.view_width)/2),y_offset:0}):(this._debug("Filling width"),d=this.view_width/this.video_width,a=Math.round(this.video_height*d),{width:this.view_width,height:a,x_offset:0,y_offset:-Math.floor((a-this.view_height)/2)})},c.prototype._get_capture_crop=function(){var a,b,c,d;return c=this.video_width/this.video_height,d=this.view_width/this.view_height,c>=d?(b=Math.round(this.video_height*d),{width:b,height:this.video_height,x_offset:Math.floor((this.video_width-b)/2),y_offset:0}):(a=Math.round(this.video_width/d),{width:this.video_width,height:a,x_offset:0,y_offset:Math.floor((this.video_height-a)/2)})},c}(a),window.JpegCamera=c),!window.swfobject)throw"JpegCamera: SWFObject is not loaded";k="9",j=!window.JpegCamera||!window.AudioContext||window.jpeg_camera_force_flash,g=function(){return window.swfobject&&swfobject.hasFlashPlayerVersion(k)},j&&g()&&(b=function(b){function c(){return n=c.__super__.constructor.apply(this,arguments)}return p(c,b),c._send_message=function(a,b){var c,d;return(d=this._instances[parseInt(a)])?(c=Array.prototype.slice.call(arguments,2),this.prototype[b].apply(d,c)):void 0},c._instances={},c._next_id=1,c.prototype._engine_init=function(){var a,b,c,d,e,f,g;return this._debug("Using Flash engine"),this._id=this.constructor._next_id++,this.constructor._instances[this._id]=this,this.view_width<215||this.view_height<138?void this._got_error("camera is too small to display privacy dialog"):(d="flash_object_"+this._id,f={loop:"false",allowScriptAccess:"always",allowFullScreen:"false",quality:"best",wmode:"opaque",menu:"false"},a={id:d,align:"middle"},e={id:this._id,width:this.view_width,height:this.view_height,shutter_url:this.options.shutter_mp3_url},g=this,b=function(a){return a.success?(g._debug("Flash loaded"),g._flash=document.getElementById(d)):g._got_error("Flash loading failed.")},c=document.createElement("div"),c.id="jpeg_camera_flash_"+this._id,c.style.width="100%",c.style.height="100%",this.container.appendChild(c),swfobject.embedSWF(this.options.swf_url,c.id,this.view_width,this.view_height,"9",null,e,f,a,b))},c.prototype._engine_play_shutter_sound=function(){return this._flash._play_shutter()},c.prototype._engine_capture=function(a,b,c,d){return this._flash._capture(a.id,b,c,d)},c.prototype._engine_display=function(a){return this._flash._display(a.id)},c.prototype._engine_get_canvas=function(a){var b,c;return a._image_data||(a._image_data=this._engine_get_image_data(a)),b=document.createElement("canvas"),b.width=a._image_data.width,b.height=a._image_data.height,c=b.getContext("2d"),c.putImageData(a._image_data,0,0),b},c.prototype._engine_get_image_data=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o;for(f=this._flash._get_image_data(b.id),a.canvas_supported()?(d=document.createElement("canvas"),d.width=f.width,d.height=f.height,e=d.getContext("2d"),l=e.createImageData(f.width,f.height)):l={data:[],width:f.width,height:f.height},o=f.data,h=m=0,n=o.length;n>m;h=++m)j=o[h],i=4*h,k=j>>16&255,g=j>>8&255,c=255&j,l.data[i+0]=k,l.data[i+1]=g,l.data[i+2]=c,l.data[i+3]=255;return l},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return a._extra_canvas||(a._extra_canvas=this._engine_get_canvas(a)),c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._extra_canvas,0,0)):f=a._extra_canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return this._flash._discard(a.id)},c.prototype._engine_show_stream=function(){return this._flash._show_stream()},c.prototype._engine_upload=function(a,b,c,d){return this._flash._upload(a.id,b,c,d)},c.prototype._flash_prepared=function(a,b){return this._block_element_access(),document.body.tabIndex=0,document.body.focus(),this._prepared(a,b)},c.prototype._flash_upload_complete=function(a,b,c,d){var e;return a=parseInt(a),e=this._snapshots[a],e._status=parseInt(b),e._response=d,e._status>=200&&e._status<300?e._upload_done():(e._error_message=c,e._upload_fail())},c}(a),window.JpegCamera=b),d=function(){function b(a,b){this.camera=a,this.options=b,this.id=this.constructor._next_snapshot_id++}return b._next_snapshot_id=1,b.prototype._discarded=!1,b.prototype.show=function(){return this._discarded&&raise("discarded snapshot cannot be used"),this.camera._display(this),this},b.prototype.hide=function(){return this.camera.displayed_snapshot()===this&&this.camera.show_stream(),this},b.prototype.get_stats=function(a){return this._discarded&&raise("discarded snapshot cannot be used"),this.get_image_data(function(b){return this._get_stats(b,a)})},b.prototype.get_canvas=function(b){var c;return this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,c=this,setTimeout(function(){return c._extra_canvas||(c._extra_canvas=c.camera._engine_get_canvas(c)),a._add_prefixed_style(c._extra_canvas,"transform","scalex(-1.0)"),b.call(c,c._extra_canvas)},1),!0},b.prototype._extra_canvas=null,b.prototype.get_blob=function(b,c){var d;return null==c&&(c="image/jpeg"),this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,d=this,setTimeout(function(){var a,e;return d._blob_mime!==c&&(d._blob=null),d._blob_mime=c,d._blob?b.call(d,d._blob):(a=d.options.mirror,e=d.options.quality,d.camera._engine_get_blob(d,c,a,e,function(a){return d._blob=a,b.call(d,d._blob)}))},1),!0},b.prototype._blob=null,b.prototype._blob_mime=null,b.prototype.get_image_data=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),b=this,setTimeout(function(){return b._image_data||(b._image_data=b.camera._engine_get_image_data(b)),a.call(b,b._image_data)},1),null},b.prototype._image_data=null,b.prototype.upload=function(a){var b;if(null==a&&(a={}),this._discarded&&raise("discarded snapshot cannot be used"),this._uploading)return void this.camera._debug("Upload already in progress");if(this._uploading=!0,this._retry=1,this._upload_options=a,b=this._options(),!b.api_url)throw this.camera._debug("Snapshot#upload called without valid api_url"),"Snapshot#upload called without valid api_url";return this._start_upload(b),this},b.prototype._upload_options={},b.prototype._uploading=!1,b.prototype._retry=1,b.prototype.done=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_done=a,b=this._options(),b.on_upload_done&&this._done&&b.on_upload_done.call(this,this._response),this},b.prototype._done=!1,b.prototype._response=null,b.prototype.fail=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_fail=a,b=this._options(),b.on_upload_fail&&this._fail&&b.on_upload_fail.call(this,this._status,this._error_message,this._response),this},b.prototype._fail=!1,b.prototype._status=null,b.prototype._error_message=null,b.prototype.discard=function(){return this.camera._discard(this),delete this._extra_canvas,delete this._image_data,void delete this._blob},b.prototype._options=function(){return this.camera._extend({},this.camera.options,this.options,this._upload_options)},b.prototype._start_upload=function(a){var b;return b="string"==typeof a.csrf_token&&a.csrf_token.length>0?a.csrf_token:null,this._done=!1,this._response=null,this._fail=!1,this._status=null,this._error_message=null,this.camera._engine_upload(this,a.api_url,b,a.timeout)},b.prototype._get_stats=function(a,b){var c,d,f,g,h,i,j,k,l,m,n;if(!this._stats){for(i=a.width*a.height,j=0,d=new Array(i),f=l=0;i>l;f=l+=1)g=4*f,c=.2126*a.data[g+0]+.7152*a.data[g+1]+.0722*a.data[g+2],c=Math.round(c),j+=c,d[f]=c;for(h=Math.round(j/i),k=0,m=0,n=d.length;n>m;m++)c=d[m],k+=Math.pow(c-h,2);this._stats=new e,this._stats.mean=h,this._stats.std=Math.round(Math.sqrt(k/i))}return b.call(this,this._stats)},b.prototype._stats=null,b.prototype._upload_done=function(){var a,b,c,d;return this.camera._debug("Upload completed with status "+this._status),this._done=!0,a=this._options(),c=a.retry_success&&a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_done?a.on_upload_done.call(this,this._response):void 0)},b.prototype._upload_fail=function(){var a,b,c,d;return this.camera._debug("Upload failed with status "+this._status),this._fail=!0,a=this._options(),c=a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_fail?a.on_upload_fail.call(this,this._status,this._error_message,this._response):void 0)},b}(),e=function(){function a(){}return a.prototype.mean=null,a.prototype.std=null,a}()}).call(this); \ No newline at end of file +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o={}.hasOwnProperty,p=function(a,b){function c(){this.constructor=a}for(var d in b)o.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a};if(a=function(){function a(a,b){if("string"==typeof a&&(a=document.getElementById(a.replace("#",""))),!a||!a.offsetWidth)throw"JpegCamera: invalid container";a.innerHTML="",this.view_width=parseInt(a.offsetWidth,10),this.view_height=parseInt(a.offsetHeight,10),this.container=document.createElement("div"),this.container.style.width="100%",this.container.style.height="100%",this.container.style.position="relative",a.appendChild(this.container),this.options=this._extend({},this.constructor.DefaultOptions,b),this._engine_init()}return a.DefaultOptions={shutter_ogg_url:"/jpeg_camera/shutter.ogg",shutter_mp3_url:"/jpeg_camera/shutter.mp3",swf_url:"/jpeg_camera/jpeg_camera.swf",on_debug:function(a){return console&&console.log?console.log("JpegCamera: "+a):void 0},quality:.9,shutter:!0,mirror:!1,timeout:0,retry_success:!1,scale:1},a._canvas_supported=!!document.createElement("canvas").getContext,a.canvas_supported=function(){return this._canvas_supported},a.prototype.ready=function(a){return this.options.on_ready=a,this.options.on_ready&&this._is_ready&&this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}),this},a.prototype._is_ready=!1,a.prototype.error=function(a){return this.options.on_error=a,this.options.on_error&&this._error_occured&&this.options.on_error.call(this,this._error_occured),this},a.prototype._error_occured=!1,a.StatsCaptureScale=.2,a.prototype.get_stats=function(b){var c,e;return c=new d(this,{}),this._engine_capture(c,!1,.1,a.StatsCaptureScale),e=this,c.get_stats(function(a){return b.call(e,a)})},a.prototype.capture=function(a){var b,c,e;return null==a&&(a={}),c=new d(this,a),this._snapshots[c.id]=c,e=c._options(),e.shutter&&this._engine_play_shutter_sound(),b=Math.min(1,e.scale),b=Math.max(.01,b),this._engine_capture(c,e.mirror,e.quality,b),c},a.prototype._snapshots={},a.prototype.show_stream=function(){return this._engine_show_stream(),this._displayed_snapshot=null,this},a.prototype.discard_all=function(){var a,b,c;this._displayed_snapshot&&this.show_stream(),c=this._snapshots;for(a in c)b=c[a],this._engine_discard(b),b._discarded=!0;return this._snapshots={},this},a.prototype._extend=function(a){var b,c,d,e,f,g;for(d=Array.prototype.slice.call(arguments,1),f=0,g=d.length;g>f;f++)if(c=d[f])for(b in c)e=c[b],a[b]=e;return a},a.prototype._debug=function(a){return this.options.on_debug?this.options.on_debug.call(this,a):void 0},a.prototype._display=function(a){return this._engine_display(a),this._displayed_snapshot=a},a.prototype._displayed_snapshot=null,a.prototype._discard=function(a){return this._displayed_snapshot===a&&this.show_stream(),this._engine_discard(a),a._discarded=!0,delete this._snapshots[a.id]},a.prototype._prepared=function(a,b){var c;return this.video_width=a,this.video_height=b,this._debug("Camera resolution "+this.video_width+"x"+this.video_height+"px"),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!0)},1)},a.prototype._wait_until_stream_looks_ok=function(a){return this.get_stats(function(b){var c;return b.std>2?(this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),this._debug("Camera is ready"),this._is_ready=!0,this.options.on_ready?this.options.on_ready.call(this,{video_width:this.video_width,video_height:this.video_height}):void 0):(a&&this._debug("Stream mean gray value = "+b.mean+" standard deviation = "+b.std),c=this,setTimeout(function(){return c._wait_until_stream_looks_ok(!1)},100))})},a.prototype._got_error=function(a){return this._debug("Error - "+a),this._error_occured=a,this.options.on_error?this.options.on_error.call(this,this._error_occured):void 0},a.prototype._block_element_access=function(){return this._overlay=document.createElement("div"),this._overlay.style.width="100%",this._overlay.style.height="100%",this._overlay.style.position="absolute",this._overlay.style.top=0,this._overlay.style.left=0,this._overlay.style.zIndex=2,this.container.appendChild(this._overlay)},a.prototype._overlay=null,a.prototype.view_width=null,a.prototype.view_height=null,a._add_prefixed_style=function(a,b,c){var d;return d=b.charAt(0).toUpperCase()+b.slice(1),a.style[b]=c,a.style["Webkit"+d]=c,a.style["Moz"+d]=c,a.style["ms"+d]=c,a.style["O"+d]=c},a}(),navigator.getUserMedia||(navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia),window.AudioContext||(window.AudioContext=window.webkitAudioContext),h=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(h(),l="audio/ogg; codecs=vorbis",i="audio/mpeg; ",f=function(a){var b;return b=document.createElement("video"),!(!b.canPlayType||!b.canPlayType(a).replace(/no/,""))},c=function(b){function c(){return m=c.__super__.constructor.apply(this,arguments)}return p(c,b),c.prototype._engine_init=function(){var b,c,d,e,g,h,j,k;this._debug("Using HTML5 engine"),k=Math.floor(.2*this.view_height),g=Math.floor(.2*this.view_width),this.message=document.createElement("div"),this.message["class"]="message",this.message.style.width="100%",this.message.style.height="100%",a._add_prefixed_style(this.message,"boxSizing","border-box"),this.message.style.overflow="hidden",this.message.style.textAlign="center",this.message.style.paddingTop=""+k+"px",this.message.style.paddingBottom=""+k+"px",this.message.style.paddingLeft=""+g+"px",this.message.style.paddingRight=""+g+"px",this.message.style.position="absolute",this.message.style.zIndex=3,this.message.innerHTML="Please allow camera access when prompted by the browser.

Look for camera icon around your address bar.",this.container.appendChild(this.message),this.video_container=document.createElement("div"),this.video_container.style.width=""+this.view_width+"px",this.video_container.style.height=""+this.view_height+"px",this.video_container.style.overflow="hidden",this.video_container.style.position="absolute",this.video_container.style.zIndex=1,this.container.appendChild(this.video_container),this.video=document.createElement("video"),this.video.autoplay=!0,a._add_prefixed_style(this.video,"transform","scalex(-1.0)"),window.AudioContext&&(f(l)?this._load_shutter_sound(this.options.shutter_ogg_url):f(i)&&this._load_shutter_sound(this.options.shutter_mp3_url)),b={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},e="function"==typeof this.options.get_media_options?this.options.get_media_options(b):b,j=this,h=function(a){return j._remove_message(),window.URL?j.video.src=URL.createObjectURL(a):j.video.src=a,j._block_element_access(),j._wait_for_video_ready()},d=function(a){var b,c,d;j.message.innerHTML='You have denied camera access.

Look for camera icon around your address bar to change your decision.',b=a.code;for(c in a)if(d=a[c],"code"!==c)return void j._got_error(c);return j._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(e,h,d)}catch(m){return c=m,navigator.getUserMedia("video",h,d)}},c.prototype._engine_play_shutter_sound=function(){var a;if(this.shutter_buffer)return a=this.audio_context.createBufferSource(),a.buffer=this.shutter_buffer,a.connect(this.audio_context.destination),a.start(0)},c.prototype._engine_capture=function(a,b,c,d){var e,f,g;return g=this._get_capture_crop(),e=document.createElement("canvas"),e.width=Math.round(g.width*d),e.height=Math.round(g.height*d),f=e.getContext("2d"),f.drawImage(this.video,g.x_offset,g.y_offset,g.width,g.height,0,0,Math.round(g.width*d),Math.round(g.height*d)),a._canvas=e,a._mirror=b,a._quality=c},c.prototype._engine_display=function(b){return this.displayed_canvas&&this.container.removeChild(this.displayed_canvas),this.displayed_canvas=b._canvas,this.displayed_canvas.style.width=""+this.view_width+"px",this.displayed_canvas.style.height=""+this.view_height+"px",this.displayed_canvas.style.top=0,this.displayed_canvas.style.left=0,this.displayed_canvas.style.position="absolute",this.displayed_canvas.style.zIndex=2,a._add_prefixed_style(this.displayed_canvas,"transform","scalex(-1.0)"),this.container.appendChild(this.displayed_canvas)},c.prototype._engine_get_canvas=function(a){var b,c;return b=document.createElement("canvas"),b.width=a._canvas.width,b.height=a._canvas.height,c=b.getContext("2d"),c.drawImage(a._canvas,0,0),b},c.prototype._engine_get_image_data=function(a){var b,c;return b=a._canvas,c=b.getContext("2d"),c.getImageData(0,0,b.width,b.height)},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._canvas,0,0)):f=a._canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return a._xhr&&a._xhr.abort(),delete a._xhr,delete a._canvas},c.prototype._engine_show_stream=function(){return this.displayed_canvas&&(this.container.removeChild(this.displayed_canvas),this.displayed_canvas=null),this.video_container.style.display="block"},c.prototype._engine_upload=function(a,b,c,d){return this._debug("Uploading the file"),a.get_blob(function(e){var f,g;return f=function(b){return delete a._xhr,a._status=b.target.status,a._response=b.target.responseText,a._status>=200&&a._status<300?a._upload_done():(a._error_message=b.target.statusText||"Unknown error",a._upload_fail())},g=new XMLHttpRequest,g.open("POST",b),g.timeout=d,c&&g.setRequestHeader("X-CSRF-Token",c),g.onload=f,g.onerror=f,g.onabort=f,g.send(e),a._xhr=g},"image/jpeg")},c.prototype._remove_message=function(){return this.message.style.display="none"},c.prototype._load_shutter_sound=function(a){var b,c;if(!this.audio_context)return this.audio_context=new AudioContext,b=new XMLHttpRequest,b.open("GET",a,!0),b.responseType="arraybuffer",c=this,b.onload=function(){return c.audio_context.decodeAudioData(b.response,function(a){return c.shutter_buffer=a})},b.send()},c.prototype._wait_for_video_ready=function(){var a,b,c,d;return d=parseInt(this.video.videoWidth),c=parseInt(this.video.videoHeight),d>0&&c>0?(this.video_container.appendChild(this.video),this.video_width=d,this.video_height=c,a=this._get_video_crop(),this.video.style.position="relative",this.video.style.width=""+a.width+"px",this.video.style.height=""+a.height+"px",this.video.style.left=""+a.x_offset+"px",this.video.style.top=""+a.y_offset+"px",this._prepared(this.video_width,this.video_height)):this._status_checks_count>100?this._got_error("Camera failed to initialize in 10 seconds"):(this._status_checks_count++,b=this,setTimeout(function(){return b._wait_for_video_ready()},100))},c.prototype._status_checks_count=0,c.prototype._get_video_crop=function(){var a,b,c,d,e;return c=this.video_width/this.video_height,e=this.view_width/this.view_height,c>=e?(this._debug("Filling height"),d=this.view_height/this.video_height,b=Math.round(this.video_width*d),{width:b,height:this.view_height,x_offset:-Math.floor((b-this.view_width)/2),y_offset:0}):(this._debug("Filling width"),d=this.view_width/this.video_width,a=Math.round(this.video_height*d),{width:this.view_width,height:a,x_offset:0,y_offset:-Math.floor((a-this.view_height)/2)})},c.prototype._get_capture_crop=function(){var a,b,c,d;return c=this.video_width/this.video_height,d=this.view_width/this.view_height,c>=d?(b=Math.round(this.video_height*d),{width:b,height:this.video_height,x_offset:Math.floor((this.video_width-b)/2),y_offset:0}):(a=Math.round(this.video_width/d),{width:this.video_width,height:a,x_offset:0,y_offset:Math.floor((this.video_height-a)/2)})},c}(a),window.JpegCamera=c),!window.swfobject)throw"JpegCamera: SWFObject is not loaded";k="9",j=!window.JpegCamera||!window.AudioContext||window.jpeg_camera_force_flash,g=function(){return window.swfobject&&swfobject.hasFlashPlayerVersion(k)},j&&g()&&(b=function(b){function c(){return n=c.__super__.constructor.apply(this,arguments)}return p(c,b),c._send_message=function(a,b){var c,d;return(d=this._instances[parseInt(a)])?(c=Array.prototype.slice.call(arguments,2),this.prototype[b].apply(d,c)):void 0},c._instances={},c._next_id=1,c.prototype._engine_init=function(){var a,b,c,d,e,f,g;return this._debug("Using Flash engine"),this._id=this.constructor._next_id++,this.constructor._instances[this._id]=this,this.view_width<215||this.view_height<138?void this._got_error("camera is too small to display privacy dialog"):(d="flash_object_"+this._id,f={loop:"false",allowScriptAccess:"always",allowFullScreen:"false",quality:"best",wmode:"opaque",menu:"false"},a={id:d,align:"middle"},e={id:this._id,width:this.view_width,height:this.view_height,shutter_url:this.options.shutter_mp3_url},g=this,b=function(a){return a.success?(g._debug("Flash loaded"),g._flash=document.getElementById(d)):g._got_error("Flash loading failed.")},c=document.createElement("div"),c.id="jpeg_camera_flash_"+this._id,c.style.width="100%",c.style.height="100%",this.container.appendChild(c),swfobject.embedSWF(this.options.swf_url,c.id,this.view_width,this.view_height,"9",null,e,f,a,b))},c.prototype._engine_play_shutter_sound=function(){return this._flash._play_shutter()},c.prototype._engine_capture=function(a,b,c,d){return this._flash._capture(a.id,b,c,d)},c.prototype._engine_display=function(a){return this._flash._display(a.id)},c.prototype._engine_get_canvas=function(a){var b,c;return a._image_data||(a._image_data=this._engine_get_image_data(a)),b=document.createElement("canvas"),b.width=a._image_data.width,b.height=a._image_data.height,c=b.getContext("2d"),c.putImageData(a._image_data,0,0),b},c.prototype._engine_get_image_data=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o;for(f=this._flash._get_image_data(b.id),a.canvas_supported()?(d=document.createElement("canvas"),d.width=f.width,d.height=f.height,e=d.getContext("2d"),l=e.createImageData(f.width,f.height)):l={data:[],width:f.width,height:f.height},o=f.data,h=m=0,n=o.length;n>m;h=++m)j=o[h],i=4*h,k=j>>16&255,g=j>>8&255,c=255&j,l.data[i+0]=k,l.data[i+1]=g,l.data[i+2]=c,l.data[i+3]=255;return l},c.prototype._engine_get_blob=function(a,b,c,d,e){var f,g;return a._extra_canvas||(a._extra_canvas=this._engine_get_canvas(a)),c?(f=document.createElement("canvas"),f.width=a._canvas.width,f.height=a._canvas.height,g=f.getContext("2d"),g.setTransform(1,0,0,1,0,0),g.translate(f.width,0),g.scale(-1,1),g.drawImage(a._extra_canvas,0,0)):f=a._extra_canvas,f.toBlob(function(a){return e(a)},b,d)},c.prototype._engine_discard=function(a){return this._flash._discard(a.id)},c.prototype._engine_show_stream=function(){return this._flash._show_stream()},c.prototype._engine_upload=function(a,b,c,d){return this._flash._upload(a.id,b,c,d)},c.prototype._flash_prepared=function(a,b){return this._block_element_access(),document.body.tabIndex=0,document.body.focus(),this._prepared(a,b)},c.prototype._flash_upload_complete=function(a,b,c,d){var e;return a=parseInt(a),e=this._snapshots[a],e._status=parseInt(b),e._response=d,e._status>=200&&e._status<300?e._upload_done():(e._error_message=c,e._upload_fail())},c}(a),window.JpegCamera=b),d=function(){function b(a,b){this.camera=a,this.options=b,this.id=this.constructor._next_snapshot_id++}return b._next_snapshot_id=1,b.prototype._discarded=!1,b.prototype.show=function(){return this._discarded&&raise("discarded snapshot cannot be used"),this.camera._display(this),this},b.prototype.hide=function(){return this.camera.displayed_snapshot()===this&&this.camera.show_stream(),this},b.prototype.get_stats=function(a){return this._discarded&&raise("discarded snapshot cannot be used"),this.get_image_data(function(b){return this._get_stats(b,a)})},b.prototype.get_canvas=function(b){var c;return this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,c=this,setTimeout(function(){return c._extra_canvas||(c._extra_canvas=c.camera._engine_get_canvas(c)),a._add_prefixed_style(c._extra_canvas,"transform","scalex(-1.0)"),b.call(c,c._extra_canvas)},1),!0},b.prototype._extra_canvas=null,b.prototype.get_blob=function(b,c){var d;return null==c&&(c="image/jpeg"),this._discarded&&raise("discarded snapshot cannot be used"),!a._canvas_supported,d=this,setTimeout(function(){var a,e;return d._blob_mime!==c&&(d._blob=null),d._blob_mime=c,d._blob?b.call(d,d._blob):(a=d.options.mirror,e=d.options.quality,d.camera._engine_get_blob(d,c,a,e,function(a){return d._blob=a,b.call(d,d._blob)}))},1),!0},b.prototype._blob=null,b.prototype._blob_mime=null,b.prototype.get_image_data=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),b=this,setTimeout(function(){return b._image_data||(b._image_data=b.camera._engine_get_image_data(b)),a.call(b,b._image_data)},1),null},b.prototype._image_data=null,b.prototype.upload=function(a){var b;if(null==a&&(a={}),this._discarded&&raise("discarded snapshot cannot be used"),this._uploading)return void this.camera._debug("Upload already in progress");if(this._uploading=!0,this._retry=1,this._upload_options=a,b=this._options(),!b.api_url)throw this.camera._debug("Snapshot#upload called without valid api_url"),"Snapshot#upload called without valid api_url";return this._start_upload(b),this},b.prototype._upload_options={},b.prototype._uploading=!1,b.prototype._retry=1,b.prototype.done=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_done=a,b=this._options(),b.on_upload_done&&this._done&&b.on_upload_done.call(this,this._response),this},b.prototype._done=!1,b.prototype._response=null,b.prototype.fail=function(a){var b;return this._discarded&&raise("discarded snapshot cannot be used"),this._upload_options.on_upload_fail=a,b=this._options(),b.on_upload_fail&&this._fail&&b.on_upload_fail.call(this,this._status,this._error_message,this._response),this},b.prototype._fail=!1,b.prototype._status=null,b.prototype._error_message=null,b.prototype.discard=function(){return this.camera._discard(this),delete this._extra_canvas,delete this._image_data,void delete this._blob},b.prototype._options=function(){return this.camera._extend({},this.camera.options,this.options,this._upload_options)},b.prototype._start_upload=function(a){var b;return b="string"==typeof a.csrf_token&&a.csrf_token.length>0?a.csrf_token:null,this._done=!1,this._response=null,this._fail=!1,this._status=null,this._error_message=null,this.camera._engine_upload(this,a.api_url,b,a.timeout)},b.prototype._get_stats=function(a,b){var c,d,f,g,h,i,j,k,l,m,n;if(!this._stats){for(i=a.width*a.height,j=0,d=new Array(i),f=l=0;i>l;f=l+=1)g=4*f,c=.2126*a.data[g+0]+.7152*a.data[g+1]+.0722*a.data[g+2],c=Math.round(c),j+=c,d[f]=c;for(h=Math.round(j/i),k=0,m=0,n=d.length;n>m;m++)c=d[m],k+=Math.pow(c-h,2);this._stats=new e,this._stats.mean=h,this._stats.std=Math.round(Math.sqrt(k/i))}return b.call(this,this._stats)},b.prototype._stats=null,b.prototype._upload_done=function(){var a,b,c,d;return this.camera._debug("Upload completed with status "+this._status),this._done=!0,a=this._options(),c=a.retry_success&&a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_done?a.on_upload_done.call(this,this._response):void 0)},b.prototype._upload_fail=function(){var a,b,c,d;return this.camera._debug("Upload failed with status "+this._status),this._fail=!0,a=this._options(),c=a.retry_if&&a.retry_if.call(this,this._status,this._error_message,this._response,this._retry),!0===c&&(c=0),"number"==typeof c?(this._retry++,c>0?(b=parseInt(c),this.camera._debug("Will retry the upload in "+b+"ms (attempt #"+this._retry+")"),d=this,setTimeout(function(){return d._start_upload(a)},b)):(this.camera._debug("Will retry the upload immediately (attempt #"+this._retry+")"),this._start_upload(a))):(this._uploading=!1,a.on_upload_fail?a.on_upload_fail.call(this,this._status,this._error_message,this._response):void 0)},b}(),e=function(){function a(){}return a.prototype.mean=null,a.prototype.std=null,a}()}).call(this); \ No newline at end of file diff --git a/src/jpeg_camera_html5.coffee b/src/jpeg_camera_html5.coffee index 5c4ad89..bf53f61 100644 --- a/src/jpeg_camera_html5.coffee +++ b/src/jpeg_camera_html5.coffee @@ -73,7 +73,7 @@ if navigator.getUserMedia else if can_play mpeg_audio @_load_shutter_sound @options.shutter_mp3_url - get_user_media_options = + default_media_options = video: optional: [ {minWidth: 1280}, @@ -82,6 +82,11 @@ if navigator.getUserMedia {minWidth: 360} ] + if typeof @options.get_media_options is 'function' + get_user_media_options = @options.get_media_options default_media_options + else + get_user_media_options = default_media_options + that = this success = (stream) ->