danielebarchiesi@0
|
1 /*
|
danielebarchiesi@0
|
2 * IMCE Integration by URL
|
danielebarchiesi@0
|
3 * Ex-1: http://example.com/imce?app=XEditor|url@urlFieldId|width@widthFieldId|height@heightFieldId
|
danielebarchiesi@0
|
4 * Creates "Insert file" operation tab, which fills the specified fields with url, width, height properties
|
danielebarchiesi@0
|
5 * of the selected file in the parent window
|
danielebarchiesi@0
|
6 * Ex-2: http://example.com/imce?app=XEditor|sendto@functionName
|
danielebarchiesi@0
|
7 * "Insert file" operation calls parent window's functionName(file, imceWindow)
|
danielebarchiesi@0
|
8 * Ex-3: http://example.com/imce?app=XEditor|imceload@functionName
|
danielebarchiesi@0
|
9 * Parent window's functionName(imceWindow) is called as soon as IMCE UI is ready. Send to operation
|
danielebarchiesi@0
|
10 * needs to be set manually. See imce.setSendTo() method in imce.js
|
danielebarchiesi@0
|
11 */
|
danielebarchiesi@0
|
12
|
danielebarchiesi@0
|
13 (function($) {
|
danielebarchiesi@0
|
14
|
danielebarchiesi@0
|
15 var appFields = {}, appWindow = (top.appiFrm||window).opener || parent;
|
danielebarchiesi@0
|
16
|
danielebarchiesi@0
|
17 // Execute when imce loads.
|
danielebarchiesi@0
|
18 imce.hooks.load.push(function(win) {
|
danielebarchiesi@0
|
19 var index = location.href.lastIndexOf('app=');
|
danielebarchiesi@0
|
20 if (index == -1) return;
|
danielebarchiesi@0
|
21 var data = decodeURIComponent(location.href.substr(index + 4)).split('|');
|
danielebarchiesi@0
|
22 var arr, prop, str, func, appName = data.shift();
|
danielebarchiesi@0
|
23 // Extract fields
|
danielebarchiesi@0
|
24 for (var i = 0, len = data.length; i < len; i++) {
|
danielebarchiesi@0
|
25 str = data[i];
|
danielebarchiesi@0
|
26 if (!str.length) continue;
|
danielebarchiesi@0
|
27 if (str.indexOf('&') != -1) str = str.split('&')[0];
|
danielebarchiesi@0
|
28 arr = str.split('@');
|
danielebarchiesi@0
|
29 if (arr.length > 1) {
|
danielebarchiesi@0
|
30 prop = arr.shift();
|
danielebarchiesi@0
|
31 appFields[prop] = arr.join('@');
|
danielebarchiesi@0
|
32 }
|
danielebarchiesi@0
|
33 }
|
danielebarchiesi@0
|
34 // Run custom onload function if available
|
danielebarchiesi@0
|
35 if (appFields.imceload && (func = isFunc(appFields.imceload))) {
|
danielebarchiesi@0
|
36 func(win);
|
danielebarchiesi@0
|
37 delete appFields.imceload;
|
danielebarchiesi@0
|
38 }
|
danielebarchiesi@0
|
39 // Set custom sendto function. appFinish is the default.
|
danielebarchiesi@0
|
40 var sendtoFunc = appFields.url ? appFinish : false;
|
danielebarchiesi@0
|
41 //check sendto@funcName syntax in URL
|
danielebarchiesi@0
|
42 if (appFields.sendto && (func = isFunc(appFields.sendto))) {
|
danielebarchiesi@0
|
43 sendtoFunc = func;
|
danielebarchiesi@0
|
44 delete appFields.sendto;
|
danielebarchiesi@0
|
45 }
|
danielebarchiesi@0
|
46 // Check old method windowname+ImceFinish.
|
danielebarchiesi@0
|
47 else if (win.name && (func = isFunc(win.name +'ImceFinish'))) {
|
danielebarchiesi@0
|
48 sendtoFunc = func;
|
danielebarchiesi@0
|
49 }
|
danielebarchiesi@0
|
50 // Highlight file
|
danielebarchiesi@0
|
51 if (appFields.url) {
|
danielebarchiesi@0
|
52 // Support multiple url fields url@field1,field2..
|
danielebarchiesi@0
|
53 if (appFields.url.indexOf(',') > -1) {
|
danielebarchiesi@0
|
54 var arr = appFields.url.split(',');
|
danielebarchiesi@0
|
55 for (var i in arr) {
|
danielebarchiesi@0
|
56 if ($('#'+ arr[i], appWindow.document).size()) {
|
danielebarchiesi@0
|
57 appFields.url = arr[i];
|
danielebarchiesi@0
|
58 break;
|
danielebarchiesi@0
|
59 }
|
danielebarchiesi@0
|
60 }
|
danielebarchiesi@0
|
61 }
|
danielebarchiesi@0
|
62 var filename = $('#'+ appFields.url, appWindow.document).val() || '';
|
danielebarchiesi@0
|
63 imce.highlight(filename.substr(filename.lastIndexOf('/')+1));
|
danielebarchiesi@0
|
64 }
|
danielebarchiesi@0
|
65 // Set send to
|
danielebarchiesi@0
|
66 sendtoFunc && imce.setSendTo(Drupal.t('Insert file'), sendtoFunc);
|
danielebarchiesi@0
|
67 });
|
danielebarchiesi@0
|
68
|
danielebarchiesi@0
|
69 // Default sendTo function
|
danielebarchiesi@0
|
70 var appFinish = function(file, win) {
|
danielebarchiesi@0
|
71 var $doc = $(appWindow.document);
|
danielebarchiesi@0
|
72 for (var i in appFields) {
|
danielebarchiesi@0
|
73 $doc.find('#'+ appFields[i]).val(file[i]);
|
danielebarchiesi@0
|
74 }
|
danielebarchiesi@0
|
75 if (appFields.url) {
|
danielebarchiesi@0
|
76 try{
|
danielebarchiesi@0
|
77 $doc.find('#'+ appFields.url).blur().change().focus();
|
danielebarchiesi@0
|
78 }catch(e){
|
danielebarchiesi@0
|
79 try{
|
danielebarchiesi@0
|
80 $doc.find('#'+ appFields.url).trigger('onblur').trigger('onchange').trigger('onfocus');//inline events for IE
|
danielebarchiesi@0
|
81 }catch(e){}
|
danielebarchiesi@0
|
82 }
|
danielebarchiesi@0
|
83 }
|
danielebarchiesi@0
|
84 appWindow.focus();
|
danielebarchiesi@0
|
85 win.close();
|
danielebarchiesi@0
|
86 };
|
danielebarchiesi@0
|
87
|
danielebarchiesi@0
|
88 // Checks if a string is a function name in the given scope.
|
danielebarchiesi@0
|
89 // Returns function reference. Supports x.y.z notation.
|
danielebarchiesi@0
|
90 var isFunc = function(str, scope) {
|
danielebarchiesi@0
|
91 var obj = scope || appWindow;
|
danielebarchiesi@0
|
92 var parts = str.split('.'), len = parts.length;
|
danielebarchiesi@0
|
93 for (var i = 0; i < len && (obj = obj[parts[i]]); i++);
|
danielebarchiesi@0
|
94 return obj && i == len && (typeof obj == 'function' || typeof obj != 'string' && !obj.nodeName && obj.constructor != Array && /^[\s[]?function/.test(obj.toString())) ? obj : false;
|
danielebarchiesi@0
|
95 }
|
danielebarchiesi@0
|
96
|
danielebarchiesi@0
|
97 })(jQuery); |