diff --git a/fields/__init__.py b/fields/__init__.py index e6914a8..428c2a4 100644 --- a/fields/__init__.py +++ b/fields/__init__.py @@ -621,7 +621,7 @@ class Field: res = copy.deepcopy(defaultFieldLayouts) return res - def getCss(self, layoutType, res): + def getCss(self, layoutType, res, config): '''This method completes the list p_res with the names of CSS files that are required for displaying widgets of self's type on a given p_layoutType. p_res is not a set because order of inclusion of CSS @@ -631,7 +631,7 @@ class Field: if fileName not in res: res.append(fileName) - def getJs(self, layoutType, res): + def getJs(self, layoutType, res, config): '''This method completes the list p_res with the names of Javascript files that are required for displaying widgets of self's type on a given p_layoutType. p_res is not a set because order of inclusion of diff --git a/fields/date.py b/fields/date.py index 522e2ab..03b7bc7 100644 --- a/fields/date.py +++ b/fields/date.py @@ -209,13 +209,13 @@ class Date(Field): historized, mapping, label, sdefault, scolspan, swidth, sheight, persist, view, xml) - def getCss(self, layoutType, res): - # CSS files are only required if the calendar must be shown. - if self.calendar: Field.getCss(self, layoutType, res) + def getCss(self, layoutType, res, config): + # CSS files are only required if the calendar must be shown + if self.calendar: Field.getCss(self, layoutType, res, config) - def getJs(self, layoutType, res): - # Javascript files are only required if the calendar must be shown. - if self.calendar: Field.getJs(self, layoutType, res) + def getJs(self, layoutType, res, config): + # Javascript files are only required if the calendar must be shown + if self.calendar: Field.getJs(self, layoutType, res, config) def getSelectableYears(self): '''Gets the list of years one may select for this field.''' diff --git a/fields/list.py b/fields/list.py index b709808..0ef5561 100644 --- a/fields/list.py +++ b/fields/list.py @@ -186,13 +186,13 @@ class List(Field): if value != None: return value return '' - def getCss(self, layoutType, res): - '''Gets the CSS required by sub-fields if any.''' + def getCss(self, layoutType, res, config): + '''Gets the CSS required by sub-fields if any''' for name, field in self.fields: - field.getCss(layoutType, res) + field.getCss(layoutType, res, config) - def getJs(self, layoutType, res): - '''Gets the JS required by sub-fields if any.''' + def getJs(self, layoutType, res, config): + '''Gets the JS required by sub-fields if any''' for name, field in self.fields: - field.getJs(layoutType, res) + field.getJs(layoutType, res, config) # ------------------------------------------------------------------------------ diff --git a/fields/string.py b/fields/string.py index 4651c82..6bba08c 100644 --- a/fields/string.py +++ b/fields/string.py @@ -69,9 +69,9 @@ class Selection: # ------------------------------------------------------------------------------ class String(Field): - # Javascript files sometimes required by this type - jsFiles = {'edit': ('ckeditor/ckeditor.js',), - 'view': ('ckeditor/ckeditor.js',)} + # Javascript files sometimes required by this type. Method String.getJs + # below determines when the files must be included. + cdnUrl = '//cdn.ckeditor.com/%s/%s/ckeditor.js' # Some predefined regular expressions that may be used as validators c = re.compile @@ -944,8 +944,11 @@ class String(Field): return 'XhtmlIndex' return Field.getIndexType(self) - def getJs(self, layoutType, res): - if self.format == String.XHTML: Field.getJs(self, layoutType, res) + def getJs(self, layoutType, res, config): + if (self.format == String.XHTML) and (layoutType in ('edit', 'view')): + # Compute the URL to ckeditor CDN + ckUrl = String.cdnUrl % (config.ckVersion, config.ckDistribution) + if ckUrl not in res: res.append(ckUrl) def getCaptchaChallenge(self, session): '''Returns a Captcha challenge in the form of a dict. At key "text", @@ -983,8 +986,10 @@ class String(Field): return 'en_US' def getCkParams(self, obj, language): - '''Gets the base params to set on a rich text field.''' - ckAttrs = {'toolbar': 'Appy', + '''Gets the base params to set on a rich text field''' + ckAttrs = {'customConfig': '/ui/ckeditor/config.js', + 'contentsCss': '/ui/ckeditor/contents.css', + 'stylesSet': '/ui/ckeditor/styles.js', 'toolbar': 'Appy', 'format_tags': ';'.join(self.styles), 'scayt_sLang': self.getCkLanguage(obj, language)} if self.width: ckAttrs['width'] = self.width diff --git a/gen/__init__.py b/gen/__init__.py index 1c64467..f8a8c0c 100644 --- a/gen/__init__.py +++ b/gen/__init__.py @@ -107,4 +107,15 @@ class Config: # user interface (CSS, Javascript and image files) is folder "ui" within # this app. uiFolders = ['ui'] + # CK editor configuration. Appy integrates CK editor via CDN (see + # http://cdn.ckeditor.com). Do not change "ckVersion" hereafter, excepted + # if you are sure that the customized configuration files config.js, + # contents.css and styles.js stored in appy/gen/ui/ckeditor will be + # compatible with the version you want to use. + ckVersion = '4.4.7' + # ckDistribution can be "basic", "standard", "standard-all", "full" or + # "full-all" (see doc in http://cdn.ckeditor.com). + ckDistribution = 'standard' + # CK toolbars are not configurable yet. So toolbar "Appy", defined in + # appy/gen/ui/ckeditor/config.js, will always be used. # ------------------------------------------------------------------------------ diff --git a/gen/mixins/__init__.py b/gen/mixins/__init__.py index 7f73715..1806794 100644 --- a/gen/mixins/__init__.py +++ b/gen/mixins/__init__.py @@ -784,28 +784,28 @@ class BaseMixin: '''Returns the fields sorted by group. If a dict is given in p_cssJs, we will add it in the css and js files required by the fields.''' res = [] - groups = {} # The already encountered groups. + groups = {} # The already encountered groups # If a dict is given in p_cssJs, we must fill it with the CSS and JS # files required for every returned field. collectCssJs = isinstance(cssJs, dict) css = js = None + config = self.getProductConfig(True) # If param "refresh" is there, we must reload the Python class refresh = ('refresh' in self.REQUEST) - if refresh: - klass = self.getClass(reloaded=True) + if refresh: klass = self.getClass(reloaded=True) for field in self.getAllAppyTypes(): if refresh: field = field.reload(klass, self) if field.page.name != pageName: continue if not field.isShowable(self, layoutType): continue if collectCssJs: if css == None: css = [] - field.getCss(layoutType, css) + field.getCss(layoutType, css, config) if js == None: js = [] - field.getJs(layoutType, js) + field.getJs(layoutType, js, config) if not field.group: res.append(field) else: - # Insert the UiGroup instance corresponding to field.group. + # Insert the UiGroup instance corresponding to field.group uiGroup = field.group.insertInto(res, groups, field.page, self.meta_type) uiGroup.addElement(field) @@ -858,9 +858,10 @@ class BaseMixin: # inclusion can be important, and this could be losed by using sets. css = [] js = [] + config = self.getProductConfig(True) for field in fields: - field.getCss(layoutType, css) - field.getJs(layoutType, js) + field.getCss(layoutType, css, config) + field.getJs(layoutType, js, config) res['css'] = css res['js'] = js diff --git a/gen/ui/ckeditor/AppyReadme b/gen/ui/ckeditor/AppyReadme deleted file mode 100644 index fa7b287..0000000 --- a/gen/ui/ckeditor/AppyReadme +++ /dev/null @@ -1,11 +0,0 @@ -This is ckeditor 4.4.4 (standard package), integrated into Appy on 2014/09/11. - -Readme files (*.md), build-config.js, sub-folders "samples" and "adapters" - have been deleted. -Files config.js, contents.css and styles.js have been modified. -Files named _translationstatus.txt have been removed (for Zope compatibility) - because of their leading "_". - -ckeditor/plugins/wsc/dialogs/tmpFrameset.html has been modified because Zope - complains that, in this file, frame tags are defined with an ending tag. So I've - replaced every occurrence by . diff --git a/gen/ui/ckeditor/Readme b/gen/ui/ckeditor/Readme new file mode 100644 index 0000000..6be05b8 --- /dev/null +++ b/gen/ui/ckeditor/Readme @@ -0,0 +1,5 @@ +Appy is integrated with CKeditor 4.4.7 via CDN (see http://cdn.ckeditor.com). +This folder stores the custom files for configuring ckeditor for Appy: + config.js, contents.css and styles.js. +Those files were copied from the same download version of ckeditor and +customized (on 2015-02-22). diff --git a/gen/ui/ckeditor/ckeditor.js b/gen/ui/ckeditor/ckeditor.js deleted file mode 100644 index b20472a..0000000 --- a/gen/ui/ckeditor/ckeditor.js +++ /dev/null @@ -1,936 +0,0 @@ -/* -Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.md or http://ckeditor.com/license -*/ -(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,e={timestamp:"E7KD",version:"4.4.4",revision:"1ba5105",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var f=window.CKEDITOR_BASEPATH||"";if(!f)for(var d=document.getElementsByTagName("script"),c=0;c=0;y--)if(n[y].priority<=e){n.splice(y+1,0,l);return{removeListener:h}}n.unshift(l)}return{removeListener:h}}, -once:function(){var a=arguments[1];arguments[1]=function(f){f.removeListener();return a.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,f=function(){a=1},d=0,b=function(){d=1};return function(j,l,h){var n=e(this)[j],j=a,t=d;a=d=0;if(n){var y=n.listeners;if(y.length)for(var y=y.slice(0),z,o=0;o=0&&d.listeners.splice(b,1)}},removeAllListeners:function(){var a=e(this),f;for(f in a)delete a[f]},hasListeners:function(a){return(a=e(this)[a])&&a.listeners.length>0}}}()); -CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,e){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,e,this)},CKEDITOR.editor.prototype.fireOnce=function(a,e){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,e,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); -CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),e={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,d=window.location.hostname;return a!=d&&a!="["+d+"]"},secure:location.protocol== -"https:"};e.gecko=navigator.product=="Gecko"&&!e.webkit&&!e.ie;if(e.webkit)a.indexOf("chrome")>-1?e.chrome=true:e.safari=true;var b=0;if(e.ie){b=e.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;e.ie9Compat=b==9;e.ie8Compat=b==8;e.ie7Compat=b==7;e.ie6Compat=b<7||e.quirks}if(e.gecko){var c=a.match(/rv:([\d\.]+)/);if(c){c=c[1].split(".");b=c[0]*1E4+(c[1]||0)*100+(c[2]||0)*1}}e.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));e.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])); -e.version=b;e.isCompatible=e.iOS&&b>=534||!e.mobile&&(e.ie&&b>6||e.gecko&&b>=2E4||e.air&&b>=1||e.webkit&&b>=522||false);e.hidpi=window.devicePixelRatio>=2;e.needsBrFiller=e.gecko||e.webkit||e.ie&&b>10;e.needsNbspFiller=e.ie&&b<11;e.cssClass="cke_browser_"+(e.ie?"ie":e.gecko?"gecko":e.webkit?"webkit":"unknown");if(e.quirks)e.cssClass=e.cssClass+" cke_browser_quirks";if(e.ie)e.cssClass=e.cssClass+(" cke_browser_ie"+(e.quirks?"6 cke_browser_iequirks":e.version));if(e.air)e.cssClass=e.cssClass+" cke_browser_air"; -if(e.iOS)e.cssClass=e.cssClass+" cke_browser_ios";if(e.hidpi)e.cssClass=e.cssClass+" cke_hidpi";return e}()); -"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= -CKEDITOR.loadFullCore,e=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():e&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},e*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={}; -(function(){var a=[],e=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,f=/"+f+""):d.push('');return d.join("")}, -htmlEncode:function(a){return(""+a).replace(b,"&").replace(c,">").replace(f,"<")},htmlDecode:function(a){return a.replace(g,"&").replace(j,">").replace(l,"<")},htmlEncodeAttr:function(a){return a.replace(d,""").replace(f,"<").replace(c,">")},htmlDecodeAttr:function(a){return a.replace(h,'"').replace(l,"<").replace(j,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,f){var d=f(a);d.prototype= -a.prototype;return d},setTimeout:function(a,f,d,b,c){c||(c=window);d||(d=c);return c.setTimeout(function(){b?a.apply(d,[].concat(b)):a.apply(d)},f||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(f){return f.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(f){return f.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(f){return f.replace(a,"")}}(),indexOf:function(a,f){if(typeof f=="function")for(var d=0,b=a.length;d=0?a[d]:null},bind:function(a,f){return function(){return a.apply(f,arguments)}},createClass:function(a){var f=a.$,d=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!f&&(f=function(){d&&this.base.apply(this,arguments)});if(b)var e=f,f=function(){var a=this._||(this._={}),f;for(f in b){var d=b[f];a[f]=typeof d=="function"?CKEDITOR.tools.bind(d,this):d}e.apply(this,arguments)};if(d){f.prototype= -this.prototypedCopy(d.prototype);f.prototype.constructor=f;f.base=d;f.baseProto=d.prototype;f.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(f.prototype,c,true);a&&this.extend(f,a,true);return f},addFunction:function(f,d){return a.push(function(){return f.apply(d||this,arguments)})-1},removeFunction:function(f){a[f]=null},callFunction:function(f){var d=a[f];return d&&d.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a= -/^-?\d+\.?\d*px$/,f;return function(d){f=CKEDITOR.tools.trim(d+"")+"px";return a.test(f)?f:d||""}}(),convertToPx:function(){var a;return function(f){if(!a){a=CKEDITOR.dom.element.createFromHtml('
',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(f)){a.setStyle("width",f);return a.$.clientWidth}return f}}(),repeat:function(a,f){return Array(f+1).join(a)},tryThese:function(){for(var a, -f=0,d=arguments.length;f8)&&e)a=e+":"+a;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0]; -return a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*]*?>)|^/i,'$&\n - -

- diff --git a/gen/ui/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/gen/ui/ckeditor/plugins/wsc/dialogs/tmpFrameset.html deleted file mode 100644 index 9961692..0000000 --- a/gen/ui/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/gen/ui/ckeditor/plugins/wsc/dialogs/wsc.css b/gen/ui/ckeditor/plugins/wsc/dialogs/wsc.css deleted file mode 100644 index da2f174..0000000 --- a/gen/ui/ckeditor/plugins/wsc/dialogs/wsc.css +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.html or http://ckeditor.com/license -*/ - -html, body -{ - background-color: transparent; - margin: 0px; - padding: 0px; -} - -body -{ - padding: 10px; -} - -body, td, input, select, textarea -{ - font-size: 11px; - font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; -} - -.midtext -{ - padding:0px; - margin:10px; -} - -.midtext p -{ - padding:0px; - margin:10px; -} - -.Button -{ - border: #737357 1px solid; - color: #3b3b1f; - background-color: #c7c78f; -} - -.PopupTabArea -{ - color: #737357; - background-color: #e3e3c7; -} - -.PopupTitleBorder -{ - border-bottom: #d5d59d 1px solid; -} -.PopupTabEmptyArea -{ - padding-left: 10px; - border-bottom: #d5d59d 1px solid; -} - -.PopupTab, .PopupTabSelected -{ - border-right: #d5d59d 1px solid; - border-top: #d5d59d 1px solid; - border-left: #d5d59d 1px solid; - padding: 3px 5px 3px 5px; - color: #737357; -} - -.PopupTab -{ - margin-top: 1px; - border-bottom: #d5d59d 1px solid; - cursor: pointer; -} - -.PopupTabSelected -{ - font-weight: bold; - cursor: default; - padding-top: 4px; - border-bottom: #f1f1e3 1px solid; - background-color: #f1f1e3; -} diff --git a/gen/ui/ckeditor/plugins/wsc/dialogs/wsc.js b/gen/ui/ckeditor/plugins/wsc/dialogs/wsc.js deleted file mode 100644 index 845b714..0000000 --- a/gen/ui/ckeditor/plugins/wsc/dialogs/wsc.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. - For licensing, see LICENSE.html or http://ckeditor.com/license -*/ -(function(){function y(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]=f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires; -if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=Object.prototype.toString,f=a.fn||null,g=a.id||"",e=a.target||window,i=a.message||{id:g};a.message&&"[object Object]"== -b.call(a.message)&&(a.message.id||(a.message.id=g),i=a.message);a=window.JSON.stringify(i,f);e.postMessage(a,"*")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener("message",a,!1):window.detachEvent("onmessage",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}}, -misc:{findFocusable:function(a){var b=null;a&&(b=a.find("a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]"));return b},isVisible:function(a){return!(0===a.offsetWidth||0==a.offsetHeight||"none"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display))},hasClass:function(a,b){return!(!a.className||!a.className.match(RegExp("(\\s|^)"+b+"(\\s|$)")))}}}}(), -a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null, -text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},Suggestions:{instance:null,text:"Suggestions"}};var z=function(b){var c,d;for(d in b)c=b[d].instance.getElement().getFirst()|| -b[d].instance.getElement(),c.setText(a.LocalizationComing[d])},A=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}},j,q;a.framesetHtml=function(b){return"'};a.setIframe=function(b,c){var d;d=a.framesetHtml(c);var f=a.iframeNumber+"_"+c;b.getElement().setHtml(d); -d=document.getElementById(f);d=d.contentWindow?d.contentWindow:d.contentDocument.document?d.contentDocument.document:d.contentDocument;d.document.open();d.document.write('iframe
+