danielebarchiesi@0: /* danielebarchiesi@0: * IMCE Integration by URL danielebarchiesi@0: * Ex-1: http://example.com/imce?app=XEditor|url@urlFieldId|width@widthFieldId|height@heightFieldId danielebarchiesi@0: * Creates "Insert file" operation tab, which fills the specified fields with url, width, height properties danielebarchiesi@0: * of the selected file in the parent window danielebarchiesi@0: * Ex-2: http://example.com/imce?app=XEditor|sendto@functionName danielebarchiesi@0: * "Insert file" operation calls parent window's functionName(file, imceWindow) danielebarchiesi@0: * Ex-3: http://example.com/imce?app=XEditor|imceload@functionName danielebarchiesi@0: * Parent window's functionName(imceWindow) is called as soon as IMCE UI is ready. Send to operation danielebarchiesi@0: * needs to be set manually. See imce.setSendTo() method in imce.js danielebarchiesi@0: */ danielebarchiesi@0: danielebarchiesi@0: (function($) { danielebarchiesi@0: danielebarchiesi@0: var appFields = {}, appWindow = (top.appiFrm||window).opener || parent; danielebarchiesi@0: danielebarchiesi@0: // Execute when imce loads. danielebarchiesi@0: imce.hooks.load.push(function(win) { danielebarchiesi@0: var index = location.href.lastIndexOf('app='); danielebarchiesi@0: if (index == -1) return; danielebarchiesi@0: var data = decodeURIComponent(location.href.substr(index + 4)).split('|'); danielebarchiesi@0: var arr, prop, str, func, appName = data.shift(); danielebarchiesi@0: // Extract fields danielebarchiesi@0: for (var i = 0, len = data.length; i < len; i++) { danielebarchiesi@0: str = data[i]; danielebarchiesi@0: if (!str.length) continue; danielebarchiesi@0: if (str.indexOf('&') != -1) str = str.split('&')[0]; danielebarchiesi@0: arr = str.split('@'); danielebarchiesi@0: if (arr.length > 1) { danielebarchiesi@0: prop = arr.shift(); danielebarchiesi@0: appFields[prop] = arr.join('@'); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: // Run custom onload function if available danielebarchiesi@0: if (appFields.imceload && (func = isFunc(appFields.imceload))) { danielebarchiesi@0: func(win); danielebarchiesi@0: delete appFields.imceload; danielebarchiesi@0: } danielebarchiesi@0: // Set custom sendto function. appFinish is the default. danielebarchiesi@0: var sendtoFunc = appFields.url ? appFinish : false; danielebarchiesi@0: //check sendto@funcName syntax in URL danielebarchiesi@0: if (appFields.sendto && (func = isFunc(appFields.sendto))) { danielebarchiesi@0: sendtoFunc = func; danielebarchiesi@0: delete appFields.sendto; danielebarchiesi@0: } danielebarchiesi@0: // Check old method windowname+ImceFinish. danielebarchiesi@0: else if (win.name && (func = isFunc(win.name +'ImceFinish'))) { danielebarchiesi@0: sendtoFunc = func; danielebarchiesi@0: } danielebarchiesi@0: // Highlight file danielebarchiesi@0: if (appFields.url) { danielebarchiesi@0: // Support multiple url fields url@field1,field2.. danielebarchiesi@0: if (appFields.url.indexOf(',') > -1) { danielebarchiesi@0: var arr = appFields.url.split(','); danielebarchiesi@0: for (var i in arr) { danielebarchiesi@0: if ($('#'+ arr[i], appWindow.document).size()) { danielebarchiesi@0: appFields.url = arr[i]; danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: var filename = $('#'+ appFields.url, appWindow.document).val() || ''; danielebarchiesi@0: imce.highlight(filename.substr(filename.lastIndexOf('/')+1)); danielebarchiesi@0: } danielebarchiesi@0: // Set send to danielebarchiesi@0: sendtoFunc && imce.setSendTo(Drupal.t('Insert file'), sendtoFunc); danielebarchiesi@0: }); danielebarchiesi@0: danielebarchiesi@0: // Default sendTo function danielebarchiesi@0: var appFinish = function(file, win) { danielebarchiesi@0: var $doc = $(appWindow.document); danielebarchiesi@0: for (var i in appFields) { danielebarchiesi@0: $doc.find('#'+ appFields[i]).val(file[i]); danielebarchiesi@0: } danielebarchiesi@0: if (appFields.url) { danielebarchiesi@0: try{ danielebarchiesi@0: $doc.find('#'+ appFields.url).blur().change().focus(); danielebarchiesi@0: }catch(e){ danielebarchiesi@0: try{ danielebarchiesi@0: $doc.find('#'+ appFields.url).trigger('onblur').trigger('onchange').trigger('onfocus');//inline events for IE danielebarchiesi@0: }catch(e){} danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: appWindow.focus(); danielebarchiesi@0: win.close(); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: // Checks if a string is a function name in the given scope. danielebarchiesi@0: // Returns function reference. Supports x.y.z notation. danielebarchiesi@0: var isFunc = function(str, scope) { danielebarchiesi@0: var obj = scope || appWindow; danielebarchiesi@0: var parts = str.split('.'), len = parts.length; danielebarchiesi@0: for (var i = 0; i < len && (obj = obj[parts[i]]); i++); danielebarchiesi@0: return obj && i == len && (typeof obj == 'function' || typeof obj != 'string' && !obj.nodeName && obj.constructor != Array && /^[\s[]?function/.test(obj.toString())) ? obj : false; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: })(jQuery);