add id to copy ine dialog
authorymh <ymh.work@gmail.com>
Mon, 27 Dec 2010 16:22:07 +0100
changeset 130 8d2b6ee4eb58
parent 129 d77bc51d9682
child 131 49123f5f8055
add id to copy ine dialog
web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html
web/ldt/ldt_utils/views.py
web/ldt/locale/en/LC_MESSAGES/django.mo
web/ldt/locale/en/LC_MESSAGES/django.po
web/ldt/locale/fr/LC_MESSAGES/django.mo
web/ldt/locale/fr/LC_MESSAGES/django.po
web/static/ldt/css/embed_popup.css
web/static/ldt/js/ZeroClipboard.js
web/static/ldt/swf/ZeroClipboard10.swf
--- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html	Wed Dec 01 16:56:01 2010 +0100
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html	Mon Dec 27 16:22:07 2010 +0100
@@ -8,6 +8,7 @@
 		<meta http-equiv="Expires" content="-1" />
 		<title>Ligne de Temps - IRI</title>
 		<script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/jquery.min.js"></script>
+		<script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/jquery.qtip.min.js"></script>
 		<script type="text/javascript">
 			var $j = jQuery.noConflict();
 		</script>
@@ -22,20 +23,47 @@
 			};
 		</script>
 		<script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/embed_popup.js"></script>
+		<script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/ZeroClipboard.js"></script>
 		
 		
 		<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/workspace.css" type="text/css"/>
 		<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/embed_popup.css" type="text/css"/>
+		<script type="text/javascript">
+			$j(document).ready(function(){
+                ZeroClipboard.setMoviePath( '{{WEB_URL}}{{LDT_MEDIA_PREFIX}}/swf/ZeroClipboard10.swf' );
+		        clip = new ZeroClipboard.Client();
+		        clip.setHandCursor(true);
+		        clip.setText('{{ldt_id}}');
+		        $j("#clipboard_button").html(clip.getHTML(32,32));
+		        $j("#clipboard_button").qtip({ 
+		    		style: { 
+		    			'name': 'dark',
+		    			'filter':'alpha(opacity=70)',
+		    			'-moz-opacity':'0.7',
+		    			'-khtml-opacity': '0.7',
+		    			'opacity': '0.7',
+		    			'border': {
+		    				'width' : '0',
+		    				'color': '#505050'
+		    			}, 
+		    			'tip': true
+		    		} 
+		    	});
+			});
+        </script>
+		
 	</head>
 
 	<body id="init_embed_popup">
+
+		<div id='ldt_id'>
+			<div id='ldt_id_title'>{% trans 'project id' %}:</div>
+			<div id='ldt_id_row'><div id="clipboard_button" title="{% trans 'copy to clipboard' %}">&nbsp;</div><div id='ldt_id_id' class="projectscontentstitle">{{ldt_id}}</div></div>
+        </div>
 	
 		<div class="ldt_player" id="wrapper_{{player_id}}">
 		{% include "ldt/ldt_utils/partial/embed_player.html" %}  
 		</div>
-		
-		<div style="height: 100px">&nbsp;</div>
-
 
 		<div id="button_row">
 		    <div id="display_select">
--- a/web/ldt/ldt_utils/views.py	Wed Dec 01 16:56:01 2010 +0100
+++ b/web/ldt/ldt_utils/views.py	Mon Dec 27 16:22:07 2010 +0100
@@ -79,7 +79,7 @@
                            for typestr in ('player','seo_body', 'seo_meta', 'links')  )
 
     return render_to_response("ldt/ldt_utils/embed_popup.html",
-                              {'json_url':json_url,'player_id':player_id, 'embed_rendered':embed_rendered, 'annotations':annotations},
+                              {'json_url':json_url,'player_id':player_id, 'embed_rendered':embed_rendered, 'annotations':annotations, 'ldt_id' : ldt_id},
                               context_instance=RequestContext(request))
 
 
Binary file web/ldt/locale/en/LC_MESSAGES/django.mo has changed
--- a/web/ldt/locale/en/LC_MESSAGES/django.po	Wed Dec 01 16:56:01 2010 +0100
+++ b/web/ldt/locale/en/LC_MESSAGES/django.po	Mon Dec 27 16:22:07 2010 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-10-19 19:43+0200\n"
+"POT-Creation-Date: 2010-12-27 15:49+0100\n"
 "PO-Revision-Date: 2010-02-17 03:53+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -137,11 +137,11 @@
 msgid "content.duration"
 msgstr "duration (ms)"
 
-#: ldt_utils/models.py:256
+#: ldt_utils/models.py:260
 msgid "created by"
 msgstr "created by"
 
-#: ldt_utils/models.py:257
+#: ldt_utils/models.py:261
 msgid "changed by"
 msgstr "changed by"
 
@@ -171,35 +171,35 @@
 msgid "confirm deletion"
 msgstr "Confirm deletion"
 
-#: ldt_utils/views.py:683
+#: ldt_utils/views.py:695
 msgid "Problem when downloading file from url : "
 msgstr "Problem when downloading file from url: "
 
-#: ldt_utils/views.py:686
+#: ldt_utils/views.py:698
 msgid "Problem when uploading file : "
 msgstr "Problem when uploading file: "
 
-#: ldt_utils/views.py:756
+#: ldt_utils/views.py:768
 #, python-format
 msgid "There is %(count)d error when deleting content"
 msgid_plural "There are %(count)d errors when deleting content"
 msgstr[0] "There is %(count)d error when deleting content"
 msgstr[1] "There are %(count)d errors when deleting content"
 
-#: ldt_utils/views.py:757
+#: ldt_utils/views.py:769
 msgid "title error deleting content"
 msgstr "Error when deleting content"
 
-#: ldt_utils/views.py:759
+#: ldt_utils/views.py:771
 #, python-format
 msgid "Confirm delete content %(titles)s"
 msgstr "Confirm delete content %(titles)s"
 
-#: ldt_utils/views.py:760
+#: ldt_utils/views.py:772
 msgid "confirm delete content"
 msgstr "Confirm delete content"
 
-#: ldt_utils/views.py:791
+#: ldt_utils/views.py:803
 #, python-format
 msgid ""
 "Content '%(title)s' is referenced by this project : %(project_titles)s. "
@@ -334,23 +334,31 @@
 msgid "create_project"
 msgstr "Create new project"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:60
+msgid "project id"
+msgstr "project id"
+
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:61
+msgid "copy to clipboard"
+msgstr "copy to clipboard"
+
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_player"
 msgstr "player"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_seo_body"
 msgstr "seo"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_seo_meta"
 msgstr "meta"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_links"
 msgstr "links"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:56
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:84
 msgid "clik here to see the project content"
 msgstr "clik here to see the project content"
 
@@ -594,19 +602,19 @@
 msgstr "Password:"
 
 #: templates/admin/page_login.html:29
-#: user/templates/registration/login.html:29
+#: user/templates/registration/login.html:39
 msgid "Create an account"
 msgstr "Create an account"
 
 #: templates/admin/page_login.html:30
-#: user/templates/registration/login.html:30
+#: user/templates/registration/login.html:40
 msgid "Forget password?"
 msgstr "Forget password?"
 
 #: templates/admin/page_login.html:32
 #: user/templates/ldt/user/login_form.html:37
 #: user/templates/ldt/user/login_form.html:45
-#: user/templates/registration/login.html:14
+#: user/templates/registration/login.html:21
 #: user/templates/registration/password_reset_complete.html:14
 msgid "Log in"
 msgstr "Log in"
@@ -700,7 +708,7 @@
 msgid "The two emails didn't match."
 msgstr "The two emails didn't match."
 
-#: user/views.py:45 user/templates/registration/login.html:17
+#: user/views.py:45 user/templates/registration/login.html:24
 msgid "Sorry, that's not a valid username or password."
 msgstr "Sorry, that's not a valid username or password."
 
@@ -823,7 +831,7 @@
 msgid "Log in again"
 msgstr "Log in again"
 
-#: user/templates/registration/login.html:25
+#: user/templates/registration/login.html:46
 msgid "login"
 msgstr "login"
 
Binary file web/ldt/locale/fr/LC_MESSAGES/django.mo has changed
--- a/web/ldt/locale/fr/LC_MESSAGES/django.po	Wed Dec 01 16:56:01 2010 +0100
+++ b/web/ldt/locale/fr/LC_MESSAGES/django.po	Mon Dec 27 16:22:07 2010 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-10-19 19:43+0200\n"
+"POT-Creation-Date: 2010-12-27 15:49+0100\n"
 "PO-Revision-Date: 2010-03-09 15:52+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -137,11 +137,11 @@
 msgid "content.duration"
 msgstr "Durée (ms)"
 
-#: ldt_utils/models.py:256
+#: ldt_utils/models.py:260
 msgid "created by"
 msgstr "créé par"
 
-#: ldt_utils/models.py:257
+#: ldt_utils/models.py:261
 msgid "changed by"
 msgstr "modifié par"
 
@@ -172,35 +172,35 @@
 msgid "confirm deletion"
 msgstr "Confirmation d'effacement"
 
-#: ldt_utils/views.py:683
+#: ldt_utils/views.py:695
 msgid "Problem when downloading file from url : "
 msgstr "Problème lors du téléchargement du fichier : "
 
-#: ldt_utils/views.py:686
+#: ldt_utils/views.py:698
 msgid "Problem when uploading file : "
 msgstr "Problème lors de l'upload du fichier : "
 
-#: ldt_utils/views.py:756
+#: ldt_utils/views.py:768
 #, python-format
 msgid "There is %(count)d error when deleting content"
 msgid_plural "There are %(count)d errors when deleting content"
 msgstr[0] "Il y a %(count)d erreur lors de l'effacement du contenu"
 msgstr[1] "Il y a %(count)d erreurs lors de l'effacement du contenu"
 
-#: ldt_utils/views.py:757
+#: ldt_utils/views.py:769
 msgid "title error deleting content"
 msgstr "Erreur lors de l'effacement du contenu"
 
-#: ldt_utils/views.py:759
+#: ldt_utils/views.py:771
 #, python-format
 msgid "Confirm delete content %(titles)s"
 msgstr "Veuillez confirmer l'effacement du contenu %(titles)s"
 
-#: ldt_utils/views.py:760
+#: ldt_utils/views.py:772
 msgid "confirm delete content"
 msgstr "Confirmation effacement contenu"
 
-#: ldt_utils/views.py:791
+#: ldt_utils/views.py:803
 #, python-format
 msgid ""
 "Content '%(title)s' is referenced by this project : %(project_titles)s. "
@@ -335,23 +335,31 @@
 msgid "create_project"
 msgstr "Créer un nouveau projet Ligne de Temps"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:60
+msgid "project id"
+msgstr "Identifiant du projet "
+
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:61
+msgid "copy to clipboard"
+msgstr "Copier l'id dans le presse-papiers"
+
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_player"
 msgstr "Code Lecteur métadata"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_seo_body"
 msgstr "Code SEO"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_seo_meta"
 msgstr "Code balise meta en-tête"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70
 msgid "popup_links"
 msgstr "Liste de liens"
 
-#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:56
+#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:84
 msgid "clik here to see the project content"
 msgstr "cliquer ici pour voir le contenu du projet"
 
@@ -595,19 +603,19 @@
 msgstr "Mot de passe :"
 
 #: templates/admin/page_login.html:29
-#: user/templates/registration/login.html:29
+#: user/templates/registration/login.html:39
 msgid "Create an account"
 msgstr "Créer un compte"
 
 #: templates/admin/page_login.html:30
-#: user/templates/registration/login.html:30
+#: user/templates/registration/login.html:40
 msgid "Forget password?"
 msgstr "Oubliez le mot de passe?"
 
 #: templates/admin/page_login.html:32
 #: user/templates/ldt/user/login_form.html:37
 #: user/templates/ldt/user/login_form.html:45
-#: user/templates/registration/login.html:14
+#: user/templates/registration/login.html:21
 #: user/templates/registration/password_reset_complete.html:14
 msgid "Log in"
 msgstr "Connexion"
@@ -701,7 +709,7 @@
 msgid "The two emails didn't match."
 msgstr "les deux emails ne correspondent pas"
 
-#: user/views.py:45 user/templates/registration/login.html:17
+#: user/views.py:45 user/templates/registration/login.html:24
 msgid "Sorry, that's not a valid username or password."
 msgstr "Saisissez un nom d'utilisateur et un mot de passe valide."
 
@@ -824,7 +832,7 @@
 msgid "Log in again"
 msgstr "Se reconnecter"
 
-#: user/templates/registration/login.html:25
+#: user/templates/registration/login.html:46
 msgid "login"
 msgstr "Connexion"
 
--- a/web/static/ldt/css/embed_popup.css	Wed Dec 01 16:56:01 2010 +0100
+++ b/web/static/ldt/css/embed_popup.css	Mon Dec 27 16:22:07 2010 +0100
@@ -31,3 +31,36 @@
 	float: right;
 }
 
+#ldt_id {
+	color: #949494;
+	font-family: Verdana;
+	font-weight: lighter;
+	font-style: normal;
+	text-align: left;
+	
+}
+
+#ldt_id_row {
+	height: 20px;
+	vertical-align: middle;
+	font-size: 1.5em;
+	font-style: normal;
+	text-align: left;
+	
+}
+
+#ldt_id_id {
+	float: left;
+}
+
+#clipboard_button {
+	height: 20px;
+	width: 20px;
+	float: left;
+	background-image:url('../img/clipboard.png');
+	background-repeat:no-repeat;
+	background-position:center;
+	cursor: pointer;
+	margin-right: 10px;
+	padding: 2px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/static/ldt/js/ZeroClipboard.js	Mon Dec 27 16:22:07 2010 +0100
@@ -0,0 +1,311 @@
+// Simple Set Clipboard System
+// Author: Joseph Huckaby
+
+var ZeroClipboard = {
+	
+	version: "1.0.7",
+	clients: {}, // registered upload clients on page, indexed by id
+	moviePath: 'ZeroClipboard.swf', // URL to movie
+	nextId: 1, // ID of next movie
+	
+	$: function(thingy) {
+		// simple DOM lookup utility function
+		if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
+		if (!thingy.addClass) {
+			// extend element with a few useful methods
+			thingy.hide = function() { this.style.display = 'none'; };
+			thingy.show = function() { this.style.display = ''; };
+			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
+			thingy.removeClass = function(name) {
+				var classes = this.className.split(/\s+/);
+				var idx = -1;
+				for (var k = 0; k < classes.length; k++) {
+					if (classes[k] == name) { idx = k; k = classes.length; }
+				}
+				if (idx > -1) {
+					classes.splice( idx, 1 );
+					this.className = classes.join(' ');
+				}
+				return this;
+			};
+			thingy.hasClass = function(name) {
+				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
+			};
+		}
+		return thingy;
+	},
+	
+	setMoviePath: function(path) {
+		// set path to ZeroClipboard.swf
+		this.moviePath = path;
+	},
+	
+	dispatch: function(id, eventName, args) {
+		// receive event from flash movie, send to client		
+		var client = this.clients[id];
+		if (client) {
+			client.receiveEvent(eventName, args);
+		}
+	},
+	
+	register: function(id, client) {
+		// register new client to receive events
+		this.clients[id] = client;
+	},
+	
+	getDOMObjectPosition: function(obj, stopObj) {
+		// get absolute coordinates for dom element
+		var info = {
+			left: 0, 
+			top: 0, 
+			width: obj.width ? obj.width : obj.offsetWidth, 
+			height: obj.height ? obj.height : obj.offsetHeight
+		};
+
+		while (obj && (obj != stopObj)) {
+			info.left += obj.offsetLeft;
+			info.top += obj.offsetTop;
+			obj = obj.offsetParent;
+		}
+
+		return info;
+	},
+	
+	Client: function(elem) {
+		// constructor for new simple upload client
+		this.handlers = {};
+		
+		// unique ID
+		this.id = ZeroClipboard.nextId++;
+		this.movieId = 'ZeroClipboardMovie_' + this.id;
+		
+		// register client with singleton to receive flash events
+		ZeroClipboard.register(this.id, this);
+		
+		// create movie
+		if (elem) this.glue(elem);
+	}
+};
+
+ZeroClipboard.Client.prototype = {
+	
+	id: 0, // unique ID for us
+	ready: false, // whether movie is ready to receive events or not
+	movie: null, // reference to movie object
+	clipText: '', // text to copy to clipboard
+	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
+	cssEffects: true, // enable CSS mouse effects on dom container
+	handlers: null, // user event handlers
+	
+	glue: function(elem, appendElem, stylesToAdd) {
+		// glue to DOM element
+		// elem can be ID or actual DOM element object
+		this.domElement = ZeroClipboard.$(elem);
+		
+		// float just above object, or zIndex 99 if dom element isn't set
+		var zIndex = 99;
+		if (this.domElement.style.zIndex) {
+			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
+		}
+		
+		if (typeof(appendElem) == 'string') {
+			appendElem = ZeroClipboard.$(appendElem);
+		}
+		else if (typeof(appendElem) == 'undefined') {
+			appendElem = document.getElementsByTagName('body')[0];
+		}
+		
+		// find X/Y position of domElement
+		var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);
+		
+		// create floating DIV above element
+		this.div = document.createElement('div');
+		var style = this.div.style;
+		style.position = 'absolute';
+		style.left = '' + box.left + 'px';
+		style.top = '' + box.top + 'px';
+		style.width = '' + box.width + 'px';
+		style.height = '' + box.height + 'px';
+		style.zIndex = zIndex;
+		
+		if (typeof(stylesToAdd) == 'object') {
+			for (addedStyle in stylesToAdd) {
+				style[addedStyle] = stylesToAdd[addedStyle];
+			}
+		}
+		
+		// style.backgroundColor = '#f00'; // debug
+		
+		appendElem.appendChild(this.div);
+		
+		this.div.innerHTML = this.getHTML( box.width, box.height );
+	},
+	
+	getHTML: function(width, height) {
+		// return HTML for movie
+		var html = '';
+		var flashvars = 'id=' + this.id + 
+			'&width=' + width + 
+			'&height=' + height;
+			
+		if (navigator.userAgent.match(/MSIE/)) {
+			// IE gets an OBJECT tag
+			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
+			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><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+'"/><param name="wmode" value="transparent"/></object>';
+		}
+		else {
+			// all other browsers get an EMBED tag
+			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
+		}
+		return html;
+	},
+	
+	hide: function() {
+		// temporarily hide floater offscreen
+		if (this.div) {
+			this.div.style.left = '-2000px';
+		}
+	},
+	
+	show: function() {
+		// show ourselves after a call to hide()
+		this.reposition();
+	},
+	
+	destroy: function() {
+		// destroy control and floater
+		if (this.domElement && this.div) {
+			this.hide();
+			this.div.innerHTML = '';
+			
+			var body = document.getElementsByTagName('body')[0];
+			try { body.removeChild( this.div ); } catch(e) {;}
+			
+			this.domElement = null;
+			this.div = null;
+		}
+	},
+	
+	reposition: function(elem) {
+		// reposition our floating div, optionally to new container
+		// warning: container CANNOT change size, only position
+		if (elem) {
+			this.domElement = ZeroClipboard.$(elem);
+			if (!this.domElement) this.hide();
+		}
+		
+		if (this.domElement && this.div) {
+			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
+			var style = this.div.style;
+			style.left = '' + box.left + 'px';
+			style.top = '' + box.top + 'px';
+		}
+	},
+	
+	setText: function(newText) {
+		// set text to be copied to clipboard
+		this.clipText = newText;
+		if (this.ready) this.movie.setText(newText);
+	},
+	
+	addEventListener: function(eventName, func) {
+		// add user event listener for event
+		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
+		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+		if (!this.handlers[eventName]) this.handlers[eventName] = [];
+		this.handlers[eventName].push(func);
+	},
+	
+	setHandCursor: function(enabled) {
+		// enable hand cursor (true), or default arrow cursor (false)
+		this.handCursorEnabled = enabled;
+		if (this.ready) this.movie.setHandCursor(enabled);
+	},
+	
+	setCSSEffects: function(enabled) {
+		// enable or disable CSS effects on DOM container
+		this.cssEffects = !!enabled;
+	},
+	
+	receiveEvent: function(eventName, args) {
+		// receive event from flash
+		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+				
+		// special behavior for certain events
+		switch (eventName) {
+			case 'load':
+				// movie claims it is ready, but in IE this isn't always the case...
+				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
+				this.movie = document.getElementById(this.movieId);
+				if (!this.movie) {
+					var self = this;
+					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
+					return;
+				}
+				
+				// firefox on pc needs a "kick" in order to set these in certain cases
+				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
+					var self = this;
+					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
+					this.ready = true;
+					return;
+				}
+				
+				this.ready = true;
+				this.movie.setText( this.clipText );
+				this.movie.setHandCursor( this.handCursorEnabled );
+				break;
+			
+			case 'mouseover':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.addClass('hover');
+					if (this.recoverActive) this.domElement.addClass('active');
+				}
+				break;
+			
+			case 'mouseout':
+				if (this.domElement && this.cssEffects) {
+					this.recoverActive = false;
+					if (this.domElement.hasClass('active')) {
+						this.domElement.removeClass('active');
+						this.recoverActive = true;
+					}
+					this.domElement.removeClass('hover');
+				}
+				break;
+			
+			case 'mousedown':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.addClass('active');
+				}
+				break;
+			
+			case 'mouseup':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.removeClass('active');
+					this.recoverActive = false;
+				}
+				break;
+		} // switch eventName
+		
+		if (this.handlers[eventName]) {
+			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
+				var func = this.handlers[eventName][idx];
+			
+				if (typeof(func) == 'function') {
+					// actual function reference
+					func(this, args);
+				}
+				else if ((typeof(func) == 'object') && (func.length == 2)) {
+					// PHP style object + method, i.e. [myObject, 'myMethod']
+					func[0][ func[1] ](this, args);
+				}
+				else if (typeof(func) == 'string') {
+					// name of function
+					window[func](this, args);
+				}
+			} // foreach event handler defined
+		} // user defined handler for event
+	}
+	
+};
Binary file web/static/ldt/swf/ZeroClipboard10.swf has changed