Browse Source

Merge pull request #841 from jloguercio/7181-1.10x

Upgrade to WebcamJS from JPEGCam in Document Tools - Refs #7181 to 1.10.x
Yannick Warnier 9 years ago
parent
commit
87ffdf664e

+ 7 - 0
app/Resources/public/css/base.css

@@ -6330,6 +6330,13 @@ a.sessionView {
 #prev.disabled {
     opacity: 0.2;
 }
+.webcamclip_bg{
+    width:340px;
+    height:260px;
+    border:10px solid;
+    border-radius: 25px;
+    border-color: #00677C;
+}
 /* CSS NEW TOP ******************************************************************************/
 /* CSS Responsive */
 @media (min-width: 1025px) and (max-width: 1200px) {

+ 1 - 0
composer.json

@@ -76,6 +76,7 @@
         "bower-asset/simplewebrtc": "1.15.*",
         "bower-asset/select2": "4.*",
         "bower-asset/MathJax": "2.5.*",
+        "bower-asset/webcamjs": "1.0.*",
         "clue/graph": "~0.9.0",
         "graphp/graphviz": "~0.2.0",
         "graphp/algorithms": "~0.8.0",

+ 98 - 69
main/document/webcam_clip.php

@@ -8,6 +8,7 @@
  *
  * @author Juan Carlos Raña Trabado herodoto@telefonica.net
  * @since 7/jun/2012
+ * @Updated 04/09/2015 Upgrade to WebCamJS
 */
 require_once '../inc/global.inc.php';
 
@@ -127,78 +128,77 @@ echo '</div>';
 <div align="center">
     <h2><?php echo get_lang('TakeYourPhotos'); ?></h2>
 </div>
-<div align="center" style="padding-left:50px;">
-<table><tr><td valign=top>
-<h3><?php echo get_lang('LocalInputImage'); ?></h3>
-<!-- First, include the JPEGCam JavaScript Library -->
-	<script type="text/javascript" src="<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/webcam.js"></script>
-
-	<!-- Configure a few settings -->
-	<script language="JavaScript">
-		var clip_filename='video_clip.jpg';
-		//var clip_filename='<?php //echo date('YmdHis') . '.jpg'; ?>';
-		webcam.set_swf_url ( '<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam//webcam.swf?blackboard.png' );
-		webcam.set_shutter_sound( true,'<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/shutter.mp3' ); // true play shutter click sound
-		webcam.set_quality( 90 ); // JPEG quality (1 - 100)
-		webcam.set_api_url( '<?php echo api_get_path(WEB_LIBRARY_PATH); ?>jpegcam/webcam_receiver.php?webcamname='+escape(clip_filename)+'&webcamdir=<?php echo $webcamdir; ?>&webcamuserid=<?php echo $webcamuserid; ?>' );
-
-	</script>
-
-	<!-- Next, write the movie to the page at 320x240 -->
+<div align="center">
+<table><tr><td valign='top' align='center'>
+<h3 align='center'><?php echo get_lang('LocalInputImage'); ?></h3>
+    <!-- Including New Lib WebCamJS upgrading from JPEGCam -->
+    <script type="text/javascript" src="<?php echo api_get_path(WEB_PATH); ?>web/assets/webcamjs/webcam.js"></script>
+    <!-- Adding a div container for the new live camera with some cool style options-->
+    <div class="webcamclip_bg">
+        <div id="chamilo-camera"></div>
+    </div>
+	<!-- Configure a few settings and attach the camera to the div container -->
 	<script language="JavaScript">
-		document.write( webcam.get_html(320, 240) );
+		Webcam.set({
+            width: 320,
+            height: 240,
+            image_format: 'jpeg',
+            jpeg_quality: 90
+        });
+        Webcam.attach( '#chamilo-camera' );
+        //This line Fix a minor bug that made a conflict with a videochat feature in another module file
+        $('video').addClass('skip');
 	</script>
 
-	<!-- Some buttons for controlling things -->
-	<br/>
-    <form>
-    <br/>
-		<input type=button value="<?php echo get_lang('Snapshot'); ?>" onClick="webcam.freeze()">
-		<input type=button value="<?php echo get_lang('Clean'); ?>" onClick="webcam.reset()">
-        <input type=button value="<?php echo get_lang('Send'); ?>" onClick="do_upload()">
-        &nbsp;&nbsp;||&nbsp;&nbsp;
-        <input type=button value="<?php echo get_lang('Auto'); ?>" onClick="start_video();">
-		<input type=button value="<?php echo get_lang('Stop'); ?>" onClick="stop_video()">
-        <br/>
-        <input type=button value="<?php echo get_lang('Configure'); ?>" onClick="webcam.configure()">
-
-	</form>
-
-	<!-- Code to handle the server response (see webcam_receiver.php) -->
+	<!-- Using now Jquery to do the webcamJS Functions and handle the server response (see webcam_receiver.php now in webcamJS directory) -->
 	<script language="JavaScript">
-		webcam.set_hook( 'onComplete', 'my_completion_handler' );
-
-		function do_upload() {
-			// upload to server
-			if (this.loaded){
-				document.getElementById('upload_results').innerHTML = '<h3><?php echo get_lang('Uploading'); ?></h3>';
-			}
-			webcam.upload();
-		}
-
-		function my_completion_handler(msg) {
-			// extract URL out of PHP output
-			if (msg.match(/(http\:\/\/\S+)/)) {
-				var image_url = RegExp.$1;
-
-				image_url=image_url.replace(/\\/g,'/').replace( /.*\//, '' );// extract basename
-				image_url='<?php echo api_get_path(WEB_COURSE_PATH).$_course['path'].'/document/'.$dir;?>'+image_url+'<?php echo '?'.api_get_cidreq(); ?>';
-
-				// show JPEG image in page
-				document.getElementById('upload_results').innerHTML =
-				'<div style="width: 320px;">' +
-					'<h3><?php echo get_lang('ClipSent'); ?></h3>' +
-					'<img src="' + image_url + '">' +
-					'</div>';
-				// reset camera for another shot
-				webcam.reset();
-			}
-			else alert("PHP Error: " + msg);
-		}
+		$(document).ready(function() {
+           $('#btnCapture').click(function() {
+               Webcam.freeze();
+               return false;
+           });
+           
+           $('#btnClean').click(function() {
+               Webcam.unfreeze();
+               return false;
+           });
+           
+           $('#btnSave').click(function() {
+               snap();
+               return false;
+           });
+           
+           $('#btnAuto').click(function() {
+               start_video();
+               return false;
+           });
+           
+           $('#btnStop').click(function() {
+               stop_video();
+               return false;
+           });
+        });
+        
+        function snap() {
+            Webcam.snap( function(data_uri) {
+                  var clip_filename='video_clip.jpg';
+                  var url = 'webcam_receiver.php?webcamname='+escape(clip_filename)+'&webcamdir=<?php echo $webcamdir; ?>&webcamuserid=<?php echo $webcamuserid; ?>';
+                  Webcam.upload(data_uri, url, function(code, response){
+                      $('#upload_results').html(
+                          '<h3>'+response+'</h3>' +
+                          '<div>'+
+                          '<img src="' + data_uri + '" class="webcamclip_bg">' +
+                          '</div>'+
+                          '</div>'+
+                          '<p hidden="true">'+code+'</p>'
+                      );
+                  });
+              });
+        }
 	</script>
 
      <script language=javascript>
-	   var internaval=null;
+	   var interval=null;
 	   var timeout=null;
 	   var counter=0;
 	   var fps=1000;//one frame per second
@@ -207,18 +207,18 @@ echo '</div>';
 
 	   function stop_video() {
 			interval=window.clearInterval(interval);
+            return false;
 	   }
 
 	   function start_video() {
-		   	webcam.set_stealth( true ); // do not freeze image upon capture
 		 	interval=window.setInterval("clip_send_video()",fps);
 	   }
 
 	   function clip_send_video() {
-		   counter++
+		   counter++;
 		   timeout=setTimeout('stop_video()',maxtime);
 		   if(maxclip>=counter){
-		       webcam.snap();// clip and upload
+		       snap();// clip and upload
 		   }
 		   else {
 			   interval=window.clearInterval(interval);
@@ -227,9 +227,38 @@ echo '</div>';
  </script>
 
 
-	</td><td width=50>&nbsp;</td><td valign=top>
+	</td><td width=50></td><td valign='top' align='center'>
 		<div id="upload_results" style="background-color:#ffffff;"></div>
 	</td></tr></table>
+    
+    <!-- Implementing Button html5 Tags instead Inputs and some cool bootstrap button styles -->
+    <div>
+        <br/>
+            <form>
+                <br/>
+                <button id="btnCapture" class="btn btn-danger">
+                <i class="fa fa-camera"></i>
+                <?php echo get_lang('Snapshot'); ?>
+                </button>
+                <button id="btnClean" class="btn btn-success">
+                <i class="fa fa-refresh"></i>
+                <?php echo get_lang('Clean'); ?>
+                </button>
+                <button id="btnSave" class="btn btn-primary">
+                <i class="fa fa-save"></i>
+                <?php echo get_lang('Save'); ?>
+                </button>
+                &nbsp;&nbsp;||&nbsp;&nbsp;
+                <button id="btnAuto" class="btn btn-default">
+                <?php echo get_lang('Auto'); ?>
+                </button>
+                <button id="btnStop" class="btn btn-default">
+                <?php echo get_lang('Stop'); ?>
+                </button>
+                <br/>
+            </form>
+        <br/>
+   </div>
 </div>
 
 <?php

+ 10 - 18
main/inc/lib/jpegcam/webcam_receiver.php → main/document/webcam_receiver.php

@@ -1,9 +1,11 @@
 <?php
 
-/* JPEGCam Script */
+/* JPEGCam Script *****UPDATED to lib webcamJS 2015-09-04***** */
 /* Receives JPEG webcam submission and saves to local file. */
 /* Make sure your directory has permission to write files as your web server user! */
-require_once '../../../inc/global.inc.php';
+
+//Changes on directory because move the proper script to the new lib upgrade directory
+require_once '../inc/global.inc.php';
 ////Add security from Chamilo
 api_protect_course_script();
 api_block_anonymous_users();
@@ -46,11 +48,11 @@ if($ext!= 'jpg'){
 //Do not use here check Fileinfo method because return: text/plain                //CHECK THIS BEFORE COMMIT
 
 $dirBaseDocuments = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document';
-$saveDir=$dirBaseDocuments.$webcamdir;
+$saveDir = $dirBaseDocuments.$webcamdir;
 $current_session_id = api_get_session_id();
 $groupId = api_get_group_id();
 
-//avoid duplicates
+//Avoid duplicates
 $webcamname_to_save=$webcamname;
 $title_to_save=str_replace('_',' ',$webcamname);
 $webcamname_noex=basename($webcamname, ".jpg");
@@ -62,29 +64,19 @@ if (file_exists($saveDir.'/'.$webcamname_noex.'.'.$ext)){
 		$title_to_save = str_replace('_',' ',$title_to_save);
 }
 
-
 $documentPath = $saveDir.'/'.$webcamname_to_save;
 
-
 //read content
-$content = file_get_contents('php://input');
+//Change to move_uploaded_file() function instead file_get_contents() to adapt the new lib
+$content = move_uploaded_file($_FILES['webcam']['tmp_name'], $documentPath);
 if (!$content) {
-	print "ERROR: Failed to read data\n";
+	print "PHP ERROR: Failed to read data\n";
 	exit();
 }
 
-//add to disk
-$fh = fopen($documentPath, 'w') or die("can't open file");
-fwrite($fh, $content);
-fclose($fh);
-
-
-//
 //add document to database
 	$doc_id = add_document($_course, $webcamdir.'/'.$webcamname_to_save, 'file', filesize($documentPath), $title_to_save);
 	api_item_property_update($_course, TOOL_DOCUMENT, $doc_id, 'DocumentAdded', $_user['user_id'], $groupId, null, null, null, $current_session_id);
 ///
 $url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']) . '/' . $documentPath;
-print "$url\n";
-
-?>
+print get_lang('ClipSent');

+ 0 - 165
main/inc/lib/jpegcam/LICENSE.txt

@@ -1,165 +0,0 @@
-		   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions. 
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version. 
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.

+ 0 - 8
main/inc/lib/jpegcam/index.html

@@ -1,8 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-</head>
-<body>
-<br />
-</body>
-</html>

BIN
main/inc/lib/jpegcam/shutter.mp3


+ 0 - 197
main/inc/lib/jpegcam/webcam.js

@@ -1,197 +0,0 @@
-/* JPEGCam v1.0.9 */
-/* Webcam library for capturing JPEG images and submitting to a server */
-/* Copyright (c) 2008 - 2009 Joseph Huckaby <jhuckaby@goldcartridge.com> */
-/* Licensed under the GNU Lesser Public License */
-/* http://www.gnu.org/licenses/lgpl.html */
-
-/* Usage:
-	<script language="JavaScript">
-		document.write( webcam.get_html(320, 240) );
-		webcam.set_api_url( 'test.php' );
-		webcam.set_hook( 'onComplete', 'my_callback_function' );
-		function my_callback_function(response) {
-			alert("Success! PHP returned: " + response);
-		}
-	</script>
-	<a href="javascript:void(webcam.snap())">Take Snapshot</a>
-*/
-
-// Everything is under a 'webcam' Namespace
-window.webcam = {
-	version: '1.0.9',
-	
-	// globals
-	ie: !!navigator.userAgent.match(/MSIE/),
-	protocol: location.protocol.match(/https/i) ? 'https' : 'http',
-	callback: null, // user callback for completed uploads
-	swf_url: 'webcam.swf', // URI to webcam.swf movie (defaults to cwd)
-	shutter_url: 'shutter.mp3', // URI to shutter.mp3 sound
-	api_url: '', // URL to upload script
-	loaded: false, // true when webcam movie finishes loading
-	quality: 90, // JPEG quality (1 - 100)
-	shutter_sound: true, // shutter sound effect on/off
-	stealth: false, // stealth mode (do not freeze image upon capture)
-	hooks: {
-		onLoad: null,
-		onComplete: null,
-		onError: null
-	}, // callback hook functions
-	
-	set_hook: function(name, callback) {
-		// set callback hook
-		// supported hooks: onLoad, onComplete, onError
-		if (typeof(this.hooks[name]) == 'undefined')
-			return alert("Hook type not supported: " + name);
-		
-		this.hooks[name] = callback;
-	},
-	
-	fire_hook: function(name, value) {
-		// fire hook callback, passing optional value to it
-		if (this.hooks[name]) {
-			if (typeof(this.hooks[name]) == 'function') {
-				// callback is function reference, call directly
-				this.hooks[name](value);
-			}
-			else if (typeof(this.hooks[name]) == 'array') {
-				// callback is PHP-style object instance method
-				this.hooks[name][0][this.hooks[name][1]](value);
-			}
-			else if (window[this.hooks[name]]) {
-				// callback is global function name
-				window[ this.hooks[name] ](value);
-			}
-			return true;
-		}
-		return false; // no hook defined
-	},
-	
-	set_api_url: function(url) {
-		// set location of upload API script
-		this.api_url = url;
-	},
-	
-	set_swf_url: function(url) {
-		// set location of SWF movie (defaults to webcam.swf in cwd)
-		this.swf_url = url;
-	},
-	
-	get_html: function(width, height, server_width, server_height) {
-		// Return HTML for embedding webcam capture movie
-		// Specify pixel width and height (640x480, 320x240, etc.)
-		// Server width and height are optional, and default to movie width/height
-		if (!server_width) server_width = width;
-		if (!server_height) server_height = height;
-		
-		var html = '';
-		var flashvars = 'shutter_enabled=' + (this.shutter_sound ? 1 : 0) + 
-			'&shutter_url=' + escape(this.shutter_url) + 
-			'&width=' + width + 
-			'&height=' + height + 
-			'&server_width=' + server_width + 
-			'&server_height=' + server_height;
-		
-		if (this.ie) {
-			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+this.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="webcam_movie" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+this.swf_url+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/></object>';
-		}
-		else {
-			html += '<embed id="webcam_movie" src="'+this.swf_url+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="webcam_movie" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" />';
-		}
-		
-		this.loaded = false;
-		return html;
-	},
-	
-	get_movie: function() {
-		// get reference to movie object/embed in DOM
-		if (!this.loaded) return alert("ERROR: Movie is not loaded yet");
-		var movie = document.getElementById('webcam_movie');
-		if (!movie) alert("ERROR: Cannot locate movie 'webcam_movie' in DOM");
-		return movie;
-	},
-	
-	set_stealth: function(stealth) {
-		// set or disable stealth mode
-		this.stealth = stealth;
-	},
-	
-	snap: function(url, callback, stealth) {
-		// take snapshot and send to server
-		// specify fully-qualified URL to server API script
-		// and callback function (string or function object)
-		if (callback) this.set_hook('onComplete', callback);
-		if (url) this.set_api_url(url);
-		if (typeof(stealth) != 'undefined') this.set_stealth( stealth );
-		
-		this.get_movie()._snap( this.api_url, this.quality, this.shutter_sound ? 1 : 0, this.stealth ? 1 : 0 );
-	},
-	
-	freeze: function() {
-		// freeze webcam image (capture but do not upload)
-		this.get_movie()._snap('', this.quality, this.shutter_sound ? 1 : 0, 0 );
-	},
-	
-	upload: function(url, callback) {
-		// upload image to server after taking snapshot
-		// specify fully-qualified URL to server API script
-		// and callback function (string or function object)
-		if (callback) this.set_hook('onComplete', callback);
-		if (url) this.set_api_url(url);
-		
-		this.get_movie()._upload( this.api_url );
-	},
-	
-	reset: function() {
-		// reset movie after taking snapshot
-		this.get_movie()._reset();
-	},
-	
-	configure: function(panel) {
-		// open flash configuration panel -- specify tab name:
-		// "camera", "privacy", "default", "localStorage", "microphone", "settingsManager"
-		if (!panel) panel = "camera";
-		this.get_movie()._configure(panel);
-	},
-	
-	set_quality: function(new_quality) {
-		// set the JPEG quality (1 - 100)
-		// default is 90
-		this.quality = new_quality;
-	},
-	
-	set_shutter_sound: function(enabled, url) {
-		// enable or disable the shutter sound effect
-		// defaults to enabled
-		this.shutter_sound = enabled;
-		this.shutter_url = url ? url : 'shutter.mp3';
-	},
-	
-	flash_notify: function(type, msg) {
-		// receive notification from flash about event
-		switch (type) {
-			case 'flashLoadComplete':
-				// movie loaded successfully
-				this.loaded = true;
-				this.fire_hook('onLoad');
-				break;
-
-			case 'error':
-				// HTTP POST error most likely
-				if (!this.fire_hook('onError', msg)) {
-					alert("JPEGCam Flash Error: " + msg);
-				}
-				break;
-
-			case 'success':
-				// upload complete, execute user callback function
-				// and pass raw API script results to function
-				this.fire_hook('onComplete', msg.toString());
-				break;
-
-			default:
-				// catch-all, just in case
-				alert("jpegcam flash_notify: " + type + ": " + msg);
-				break;
-		}
-	}
-};

BIN
main/inc/lib/jpegcam/webcam.swf