Merge branch 'master' into wip_leon_T7330_logo_uploader_padding wip_leon_T7330_logo_uploader_padding
authorAlan <alan@roojs.com>
Thu, 22 Sep 2022 04:11:51 +0000 (12:11 +0800)
committerAlan <alan@roojs.com>
Thu, 22 Sep 2022 04:11:51 +0000 (12:11 +0800)
1  2 
roojs-all.js
roojs-debug.js
roojs-ui-debug.js
roojs-ui.js

diff --combined roojs-all.js
@@@ -687,18 -687,19 +687,19 @@@ A.un("add",fn,B);}});}};}()
  // Roo/Component.js
  Roo.Component=function(A){A=A||{};if(A.tagName||A.dom||typeof A=="string"){A={el:A,id:A.id||A};}this.initialConfig=A;Roo.apply(this,A);this.addEvents({disable:true,enable:true,beforeshow:true,show:true,beforehide:true,hide:true,beforerender:true,render:true,beforedestroy:true,destroy:true}
  );if(!this.id){this.id="roo-comp-"+(++Roo.Component.AUTO_ID);}Roo.ComponentMgr.register(this);Roo.Component.superclass.constructor.call(this);this.initComponent();if(this.renderTo){this.render(this.renderTo);delete this.renderTo;}};Roo.Component.AUTO_ID=1000;
- Roo.extend(Roo.Component,Roo.util.Observable,{hidden:false,disabled:false,rendered:false,disabledClass:"x-item-disabled",allowDomMove:true,hideMode:'display',ctype:"Roo.Component",actionMode:"el",getActionEl:function(){return this[this.actionMode];},initComponent:Roo.emptyFn,render:function(A,B){if(this.rendered){return this;
- }if(this.fireEvent("beforerender",this)===false){return false;}if(!A&&this.el){this.el=Roo.get(this.el);A=this.el.dom.parentNode;this.allowDomMove=false;}this.container=Roo.get(A);this.rendered=true;if(B!==undefined){if(typeof B=='number'){B=this.container.dom.childNodes[B];
- }else{B=Roo.getDom(B);}}this.onRender(this.container,B||null);if(this.cls){this.el.addClass(this.cls);delete this.cls;}if(this.style){this.el.applyStyles(this.style);delete this.style;}this.fireEvent("render",this);this.afterRender(this.container);if(this.hidden){this.hide();
- }if(this.disabled){this.disable();}return this;},onRender:function(ct,A){if(this.el){this.el=Roo.get(this.el);if(this.allowDomMove!==false){ct.dom.insertBefore(this.el.dom,A);}}},getAutoCreate:function(){var A=typeof this.autoCreate=="object"?this.autoCreate:Roo.apply({}
- ,this.defaultAutoCreate);if(this.id&&!A.id){A.id=this.id;}return A;},afterRender:Roo.emptyFn,destroy:function(){if(this.fireEvent("beforedestroy",this)!==false){this.purgeListeners();this.beforeDestroy();if(this.rendered){this.el.removeAllListeners();this.el.remove();
- if(this.actionMode=="container"){this.container.remove();}}this.onDestroy();Roo.ComponentMgr.unregister(this);this.fireEvent("destroy",this);}},beforeDestroy:function(){},onDestroy:function(){},getEl:function(){return this.el;},getId:function(){return this.id;
- },focus:function(A){if(this.rendered){this.el.focus();if(A===true){this.el.dom.select();}}return this;},blur:function(){if(this.rendered){this.el.blur();}return this;},disable:function(){if(this.rendered){this.onDisable();}this.disabled=true;this.fireEvent("disable",this);
- return this;},onDisable:function(){this.getActionEl().addClass(this.disabledClass);this.el.dom.disabled=true;},enable:function(){if(this.rendered){this.onEnable();}this.disabled=false;this.fireEvent("enable",this);return this;},onEnable:function(){this.getActionEl().removeClass(this.disabledClass);
- this.el.dom.disabled=false;},setDisabled:function(A){this[A?"disable":"enable"]();},show:function(){if(this.fireEvent("beforeshow",this)!==false){this.hidden=false;if(this.rendered){this.onShow();}this.fireEvent("show",this);}return this;},onShow:function(){var ae=this.getActionEl();
- if(this.hideMode=='visibility'){ae.dom.style.visibility="visible";}else if(this.hideMode=='offsets'){ae.removeClass('x-hidden');}else{ae.dom.style.display="";}},hide:function(){if(this.fireEvent("beforehide",this)!==false){this.hidden=true;if(this.rendered){this.onHide();
- }this.fireEvent("hide",this);}return this;},onHide:function(){var ae=this.getActionEl();if(this.hideMode=='visibility'){ae.dom.style.visibility="hidden";}else if(this.hideMode=='offsets'){ae.addClass('x-hidden');}else{ae.dom.style.display="none";}},setVisible:function(A){if(A){this.show();
- }else{this.hide();}return this;},isVisible:function(){return this.getActionEl().isVisible();},cloneConfig:function(A){A=A||{};var id=A.id||Roo.id();var B=Roo.applyIf(A,this.initialConfig);B.id=id;return new this.constructor(B);}});
+ Roo.extend(Roo.Component,Roo.util.Observable,{hidden:false,disabled:false,rendered:false,disabledClass:"x-item-disabled",allowDomMove:true,hideMode:'display',ctype:"Roo.Component",actionMode:"el",style:false,getActionEl:function(){return this[this.actionMode];
+ },initComponent:Roo.emptyFn,render:function(A,B){if(this.rendered){return this;}if(this.fireEvent("beforerender",this)===false){return false;}if(!A&&this.el){this.el=Roo.get(this.el);A=this.el.dom.parentNode;this.allowDomMove=false;}this.container=Roo.get(A);
+ this.rendered=true;if(B!==undefined){if(typeof B=='number'){B=this.container.dom.childNodes[B];}else{B=Roo.getDom(B);}}this.onRender(this.container,B||null);if(this.cls){this.el.addClass(this.cls);delete this.cls;}if(this.style){this.el.applyStyles(this.style);
+ delete this.style;}this.fireEvent("render",this);this.afterRender(this.container);if(this.hidden){this.hide();}if(this.disabled){this.disable();}return this;},onRender:function(ct,A){if(this.el){this.el=Roo.get(this.el);if(this.allowDomMove!==false){ct.dom.insertBefore(this.el.dom,A);
+ }}},getAutoCreate:function(){var A=typeof this.autoCreate=="object"?this.autoCreate:Roo.apply({},this.defaultAutoCreate);if(this.id&&!A.id){A.id=this.id;}return A;},afterRender:Roo.emptyFn,destroy:function(){if(this.fireEvent("beforedestroy",this)!==false){this.purgeListeners();
+ this.beforeDestroy();if(this.rendered){this.el.removeAllListeners();this.el.remove();if(this.actionMode=="container"){this.container.remove();}}this.onDestroy();Roo.ComponentMgr.unregister(this);this.fireEvent("destroy",this);}},beforeDestroy:function(){}
+ ,onDestroy:function(){},getEl:function(){return this.el;},getId:function(){return this.id;},focus:function(A){if(this.rendered){this.el.focus();if(A===true){this.el.dom.select();}}return this;},blur:function(){if(this.rendered){this.el.blur();}return this;
+ },disable:function(){if(this.rendered){this.onDisable();}this.disabled=true;this.fireEvent("disable",this);return this;},onDisable:function(){this.getActionEl().addClass(this.disabledClass);this.el.dom.disabled=true;},enable:function(){if(this.rendered){this.onEnable();
+ }this.disabled=false;this.fireEvent("enable",this);return this;},onEnable:function(){this.getActionEl().removeClass(this.disabledClass);this.el.dom.disabled=false;},setDisabled:function(A){this[A?"disable":"enable"]();},show:function(){if(this.fireEvent("beforeshow",this)!==false){this.hidden=false;
+ if(this.rendered){this.onShow();}this.fireEvent("show",this);}return this;},onShow:function(){var ae=this.getActionEl();if(this.hideMode=='visibility'){ae.dom.style.visibility="visible";}else if(this.hideMode=='offsets'){ae.removeClass('x-hidden');}else{ae.dom.style.display="";
+ }},hide:function(){if(this.fireEvent("beforehide",this)!==false){this.hidden=true;if(this.rendered){this.onHide();}this.fireEvent("hide",this);}return this;},onHide:function(){var ae=this.getActionEl();if(this.hideMode=='visibility'){ae.dom.style.visibility="hidden";
+ }else if(this.hideMode=='offsets'){ae.addClass('x-hidden');}else{ae.dom.style.display="none";}},setVisible:function(A){if(A){this.show();}else{this.hide();}return this;},isVisible:function(){return this.getActionEl().isVisible();},cloneConfig:function(A){A=A||{}
+ ;var id=A.id||Roo.id();var B=Roo.applyIf(A,this.initialConfig);B.id=id;return new this.constructor(B);}});
  // Roo/BoxComponent.js
  Roo.BoxComponent=function(A){Roo.Component.call(this,A);this.addEvents({resize:true,move:true});};Roo.extend(Roo.BoxComponent,Roo.Component,{boxReady:false,deferHeight:false,setSize:function(w,h){if(typeof w=='object'){h=w.height;w=w.width;}if(!this.boxReady){this.width=w;
  this.height=h;return this;}if(this.lastSize&&this.lastSize.width==w&&this.lastSize.height==h){return this;}this.lastSize={width:w,height:h};var A=this.adjustSize(w,h);var aw=A.width,ah=A.height;if(aw!==undefined||ah!==undefined){var rz=this.getResizeEl();
@@@ -1932,16 -1933,16 +1933,16 @@@ A.removeChild(cn);A.parentNode.insertBe
  }C.push(F);});A.className=C.length?C.join(' '):'';if(!C.length){A.removeAttribute("class");}}if(A.hasAttribute("lang")){A.removeAttribute("lang");}if(A.hasAttribute("style")){var D=A.getAttribute("style").split(";");var E=[];Roo.each(D,function(s){if(!s.match(/:/)){return;
  }var kv=s.split(":");if(kv[0].match(/^(mso-|line|font|background|margin|padding|color)/)){return;}E.push(s);});A.setAttribute("style",E.length?E.join(';'):'');if(!E.length){A.removeAttribute('style');}}return true;},styleToObject:function(A){var B=(A.getAttribute("style")||'').split(";");
  var C={};Roo.each(B,function(s){if(!s.match(/:/)){return;}var kv=s.split(":");C[kv[0].trim()]=kv[1];});return C;},replaceAname:function(A){var aa=Array.from(A.getElementsByTagName('a'));for(var i=0;i<aa.length;i++){var a=aa[i];if(a.hasAttribute("name")){a.removeAttribute("name");
- }if(a.hasAttribute("href")){continue;}this.removeNodeKeepChildren(a);}},replaceDocBullets:function(A){var B=A.getElementsByClassName('MsoListParagraphCxSpFirst');for(var i=0;i<B.length;i++){B.item(i).className="MsoListParagraph";}B=A.getElementsByClassName('MsoListParagraphCxSpMiddle');
- for(var i=0;i<B.length;i++){B.item(i).className="MsoListParagraph";}B=A.getElementsByClassName('MsoListParagraphCxSpLast');for(var i=0;i<B.length;i++){B.item(i).className="MsoListParagraph";}B=A.getElementsByClassName('ql-indent-1');for(var i=0;i<B.length;
- i++){B.item(i).className="MsoListParagraph";}var C=A.getElementsByTagName('h2');for(var i=0;i<C.length;i++){if(C.item(i).hasAttribute('style')&&C.item(i).getAttribute('style').match(/mso-list:/)){C.item(i).className="MsoListParagraph";}}B=A.getElementsByClassName('MsoNormal');
while(B.length){if(B.item(0).hasAttribute('style')&&B.item(0).getAttribute('style').match(/mso-list:/)){B.item(0).className="MsoListParagraph";}else{B.item(0).className="MsoNormalx";}}B=A.getElementsByClassName('MsoListParagraph');while(B.length){this.replaceDocBullet(B.item(0));
+ }if(a.hasAttribute("href")){continue;}this.removeNodeKeepChildren(a);}},replaceDocBullets:function(A){var B=Array.from(A.getElementsByClassName('MsoListParagraphCxSpFirst'));for(var i=0;i<B.length;i++){B[i].className="MsoListParagraph";}B=Array.from(A.getElementsByClassName('MsoListParagraphCxSpMiddle'));
+ for(var i=0;i<B.length;i++){B[i].className="MsoListParagraph";}B=Array.from(A.getElementsByClassName('MsoListParagraphCxSpLast'));for(var i=0;i<B.length;i++){B[i].className="MsoListParagraph";}B=Array.from(A.getElementsByClassName('ql-indent-1'));for(var i=0;
+ i<B.length;i++){B[i].className="MsoListParagraph";}var C=Array.from(A.getElementsByTagName('h2'));for(var i=0;i<C.length;i++){if(C[i].hasAttribute('style')&&C[i].getAttribute('style').match(/mso-list:/)){C[i].className="MsoListParagraph";}}B=Array.from(A.getElementsByClassName('MsoNormal'));
for(var i=0;i<B.length;i++){if(B[i].hasAttribute('style')&&B[i].getAttribute('style').match(/mso-list:/)){B[i].className="MsoListParagraph";}else{B[i].className="MsoNormalx";}}B=A.getElementsByClassName('MsoListParagraph');while(B.length){this.replaceDocBullet(B.item(0));
  }},replaceDocBullet:function(p){var ns=p,A=p.parentNode,B=A.ownerDocument,C=[];var D='ul';while(ns){if(ns.nodeType!=1){ns=ns.nextSibling;continue;}if(!ns.className.match(/(MsoListParagraph|ql-indent-1)/i)){break;}var E=ns.getElementsByTagName('span');if(ns.hasAttribute('style')&&ns.getAttribute('style').match(/mso-list/)){C.push(ns);
  ns=ns.nextSibling;G=true;if(E.length&&E[0].hasAttribute('style')){var F=this.styleToObject(E[0]);if(typeof(F['font-family'])!='undefined'&&!F['font-family'].match(/Symbol/)){D='ol';}}continue;}var E=ns.getElementsByTagName('span');if(!E.length){break;}var G=false;
  for(var i=0;i<E.length;i++){if(E[i].hasAttribute('style')&&E[i].getAttribute('style').match(/mso-list/)){G=true;break;}}if(!G){break;}C.push(ns);ns=ns.nextSibling;}if(!C.length){ns.className="";return;}var ul=A.ownerDocument.createElement(D);A.insertBefore(ul,p);
  var H=0;var I=[ul];var J=false;var K={};max_margins=-1;C.forEach(function(n,L){var M=n.getElementsByTagName('span');if(!M.length){A.removeChild(n);return;}var N=1;var O={};for(var i=0;i<M.length;i++){O=this.styleToObject(M[i]);if(typeof(O['mso-list'])=='undefined'){continue;
  }if(D=='ol'){N=M[i].innerText.replace(/[^0-9]+]/g,'')*1;}M[i].parentNode.removeChild(M[i]);break;}O=this.styleToObject(n);if(typeof(O['mso-list'])=='undefined'){A.removeChild(n);return;}var P=O['margin-left'];if(typeof(K[P])=='undefined'){max_margins++;K[P]=max_margins;
- }nlvl=K[P];if(nlvl>H){var Q=B.createElement(D);if(!J){J=B.createElement('li');I[H].appendChild(J);}J.appendChild(Q);I[nlvl]=Q;}H=nlvl;if(!I[nlvl].hasAttribute("start")&&N>1){I[nlvl].setAttribute("start",N);}var R=I[nlvl].appendChild(B.createElement('li'));
+ }nlvl=K[P];if(nlvl>H){var Q=B.createElement(D);if(!J){J=B.createElement('li');I[H].appendChild(J);}J.appendChild(Q);I[nlvl]=Q;}H=nlvl;if(!I[nlvl].hasAttribute("start")&&D=="ol"){I[nlvl].setAttribute("start",N);}var R=I[nlvl].appendChild(B.createElement('li'));
  J=R;R.innerHTML=n.innerHTML;A.removeChild(n);},this);}});
  // Roo/htmleditor/FilterStyleToTag.js
  Roo.htmleditor.FilterStyleToTag=function(A){this.tags={B:['fontWeight','bold'],I:['fontStyle','italic'],SUP:['verticalAlign','super'],SUB:['verticalAlign','sub']};Roo.apply(this,A);this.walk(A.node);};Roo.extend(Roo.htmleditor.FilterStyleToTag,Roo.htmleditor.Filter,{tag:true,tags:false,replaceTag:function(A){if(A.getAttribute("style")===null){return true;
@@@ -2079,9 -2080,10 +2080,10 @@@ this.doc.open();this.doc.write(this.get
  }}},toggleSourceEdit:function(A){this.sourceEditMode=A===true;if(this.sourceEditMode){Roo.get(this.iframe).addClass(['x-hidden','hide','d-none']);}else{Roo.get(this.iframe).removeClass(['x-hidden','hide','d-none']);this.deferFocus();}},cleanHtml:function(A){A=String(A);
  if(A.length>5){if(Roo.isSafari){A=A.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,'');}}if(A=='&nbsp;'){A='';}return A;},syncValue:function(){if(this.initialized){if(this.undoManager){this.undoManager.addEvent();}var bd=(this.doc.body||this.doc.documentElement);
  var A=this.win.getSelection();var B=document.createElement('div');B.innerHTML=bd.innerHTML;var C=B.getElementsByClassName('gtx-trans-icon');if(C.length>0){var rm=C.item(0).parentNode;rm.parentNode.removeChild(rm);}if(this.enableBlocks){new Roo.htmleditor.FilterBlock({node:B}
- );}var D=new Roo.htmleditor.TidySerializer({inner:true});var E=D.serialize(B);if(Roo.isSafari){var bs=bd.getAttribute('style');var m=bs?bs.match(/text-align:(.*?);/i):false;if(m&&m[1]){E='<div style="'+m[0]+'">'+E+'</div>';}}E=this.cleanHtml(E);E=E.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u0080-\uFFFF]/g,function(F){var cc=F.charCodeAt();
- if(F.length==2){var G=F.charCodeAt(0)-0xD800;var H=F.charCodeAt(1)-0xDC00;cc=(G*0x400)+H+0x10000;}else if((cc>=0x4E00&&cc<0xA000)||(cc>=0x3400&&cc<0x4E00)||(cc>=0xf900&&cc<0xfb00)){return F;}return "&#"+cc+";";});if(this.owner.fireEvent('beforesync',this,E)!==false){this.el.dom.value=E;
- this.owner.fireEvent('sync',this,E);}}},pushValue:function(){if(this.initialized){var v=this.el.dom.value.trim();if(this.owner.fireEvent('beforepush',this,v)!==false){var d=(this.doc.body||this.doc.documentElement);d.innerHTML=v;this.el.dom.value=d.innerHTML;
+ );}var D=B.innerHTML;if(this.autoClean){new Roo.htmleditor.FilterAttributes({node:B,attrib_white:['href','src','name','align','colspan','rowspan','data-display','data-width','start','style','class','allowfullscreen','frameborder','width','height','alt'],attrib_clean:['href','src']}
+ );var E=new Roo.htmleditor.TidySerializer({inner:true});D=E.serialize(B);}if(Roo.isSafari){var bs=bd.getAttribute('style');var m=bs?bs.match(/text-align:(.*?);/i):false;if(m&&m[1]){D='<div style="'+m[0]+'">'+D+'</div>';}}D=this.cleanHtml(D);D=D.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u0080-\uFFFF]/g,function(F){var cc=F.charCodeAt();
+ if(F.length==2){var G=F.charCodeAt(0)-0xD800;var H=F.charCodeAt(1)-0xDC00;cc=(G*0x400)+H+0x10000;}else if((cc>=0x4E00&&cc<0xA000)||(cc>=0x3400&&cc<0x4E00)||(cc>=0xf900&&cc<0xfb00)){return F;}return "&#"+cc+";";});if(this.owner.fireEvent('beforesync',this,D)!==false){this.el.dom.value=D;
+ this.owner.fireEvent('sync',this,D);}}},pushValue:function(){if(this.initialized){var v=this.el.dom.value.trim();if(this.owner.fireEvent('beforepush',this,v)!==false){var d=(this.doc.body||this.doc.documentElement);d.innerHTML=v;this.el.dom.value=d.innerHTML;
  this.owner.fireEvent('push',this,v);}if(this.autoClean){new Roo.htmleditor.FilterParagraph({node:this.doc.body});new Roo.htmleditor.FilterSpan({node:this.doc.body});}if(this.enableBlocks){Roo.htmleditor.Block.initAll(this.doc.body);}this.updateLanguage();
  var lc=this.doc.body.lastChild;if(lc&&lc.nodeType==1&&lc.getAttribute("contenteditable")=="false"){this.doc.body.appendChild(this.doc.createElement('br'));}}},deferFocus:function(){this.focus.defer(10,this);},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus();
  }else{this.el.focus();}},assignDocWin:function(){var A=this.iframe;if(Roo.isIE){this.doc=A.contentWindow.document;this.win=A.contentWindow;}else{if(!Roo.get(this.frameId)&&!A.contentDocument){return;}this.doc=(A.contentDocument||Roo.get(this.frameId).dom.document);
@@@ -2903,26 -2905,20 +2905,26 @@@ this.footerEl.hide();this.setThumbBoxSi
  this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);this.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel';
  this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;
  this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();this.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e);
 -break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);
 +break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;case 'center':this.center(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);
  },beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();if(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return;
 -}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset();
 +}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},center:function(e){this.setCanvasPosition();},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset();
  this.imageEl=document.createElement('img');var B=this;this.imageEl.addEventListener("load",function(){B.onLoadCanvas();});this.imageEl.src=A;}},onLoadCanvas:function(){this.imageEl.OriginWidth=this.imageEl.naturalWidth||this.imageEl.width;this.imageEl.OriginHeight=this.imageEl.naturalHeight||this.imageEl.height;
  if(this.fireEvent('loadcanvas',this,this.imageEl)!=false){this.bodyEl.un('click',this.beforeSelectFile,this);this.notifyEl.hide();this.thumbEl.show();this.footerEl.show();this.baseRotateLevel();if(this.isDocument){this.setThumbBoxSize();}this.setThumbBoxPosition();
 -this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(){if(!this.canvasEl){return;}var pw=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);
 -this.previewEl.setLeft(pw);this.previewEl.setTop(ph);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width<this.thumbEl.getWidth()||this.canvasEl.height<this.thumbEl.getHeight())){this.dragable=false;
 -return;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=Math.ceil(this.thumbEl.getLeft(true));
 -var B=Math.ceil(this.thumbEl.getTop(true));var C=Math.ceil(A+this.thumbEl.getWidth()-this.canvasEl.width);var D=Math.ceil(B+this.thumbEl.getHeight()-this.canvasEl.height);if(A>C){var E=A;A=C;C=E;}if(B>D){var F=B;B=D;D=F;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();
 -var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var G=Math.ceil(x+this.previewEl.getLeft(true));var H=Math.ceil(y+this.previewEl.getTop(true));G=(G<A)?A:((G>C)?C:G);H=(H<B)?B:((H>D)?D:H);this.previewEl.setLeft(G);
 -this.previewEl.setTop(H);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();
 -this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;
 -}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);var D=this.imageEl.OriginWidth;var E=this.imageEl.OriginHeight;if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;
 -}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&((this.imageEl.OriginWidth/this.imageEl.OriginHeight>=this.minWidth/this.minHeight)&&B<this.minWidth||(this.imageEl.OriginWidth/this.imageEl.OriginHeight<=this.minWidth/this.minHeight)&&C<this.minHeight||B>D||C>E)){return false;
 +this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(A=true){if(!this.canvasEl){return;}var B=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var C=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);
 +if(A){this.previewEl.setLeft(B);this.previewEl.setTop(C);return;}var D=this.baseScale*Math.pow(1.02,this.startScale);var E=Math.floor(this.imageEl.OriginWidth*D);var F=Math.floor(this.imageEl.OriginHeight*D);var G=Math.ceil((this.bodyEl.getWidth()-E)/2);var H=Math.ceil((this.bodyEl.getHeight()-F)/2);
 +var I=B-G;var J=C-H;var K=this.previewEl.getLeft(true)+I;var L=this.previewEl.getTop(true)+J;this.previewEl.setLeft(K);this.previewEl.setTop(L);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width<this.thumbEl.getWidth()||this.canvasEl.height<this.thumbEl.getHeight())){this.dragable=false;
 +return;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=this.canvasEl.width/0.9*0.05;
 +var B=A*this.minHeight/this.minWidth;if((this.imageEl.OriginWidth/this.imageEl.OriginHeight<=this.minWidth/this.minHeight)){A=(this.canvasEl.height*this.minWidth/this.minHeight-this.canvasEl.width)/2+A;}if((this.imageEl.OriginWidth/this.imageEl.OriginHeight>=this.minWidth/this.minHeight)){B=(this.canvasEl.width*this.minHeight/this.minWidth-this.canvasEl.height)/2+B;
 +}var C=Math.ceil(this.thumbEl.getLeft(true)+this.thumbEl.getWidth()-this.canvasEl.width-A);var D=Math.ceil(this.thumbEl.getTop(true)+this.thumbEl.getHeight()-this.canvasEl.height-B);var E=Math.ceil(this.thumbEl.getLeft(true)+A);var F=Math.ceil(this.thumbEl.getTop(true)+B);
 +if(C>E){var G=C;C=E;E=G;}if(D>F){var H=D;D=F;F=H;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var I=Math.ceil(x+this.previewEl.getLeft(true));
 +var J=Math.ceil(y+this.previewEl.getTop(true));I=(I<C)?C:((I>E)?E:I);J=(J<D)?D:((J>F)?F:J);this.previewEl.setLeft(I);this.previewEl.setTop(J);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();
 +},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();
 +return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);
 +var D=this.imageEl.OriginWidth;var E=this.imageEl.OriginHeight;var F=Math.floor(this.imageEl.OriginWidth*this.getScaleLevel());var G=Math.floor(this.imageEl.OriginHeight*this.getScaleLevel());var H=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);
 +var I=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);var J=Math.ceil((this.bodyEl.getWidth()-F)/2);var K=Math.ceil((this.bodyEl.getHeight()-G)/2);var L=J-H;var M=K-I;var N=this.previewEl.getLeft(true)+L;var O=this.previewEl.getTop(true)+M;var P=N-this.thumbEl.getLeft(true);
 +var Q=O-this.thumbEl.getTop(true);var R=this.thumbEl.getLeft(true)+this.thumbEl.getWidth()-F-N;var S=this.thumbEl.getTop(true)+this.thumbEl.getHeight()-G-O;var T=F/0.9*0.05;var U=T*this.minHeight/this.minWidth;if((this.imageEl.OriginWidth/this.imageEl.OriginHeight<=this.minWidth/this.minHeight)){T=(G*this.minWidth/this.minHeight-F)/2+T;
 +}if((this.imageEl.OriginWidth/this.imageEl.OriginHeight>=this.minWidth/this.minHeight)){U=(F*this.minHeight/this.minWidth-G)/2+U;}if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;
 +}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&(P>T||R>T||Q>U||S>U||B>D||C>E)){return false;
  }if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;
  var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
  }this.rotate=(this.rotate<90)?270:this.rotate-90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate<90)?270:this.rotate-90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();
@@@ -2937,7 -2933,7 +2939,7 @@@ break;case 90:this.canvasEl.width=this.
  break;}this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;case 180:this.canvasEl.width=this.imageEl.OriginWidth*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginHeight*this.getScaleLevel();
  if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;}this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);
  break;case 270:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);
 -break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition();
 +break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition(false);
  },crop:function(){if(!this.canvasLoaded){return;}var A=document.createElement("canvas");var B=A.getContext("2d");A.width=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;A.height=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;
  var C=A.width/2;B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);var D=document.createElement("canvas");var E=D.getContext("2d");
  D.width=this.thumbEl.getWidth()/this.getScaleLevel();D.height=this.thumbEl.getHeight()/this.getScaleLevel();switch(this.rotate){case 0:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel());
@@@ -2992,4 -2988,4 +2994,4 @@@ return;}if(E===1){return G.getValue(A,I
  ]},{tag:'div',cls:'btn-group roo-upload-cropbox-download',action:'download',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-download"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-crop',action:'crop',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-crop"></i>'}
  ]},{tag:'div',cls:'btn-group roo-upload-cropbox-trash',action:'trash',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-trash"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}
  ]}],ROTATOR:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}
 -]}]}});
 +]}],CENTER:[{tag:'div',cls:'btn-group roo-upload-cropbox-center',action:'center',cn:[{tag:'button',cls:'btn btn-default',html:'CENTER'}]}]}});
diff --combined roojs-debug.js
@@@ -16992,6 -16992,13 +16992,13 @@@ Roo.extend(Roo.Component, Roo.util.Obse
       */
      actionMode : "el",
  
+        /**
+      * @cfg {String} style
+      * css styles to add to component
+      * eg. text-align:right;
+      */
+     style : false,
+       
      /** @private */
      getActionEl : function(){
          return this[this.actionMode];
@@@ -46264,44 -46271,44 +46271,44 @@@ Roo.extend(Roo.htmleditor.FilterWord, R
          // this is a bit odd - but it appears some indents use ql-indent-1
           //Roo.log(doc.innerHTML);
          
-         var listpara = doc.getElementsByClassName('MsoListParagraphCxSpFirst');
+         var listpara = Array.from(doc.getElementsByClassName('MsoListParagraphCxSpFirst'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
          
-         listpara = doc.getElementsByClassName('MsoListParagraphCxSpMiddle');
+         listpara =  Array.from(doc.getElementsByClassName('MsoListParagraphCxSpMiddle'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
-         listpara = doc.getElementsByClassName('MsoListParagraphCxSpLast');
+         listpara =  Array.from(doc.getElementsByClassName('MsoListParagraphCxSpLast'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
-         listpara = doc.getElementsByClassName('ql-indent-1');
+         listpara =  Array.from(doc.getElementsByClassName('ql-indent-1'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
          
          // this is a bit hacky - we had one word document where h2 had a miso-list attribute.
-         var htwo = doc.getElementsByTagName('h2');
+         var htwo =  Array.from(doc.getElementsByTagName('h2'));
          for( var i = 0; i < htwo.length; i ++) {
-             if (htwo.item(i).hasAttribute('style') && htwo.item(i).getAttribute('style').match(/mso-list:/)) {
-                 htwo.item(i).className = "MsoListParagraph";
+             if (htwo[i].hasAttribute('style') && htwo[i].getAttribute('style').match(/mso-list:/)) {
+                 htwo[i].className = "MsoListParagraph";
              }
          }
-         listpara = doc.getElementsByClassName('MsoNormal');
-         while(listpara.length) {
-             if (listpara.item(0).hasAttribute('style') && listpara.item(0).getAttribute('style').match(/mso-list:/)) {
-                 listpara.item(0).className = "MsoListParagraph";
+         listpara =  Array.from(doc.getElementsByClassName('MsoNormal'));
+         for( var i = 0; i < listpara.length; i ++) {
+             if (listpara[i].hasAttribute('style') && listpara[i].getAttribute('style').match(/mso-list:/)) {
+                 listpara[i].className = "MsoListParagraph";
              } else {
-                 listpara.item(0).className = "MsoNormalx";
+                 listpara[i].className = "MsoNormalx";
              }
          }
         
          listpara = doc.getElementsByClassName('MsoListParagraph');
+         // Roo.log(doc.innerHTML);
          
          
-         //Roo.log(doc.innerHTML);
          
          while(listpara.length) {
              
              lvl = nlvl;
              
              // not starting at 1..
-             if (!stack[nlvl].hasAttribute("start") && num > 1) {
+             if (!stack[nlvl].hasAttribute("start") && listtype == "ol") {
                  stack[nlvl].setAttribute("start", num);
              }
              
@@@ -50193,11 -50200,42 +50200,42 @@@ Roo.extend(Roo.HtmlEditorCore, Roo.Comp
              if (this.enableBlocks) {
                  new Roo.htmleditor.FilterBlock({ node : div });
              }
+             
+             var html = div.innerHTML;
+             
              //?? tidy?
-             var tidy = new Roo.htmleditor.TidySerializer({
-                 inner:  true
-             });
-             var html  = tidy.serialize(div);
+             if (this.autoClean) {
+                 
+                 new Roo.htmleditor.FilterAttributes({
+                     node : div,
+                     attrib_white : [
+                             'href',
+                             'src',
+                             'name',
+                             'align',
+                             'colspan',
+                             'rowspan',
+                             'data-display',
+                             'data-width',
+                             'start' ,
+                             'style',
+                             // youtube embed.
+                             'class',
+                             'allowfullscreen',
+                             'frameborder',
+                             'width',
+                             'height',
+                             'alt'
+                             ],
+                     attrib_clean : ['href', 'src' ] 
+                 });
+                 
+                 var tidy = new Roo.htmleditor.TidySerializer({
+                     inner:  true
+                 });
+                 html  = tidy.serialize(div);
+                 
+             }
              
              
              if(Roo.isSafari){
@@@ -68605,9 -68643,6 +68643,9 @@@ Roo.extend(Roo.dialog.UploadCropbox, Ro
              case 'download' :
                  this.download(e);
                  break;
 +            case 'center' :
 +                this.center(e);
 +                break;
              default :
                  break;
          }
      {
          this.fireEvent('download', this);
      },
 +
 +    center : function(e)
 +    {
 +        this.setCanvasPosition();
 +    },
      
      loadCanvas : function(src)
      {   
          
      },
      
 -    setCanvasPosition : function()
 +    setCanvasPosition : function(center = true)
      {   
          if(!this.canvasEl){
              return;
          }
 +
 +        var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);
 +        var newCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);
 +
 +        if(center) {
 +            this.previewEl.setLeft(newCenterLeft);
 +            this.previewEl.setTop(newCenterTop);
 +
 +            return;
 +        }
          
 -        var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);
 -        var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);
 -        
 -        this.previewEl.setLeft(pw);
 -        this.previewEl.setTop(ph);
 +        var oldScaleLevel = this.baseScale * Math.pow(1.02, this.startScale);
 +        var oldCanvasWidth = Math.floor(this.imageEl.OriginWidth * oldScaleLevel);
 +        var oldCanvasHeight = Math.floor(this.imageEl.OriginHeight * oldScaleLevel);
 +
 +        var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - oldCanvasWidth) / 2);
 +        var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - oldCanvasHeight) / 2);
 +
 +        var leftDiff = newCenterLeft - oldCenterLeft;
 +        var topDiff = newCenterTop - oldCenterTop;
 +
 +        var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff;
 +        var newPreviewTop = this.previewEl.getTop(true) + topDiff;
 +
 +        this.previewEl.setLeft(newPreviewLeft);
 +        this.previewEl.setTop(newPreviewTop);
          
      },
      
          if (!this.dragable){
              return;
          }
 +
 +        var maxPaddingLeft = this.canvasEl.width / 0.9 * 0.05;
 +        var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth;
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) {
 +            maxPaddingLeft = (this.canvasEl.height * this.minWidth / this.minHeight - this.canvasEl.width) / 2 + maxPaddingLeft;
 +        }
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) {
 +            maxPaddingTop = (this.canvasEl.width * this.minHeight / this.minWidth - this.canvasEl.height) / 2 + maxPaddingTop;
 +        }
          
 -        var minX = Math.ceil(this.thumbEl.getLeft(true));
 -        var minY = Math.ceil(this.thumbEl.getTop(true));
 +        var minX = Math.ceil(this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - this.canvasEl.width - maxPaddingLeft);
 +        var minY = Math.ceil(this.thumbEl.getTop(true) + this.thumbEl.getHeight() - this.canvasEl.height - maxPaddingTop);
          
 -        var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width);
 -        var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height);
 +        var maxX = Math.ceil(this.thumbEl.getLeft(true) + maxPaddingLeft);
 +        var maxY = Math.ceil(this.thumbEl.getTop(true) +  maxPaddingTop);
  
          if(minX > maxX) {
              var tempX = minX;
   
          var maxWidth = this.imageEl.OriginWidth;
          var maxHeight = this.imageEl.OriginHeight;
 +
 +
 +        var newCanvasWidth = Math.floor(this.imageEl.OriginWidth * this.getScaleLevel());
 +        var newCanvasHeight = Math.floor(this.imageEl.OriginHeight * this.getScaleLevel());
 +
 +        var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);
 +        var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);
 +
 +        var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - newCanvasWidth) / 2);
 +        var newCenterTop = Math.ceil((this.bodyEl.getHeight() - newCanvasHeight) / 2);
 +
 +        var leftDiff = newCenterLeft - oldCenterLeft;
 +        var topDiff = newCenterTop - oldCenterTop;
 +
 +        var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff;
 +        var newPreviewTop = this.previewEl.getTop(true) + topDiff;
 +
 +        var paddingLeft = newPreviewLeft - this.thumbEl.getLeft(true);
 +        var paddingTop = newPreviewTop - this.thumbEl.getTop(true);
 +
 +        var paddingRight = this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - newCanvasWidth - newPreviewLeft;
 +        var paddingBottom = this.thumbEl.getTop(true) + this.thumbEl.getHeight() - newCanvasHeight - newPreviewTop;
 +
 +        var maxPaddingLeft = newCanvasWidth / 0.9 * 0.05;
 +        var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth;
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) {
 +            maxPaddingLeft = (newCanvasHeight * this.minWidth / this.minHeight - newCanvasWidth) / 2 + maxPaddingLeft;
 +        }
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) {
 +            maxPaddingTop = (newCanvasWidth * this.minHeight / this.minWidth - newCanvasHeight) / 2 + maxPaddingTop;
 +        }
          
          if(
                  this.isDocument &&
                  !this.isDocument &&
                  (this.rotate == 0 || this.rotate == 180) && 
                  (
 -                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight) && width < this.minWidth ||
 -                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight) && height < this.minHeight ||
 +                    // for zoom out
 +                    paddingLeft > maxPaddingLeft ||
 +                    paddingRight > maxPaddingLeft ||
 +                    paddingTop > maxPaddingTop ||
 +                    paddingBottom > maxPaddingTop ||
 +                    // for zoom in
                      width > maxWidth ||
                      height > maxHeight
                  )
          
          this.previewEl.appendChild(this.canvasEl);
          
 -        this.setCanvasPosition();
 +        this.setCanvasPosition(false);
      },
      
      crop : function()
@@@ -70108,20 -70070,6 +70146,20 @@@ Roo.apply(Roo.dialog.UploadCropbox, 
                      }
                  ]
              }
 +        ],
 +        CENTER : [
 +            {
 +                tag : 'div',
 +                cls : 'btn-group roo-upload-cropbox-center',
 +                action : 'center',
 +                cn : [
 +                    {
 +                        tag : 'button',
 +                        cls : 'btn btn-default',
 +                        html : 'CENTER'
 +                    }
 +                ]
 +            }
          ]
      }
  });
diff --combined roojs-ui-debug.js
@@@ -21772,44 -21772,44 +21772,44 @@@ Roo.extend(Roo.htmleditor.FilterWord, R
          // this is a bit odd - but it appears some indents use ql-indent-1
           //Roo.log(doc.innerHTML);
          
-         var listpara = doc.getElementsByClassName('MsoListParagraphCxSpFirst');
+         var listpara = Array.from(doc.getElementsByClassName('MsoListParagraphCxSpFirst'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
          
-         listpara = doc.getElementsByClassName('MsoListParagraphCxSpMiddle');
+         listpara =  Array.from(doc.getElementsByClassName('MsoListParagraphCxSpMiddle'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
-         listpara = doc.getElementsByClassName('MsoListParagraphCxSpLast');
+         listpara =  Array.from(doc.getElementsByClassName('MsoListParagraphCxSpLast'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
-         listpara = doc.getElementsByClassName('ql-indent-1');
+         listpara =  Array.from(doc.getElementsByClassName('ql-indent-1'));
          for( var i = 0; i < listpara.length; i ++) {
-             listpara.item(i).className = "MsoListParagraph";
+             listpara[i].className = "MsoListParagraph";
          }
          
          // this is a bit hacky - we had one word document where h2 had a miso-list attribute.
-         var htwo = doc.getElementsByTagName('h2');
+         var htwo =  Array.from(doc.getElementsByTagName('h2'));
          for( var i = 0; i < htwo.length; i ++) {
-             if (htwo.item(i).hasAttribute('style') && htwo.item(i).getAttribute('style').match(/mso-list:/)) {
-                 htwo.item(i).className = "MsoListParagraph";
+             if (htwo[i].hasAttribute('style') && htwo[i].getAttribute('style').match(/mso-list:/)) {
+                 htwo[i].className = "MsoListParagraph";
              }
          }
-         listpara = doc.getElementsByClassName('MsoNormal');
-         while(listpara.length) {
-             if (listpara.item(0).hasAttribute('style') && listpara.item(0).getAttribute('style').match(/mso-list:/)) {
-                 listpara.item(0).className = "MsoListParagraph";
+         listpara =  Array.from(doc.getElementsByClassName('MsoNormal'));
+         for( var i = 0; i < listpara.length; i ++) {
+             if (listpara[i].hasAttribute('style') && listpara[i].getAttribute('style').match(/mso-list:/)) {
+                 listpara[i].className = "MsoListParagraph";
              } else {
-                 listpara.item(0).className = "MsoNormalx";
+                 listpara[i].className = "MsoNormalx";
              }
          }
         
          listpara = doc.getElementsByClassName('MsoListParagraph');
+         // Roo.log(doc.innerHTML);
          
          
-         //Roo.log(doc.innerHTML);
          
          while(listpara.length) {
              
              lvl = nlvl;
              
              // not starting at 1..
-             if (!stack[nlvl].hasAttribute("start") && num > 1) {
+             if (!stack[nlvl].hasAttribute("start") && listtype == "ol") {
                  stack[nlvl].setAttribute("start", num);
              }
              
@@@ -25701,11 -25701,42 +25701,42 @@@ Roo.extend(Roo.HtmlEditorCore, Roo.Comp
              if (this.enableBlocks) {
                  new Roo.htmleditor.FilterBlock({ node : div });
              }
+             
+             var html = div.innerHTML;
+             
              //?? tidy?
-             var tidy = new Roo.htmleditor.TidySerializer({
-                 inner:  true
-             });
-             var html  = tidy.serialize(div);
+             if (this.autoClean) {
+                 
+                 new Roo.htmleditor.FilterAttributes({
+                     node : div,
+                     attrib_white : [
+                             'href',
+                             'src',
+                             'name',
+                             'align',
+                             'colspan',
+                             'rowspan',
+                             'data-display',
+                             'data-width',
+                             'start' ,
+                             'style',
+                             // youtube embed.
+                             'class',
+                             'allowfullscreen',
+                             'frameborder',
+                             'width',
+                             'height',
+                             'alt'
+                             ],
+                     attrib_clean : ['href', 'src' ] 
+                 });
+                 
+                 var tidy = new Roo.htmleditor.TidySerializer({
+                     inner:  true
+                 });
+                 html  = tidy.serialize(div);
+                 
+             }
              
              
              if(Roo.isSafari){
@@@ -44113,9 -44144,6 +44144,9 @@@ Roo.extend(Roo.dialog.UploadCropbox, Ro
              case 'download' :
                  this.download(e);
                  break;
 +            case 'center' :
 +                this.center(e);
 +                break;
              default :
                  break;
          }
      {
          this.fireEvent('download', this);
      },
 +
 +    center : function(e)
 +    {
 +        this.setCanvasPosition();
 +    },
      
      loadCanvas : function(src)
      {   
          
      },
      
 -    setCanvasPosition : function()
 +    setCanvasPosition : function(center = true)
      {   
          if(!this.canvasEl){
              return;
          }
 +
 +        var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);
 +        var newCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);
 +
 +        if(center) {
 +            this.previewEl.setLeft(newCenterLeft);
 +            this.previewEl.setTop(newCenterTop);
 +
 +            return;
 +        }
          
 -        var pw = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);
 -        var ph = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);
 -        
 -        this.previewEl.setLeft(pw);
 -        this.previewEl.setTop(ph);
 +        var oldScaleLevel = this.baseScale * Math.pow(1.02, this.startScale);
 +        var oldCanvasWidth = Math.floor(this.imageEl.OriginWidth * oldScaleLevel);
 +        var oldCanvasHeight = Math.floor(this.imageEl.OriginHeight * oldScaleLevel);
 +
 +        var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - oldCanvasWidth) / 2);
 +        var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - oldCanvasHeight) / 2);
 +
 +        var leftDiff = newCenterLeft - oldCenterLeft;
 +        var topDiff = newCenterTop - oldCenterTop;
 +
 +        var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff;
 +        var newPreviewTop = this.previewEl.getTop(true) + topDiff;
 +
 +        this.previewEl.setLeft(newPreviewLeft);
 +        this.previewEl.setTop(newPreviewTop);
          
      },
      
          if (!this.dragable){
              return;
          }
 +
 +        var maxPaddingLeft = this.canvasEl.width / 0.9 * 0.05;
 +        var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth;
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) {
 +            maxPaddingLeft = (this.canvasEl.height * this.minWidth / this.minHeight - this.canvasEl.width) / 2 + maxPaddingLeft;
 +        }
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) {
 +            maxPaddingTop = (this.canvasEl.width * this.minHeight / this.minWidth - this.canvasEl.height) / 2 + maxPaddingTop;
 +        }
          
 -        var minX = Math.ceil(this.thumbEl.getLeft(true));
 -        var minY = Math.ceil(this.thumbEl.getTop(true));
 +        var minX = Math.ceil(this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - this.canvasEl.width - maxPaddingLeft);
 +        var minY = Math.ceil(this.thumbEl.getTop(true) + this.thumbEl.getHeight() - this.canvasEl.height - maxPaddingTop);
          
 -        var maxX = Math.ceil(minX + this.thumbEl.getWidth() - this.canvasEl.width);
 -        var maxY = Math.ceil(minY + this.thumbEl.getHeight() - this.canvasEl.height);
 +        var maxX = Math.ceil(this.thumbEl.getLeft(true) + maxPaddingLeft);
 +        var maxY = Math.ceil(this.thumbEl.getTop(true) +  maxPaddingTop);
  
          if(minX > maxX) {
              var tempX = minX;
   
          var maxWidth = this.imageEl.OriginWidth;
          var maxHeight = this.imageEl.OriginHeight;
 +
 +
 +        var newCanvasWidth = Math.floor(this.imageEl.OriginWidth * this.getScaleLevel());
 +        var newCanvasHeight = Math.floor(this.imageEl.OriginHeight * this.getScaleLevel());
 +
 +        var oldCenterLeft = Math.ceil((this.bodyEl.getWidth() - this.canvasEl.width) / 2);
 +        var oldCenterTop = Math.ceil((this.bodyEl.getHeight() - this.canvasEl.height) / 2);
 +
 +        var newCenterLeft = Math.ceil((this.bodyEl.getWidth() - newCanvasWidth) / 2);
 +        var newCenterTop = Math.ceil((this.bodyEl.getHeight() - newCanvasHeight) / 2);
 +
 +        var leftDiff = newCenterLeft - oldCenterLeft;
 +        var topDiff = newCenterTop - oldCenterTop;
 +
 +        var newPreviewLeft = this.previewEl.getLeft(true) + leftDiff;
 +        var newPreviewTop = this.previewEl.getTop(true) + topDiff;
 +
 +        var paddingLeft = newPreviewLeft - this.thumbEl.getLeft(true);
 +        var paddingTop = newPreviewTop - this.thumbEl.getTop(true);
 +
 +        var paddingRight = this.thumbEl.getLeft(true) + this.thumbEl.getWidth() - newCanvasWidth - newPreviewLeft;
 +        var paddingBottom = this.thumbEl.getTop(true) + this.thumbEl.getHeight() - newCanvasHeight - newPreviewTop;
 +
 +        var maxPaddingLeft = newCanvasWidth / 0.9 * 0.05;
 +        var maxPaddingTop = maxPaddingLeft * this.minHeight / this.minWidth;
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight)) {
 +            maxPaddingLeft = (newCanvasHeight * this.minWidth / this.minHeight - newCanvasWidth) / 2 + maxPaddingLeft;
 +        }
 +
 +        if ((this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight)) {
 +            maxPaddingTop = (newCanvasWidth * this.minHeight / this.minWidth - newCanvasHeight) / 2 + maxPaddingTop;
 +        }
          
          if(
                  this.isDocument &&
                  !this.isDocument &&
                  (this.rotate == 0 || this.rotate == 180) && 
                  (
 -                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight >= this.minWidth / this.minHeight) && width < this.minWidth ||
 -                    (this.imageEl.OriginWidth / this.imageEl.OriginHeight <= this.minWidth / this.minHeight) && height < this.minHeight ||
 +                    // for zoom out
 +                    paddingLeft > maxPaddingLeft ||
 +                    paddingRight > maxPaddingLeft ||
 +                    paddingTop > maxPaddingTop ||
 +                    paddingBottom > maxPaddingTop ||
 +                    // for zoom in
                      width > maxWidth ||
                      height > maxHeight
                  )
          
          this.previewEl.appendChild(this.canvasEl);
          
 -        this.setCanvasPosition();
 +        this.setCanvasPosition(false);
      },
      
      crop : function()
@@@ -45616,20 -45571,6 +45647,20 @@@ Roo.apply(Roo.dialog.UploadCropbox, 
                      }
                  ]
              }
 +        ],
 +        CENTER : [
 +            {
 +                tag : 'div',
 +                cls : 'btn-group roo-upload-cropbox-center',
 +                action : 'center',
 +                cn : [
 +                    {
 +                        tag : 'button',
 +                        cls : 'btn btn-default',
 +                        html : 'CENTER'
 +                    }
 +                ]
 +            }
          ]
      }
  });
diff --combined roojs-ui.js
@@@ -986,16 -986,16 +986,16 @@@ A.removeChild(cn);A.parentNode.insertBe
  }C.push(F);});A.className=C.length?C.join(' '):'';if(!C.length){A.removeAttribute("class");}}if(A.hasAttribute("lang")){A.removeAttribute("lang");}if(A.hasAttribute("style")){var D=A.getAttribute("style").split(";");var E=[];Roo.each(D,function(s){if(!s.match(/:/)){return;
  }var kv=s.split(":");if(kv[0].match(/^(mso-|line|font|background|margin|padding|color)/)){return;}E.push(s);});A.setAttribute("style",E.length?E.join(';'):'');if(!E.length){A.removeAttribute('style');}}return true;},styleToObject:function(A){var B=(A.getAttribute("style")||'').split(";");
  var C={};Roo.each(B,function(s){if(!s.match(/:/)){return;}var kv=s.split(":");C[kv[0].trim()]=kv[1];});return C;},replaceAname:function(A){var aa=Array.from(A.getElementsByTagName('a'));for(var i=0;i<aa.length;i++){var a=aa[i];if(a.hasAttribute("name")){a.removeAttribute("name");
- }if(a.hasAttribute("href")){continue;}this.removeNodeKeepChildren(a);}},replaceDocBullets:function(A){var B=A.getElementsByClassName('MsoListParagraphCxSpFirst');for(var i=0;i<B.length;i++){B.item(i).className="MsoListParagraph";}B=A.getElementsByClassName('MsoListParagraphCxSpMiddle');
- for(var i=0;i<B.length;i++){B.item(i).className="MsoListParagraph";}B=A.getElementsByClassName('MsoListParagraphCxSpLast');for(var i=0;i<B.length;i++){B.item(i).className="MsoListParagraph";}B=A.getElementsByClassName('ql-indent-1');for(var i=0;i<B.length;
- i++){B.item(i).className="MsoListParagraph";}var C=A.getElementsByTagName('h2');for(var i=0;i<C.length;i++){if(C.item(i).hasAttribute('style')&&C.item(i).getAttribute('style').match(/mso-list:/)){C.item(i).className="MsoListParagraph";}}B=A.getElementsByClassName('MsoNormal');
while(B.length){if(B.item(0).hasAttribute('style')&&B.item(0).getAttribute('style').match(/mso-list:/)){B.item(0).className="MsoListParagraph";}else{B.item(0).className="MsoNormalx";}}B=A.getElementsByClassName('MsoListParagraph');while(B.length){this.replaceDocBullet(B.item(0));
+ }if(a.hasAttribute("href")){continue;}this.removeNodeKeepChildren(a);}},replaceDocBullets:function(A){var B=Array.from(A.getElementsByClassName('MsoListParagraphCxSpFirst'));for(var i=0;i<B.length;i++){B[i].className="MsoListParagraph";}B=Array.from(A.getElementsByClassName('MsoListParagraphCxSpMiddle'));
+ for(var i=0;i<B.length;i++){B[i].className="MsoListParagraph";}B=Array.from(A.getElementsByClassName('MsoListParagraphCxSpLast'));for(var i=0;i<B.length;i++){B[i].className="MsoListParagraph";}B=Array.from(A.getElementsByClassName('ql-indent-1'));for(var i=0;
+ i<B.length;i++){B[i].className="MsoListParagraph";}var C=Array.from(A.getElementsByTagName('h2'));for(var i=0;i<C.length;i++){if(C[i].hasAttribute('style')&&C[i].getAttribute('style').match(/mso-list:/)){C[i].className="MsoListParagraph";}}B=Array.from(A.getElementsByClassName('MsoNormal'));
for(var i=0;i<B.length;i++){if(B[i].hasAttribute('style')&&B[i].getAttribute('style').match(/mso-list:/)){B[i].className="MsoListParagraph";}else{B[i].className="MsoNormalx";}}B=A.getElementsByClassName('MsoListParagraph');while(B.length){this.replaceDocBullet(B.item(0));
  }},replaceDocBullet:function(p){var ns=p,A=p.parentNode,B=A.ownerDocument,C=[];var D='ul';while(ns){if(ns.nodeType!=1){ns=ns.nextSibling;continue;}if(!ns.className.match(/(MsoListParagraph|ql-indent-1)/i)){break;}var E=ns.getElementsByTagName('span');if(ns.hasAttribute('style')&&ns.getAttribute('style').match(/mso-list/)){C.push(ns);
  ns=ns.nextSibling;G=true;if(E.length&&E[0].hasAttribute('style')){var F=this.styleToObject(E[0]);if(typeof(F['font-family'])!='undefined'&&!F['font-family'].match(/Symbol/)){D='ol';}}continue;}var E=ns.getElementsByTagName('span');if(!E.length){break;}var G=false;
  for(var i=0;i<E.length;i++){if(E[i].hasAttribute('style')&&E[i].getAttribute('style').match(/mso-list/)){G=true;break;}}if(!G){break;}C.push(ns);ns=ns.nextSibling;}if(!C.length){ns.className="";return;}var ul=A.ownerDocument.createElement(D);A.insertBefore(ul,p);
  var H=0;var I=[ul];var J=false;var K={};max_margins=-1;C.forEach(function(n,L){var M=n.getElementsByTagName('span');if(!M.length){A.removeChild(n);return;}var N=1;var O={};for(var i=0;i<M.length;i++){O=this.styleToObject(M[i]);if(typeof(O['mso-list'])=='undefined'){continue;
  }if(D=='ol'){N=M[i].innerText.replace(/[^0-9]+]/g,'')*1;}M[i].parentNode.removeChild(M[i]);break;}O=this.styleToObject(n);if(typeof(O['mso-list'])=='undefined'){A.removeChild(n);return;}var P=O['margin-left'];if(typeof(K[P])=='undefined'){max_margins++;K[P]=max_margins;
- }nlvl=K[P];if(nlvl>H){var Q=B.createElement(D);if(!J){J=B.createElement('li');I[H].appendChild(J);}J.appendChild(Q);I[nlvl]=Q;}H=nlvl;if(!I[nlvl].hasAttribute("start")&&N>1){I[nlvl].setAttribute("start",N);}var R=I[nlvl].appendChild(B.createElement('li'));
+ }nlvl=K[P];if(nlvl>H){var Q=B.createElement(D);if(!J){J=B.createElement('li');I[H].appendChild(J);}J.appendChild(Q);I[nlvl]=Q;}H=nlvl;if(!I[nlvl].hasAttribute("start")&&D=="ol"){I[nlvl].setAttribute("start",N);}var R=I[nlvl].appendChild(B.createElement('li'));
  J=R;R.innerHTML=n.innerHTML;A.removeChild(n);},this);}});
  // Roo/htmleditor/FilterStyleToTag.js
  Roo.htmleditor.FilterStyleToTag=function(A){this.tags={B:['fontWeight','bold'],I:['fontStyle','italic'],SUP:['verticalAlign','super'],SUB:['verticalAlign','sub']};Roo.apply(this,A);this.walk(A.node);};Roo.extend(Roo.htmleditor.FilterStyleToTag,Roo.htmleditor.Filter,{tag:true,tags:false,replaceTag:function(A){if(A.getAttribute("style")===null){return true;
@@@ -1133,9 -1133,10 +1133,10 @@@ this.doc.open();this.doc.write(this.get
  }}},toggleSourceEdit:function(A){this.sourceEditMode=A===true;if(this.sourceEditMode){Roo.get(this.iframe).addClass(['x-hidden','hide','d-none']);}else{Roo.get(this.iframe).removeClass(['x-hidden','hide','d-none']);this.deferFocus();}},cleanHtml:function(A){A=String(A);
  if(A.length>5){if(Roo.isSafari){A=A.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,'');}}if(A=='&nbsp;'){A='';}return A;},syncValue:function(){if(this.initialized){if(this.undoManager){this.undoManager.addEvent();}var bd=(this.doc.body||this.doc.documentElement);
  var A=this.win.getSelection();var B=document.createElement('div');B.innerHTML=bd.innerHTML;var C=B.getElementsByClassName('gtx-trans-icon');if(C.length>0){var rm=C.item(0).parentNode;rm.parentNode.removeChild(rm);}if(this.enableBlocks){new Roo.htmleditor.FilterBlock({node:B}
- );}var D=new Roo.htmleditor.TidySerializer({inner:true});var E=D.serialize(B);if(Roo.isSafari){var bs=bd.getAttribute('style');var m=bs?bs.match(/text-align:(.*?);/i):false;if(m&&m[1]){E='<div style="'+m[0]+'">'+E+'</div>';}}E=this.cleanHtml(E);E=E.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u0080-\uFFFF]/g,function(F){var cc=F.charCodeAt();
- if(F.length==2){var G=F.charCodeAt(0)-0xD800;var H=F.charCodeAt(1)-0xDC00;cc=(G*0x400)+H+0x10000;}else if((cc>=0x4E00&&cc<0xA000)||(cc>=0x3400&&cc<0x4E00)||(cc>=0xf900&&cc<0xfb00)){return F;}return "&#"+cc+";";});if(this.owner.fireEvent('beforesync',this,E)!==false){this.el.dom.value=E;
- this.owner.fireEvent('sync',this,E);}}},pushValue:function(){if(this.initialized){var v=this.el.dom.value.trim();if(this.owner.fireEvent('beforepush',this,v)!==false){var d=(this.doc.body||this.doc.documentElement);d.innerHTML=v;this.el.dom.value=d.innerHTML;
+ );}var D=B.innerHTML;if(this.autoClean){new Roo.htmleditor.FilterAttributes({node:B,attrib_white:['href','src','name','align','colspan','rowspan','data-display','data-width','start','style','class','allowfullscreen','frameborder','width','height','alt'],attrib_clean:['href','src']}
+ );var E=new Roo.htmleditor.TidySerializer({inner:true});D=E.serialize(B);}if(Roo.isSafari){var bs=bd.getAttribute('style');var m=bs?bs.match(/text-align:(.*?);/i):false;if(m&&m[1]){D='<div style="'+m[0]+'">'+D+'</div>';}}D=this.cleanHtml(D);D=D.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u0080-\uFFFF]/g,function(F){var cc=F.charCodeAt();
+ if(F.length==2){var G=F.charCodeAt(0)-0xD800;var H=F.charCodeAt(1)-0xDC00;cc=(G*0x400)+H+0x10000;}else if((cc>=0x4E00&&cc<0xA000)||(cc>=0x3400&&cc<0x4E00)||(cc>=0xf900&&cc<0xfb00)){return F;}return "&#"+cc+";";});if(this.owner.fireEvent('beforesync',this,D)!==false){this.el.dom.value=D;
+ this.owner.fireEvent('sync',this,D);}}},pushValue:function(){if(this.initialized){var v=this.el.dom.value.trim();if(this.owner.fireEvent('beforepush',this,v)!==false){var d=(this.doc.body||this.doc.documentElement);d.innerHTML=v;this.el.dom.value=d.innerHTML;
  this.owner.fireEvent('push',this,v);}if(this.autoClean){new Roo.htmleditor.FilterParagraph({node:this.doc.body});new Roo.htmleditor.FilterSpan({node:this.doc.body});}if(this.enableBlocks){Roo.htmleditor.Block.initAll(this.doc.body);}this.updateLanguage();
  var lc=this.doc.body.lastChild;if(lc&&lc.nodeType==1&&lc.getAttribute("contenteditable")=="false"){this.doc.body.appendChild(this.doc.createElement('br'));}}},deferFocus:function(){this.focus.defer(10,this);},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus();
  }else{this.el.focus();}},assignDocWin:function(){var A=this.iframe;if(Roo.isIE){this.doc=A.contentWindow.document;this.win=A.contentWindow;}else{if(!Roo.get(this.frameId)&&!A.contentDocument){return;}this.doc=(A.contentDocument||Roo.get(this.frameId).dom.document);
@@@ -1957,26 -1958,20 +1958,26 @@@ this.footerEl.hide();this.setThumbBoxSi
  this.bodyEl.on('touchmove',this.onTouchMove,this);this.bodyEl.on('touchend',this.onTouchEnd,this);}if(!Roo.isTouch){this.bodyEl.on('mousedown',this.onMouseDown,this);this.bodyEl.on('mousemove',this.onMouseMove,this);var B=(/Firefox/i.test(navigator.userAgent))?'DOMMouseScroll':'mousewheel';
  this.bodyEl.on(B,this.onMouseWheel,this);Roo.get(document).on('mouseup',this.onMouseUp,this);}this.selectorEl.on('change',this.onFileSelected,this);},reset:function(){this.scale=0;this.baseScale=1;this.rotate=0;this.baseRotate=1;this.dragable=false;this.pinching=false;
  this.mouseX=0;this.mouseY=0;this.cropData=false;this.notifyEl.dom.innerHTML=this.emptyText;},resize:function(){if(this.fireEvent('resize',this)!=false){this.setThumbBoxPosition();this.setCanvasPosition();}},onFooterButtonClick:function(e,el,o,A){switch(A){case 'rotate-left':this.onRotateLeft(e);
 -break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);
 +break;case 'rotate-right':this.onRotateRight(e);break;case 'picture':this.beforeSelectFile(e);break;case 'trash':this.trash(e);break;case 'crop':this.crop(e);break;case 'download':this.download(e);break;case 'center':this.center(e);break;default:break;}this.fireEvent('footerbuttonclick',this,A);
  },beforeSelectFile:function(e){e.preventDefault();if(this.fireEvent('beforeselectfile',this)!=false){this.selectorEl.dom.click();}},onFileSelected:function(e){e.preventDefault();if(typeof(this.selectorEl.dom.files)=='undefined'||!this.selectorEl.dom.files.length){return;
 -}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset();
 +}var A=this.selectorEl.dom.files[0];if(this.fireEvent('inspect',this,A)!=false){this.prepare(A);}},trash:function(e){this.fireEvent('trash',this);},download:function(e){this.fireEvent('download',this);},center:function(e){this.setCanvasPosition();},loadCanvas:function(A){if(this.fireEvent('beforeloadcanvas',this,A)!=false){this.reset();
  this.imageEl=document.createElement('img');var B=this;this.imageEl.addEventListener("load",function(){B.onLoadCanvas();});this.imageEl.src=A;}},onLoadCanvas:function(){this.imageEl.OriginWidth=this.imageEl.naturalWidth||this.imageEl.width;this.imageEl.OriginHeight=this.imageEl.naturalHeight||this.imageEl.height;
  if(this.fireEvent('loadcanvas',this,this.imageEl)!=false){this.bodyEl.un('click',this.beforeSelectFile,this);this.notifyEl.hide();this.thumbEl.show();this.footerEl.show();this.baseRotateLevel();if(this.isDocument){this.setThumbBoxSize();}this.setThumbBoxPosition();
 -this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(){if(!this.canvasEl){return;}var pw=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var ph=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);
 -this.previewEl.setLeft(pw);this.previewEl.setTop(ph);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width<this.thumbEl.getWidth()||this.canvasEl.height<this.thumbEl.getHeight())){this.dragable=false;
 -return;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=Math.ceil(this.thumbEl.getLeft(true));
 -var B=Math.ceil(this.thumbEl.getTop(true));var C=Math.ceil(A+this.thumbEl.getWidth()-this.canvasEl.width);var D=Math.ceil(B+this.thumbEl.getHeight()-this.canvasEl.height);if(A>C){var E=A;A=C;C=E;}if(B>D){var F=B;B=D;D=F;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();
 -var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var G=Math.ceil(x+this.previewEl.getLeft(true));var H=Math.ceil(y+this.previewEl.getTop(true));G=(G<A)?A:((G>C)?C:G);H=(H<B)?B:((H>D)?D:H);this.previewEl.setLeft(G);
 -this.previewEl.setTop(H);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();
 -this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;
 -}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);var D=this.imageEl.OriginWidth;var E=this.imageEl.OriginHeight;if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;
 -}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&((this.imageEl.OriginWidth/this.imageEl.OriginHeight>=this.minWidth/this.minHeight)&&B<this.minWidth||(this.imageEl.OriginWidth/this.imageEl.OriginHeight<=this.minWidth/this.minHeight)&&C<this.minHeight||B>D||C>E)){return false;
 +this.baseScaleLevel();this.draw();this.resize();this.canvasLoaded=true;}if(this.loadMask){this.maskEl.unmask();}},setCanvasPosition:function(A=true){if(!this.canvasEl){return;}var B=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);var C=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);
 +if(A){this.previewEl.setLeft(B);this.previewEl.setTop(C);return;}var D=this.baseScale*Math.pow(1.02,this.startScale);var E=Math.floor(this.imageEl.OriginWidth*D);var F=Math.floor(this.imageEl.OriginHeight*D);var G=Math.ceil((this.bodyEl.getWidth()-E)/2);var H=Math.ceil((this.bodyEl.getHeight()-F)/2);
 +var I=B-G;var J=C-H;var K=this.previewEl.getLeft(true)+I;var L=this.previewEl.getTop(true)+J;this.previewEl.setLeft(K);this.previewEl.setTop(L);},onMouseDown:function(e){e.stopEvent();this.dragable=true;this.pinching=false;if(this.isDocument&&(this.canvasEl.width<this.thumbEl.getWidth()||this.canvasEl.height<this.thumbEl.getHeight())){this.dragable=false;
 +return;}this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();},onMouseMove:function(e){e.stopEvent();if(!this.canvasLoaded){return;}if(!this.dragable){return;}var A=this.canvasEl.width/0.9*0.05;
 +var B=A*this.minHeight/this.minWidth;if((this.imageEl.OriginWidth/this.imageEl.OriginHeight<=this.minWidth/this.minHeight)){A=(this.canvasEl.height*this.minWidth/this.minHeight-this.canvasEl.width)/2+A;}if((this.imageEl.OriginWidth/this.imageEl.OriginHeight>=this.minWidth/this.minHeight)){B=(this.canvasEl.width*this.minHeight/this.minWidth-this.canvasEl.height)/2+B;
 +}var C=Math.ceil(this.thumbEl.getLeft(true)+this.thumbEl.getWidth()-this.canvasEl.width-A);var D=Math.ceil(this.thumbEl.getTop(true)+this.thumbEl.getHeight()-this.canvasEl.height-B);var E=Math.ceil(this.thumbEl.getLeft(true)+A);var F=Math.ceil(this.thumbEl.getTop(true)+B);
 +if(C>E){var G=C;C=E;E=G;}if(D>F){var H=D;D=F;F=H;}var x=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();var y=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();x=x-this.mouseX;y=y-this.mouseY;var I=Math.ceil(x+this.previewEl.getLeft(true));
 +var J=Math.ceil(y+this.previewEl.getTop(true));I=(I<C)?C:((I>E)?E:I);J=(J<D)?D:((J>F)?F:J);this.previewEl.setLeft(I);this.previewEl.setTop(J);this.mouseX=Roo.isTouch?e.browserEvent.touches[0].pageX:e.getPageX();this.mouseY=Roo.isTouch?e.browserEvent.touches[0].pageY:e.getPageY();
 +},onMouseUp:function(e){e.stopEvent();this.dragable=false;},onMouseWheel:function(e){e.stopEvent();this.startScale=this.scale;this.scale=(e.getWheelDelta()>0)?(this.scale+1):(this.scale-1);if(!this.zoomable()){this.scale=this.startScale;return;}this.draw();
 +return;},zoomable:function(){var A=this.thumbEl.getWidth()/this.minWidth;if(this.minWidth<this.minHeight){A=this.thumbEl.getHeight()/this.minHeight;}var B=Math.ceil(this.imageEl.OriginWidth*this.getScaleLevel()/A);var C=Math.ceil(this.imageEl.OriginHeight*this.getScaleLevel()/A);
 +var D=this.imageEl.OriginWidth;var E=this.imageEl.OriginHeight;var F=Math.floor(this.imageEl.OriginWidth*this.getScaleLevel());var G=Math.floor(this.imageEl.OriginHeight*this.getScaleLevel());var H=Math.ceil((this.bodyEl.getWidth()-this.canvasEl.width)/2);
 +var I=Math.ceil((this.bodyEl.getHeight()-this.canvasEl.height)/2);var J=Math.ceil((this.bodyEl.getWidth()-F)/2);var K=Math.ceil((this.bodyEl.getHeight()-G)/2);var L=J-H;var M=K-I;var N=this.previewEl.getLeft(true)+L;var O=this.previewEl.getTop(true)+M;var P=N-this.thumbEl.getLeft(true);
 +var Q=O-this.thumbEl.getTop(true);var R=this.thumbEl.getLeft(true)+this.thumbEl.getWidth()-F-N;var S=this.thumbEl.getTop(true)+this.thumbEl.getHeight()-G-O;var T=F/0.9*0.05;var U=T*this.minHeight/this.minWidth;if((this.imageEl.OriginWidth/this.imageEl.OriginHeight<=this.minWidth/this.minHeight)){T=(G*this.minWidth/this.minHeight-F)/2+T;
 +}if((this.imageEl.OriginWidth/this.imageEl.OriginHeight>=this.minWidth/this.minHeight)){U=(F*this.minHeight/this.minWidth-G)/2+U;}if(this.isDocument&&(this.rotate==0||this.rotate==180)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minWidth&&C<this.minHeight))){return false;
 +}if(this.isDocument&&(this.rotate==90||this.rotate==270)&&(B>this.imageEl.OriginWidth||C>this.imageEl.OriginHeight||(B<this.minHeight&&C<this.minWidth))){return false;}if(!this.isDocument&&(this.rotate==0||this.rotate==180)&&(P>T||R>T||Q>U||S>U||B>D||C>E)){return false;
  }if(!this.isDocument&&(this.rotate==90||this.rotate==270)&&(B<this.minHeight||B>this.imageEl.OriginWidth||C<this.minWidth||C>this.imageEl.OriginHeight)){return false;}return true;},onRotateLeft:function(e){if(!this.isDocument&&(this.canvasEl.height<this.thumbEl.getWidth()||this.canvasEl.width<this.thumbEl.getHeight())){var A=this.thumbEl.getWidth()/this.minWidth;
  var bw=Math.ceil(this.canvasEl.width/this.getScaleLevel());var bh=Math.ceil(this.canvasEl.height/this.getScaleLevel());this.startScale=this.scale;while(this.getScaleLevel()<A){this.scale=this.scale+1;if(!this.zoomable()){break;}if(Math.ceil(bw*this.getScaleLevel())<this.thumbEl.getHeight()||Math.ceil(bh*this.getScaleLevel())<this.thumbEl.getWidth()){continue;
  }this.rotate=(this.rotate<90)?270:this.rotate-90;this.draw();return;}this.scale=this.startScale;this.onRotateFail();return false;}this.rotate=(this.rotate<90)?270:this.rotate-90;if(this.isDocument){this.setThumbBoxSize();this.setThumbBoxPosition();this.setCanvasPosition();
@@@ -1991,7 -1986,7 +1992,7 @@@ break;case 90:this.canvasEl.width=this.
  break;}this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;case 180:this.canvasEl.width=this.imageEl.OriginWidth*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginHeight*this.getScaleLevel();
  if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;}this.contextEl.drawImage(A,Math.abs(this.canvasEl.width-this.canvasEl.height),0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);
  break;case 270:this.canvasEl.width=this.imageEl.OriginHeight*this.getScaleLevel();this.canvasEl.height=this.imageEl.OriginWidth*this.getScaleLevel();if(this.imageEl.OriginWidth>this.imageEl.OriginHeight){this.contextEl.drawImage(A,0,0,this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);
 -break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition();
 +break;}this.contextEl.drawImage(A,0,Math.abs(this.canvasEl.width-this.canvasEl.height),this.canvasEl.width,this.canvasEl.height,0,0,this.canvasEl.width,this.canvasEl.height);break;default:break;}this.previewEl.appendChild(this.canvasEl);this.setCanvasPosition(false);
  },crop:function(){if(!this.canvasLoaded){return;}var A=document.createElement("canvas");var B=A.getContext("2d");A.width=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;A.height=(this.imageEl.OriginWidth>this.imageEl.OriginHeight)?this.imageEl.OriginWidth:this.imageEl.OriginHeight;
  var C=A.width/2;B.translate(C,C);B.rotate(this.rotate*Math.PI/180);B.drawImage(this.imageEl,0,0,this.imageEl.OriginWidth,this.imageEl.OriginHeight,C*-1,C*-1,this.imageEl.OriginWidth,this.imageEl.OriginHeight);var D=document.createElement("canvas");var E=D.getContext("2d");
  D.width=this.thumbEl.getWidth()/this.getScaleLevel();D.height=this.thumbEl.getHeight()/this.getScaleLevel();switch(this.rotate){case 0:var F=(this.thumbEl.getWidth()/this.getScaleLevel()>this.imageEl.OriginWidth)?this.imageEl.OriginWidth:(this.thumbEl.getWidth()/this.getScaleLevel());
@@@ -2046,4 -2041,4 +2047,4 @@@ return;}if(E===1){return G.getValue(A,I
  ]},{tag:'div',cls:'btn-group roo-upload-cropbox-download',action:'download',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-download"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-crop',action:'crop',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-crop"></i>'}
  ]},{tag:'div',cls:'btn-group roo-upload-cropbox-trash',action:'trash',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-trash"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}
  ]}],ROTATOR:[{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-left',action:'rotate-left',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-undo"></i>'}]},{tag:'div',cls:'btn-group roo-upload-cropbox-rotate-right',action:'rotate-right',cn:[{tag:'button',cls:'btn btn-default',html:'<i class="fa fa-repeat"></i>'}
 -]}]}});
 +]}],CENTER:[{tag:'div',cls:'btn-group roo-upload-cropbox-center',action:'center',cn:[{tag:'button',cls:'btn btn-default',html:'CENTER'}]}]}});