Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / lib / jquery.zclip.js @ 3b463c5a

History | View | Annotate | Download (16.3 kB)

1 35584d80 Kostas Papadimitriou
/*
2 35584d80 Kostas Papadimitriou
 * zClip :: jQuery ZeroClipboard v1.1.1
3 35584d80 Kostas Papadimitriou
 * http://steamdev.com/zclip
4 35584d80 Kostas Papadimitriou
 *
5 35584d80 Kostas Papadimitriou
 * Copyright 2011, SteamDev
6 35584d80 Kostas Papadimitriou
 * Released under the MIT license.
7 35584d80 Kostas Papadimitriou
 * http://www.opensource.org/licenses/mit-license.php
8 35584d80 Kostas Papadimitriou
 *
9 35584d80 Kostas Papadimitriou
 * Date: Wed Jun 01, 2011
10 35584d80 Kostas Papadimitriou
 */
11 35584d80 Kostas Papadimitriou
12 35584d80 Kostas Papadimitriou
13 35584d80 Kostas Papadimitriou
(function ($) {
14 35584d80 Kostas Papadimitriou
15 35584d80 Kostas Papadimitriou
    $.fn.zclip = function (params) {
16 35584d80 Kostas Papadimitriou
17 35584d80 Kostas Papadimitriou
        if (typeof params == "object" && !params.length) {
18 35584d80 Kostas Papadimitriou
19 35584d80 Kostas Papadimitriou
            var settings = $.extend({
20 35584d80 Kostas Papadimitriou
21 35584d80 Kostas Papadimitriou
                path: 'ZeroClipboard.swf',
22 35584d80 Kostas Papadimitriou
                copy: null,
23 35584d80 Kostas Papadimitriou
                beforeCopy: null,
24 35584d80 Kostas Papadimitriou
                afterCopy: null,
25 35584d80 Kostas Papadimitriou
                clickAfter: true,
26 35584d80 Kostas Papadimitriou
                setHandCursor: true,
27 35584d80 Kostas Papadimitriou
                setCSSEffects: true
28 35584d80 Kostas Papadimitriou
29 35584d80 Kostas Papadimitriou
            }, params);
30 35584d80 Kostas Papadimitriou
                        
31 35584d80 Kostas Papadimitriou
32 35584d80 Kostas Papadimitriou
            return this.each(function () {
33 35584d80 Kostas Papadimitriou
34 35584d80 Kostas Papadimitriou
                var o = $(this);
35 35584d80 Kostas Papadimitriou
36 35584d80 Kostas Papadimitriou
                if (o.is(':visible') && (typeof settings.copy == 'string' || $.isFunction(settings.copy))) {
37 35584d80 Kostas Papadimitriou
                    ZeroClipboard.setMoviePath(settings.path);
38 35584d80 Kostas Papadimitriou
                    var clip = new ZeroClipboard.Client();
39 35584d80 Kostas Papadimitriou
                    
40 35584d80 Kostas Papadimitriou
                    if($.isFunction(settings.copy)){
41 35584d80 Kostas Papadimitriou
                            o.bind('zClip_copy',settings.copy);
42 35584d80 Kostas Papadimitriou
                    }
43 35584d80 Kostas Papadimitriou
                    if($.isFunction(settings.beforeCopy)){
44 35584d80 Kostas Papadimitriou
                            o.bind('zClip_beforeCopy',settings.beforeCopy);
45 35584d80 Kostas Papadimitriou
                    }
46 35584d80 Kostas Papadimitriou
                    if($.isFunction(settings.afterCopy)){
47 35584d80 Kostas Papadimitriou
                            o.bind('zClip_afterCopy',settings.afterCopy);
48 35584d80 Kostas Papadimitriou
                    }                    
49 35584d80 Kostas Papadimitriou
50 35584d80 Kostas Papadimitriou
                    clip.setHandCursor(settings.setHandCursor);
51 35584d80 Kostas Papadimitriou
                    clip.setCSSEffects(settings.setCSSEffects);
52 35584d80 Kostas Papadimitriou
                    clip.addEventListener('mouseOver', function (client) {
53 35584d80 Kostas Papadimitriou
                        o.trigger('mouseenter');
54 35584d80 Kostas Papadimitriou
                    });
55 35584d80 Kostas Papadimitriou
                    clip.addEventListener('mouseOut', function (client) {
56 35584d80 Kostas Papadimitriou
                        o.trigger('mouseleave');
57 35584d80 Kostas Papadimitriou
                    });
58 35584d80 Kostas Papadimitriou
                    clip.addEventListener('mouseDown', function (client) {
59 35584d80 Kostas Papadimitriou
60 35584d80 Kostas Papadimitriou
                        o.trigger('mousedown');
61 35584d80 Kostas Papadimitriou
                        
62 35584d80 Kostas Papadimitriou
                        if(!$.isFunction(settings.copy)){
63 35584d80 Kostas Papadimitriou
                           clip.setText(settings.copy);
64 35584d80 Kostas Papadimitriou
                        } else {
65 35584d80 Kostas Papadimitriou
                           clip.setText(o.triggerHandler('zClip_copy'));
66 35584d80 Kostas Papadimitriou
                        }                        
67 35584d80 Kostas Papadimitriou
                        
68 35584d80 Kostas Papadimitriou
                        if ($.isFunction(settings.beforeCopy)) {
69 35584d80 Kostas Papadimitriou
                            o.trigger('zClip_beforeCopy');                            
70 35584d80 Kostas Papadimitriou
                        }
71 35584d80 Kostas Papadimitriou
72 35584d80 Kostas Papadimitriou
                    });
73 35584d80 Kostas Papadimitriou
74 35584d80 Kostas Papadimitriou
                    clip.addEventListener('complete', function (client, text) {
75 35584d80 Kostas Papadimitriou
76 35584d80 Kostas Papadimitriou
                        if ($.isFunction(settings.afterCopy)) {
77 35584d80 Kostas Papadimitriou
                            
78 35584d80 Kostas Papadimitriou
                            o.trigger('zClip_afterCopy');
79 35584d80 Kostas Papadimitriou
80 35584d80 Kostas Papadimitriou
                        } else {
81 35584d80 Kostas Papadimitriou
                            if (text.length > 500) {
82 35584d80 Kostas Papadimitriou
                                text = text.substr(0, 500) + "...\n\n(" + (text.length - 500) + " characters not shown)";
83 35584d80 Kostas Papadimitriou
                            }
84 35584d80 Kostas Papadimitriou
                                                        
85 35584d80 Kostas Papadimitriou
                            o.removeClass('hover');
86 35584d80 Kostas Papadimitriou
                        }
87 35584d80 Kostas Papadimitriou
88 35584d80 Kostas Papadimitriou
                        if (settings.clickAfter) {
89 35584d80 Kostas Papadimitriou
                            o.trigger('click');
90 35584d80 Kostas Papadimitriou
                        }
91 35584d80 Kostas Papadimitriou
92 35584d80 Kostas Papadimitriou
                    });
93 35584d80 Kostas Papadimitriou
94 35584d80 Kostas Papadimitriou
                                        
95 35584d80 Kostas Papadimitriou
                    clip.glue(o[0], o.parent()[0]);
96 35584d80 Kostas Papadimitriou
                                        
97 35584d80 Kostas Papadimitriou
                    $(window).bind('load resize',function(){clip.reposition();});
98 35584d80 Kostas Papadimitriou
                                        
99 35584d80 Kostas Papadimitriou
100 35584d80 Kostas Papadimitriou
                }
101 35584d80 Kostas Papadimitriou
102 35584d80 Kostas Papadimitriou
            });
103 35584d80 Kostas Papadimitriou
104 35584d80 Kostas Papadimitriou
        } else if (typeof params == "string") {
105 35584d80 Kostas Papadimitriou
106 35584d80 Kostas Papadimitriou
            return this.each(function () {
107 35584d80 Kostas Papadimitriou
108 35584d80 Kostas Papadimitriou
                var o = $(this);
109 35584d80 Kostas Papadimitriou
110 35584d80 Kostas Papadimitriou
                params = params.toLowerCase();
111 35584d80 Kostas Papadimitriou
                var zclipId = o.data('zclipId');
112 35584d80 Kostas Papadimitriou
                var clipElm = $('#' + zclipId + '.zclip');
113 35584d80 Kostas Papadimitriou
114 35584d80 Kostas Papadimitriou
                if (params == "remove") {
115 35584d80 Kostas Papadimitriou
116 35584d80 Kostas Papadimitriou
                    clipElm.remove();
117 35584d80 Kostas Papadimitriou
                    o.removeClass('active hover');
118 35584d80 Kostas Papadimitriou
119 35584d80 Kostas Papadimitriou
                } else if (params == "hide") {
120 35584d80 Kostas Papadimitriou
121 35584d80 Kostas Papadimitriou
                    clipElm.hide();
122 35584d80 Kostas Papadimitriou
                    o.removeClass('active hover');
123 35584d80 Kostas Papadimitriou
124 35584d80 Kostas Papadimitriou
                } else if (params == "show") {
125 35584d80 Kostas Papadimitriou
126 35584d80 Kostas Papadimitriou
                    clipElm.show();
127 35584d80 Kostas Papadimitriou
128 35584d80 Kostas Papadimitriou
                }
129 35584d80 Kostas Papadimitriou
130 35584d80 Kostas Papadimitriou
            });
131 35584d80 Kostas Papadimitriou
132 35584d80 Kostas Papadimitriou
        }
133 35584d80 Kostas Papadimitriou
134 35584d80 Kostas Papadimitriou
    }        
135 35584d80 Kostas Papadimitriou
        
136 35584d80 Kostas Papadimitriou
        
137 35584d80 Kostas Papadimitriou
138 35584d80 Kostas Papadimitriou
})(jQuery);
139 35584d80 Kostas Papadimitriou
140 35584d80 Kostas Papadimitriou
141 35584d80 Kostas Papadimitriou
142 35584d80 Kostas Papadimitriou
143 35584d80 Kostas Papadimitriou
144 35584d80 Kostas Papadimitriou
145 35584d80 Kostas Papadimitriou
146 35584d80 Kostas Papadimitriou
// ZeroClipboard
147 35584d80 Kostas Papadimitriou
// Simple Set Clipboard System
148 35584d80 Kostas Papadimitriou
// Author: Joseph Huckaby
149 35584d80 Kostas Papadimitriou
var ZeroClipboard = {
150 35584d80 Kostas Papadimitriou
151 35584d80 Kostas Papadimitriou
    version: "1.0.7",
152 35584d80 Kostas Papadimitriou
    clients: {},
153 35584d80 Kostas Papadimitriou
    // registered upload clients on page, indexed by id
154 35584d80 Kostas Papadimitriou
    moviePath: 'ZeroClipboard.swf',
155 35584d80 Kostas Papadimitriou
    // URL to movie
156 35584d80 Kostas Papadimitriou
    nextId: 1,
157 35584d80 Kostas Papadimitriou
    // ID of next movie
158 35584d80 Kostas Papadimitriou
    $: function (thingy) {
159 35584d80 Kostas Papadimitriou
        // simple DOM lookup utility function
160 35584d80 Kostas Papadimitriou
        if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
161 35584d80 Kostas Papadimitriou
        if (!thingy.addClass) {
162 35584d80 Kostas Papadimitriou
            // extend element with a few useful methods
163 35584d80 Kostas Papadimitriou
            thingy.hide = function () {
164 35584d80 Kostas Papadimitriou
                this.style.display = 'none';
165 35584d80 Kostas Papadimitriou
            };
166 35584d80 Kostas Papadimitriou
            thingy.show = function () {
167 35584d80 Kostas Papadimitriou
                this.style.display = '';
168 35584d80 Kostas Papadimitriou
            };
169 35584d80 Kostas Papadimitriou
            thingy.addClass = function (name) {
170 35584d80 Kostas Papadimitriou
                this.removeClass(name);
171 35584d80 Kostas Papadimitriou
                this.className += ' ' + name;
172 35584d80 Kostas Papadimitriou
            };
173 35584d80 Kostas Papadimitriou
            thingy.removeClass = function (name) {
174 35584d80 Kostas Papadimitriou
                var classes = this.className.split(/\s+/);
175 35584d80 Kostas Papadimitriou
                var idx = -1;
176 35584d80 Kostas Papadimitriou
                for (var k = 0; k < classes.length; k++) {
177 35584d80 Kostas Papadimitriou
                    if (classes[k] == name) {
178 35584d80 Kostas Papadimitriou
                        idx = k;
179 35584d80 Kostas Papadimitriou
                        k = classes.length;
180 35584d80 Kostas Papadimitriou
                    }
181 35584d80 Kostas Papadimitriou
                }
182 35584d80 Kostas Papadimitriou
                if (idx > -1) {
183 35584d80 Kostas Papadimitriou
                    classes.splice(idx, 1);
184 35584d80 Kostas Papadimitriou
                    this.className = classes.join(' ');
185 35584d80 Kostas Papadimitriou
                }
186 35584d80 Kostas Papadimitriou
                return this;
187 35584d80 Kostas Papadimitriou
            };
188 35584d80 Kostas Papadimitriou
            thingy.hasClass = function (name) {
189 35584d80 Kostas Papadimitriou
                return !!this.className.match(new RegExp("\\s*" + name + "\\s*"));
190 35584d80 Kostas Papadimitriou
            };
191 35584d80 Kostas Papadimitriou
        }
192 35584d80 Kostas Papadimitriou
        return thingy;
193 35584d80 Kostas Papadimitriou
    },
194 35584d80 Kostas Papadimitriou
195 35584d80 Kostas Papadimitriou
    setMoviePath: function (path) {
196 35584d80 Kostas Papadimitriou
        // set path to ZeroClipboard.swf
197 35584d80 Kostas Papadimitriou
        this.moviePath = path;
198 35584d80 Kostas Papadimitriou
    },
199 35584d80 Kostas Papadimitriou
200 35584d80 Kostas Papadimitriou
    dispatch: function (id, eventName, args) {
201 35584d80 Kostas Papadimitriou
        // receive event from flash movie, send to client                
202 35584d80 Kostas Papadimitriou
        var client = this.clients[id];
203 35584d80 Kostas Papadimitriou
        if (client) {
204 35584d80 Kostas Papadimitriou
            client.receiveEvent(eventName, args);
205 35584d80 Kostas Papadimitriou
        }
206 35584d80 Kostas Papadimitriou
    },
207 35584d80 Kostas Papadimitriou
208 35584d80 Kostas Papadimitriou
    register: function (id, client) {
209 35584d80 Kostas Papadimitriou
        // register new client to receive events
210 35584d80 Kostas Papadimitriou
        this.clients[id] = client;
211 35584d80 Kostas Papadimitriou
    },
212 35584d80 Kostas Papadimitriou
213 35584d80 Kostas Papadimitriou
    getDOMObjectPosition: function (obj, stopObj) {
214 35584d80 Kostas Papadimitriou
        // get absolute coordinates for dom element
215 35584d80 Kostas Papadimitriou
        var info = {
216 35584d80 Kostas Papadimitriou
            left: 0,
217 35584d80 Kostas Papadimitriou
            top: 0,
218 35584d80 Kostas Papadimitriou
            width: obj.width ? obj.width : obj.offsetWidth,
219 35584d80 Kostas Papadimitriou
            height: obj.height ? obj.height : obj.offsetHeight
220 35584d80 Kostas Papadimitriou
        };
221 35584d80 Kostas Papadimitriou
222 35584d80 Kostas Papadimitriou
        if (obj && (obj != stopObj)) {
223 35584d80 Kostas Papadimitriou
                        info.left += obj.offsetLeft;
224 35584d80 Kostas Papadimitriou
            info.top += obj.offsetTop;
225 35584d80 Kostas Papadimitriou
        }
226 35584d80 Kostas Papadimitriou
227 35584d80 Kostas Papadimitriou
        return info;
228 35584d80 Kostas Papadimitriou
    },
229 35584d80 Kostas Papadimitriou
230 35584d80 Kostas Papadimitriou
    Client: function (elem) {
231 35584d80 Kostas Papadimitriou
        // constructor for new simple upload client
232 35584d80 Kostas Papadimitriou
        this.handlers = {};
233 35584d80 Kostas Papadimitriou
234 35584d80 Kostas Papadimitriou
        // unique ID
235 35584d80 Kostas Papadimitriou
        this.id = ZeroClipboard.nextId++;
236 35584d80 Kostas Papadimitriou
        this.movieId = 'ZeroClipboardMovie_' + this.id;
237 35584d80 Kostas Papadimitriou
238 35584d80 Kostas Papadimitriou
        // register client with singleton to receive flash events
239 35584d80 Kostas Papadimitriou
        ZeroClipboard.register(this.id, this);
240 35584d80 Kostas Papadimitriou
241 35584d80 Kostas Papadimitriou
        // create movie
242 35584d80 Kostas Papadimitriou
        if (elem) this.glue(elem);
243 35584d80 Kostas Papadimitriou
    }
244 35584d80 Kostas Papadimitriou
};
245 35584d80 Kostas Papadimitriou
246 35584d80 Kostas Papadimitriou
ZeroClipboard.Client.prototype = {
247 35584d80 Kostas Papadimitriou
248 35584d80 Kostas Papadimitriou
    id: 0,
249 35584d80 Kostas Papadimitriou
    // unique ID for us
250 35584d80 Kostas Papadimitriou
    ready: false,
251 35584d80 Kostas Papadimitriou
    // whether movie is ready to receive events or not
252 35584d80 Kostas Papadimitriou
    movie: null,
253 35584d80 Kostas Papadimitriou
    // reference to movie object
254 35584d80 Kostas Papadimitriou
    clipText: '',
255 35584d80 Kostas Papadimitriou
    // text to copy to clipboard
256 35584d80 Kostas Papadimitriou
    handCursorEnabled: true,
257 35584d80 Kostas Papadimitriou
    // whether to show hand cursor, or default pointer cursor
258 35584d80 Kostas Papadimitriou
    cssEffects: true,
259 35584d80 Kostas Papadimitriou
    // enable CSS mouse effects on dom container
260 35584d80 Kostas Papadimitriou
    handlers: null,
261 35584d80 Kostas Papadimitriou
    // user event handlers
262 35584d80 Kostas Papadimitriou
    glue: function (elem, appendElem, stylesToAdd) {
263 35584d80 Kostas Papadimitriou
        // glue to DOM element
264 35584d80 Kostas Papadimitriou
        // elem can be ID or actual DOM element object
265 35584d80 Kostas Papadimitriou
        this.domElement = ZeroClipboard.$(elem);
266 35584d80 Kostas Papadimitriou
267 35584d80 Kostas Papadimitriou
        // float just above object, or zIndex 99 if dom element isn't set
268 35584d80 Kostas Papadimitriou
        var zIndex = 99;
269 35584d80 Kostas Papadimitriou
        if (this.domElement.style.zIndex) {
270 35584d80 Kostas Papadimitriou
            zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
271 35584d80 Kostas Papadimitriou
        }
272 35584d80 Kostas Papadimitriou
273 35584d80 Kostas Papadimitriou
        if (typeof(appendElem) == 'string') {
274 35584d80 Kostas Papadimitriou
            appendElem = ZeroClipboard.$(appendElem);
275 35584d80 Kostas Papadimitriou
        } else if (typeof(appendElem) == 'undefined') {
276 35584d80 Kostas Papadimitriou
            appendElem = document.getElementsByTagName('body')[0];
277 35584d80 Kostas Papadimitriou
        }
278 35584d80 Kostas Papadimitriou
279 35584d80 Kostas Papadimitriou
        // find X/Y position of domElement
280 35584d80 Kostas Papadimitriou
        var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);
281 35584d80 Kostas Papadimitriou
282 35584d80 Kostas Papadimitriou
        // create floating DIV above element
283 35584d80 Kostas Papadimitriou
        this.div = document.createElement('div');
284 35584d80 Kostas Papadimitriou
        this.div.className = "zclip";
285 35584d80 Kostas Papadimitriou
        this.div.id = "zclip-" + this.movieId;
286 35584d80 Kostas Papadimitriou
        $(this.domElement).data('zclipId', 'zclip-' + this.movieId);
287 35584d80 Kostas Papadimitriou
        var style = this.div.style;
288 35584d80 Kostas Papadimitriou
        style.position = 'absolute';
289 35584d80 Kostas Papadimitriou
        style.left = '' + box.left + 'px';
290 35584d80 Kostas Papadimitriou
        style.top = '' + box.top + 'px';
291 35584d80 Kostas Papadimitriou
        style.width = '' + box.width + 'px';
292 35584d80 Kostas Papadimitriou
        style.height = '' + box.height + 'px';
293 35584d80 Kostas Papadimitriou
        style.zIndex = zIndex;
294 35584d80 Kostas Papadimitriou
295 35584d80 Kostas Papadimitriou
        if (typeof(stylesToAdd) == 'object') {
296 35584d80 Kostas Papadimitriou
            for (addedStyle in stylesToAdd) {
297 35584d80 Kostas Papadimitriou
                style[addedStyle] = stylesToAdd[addedStyle];
298 35584d80 Kostas Papadimitriou
            }
299 35584d80 Kostas Papadimitriou
        }
300 35584d80 Kostas Papadimitriou
301 35584d80 Kostas Papadimitriou
        // style.backgroundColor = '#f00'; // debug
302 35584d80 Kostas Papadimitriou
        appendElem.appendChild(this.div);
303 35584d80 Kostas Papadimitriou
304 35584d80 Kostas Papadimitriou
        this.div.innerHTML = this.getHTML(box.width, box.height);
305 35584d80 Kostas Papadimitriou
    },
306 35584d80 Kostas Papadimitriou
307 35584d80 Kostas Papadimitriou
    getHTML: function (width, height) {
308 35584d80 Kostas Papadimitriou
        // return HTML for movie
309 35584d80 Kostas Papadimitriou
        var html = '';
310 35584d80 Kostas Papadimitriou
        var flashvars = 'id=' + this.id + '&width=' + width + '&height=' + height;
311 35584d80 Kostas Papadimitriou
312 35584d80 Kostas Papadimitriou
        if (navigator.userAgent.match(/MSIE/)) {
313 35584d80 Kostas Papadimitriou
            // IE gets an OBJECT tag
314 35584d80 Kostas Papadimitriou
            var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
315 35584d80 Kostas Papadimitriou
            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>';
316 35584d80 Kostas Papadimitriou
        } else {
317 35584d80 Kostas Papadimitriou
            // all other browsers get an EMBED tag
318 35584d80 Kostas Papadimitriou
            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" />';
319 35584d80 Kostas Papadimitriou
        }
320 35584d80 Kostas Papadimitriou
        return html;
321 35584d80 Kostas Papadimitriou
    },
322 35584d80 Kostas Papadimitriou
323 35584d80 Kostas Papadimitriou
    hide: function () {
324 35584d80 Kostas Papadimitriou
        // temporarily hide floater offscreen
325 35584d80 Kostas Papadimitriou
        if (this.div) {
326 35584d80 Kostas Papadimitriou
            this.div.style.left = '-2000px';
327 35584d80 Kostas Papadimitriou
        }
328 35584d80 Kostas Papadimitriou
    },
329 35584d80 Kostas Papadimitriou
330 35584d80 Kostas Papadimitriou
    show: function () {
331 35584d80 Kostas Papadimitriou
        // show ourselves after a call to hide()
332 35584d80 Kostas Papadimitriou
        this.reposition();
333 35584d80 Kostas Papadimitriou
    },
334 35584d80 Kostas Papadimitriou
335 35584d80 Kostas Papadimitriou
    destroy: function () {
336 35584d80 Kostas Papadimitriou
        // destroy control and floater
337 35584d80 Kostas Papadimitriou
        if (this.domElement && this.div) {
338 35584d80 Kostas Papadimitriou
            this.hide();
339 35584d80 Kostas Papadimitriou
            this.div.innerHTML = '';
340 35584d80 Kostas Papadimitriou
341 35584d80 Kostas Papadimitriou
            var body = document.getElementsByTagName('body')[0];
342 35584d80 Kostas Papadimitriou
            try {
343 35584d80 Kostas Papadimitriou
                body.removeChild(this.div);
344 35584d80 Kostas Papadimitriou
            } catch (e) {;
345 35584d80 Kostas Papadimitriou
            }
346 35584d80 Kostas Papadimitriou
347 35584d80 Kostas Papadimitriou
            this.domElement = null;
348 35584d80 Kostas Papadimitriou
            this.div = null;
349 35584d80 Kostas Papadimitriou
        }
350 35584d80 Kostas Papadimitriou
    },
351 35584d80 Kostas Papadimitriou
352 35584d80 Kostas Papadimitriou
    reposition: function (elem) {
353 35584d80 Kostas Papadimitriou
        // reposition our floating div, optionally to new container
354 35584d80 Kostas Papadimitriou
        // warning: container CANNOT change size, only position
355 35584d80 Kostas Papadimitriou
        if (elem) {
356 35584d80 Kostas Papadimitriou
            this.domElement = ZeroClipboard.$(elem);
357 35584d80 Kostas Papadimitriou
            if (!this.domElement) this.hide();
358 35584d80 Kostas Papadimitriou
        }
359 35584d80 Kostas Papadimitriou
360 35584d80 Kostas Papadimitriou
        if (this.domElement && this.div) {
361 35584d80 Kostas Papadimitriou
            var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
362 35584d80 Kostas Papadimitriou
            var style = this.div.style;
363 35584d80 Kostas Papadimitriou
            style.left = '' + box.left + 'px';
364 35584d80 Kostas Papadimitriou
            style.top = '' + box.top + 'px';
365 35584d80 Kostas Papadimitriou
        }
366 35584d80 Kostas Papadimitriou
    },
367 35584d80 Kostas Papadimitriou
368 35584d80 Kostas Papadimitriou
    setText: function (newText) {
369 35584d80 Kostas Papadimitriou
        // set text to be copied to clipboard
370 35584d80 Kostas Papadimitriou
        this.clipText = newText;
371 35584d80 Kostas Papadimitriou
        if (this.ready) {
372 35584d80 Kostas Papadimitriou
            this.movie.setText(newText);
373 35584d80 Kostas Papadimitriou
        }
374 35584d80 Kostas Papadimitriou
    },
375 35584d80 Kostas Papadimitriou
376 35584d80 Kostas Papadimitriou
    addEventListener: function (eventName, func) {
377 35584d80 Kostas Papadimitriou
        // add user event listener for event
378 35584d80 Kostas Papadimitriou
        // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
379 35584d80 Kostas Papadimitriou
        eventName = eventName.toString().toLowerCase().replace(/^on/, '');
380 35584d80 Kostas Papadimitriou
        if (!this.handlers[eventName]) {
381 35584d80 Kostas Papadimitriou
            this.handlers[eventName] = [];
382 35584d80 Kostas Papadimitriou
        }
383 35584d80 Kostas Papadimitriou
        this.handlers[eventName].push(func);
384 35584d80 Kostas Papadimitriou
    },
385 35584d80 Kostas Papadimitriou
386 35584d80 Kostas Papadimitriou
    setHandCursor: function (enabled) {
387 35584d80 Kostas Papadimitriou
        // enable hand cursor (true), or default arrow cursor (false)
388 35584d80 Kostas Papadimitriou
        this.handCursorEnabled = enabled;
389 35584d80 Kostas Papadimitriou
        if (this.ready) {
390 35584d80 Kostas Papadimitriou
            this.movie.setHandCursor(enabled);
391 35584d80 Kostas Papadimitriou
        }
392 35584d80 Kostas Papadimitriou
    },
393 35584d80 Kostas Papadimitriou
394 35584d80 Kostas Papadimitriou
    setCSSEffects: function (enabled) {
395 35584d80 Kostas Papadimitriou
        // enable or disable CSS effects on DOM container
396 35584d80 Kostas Papadimitriou
        this.cssEffects = !! enabled;
397 35584d80 Kostas Papadimitriou
    },
398 35584d80 Kostas Papadimitriou
399 35584d80 Kostas Papadimitriou
    receiveEvent: function (eventName, args) {
400 35584d80 Kostas Papadimitriou
        // receive event from flash
401 35584d80 Kostas Papadimitriou
        eventName = eventName.toString().toLowerCase().replace(/^on/, '');
402 35584d80 Kostas Papadimitriou
403 35584d80 Kostas Papadimitriou
        // special behavior for certain events
404 35584d80 Kostas Papadimitriou
        switch (eventName) {
405 35584d80 Kostas Papadimitriou
        case 'load':
406 35584d80 Kostas Papadimitriou
            // movie claims it is ready, but in IE this isn't always the case...
407 35584d80 Kostas Papadimitriou
            // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
408 35584d80 Kostas Papadimitriou
            this.movie = document.getElementById(this.movieId);
409 35584d80 Kostas Papadimitriou
            if (!this.movie) {
410 35584d80 Kostas Papadimitriou
                var self = this;
411 35584d80 Kostas Papadimitriou
                setTimeout(function () {
412 35584d80 Kostas Papadimitriou
                    self.receiveEvent('load', null);
413 35584d80 Kostas Papadimitriou
                }, 1);
414 35584d80 Kostas Papadimitriou
                return;
415 35584d80 Kostas Papadimitriou
            }
416 35584d80 Kostas Papadimitriou
417 35584d80 Kostas Papadimitriou
            // firefox on pc needs a "kick" in order to set these in certain cases
418 35584d80 Kostas Papadimitriou
            if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
419 35584d80 Kostas Papadimitriou
                var self = this;
420 35584d80 Kostas Papadimitriou
                setTimeout(function () {
421 35584d80 Kostas Papadimitriou
                    self.receiveEvent('load', null);
422 35584d80 Kostas Papadimitriou
                }, 100);
423 35584d80 Kostas Papadimitriou
                this.ready = true;
424 35584d80 Kostas Papadimitriou
                return;
425 35584d80 Kostas Papadimitriou
            }
426 35584d80 Kostas Papadimitriou
427 35584d80 Kostas Papadimitriou
            this.ready = true;
428 35584d80 Kostas Papadimitriou
            try {
429 35584d80 Kostas Papadimitriou
                this.movie.setText(this.clipText);
430 35584d80 Kostas Papadimitriou
            } catch (e) {}
431 35584d80 Kostas Papadimitriou
            try {
432 35584d80 Kostas Papadimitriou
                this.movie.setHandCursor(this.handCursorEnabled);
433 35584d80 Kostas Papadimitriou
            } catch (e) {}
434 35584d80 Kostas Papadimitriou
            break;
435 35584d80 Kostas Papadimitriou
436 35584d80 Kostas Papadimitriou
        case 'mouseover':
437 35584d80 Kostas Papadimitriou
            if (this.domElement && this.cssEffects) {
438 35584d80 Kostas Papadimitriou
                this.domElement.addClass('hover');
439 35584d80 Kostas Papadimitriou
                if (this.recoverActive) {
440 35584d80 Kostas Papadimitriou
                    this.domElement.addClass('active');
441 35584d80 Kostas Papadimitriou
                }
442 35584d80 Kostas Papadimitriou
443 35584d80 Kostas Papadimitriou
444 35584d80 Kostas Papadimitriou
            }
445 35584d80 Kostas Papadimitriou
446 35584d80 Kostas Papadimitriou
447 35584d80 Kostas Papadimitriou
            break;
448 35584d80 Kostas Papadimitriou
449 35584d80 Kostas Papadimitriou
        case 'mouseout':
450 35584d80 Kostas Papadimitriou
            if (this.domElement && this.cssEffects) {
451 35584d80 Kostas Papadimitriou
                this.recoverActive = false;
452 35584d80 Kostas Papadimitriou
                if (this.domElement.hasClass('active')) {
453 35584d80 Kostas Papadimitriou
                    this.domElement.removeClass('active');
454 35584d80 Kostas Papadimitriou
                    this.recoverActive = true;
455 35584d80 Kostas Papadimitriou
                }
456 35584d80 Kostas Papadimitriou
                this.domElement.removeClass('hover');
457 35584d80 Kostas Papadimitriou
458 35584d80 Kostas Papadimitriou
            }
459 35584d80 Kostas Papadimitriou
            break;
460 35584d80 Kostas Papadimitriou
461 35584d80 Kostas Papadimitriou
        case 'mousedown':
462 35584d80 Kostas Papadimitriou
            if (this.domElement && this.cssEffects) {
463 35584d80 Kostas Papadimitriou
                this.domElement.addClass('active');
464 35584d80 Kostas Papadimitriou
            }
465 35584d80 Kostas Papadimitriou
            break;
466 35584d80 Kostas Papadimitriou
467 35584d80 Kostas Papadimitriou
        case 'mouseup':
468 35584d80 Kostas Papadimitriou
            if (this.domElement && this.cssEffects) {
469 35584d80 Kostas Papadimitriou
                this.domElement.removeClass('active');
470 35584d80 Kostas Papadimitriou
                this.recoverActive = false;
471 35584d80 Kostas Papadimitriou
            }
472 35584d80 Kostas Papadimitriou
            break;
473 35584d80 Kostas Papadimitriou
        } // switch eventName
474 35584d80 Kostas Papadimitriou
        if (this.handlers[eventName]) {
475 35584d80 Kostas Papadimitriou
            for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
476 35584d80 Kostas Papadimitriou
                var func = this.handlers[eventName][idx];
477 35584d80 Kostas Papadimitriou
478 35584d80 Kostas Papadimitriou
                if (typeof(func) == 'function') {
479 35584d80 Kostas Papadimitriou
                    // actual function reference
480 35584d80 Kostas Papadimitriou
                    func(this, args);
481 35584d80 Kostas Papadimitriou
                } else if ((typeof(func) == 'object') && (func.length == 2)) {
482 35584d80 Kostas Papadimitriou
                    // PHP style object + method, i.e. [myObject, 'myMethod']
483 35584d80 Kostas Papadimitriou
                    func[0][func[1]](this, args);
484 35584d80 Kostas Papadimitriou
                } else if (typeof(func) == 'string') {
485 35584d80 Kostas Papadimitriou
                    // name of function
486 35584d80 Kostas Papadimitriou
                    window[func](this, args);
487 35584d80 Kostas Papadimitriou
                }
488 35584d80 Kostas Papadimitriou
            } // foreach event handler defined
489 35584d80 Kostas Papadimitriou
        } // user defined handler for event
490 35584d80 Kostas Papadimitriou
    }
491 35584d80 Kostas Papadimitriou
492 35584d80 Kostas Papadimitriou
};        
493 35584d80 Kostas Papadimitriou