jpeg_camera 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 09f9c19c75f0ba4fb72d4326d6a8470dbb0da435
4
- data.tar.gz: 539264269d10d91e06fb3e62bce042ebeda41f65
3
+ metadata.gz: 32d25f723be89c783b99c281f2a3ccf89a8bbb0a
4
+ data.tar.gz: ff00c46f797a20ab1536142399d54c4b0de8a154
5
5
  SHA512:
6
- metadata.gz: 21f3e9348dc6340f25c2427419f3401e0b798e60b00a50595a0d6bca27643ca241783c3084bf82d9b8694fe80a9d387ffd0093ef43632205668632c7d765e039
7
- data.tar.gz: 9d5a099a80170bf77b20bf11064e287e22fd5da95bb1e76de00e4fb49237c2780cf82c5bd813f14cebf6b82fdea0518667a728f33a29bde4193b0d6400edfdb5
6
+ metadata.gz: 499716df6c49fd26e4f24923063740de4c56975af08c62545ab6e11264158f40683594addf528da0b7b0347dfe2e797f500e3c101b2be3c016383c7304f0ee40
7
+ data.tar.gz: 367505325ca62e1999f953e4e4be795024507f06497b45fbfb5f800c67a06f671dbc79b60225775aaf3ec264f1ba2fe3e68a5d979f3fc157e72be0c9198d0651
data/README.md CHANGED
@@ -74,7 +74,7 @@ to also load Canvas-to-Blob. You don't need SWFObject for HTML5.
74
74
 
75
75
  Require the gem in your Gemfile.
76
76
 
77
- gem "jpeg_camera", "~> 1.2.1"
77
+ gem "jpeg_camera", "~> 1.3.0"
78
78
 
79
79
  Add appropriate requires to your application.js. SWFObject and Canvas-to-Blob
80
80
  are stored in separate files so that you don't have to load them again if you
@@ -1,14 +1,15 @@
1
- /*! JpegCamera 1.2.1 | 2013-11-21
1
+ /*! JpegCamera 1.3.0 | 2013-11-21
2
2
  (c) 2013 Adam Wrobel
3
3
  http://amw.github.io/jpeg_camera */
4
4
  (function() {
5
- var JpegCamera, JpegCameraFlash, JpegCameraHtml5, Snapshot, Stats, check_canvas_to_blob, supported_flash_version, _ref, _ref1,
5
+ var JpegCamera, JpegCameraFlash, JpegCameraHtml5, Snapshot, Stats, can_play, can_use_flash, check_canvas_to_blob, mpeg_audio, should_try_flash, supported_flash_version, vorbis_audio, _ref, _ref1,
6
6
  __hasProp = {}.hasOwnProperty,
7
7
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
8
8
 
9
9
  JpegCamera = (function() {
10
10
  JpegCamera.DefaultOptions = {
11
- shutter_url: "/jpeg_camera/shutter.mp3",
11
+ shutter_ogg_url: "/jpeg_camera/shutter.ogg",
12
+ shutter_mp3_url: "/jpeg_camera/shutter.mp3",
12
13
  swf_url: "/jpeg_camera/jpeg_camera.swf",
13
14
  on_debug: function(message) {
14
15
  if (console && console.log) {
@@ -237,6 +238,8 @@
237
238
 
238
239
  navigator.getUserMedia || (navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
239
240
 
241
+ window.AudioContext || (window.AudioContext = window.webkitAudioContext);
242
+
240
243
  check_canvas_to_blob = function() {
241
244
  var canvas;
242
245
  canvas = document.createElement("canvas");
@@ -247,6 +250,13 @@
247
250
 
248
251
  if (navigator.getUserMedia) {
249
252
  check_canvas_to_blob();
253
+ vorbis_audio = "audio/ogg; codecs=vorbis";
254
+ mpeg_audio = "audio/mpeg; ";
255
+ can_play = function(type) {
256
+ var elem;
257
+ elem = document.createElement("video");
258
+ return !!(elem.canPlayType && elem.canPlayType(type).replace(/no/, ''));
259
+ };
250
260
  JpegCameraHtml5 = (function(_super) {
251
261
  __extends(JpegCameraHtml5, _super);
252
262
 
@@ -285,9 +295,12 @@
285
295
  this.video = document.createElement('video');
286
296
  this.video.autoplay = true;
287
297
  JpegCamera._add_prefixed_style(this.video, "transform", "scalex(-1.0)");
288
- window.AudioContext || (window.AudioContext = window.webkitAudioContext);
289
298
  if (window.AudioContext) {
290
- this._load_shutter_sound();
299
+ if (can_play(vorbis_audio)) {
300
+ this._load_shutter_sound(this.options.shutter_ogg_url);
301
+ } else if (can_play(mpeg_audio)) {
302
+ this._load_shutter_sound(this.options.shutter_mp3_url);
303
+ }
291
304
  }
292
305
  get_user_media_options = {
293
306
  video: {
@@ -461,14 +474,14 @@
461
474
  return this.message.style.display = "none";
462
475
  };
463
476
 
464
- JpegCameraHtml5.prototype._load_shutter_sound = function() {
477
+ JpegCameraHtml5.prototype._load_shutter_sound = function(url) {
465
478
  var request, that;
466
479
  if (this.audio_context) {
467
480
  return;
468
481
  }
469
482
  this.audio_context = new AudioContext();
470
483
  request = new XMLHttpRequest();
471
- request.open('GET', this.options.shutter_url, true);
484
+ request.open('GET', url, true);
472
485
  request.responseType = 'arraybuffer';
473
486
  that = this;
474
487
  request.onload = function() {
@@ -567,13 +580,19 @@
567
580
  window.JpegCamera = JpegCameraHtml5;
568
581
  }
569
582
 
570
- supported_flash_version = '9';
571
-
572
583
  if (!window.swfobject) {
573
584
  throw "JpegCamera: SWFObject is not loaded";
574
585
  }
575
586
 
576
- if ((!window.JpegCamera || window.jpeg_camera_force_flash) && window.swfobject && swfobject.hasFlashPlayerVersion(supported_flash_version)) {
587
+ supported_flash_version = '9';
588
+
589
+ should_try_flash = !window.JpegCamera || !window.AudioContext || window.jpeg_camera_force_flash;
590
+
591
+ can_use_flash = function() {
592
+ return window.swfobject && swfobject.hasFlashPlayerVersion(supported_flash_version);
593
+ };
594
+
595
+ if (should_try_flash && can_use_flash()) {
577
596
  JpegCameraFlash = (function(_super) {
578
597
  __extends(JpegCameraFlash, _super);
579
598
 
@@ -622,7 +641,7 @@
622
641
  id: this._id,
623
642
  width: this.view_width,
624
643
  height: this.view_height,
625
- shutter_url: this.options.shutter_url
644
+ shutter_url: this.options.shutter_mp3_url
626
645
  };
627
646
  that = this;
628
647
  callback = function(event) {
@@ -1,4 +1,4 @@
1
- /*! JpegCamera 1.2.1 | 2013-11-21
1
+ /*! JpegCamera 1.3.0 | 2013-11-21
2
2
  (c) 2013 Adam Wrobel
3
3
  http://amw.github.io/jpeg_camera */
4
- (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};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_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),f=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(f(),c=function(b){function c(){return h=c.__super__.constructor.apply(this,arguments)}return k(c,b),c.prototype._engine_init=function(){var b,c,d,e,f,g,h;this._debug("Using HTML5 engine"),h=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=""+h+"px",this.message.style.paddingBottom=""+h+"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.<br><br>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||(window.AudioContext=window.webkitAudioContext),window.AudioContext&&this._load_shutter_sound(),d={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},g=this,f=function(a){return g._remove_message(),g.video.src=window.URL?URL.createObjectURL(a):a,g._block_element_access(),g._wait_for_video_ready()},c=function(a){var b,c,d;g.message.innerHTML='<span style="color: red;">You have denied camera access.</span><br><br>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 g._got_error(c),void 0;return g._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(d,f,c)}catch(i){return b=i,navigator.getUserMedia("video",f,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(){var a,b;if(!this.audio_context)return this.audio_context=new AudioContext,a=new XMLHttpRequest,a.open("GET",this.options.shutter_url,!0),a.responseType="arraybuffer",b=this,a.onload=function(){return b.audio_context.decodeAudioData(a.response,function(a){return b.shutter_buffer=a})},a.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),g="9",!window.swfobject)throw"JpegCamera: SWFObject is not loaded";(!window.JpegCamera||window.jpeg_camera_force_flash)&&window.swfobject&&swfobject.hasFlashPlayerVersion(g)&&(b=function(b){function c(){return i=c.__super__.constructor.apply(this,arguments)}return k(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?(this._got_error("camera is too small to display privacy dialog"),void 0):(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_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=255&j>>16,g=255&j>>8,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 this.camera._debug("Upload already in progress"),void 0;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,delete this._blob,void 0},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);
4
+ (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.<br><br>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(),h.video.src=window.URL?URL.createObjectURL(a):a,h._block_element_access(),h._wait_for_video_ready()},c=function(a){var b,c,d;h.message.innerHTML='<span style="color: red;">You have denied camera access.</span><br><br>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 h._got_error(c),void 0;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?(this._got_error("camera is too small to display privacy dialog"),void 0):(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=255&j>>16,g=255&j>>8,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 this.camera._debug("Upload already in progress"),void 0;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,delete this._blob,void 0},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);
@@ -1,14 +1,15 @@
1
- /*! JpegCamera 1.2.1 | 2013-11-21
1
+ /*! JpegCamera 1.3.0 | 2013-11-21
2
2
  (c) 2013 Adam Wrobel
3
3
  http://amw.github.io/jpeg_camera */
4
4
  (function() {
5
- var JpegCamera, JpegCameraHtml5, Snapshot, Stats, check_canvas_to_blob, _ref,
5
+ var JpegCamera, JpegCameraHtml5, Snapshot, Stats, can_play, check_canvas_to_blob, mpeg_audio, vorbis_audio, _ref,
6
6
  __hasProp = {}.hasOwnProperty,
7
7
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
8
8
 
9
9
  JpegCamera = (function() {
10
10
  JpegCamera.DefaultOptions = {
11
- shutter_url: "/jpeg_camera/shutter.mp3",
11
+ shutter_ogg_url: "/jpeg_camera/shutter.ogg",
12
+ shutter_mp3_url: "/jpeg_camera/shutter.mp3",
12
13
  swf_url: "/jpeg_camera/jpeg_camera.swf",
13
14
  on_debug: function(message) {
14
15
  if (console && console.log) {
@@ -237,6 +238,8 @@
237
238
 
238
239
  navigator.getUserMedia || (navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
239
240
 
241
+ window.AudioContext || (window.AudioContext = window.webkitAudioContext);
242
+
240
243
  check_canvas_to_blob = function() {
241
244
  var canvas;
242
245
  canvas = document.createElement("canvas");
@@ -247,6 +250,13 @@
247
250
 
248
251
  if (navigator.getUserMedia) {
249
252
  check_canvas_to_blob();
253
+ vorbis_audio = "audio/ogg; codecs=vorbis";
254
+ mpeg_audio = "audio/mpeg; ";
255
+ can_play = function(type) {
256
+ var elem;
257
+ elem = document.createElement("video");
258
+ return !!(elem.canPlayType && elem.canPlayType(type).replace(/no/, ''));
259
+ };
250
260
  JpegCameraHtml5 = (function(_super) {
251
261
  __extends(JpegCameraHtml5, _super);
252
262
 
@@ -285,9 +295,12 @@
285
295
  this.video = document.createElement('video');
286
296
  this.video.autoplay = true;
287
297
  JpegCamera._add_prefixed_style(this.video, "transform", "scalex(-1.0)");
288
- window.AudioContext || (window.AudioContext = window.webkitAudioContext);
289
298
  if (window.AudioContext) {
290
- this._load_shutter_sound();
299
+ if (can_play(vorbis_audio)) {
300
+ this._load_shutter_sound(this.options.shutter_ogg_url);
301
+ } else if (can_play(mpeg_audio)) {
302
+ this._load_shutter_sound(this.options.shutter_mp3_url);
303
+ }
291
304
  }
292
305
  get_user_media_options = {
293
306
  video: {
@@ -461,14 +474,14 @@
461
474
  return this.message.style.display = "none";
462
475
  };
463
476
 
464
- JpegCameraHtml5.prototype._load_shutter_sound = function() {
477
+ JpegCameraHtml5.prototype._load_shutter_sound = function(url) {
465
478
  var request, that;
466
479
  if (this.audio_context) {
467
480
  return;
468
481
  }
469
482
  this.audio_context = new AudioContext();
470
483
  request = new XMLHttpRequest();
471
- request.open('GET', this.options.shutter_url, true);
484
+ request.open('GET', url, true);
472
485
  request.responseType = 'arraybuffer';
473
486
  that = this;
474
487
  request.onload = function() {
@@ -1,4 +1,4 @@
1
- /*! JpegCamera 1.2.1 | 2013-11-21
1
+ /*! JpegCamera 1.3.0 | 2013-11-21
2
2
  (c) 2013 Adam Wrobel
3
3
  http://amw.github.io/jpeg_camera */
4
- (function(){var a,b,c,d,e,f,g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.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_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),e=function(){var a;if(a=document.createElement("canvas"),a.getContext&&!a.toBlob)throw"JpegCamera: Canvas-to-Blob is not loaded"},navigator.getUserMedia&&(e(),b=function(b){function c(){return f=c.__super__.constructor.apply(this,arguments)}return h(c,b),c.prototype._engine_init=function(){var b,c,d,e,f,g,h;this._debug("Using HTML5 engine"),h=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=""+h+"px",this.message.style.paddingBottom=""+h+"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.<br><br>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||(window.AudioContext=window.webkitAudioContext),window.AudioContext&&this._load_shutter_sound(),d={video:{optional:[{minWidth:1280},{minWidth:640},{minWidth:480},{minWidth:360}]}},g=this,f=function(a){return g._remove_message(),g.video.src=window.URL?URL.createObjectURL(a):a,g._block_element_access(),g._wait_for_video_ready()},c=function(a){var b,c,d;g.message.innerHTML='<span style="color: red;">You have denied camera access.</span><br><br>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 g._got_error(c),void 0;return g._got_error("UNKNOWN ERROR")};try{return navigator.getUserMedia(d,f,c)}catch(i){return b=i,navigator.getUserMedia("video",f,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(){var a,b;if(!this.audio_context)return this.audio_context=new AudioContext,a=new XMLHttpRequest,a.open("GET",this.options.shutter_url,!0),a.responseType="arraybuffer",b=this,a.onload=function(){return b.audio_context.decodeAudioData(a.response,function(a){return b.shutter_buffer=a})},a.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 this.camera._debug("Upload already in progress"),void 0;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,delete this._blob,void 0},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);
4
+ (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.<br><br>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(),j.video.src=window.URL?URL.createObjectURL(a):a,j._block_element_access(),j._wait_for_video_ready()},c=function(a){var b,c,d;j.message.innerHTML='<span style="color: red;">You have denied camera access.</span><br><br>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 j._got_error(c),void 0;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 this.camera._debug("Upload already in progress"),void 0;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,delete this._blob,void 0},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);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jpeg_camera
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Wróbel