gusucode.com > CRM源码带手机版ASP源码程序 > Skin/Default/TQEditor/TQEditor.js
/************************************************* * TQEditor * Author : TengQiu Li * E-Mail : litqqs@163.com * Copyright : TengQiu Li * Version : 2.2.4 * Site : http://www.e512.net *************************************************/ (function(window,undefined){ if(window.TQE) return; var version='2.2.4',//编辑器版本 ua = navigator.userAgent.toLowerCase(), document=window.document, isIE =!!window.ActiveXObject, //ie // ua.indexOf('trident')>=0 || ua.indexOf('msie 6')>=0 ; isIE6 = isIE && !window.XMLHttpRequest,//ie6 isIE9 = isIE && !!document.createDocumentFragment, isWebkit = ua.indexOf('webkit')>=0,//chrome,safari isOpera = ua.indexOf('presto')>=0, //opera isGecko = !isWebkit && !isOpera && ua.indexOf('gecko')>=0, //firefox //相关资源 resStrCreateLink='添加链接', resStrTargetOptions='<option value="">默认</option><option value="_blank">新窗口</option><option value="_self">当前窗口</option><option value="_parent">父窗口</option><option value="_top">顶层窗口</option>', resStrInsertLinkUI='网址:<input type="text" id="url" value="" size=45 /><br />标题:<input type="text" id="title" value="" size=45 /><br />打开:<select id="target">'+resStrTargetOptions+'</select>', resStrInsertImage='插入图片', resStrInsertImageUI='图片网址:<input type="text" id="url" value="" size=40 /><br />替换文本:<input name="alt" type="text" id="alt" size="20" /><br />尺寸:<input name="width" type="text" id="width" size="4" /> × <input name="height" type="text" id="height" size="4" /> px <br />对齐:<select name="align" id="align"><option value="" >默认</option><option value="top">居上</option><option value="textTop">文本上方</option><option value="middle">居中</option><option value="absMiddle">绝对居中</option><option value="baseline">基线</option><option value="bottom">底部</option><option value="absBottom">绝对底部</option><option value="left">左</option><option value="right">右</option></select> 边框:<input name="border" type="text" id="border" size="5" />', resStrImageContextUI='<form class="ePopForm">网址: <input type="text" id="url" size="50"><br>尺寸: <input type="text" id="width" style="width:30px; overflow:visible;"> × <input type="text" id="height" style="width:30px; overflow:visible;">px <a href="javascript:void(0)" id="resetWH" >重设大小</a><label><input name="lock" type="checkbox" id="lock" value="1" checked>锁定比例</label><br>替换文本: <input type="text" id="alt" /> 边框: <input type="text" id="border" style="width:30px; overflow:visible;" /><br>排版: <a href="javascript:void(0)" id="alignDefault">默认</a> | <a href="javascript:void(0)" id="alignLeft">左浮动</a> | <a href="javascript:void(0)" id="alignC">居中</a> | <a href="javascript:void(0)" id="alignRight">右浮动</a> | <a href="javascript:void(0)" id="alignTop">上对齐</a> | <a href="javascript:void(0)" id="alignAbsMiddle">中对齐</a> | <a href="javascript:void(0)" id="alignBottom">下对齐</a><div><hr>链接: <input type="text" id="link" size="40"><select id="target">'+resStrTargetOptions+'</select></div></form>', resStrInsertFlash='插入动画', resStrInsertFlashUI='Flash网址:<input type="text" id="url" value="" size=40 /><br />尺寸:<input name="width" type="text" id="width" size="4" value="200" />×<input name="height" type="text" id="height" size="4" value="200" /> px', resStrInsertMusic='插入音频', resStrInsertMusicUI='音频网址:<input type="text" id="url" value="" size=40 /><br />自动播放:<select id="auto_start" name="auto_start"><option value="0">手动开始</option><option value="1">自动开始</option></select>', resStrInsertVideo='插入视频', resStrInsertVideoUI='视频网址:<input type="text" id="url" value="" size=40 /><br />尺寸:<input name="width" type="text" id="width" size="4" value="320"/>×<input name="height" type="text" id="height" size="4" value="240" /> px<br />自动播放:<select id="auto_start" name="auto_start"><option value="0">手动开始</option><option value="1">自动开始</option></select><br />视频类型:<select id="video_type" name="video_type"><option value="auto">自动识别</option><option value="flv">FLV</option><option value="rm">RMVB</option><option value="wm">其他视频</option></select>', resStrInsertRow='插入行', resStrInsertCol='插入列', resStrDeleteRow='删除行', resStrDeleteCol='删除列', resStrDeleteTable='删除表格', resStrTableContextUI='<div><a class="eMenuItem" style="width:168px;" ><span id="eMergeCells" class="eButton"></span>合并单元格</a><a style="width:168px;" class="eMenuItem" ><span id="eSplitCells" class="eButton"></span>拆分单元格</a><hr width="166"><div style="padding:1px 1px 1px 3px;">表格排版: <a id="eTableAlignLeft">居左</a> | <a id="eTableAlignCenter">居中</a> | <a id="eTableAlignRight">居右</a></div><table border="0" cellSpacing="2" cellPadding="0"><tbody><tr><td width="65" align="center" valign="top" bgcolor="#FFFFFF" style="border:#999 solid 1px;">内容对齐<br><a id="eCellAlignLT" class="eButton eCellAlign"></a><a id="eCellAlignCT" class="eButton eCellAlign"></a><a id="eCellAlignRT" class="eButton eCellAlign"></a><br><a id="eCellAlignLC" class="eButton eCellAlign"></a><a id="eCellAlignCC" class="eButton eCellAlign"></a><a id="eCellAlignRC" class="eButton eCellAlign"></a><br><a id="eCellAlignLB" class="eButton eCellAlign"></a><a id="eCellAlignCB" class="eButton eCellAlign"></a><a id="eCellAlignRB" class="eButton eCellAlign"></a></td><td width="90" align="center" valign="top">宽度<input id="width" name="width" size="3" type="text"><br>边框<input id="border" name="border" size="3" type="text"><br>间距<input id="cellSpacing" name="cellSpacing" size="3" type="text"><br>填充<input id="cellPadding" name="cellPadding" size="3" type="text"></td></tr></tbody></table></div><div><hr width="166">插入表格</div>', resStrNoColor='无色', resStrOK='确定', resStrCenal='取消', resStrUpload='上传', resStrClose='关闭', resStrVersion='版本', resStrAuthor='作者', resStrSite='官网', resStrMail='邮箱', TQE=function(objId,userConfig) { var $=this,config=TQE.clone(TQE.config); $.objId = objId; if(userConfig){ for(var k in userConfig){ config[k] = userConfig[k]; } } if(typeof config.toolbar =='string'){ var tm=TQE.toolbarMode[config.toolbar]; if(!tm) tm=TQE.toolbarMode.normal; config.toolbar=tm.left; if(!userConfig || undefined===userConfig.toolbarRight)config.toolbarRight=tm.right; } $.config = config; $.hasFocus=false; $._containerDiv=null; $._toolbarDiv=null; $._clientDiv=null; $._statusDiv=null; //Methods $.init=function(){ $.obj = TQE.find($.objId); if(!$.obj){ if($.config.debug) throw('缺少ID为 '+$.objId+' 表单元素'); return; } if($.obj.editor) return;//对象不存在或已执行过 $.obj.editor = $; if (!$.config.width || $.config.width == "auto") { if($.obj.style.width){$.config.width = $.obj.style.width; } else if($.obj.cols){ $.config.width = ($.obj.cols * 8)+'px'; } else{ $.config.width = '100%'; } } if (!$.config.height || config.height == "auto") { if($.obj.style.height){ $.config.height = $.obj.style.height; } else if($.obj.rows){ $.config.height = ($.obj.rows * 17)+'px' } else{ $.config.height = '200'; } } //toolbar var i,j, btn,code ='<div class="eToolBar" id="'+$.objId+'_EditorToolBar">'; // if($.config.toolbarRight.length){ code +='<ul class="eToolBarGroupRight" >'; for(i=0; i < $.config.toolbarRight.length; i++){ code += $._btnCode($.config.toolbarRight[i], false); } code +='</ul>'; } //工具组 code +='<ul class="eToolBarGroup" >'; if($.config.showToolbarGroupHandle){ btn = TQE.toolbarBottons['group']; code +='<div class="eButton" id="eBTNgroup" style="background-position: -'+btn.left+'px 0;width:'+btn.width+'px;" ></div>'; } for(i=0; i < $.config.toolbar.length; i++){ code += $._btnCode($.config.toolbar[i], true); } code += '</ul>'+ //工具组完 '<div class="eClear"></div></div>'+ //编辑区 '<div id="'+$.objId+'_EditorClient" class="eEditorClient">'+ '<iframe id="'+$.objId+'_Editor" style="height:'+$.config.height+';" frameborder=0 ></iframe>'+ '</div>'+ '</div>'+ '<div class="eStatusBar"><div class="eResizeWH" ></div><div class="eResizeH" ></div></div>'; if (!$.config.debug) { $.obj.style.display = "none"; } var e =TQE.CE('DIV','TQEditorContainer_'+$.objId, code ); e.className='eEditor'; e.style.width=$.config.width; $.obj.parentNode.insertBefore(e, $.obj); $._containerDiv = e; $._toolbarDiv = TQE.find($.objId+'_EditorToolBar'); $._clientDiv = TQE.find($.objId+'_EditorClient'); TQE._noSel($._toolbarDiv); //TQE._noSel($._toolbarDiv,'DIV,UL,LI'); var btns = TQE._tags($._toolbarDiv,'LI'); for(i=btns.length-1;i>=0;i--){ $._ieMouseStyle(btns[i],'eButton','eButtonUp','eButtonDown'); //ie6 TQE.addListener(btns[i],'click', $._toolbarBottonClick); TQE.addListener(btns[i],'mouseout', function(){ var o=TQE.activePop; this.className= (o && o.relateObj==this)? 'eButtonDropDown':'eButton'; }); } if(isIE){//IE6或IE8兼容模式时需要 var groups = TQE._tags($._toolbarDiv,'UL'),w; for(i=groups.length-1;i>=0;i--){ w=3; btns=groups[i].childNodes; for(j=btns.length-1;j>=0;j--){w += btns[j].offsetWidth+2;} groups[i].style.minWidth=w+'px'; } } //-- if('function'===typeof $.config.oninit) $.config.oninit.call($); $._initContent($.obj.value); $.obj.focus = function(){this.editor.focus();} //ie //$._containerDiv.onresize=$._fixWidth; //if(!isIE && $.config.width.indexOf('%')){ // TQE.addListener(window,'resize',$._fixWidth); //} //-- $._statusDiv = e.lastChild; if(false==$.config.resize)$._statusDiv.style.display='none'; $._statusDiv.onmousedown=function(a){ var x,y,obj,maskDiv, o=this, //$=this.context, p=TQE.pos(this), scrollTop = TQE._docScrollTop(), scrollLeft = TQE._docScrollLeft(), h =parseInt( $.config.height,10), w=$._containerDiv.offsetWidth-2, bChangeWidth = this.style.cursor == 'se-resize', oldTop = TQE.pos($._clientDiv).y, documentMM=document.onmousemove, documentMU=document.onmouseup; $._showTableContext(0); if(isIE){ a=window.event; obj=a.srcElement; x=scrollLeft + a.clientX-p.x; y=scrollTop + a.clientY-p.y; }else{ obj=a.target; x=a.pageX-p.x; y=a.pageY-p.y; } bChangeWidth = bChangeWidth || obj===o.firstChild; o.mouseout=o.onmouseleave=null; //$.setOpacity(o,80); if(isWebkit || isIE6){ maskDiv=TQE.CE('DIV','','',true); maskDiv.className='eDragMaskDiv'; maskDiv.style.cursor= bChangeWidth ? 'se-resize':'s-resize'; maskDiv.style.height=Math.max(document.documentElement.clientHeight, document.body.scrollHeight)+'px'; } if(o.setCapture) o.setCapture(); else if(window.captureEvents) window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); document.onmousemove=function(a){ if(isIE){ a=window.event; a.pageX=scrollLeft + a.clientX; a.pageY=scrollTop + a.clientY; } var deltaH=oldTop - TQE.pos($._clientDiv).y, ty=Math.max(50-h+p.y-deltaH, a.pageY-y),tx=Math.max(100-w+p.x, a.pageX-x); if(bChangeWidth){ //o.style.width= tx-p.x + w +'px'; $.setWidth(tx-p.x + w); } //o.style.top=ty +'px'; $.setHeight(ty-p.y + h + deltaH ); }; document.onmouseup=function(a){ if(o.releaseCapture) o.releaseCapture(); else if(window.releaseEvents) window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP); document.onmousemove=documentMM; document.onmouseup=documentMU; if(maskDiv) document.body.removeChild(maskDiv); maskDiv=null; $.focus(); $._popTableContext(); //$.setOpacity(o,100); }; }; }; $._btnCode=function(tn, groupFlag){ var submenu='',btn,code,styleCode; if('||'===tn) tn='group'; else if('|'===tn) tn='separator'; else if('string'!==typeof tn){//子菜单 submenu= 'submenu="'+tn.join(',')+'" '; tn='submenu'; } btn = TQE.toolbarBottons[tn]; if(!btn) return ''; styleCode=function(btn){return 'id="eBTN'+tn+'" class="eButton"' + (btn.css ? ' style="'+btn.css+'"':'' ); }; switch(tn){ case 'group': if(!groupFlag) return ''; code='</ul><ul class="eToolBarGroup" >'; if($.config.showToolbarGroupHandle){ code+= '<div '+styleCode(btn)+' ></div>'; } return code; case 'separator': return '<div '+styleCode(btn)+' ></div>'; // id="eBTN'+tn+'" default: return'<li name="'+tn+'" title="'+btn.text+'" '+submenu+styleCode(btn)+' ></li>';//id="'+$.objId+'_'+tn+'" } }; //ie6 $._ieMouseStyle=function(obj,normal,hover,down){ if(!isIE || !isIE6 && document.compatMode == "CSS1Compat") return; TQE.addListener(obj,'mouseover', function(){this.className=hover;}); TQE.addListener(obj,'mouseup', function(){this.className=hover;}); TQE.addListener(obj,'mousedown', function(){this.className=down;}); TQE.addListener(obj,'mouseout', function(){this.className=normal;}); }; $._keepBookmark=function(){ if(isIE){ var _bookmark, win = TQE.find($.objId+'_Editor'); TQE.addListener(win,'beforedeactivate',function(){_bookmark=$._getRange();}); TQE.addListener(win,'activate',function(){ if(null==_bookmark) return; var sel=$._getSelection(); if(sel.addRange) sel.addRange(_bookmark); else _bookmark.select(); _bookmark=null; }); } }; $._toolbarBottonClick=function(){ var e=isIE ? event : arguments[0], cmd = this.getAttribute('name'), btn=TQE.toolbarBottons[cmd]; e.cancelBubble = true; $.focus(); if(btn && btn.click){ btn.click($,this); }else{ TQE.hidePop(); $.exeCmd(cmd); } }; $.__selectOption=function(selectObj,value){ for(var i=selectObj.options.length-1;i>=0;i--){ if(selectObj.options[i].value==value){ selectObj.selectedIndex=i; return; } } }; $.exeCmd=function(cmd,para){ $.focus(); var cells=$.selectedCells(), d=$._getDoc(), sel=$._getSelection(), i, r, fcs; if(cells.length){ r= d.createRange ? d.createRange() : d.body.createTextRange(); for(i=0;i<cells.length;i++){ if('backcolor'==cmd || 'hilitecolor'==cmd){ cells[i].style.backgroundColor=para; continue; } if(sel.empty) sel.empty(); //ie6,7,8 else if(sel.removeAllRanges) sel.removeAllRanges(); if(sel.selectAllChildren){ sel.selectAllChildren(cells[i]) }else if(r.moveToElementText){ //ie6,7,8 r.moveToElementText(cells[i]); r.select(); //}else{ // r.selectNode(cells[i]); // sel.addRange(r); } try{ d.execCommand(cmd,false, para!=null?para:false); if('bold'==cmd || 'italic'==cmd || 'underline'==cmd || 'strikethrough'==cmd || 'subscript'==cmd || 'superscript'==cmd){ if(i==0) fcs = d.queryCommandState(cmd); else if(fcs != d.queryCommandState(cmd)) d.execCommand(cmd,false, para!=null?para:false); } }catch(e){} } if(sel.empty) sel.empty(); //ie6,7,8 else if(sel.removeAllRanges) sel.removeAllRanges(); }else{ try{return d.execCommand(cmd,false, para!=null?para:false);}catch(e){} } }; $.focus=function(){ if($.hasFocus) return ; if('visual'==$.currentMode()){ var cells=$.selectedCells(),r,sel; if(cells.length<1){ $._editorObj().contentWindow.focus(); var r=$._getRange(), sel = $._getSelection(); if(isWebkit && sel.rangeCount<1){ r.selectNodeContents($._getDoc().body); r.collapse(true); sel.removeAllRanges(); sel.addRange(r); } }else{ var r=$._getRange(); if(r.select){ //ie6,7,8 r.collapse(false); r.select(); }else{ r.selectNodeContents(cells[0]); r.collapse(false); sel = $._getSelection(); sel.removeAllRanges(); sel.addRange(r); } } }else{ $._editorObj().focus(); } $.hasFocus=true; }; $.focusNode=function(){ if('visual'!==$.currentMode() || !$.hasFocus ) return null; var r,node = $._getSelection().focusNode; if(!node){//ie6,7,8 r = $._getRange(); return (r.length)? r.item(0).parentNode : r.parentElement? r.parentElement():null; } return node; }; $._showColorSelectUI=function(sender,cmd){ var o=TQE.find($.objId+'ColorSelect'+cmd); if(null==o){ o = TQE.CE('DIV',$.objId+'ColorSelect'+cmd, TQE._colorPickerUI() ,true); o.className='ePopPanel'; TQE._noSel(o);//,'TABLE,TR,TD,DIV'); TQE.listenTags(o,'TD','click',function(){TQE.hidePop();$.exeCmd(cmd, this.bgColor);}); o.lastChild.lastChild.onclick=function(){TQE.hidePop();$.exeCmd(cmd, '');}; TQE.listenTags(o,'TD','mouseover',function(){ var self=this, iid = window.setInterval(function(){self.style.backgroundColor=(self.style.backgroundColor!='')?'':'#FFFFFF'},500), p=this.parentNode.parentNode.parentNode.parentNode.lastChild; p.firstChild.style.backgroundColor=this.bgColor; p.firstChild.nextSibling.innerHTML=this.bgColor; this.style.backgroundColor='#FFFFFF'; this.onmouseout=function(){window.clearInterval(iid);this.style.backgroundColor='';} }); } TQE.pop(o,sender); }; $._popAsMenu=function(sender, btns){ var cmd=sender.getAttribute('name'), o=TQE.find($.objId+'PopMenu'+cmd), s='', es,i,tn,btn; if(null==o){ o = TQE.CE('DIV',$.objId+'PopMenu'+cmd, '' ,true); o.className='ePopPanel'; } for(i=0; i < btns.length; i++){ tn = btns[i]; if('separator'==tn || '|'==tn){ s +='<hr style="width:120px; clear:both;" />'; continue; } btn = TQE.toolbarBottons[tn]; if(btn){ s +='<div name="'+tn+'" class="eMenuItem" ><span class="eButton" id="eBTN'+tn+'" ></span>'+btn.text+'</div>'; } } o.innerHTML=s; TQE._noSel(o); if(isOpera)TQE._noSel(o,'DIV'); TQE.listenTags(o,'DIV','click',$._toolbarBottonClick); if(isIE6){ es = TQE._tags(o,'DIV'); for(i=es.length-1;i>=0;i--){ $._ieMouseStyle(es[i],'eMenuItem','eMenuItemUp','eMenuItem'); } } TQE.pop(o,sender); }; $._popFormUI=function(id, caption, htm, cbOK, intInputNames, uploadUrl, uploadFileTypes, uploadFileSize, uploadType){ var s='<form class="ePopForm">'; if(uploadUrl){ s+='<div class="eTabBar"><a href="javascript:void(0)" class="active" HIDEFOCUS="true">'+caption+'</a><a href="javascript:void(0)" HIDEFOCUS="true">'+resStrUpload+'</a></div>'; s+='<div>'; } s += htm; s+='<div class="eBar"><button id="OK" name="OK" type="submit" class="eBtn" HIDEFOCUS="true"/>'+resStrOK+'</button> <button id="Cancel" name="Cancel" type="button" class="eBtn" HIDEFOCUS="true">'+resStrCenal+'</button></div>'; if(uploadUrl){ s+='</div><div style="display:none">'; var url=uploadUrl; if(uploadUrl.substr(0,1)=='#'){//自定上传界面 url=uploadUrl.substring(1); }else{ //修正相对网址 if(!('http://'==uploadUrl.substr(0,7).toLowerCase() || '/'==uploadUrl.substr(0,1) || 'https://'==uploadUrl.substr(0,6).toLowerCase())){ if('?'==uploadUrl.substr(0,1)){ uploadUrl = location.pathname+uploadUrl; }else{ var a=location.pathname.split('/'); a[a.length-1]= uploadUrl; uploadUrl = a.join('/'); } } url=TQE.url+'upload.htm?url='+encodeURIComponent(uploadUrl)+'&field_name='+$.config.uploadFieldName+'&exts='+encodeURIComponent(uploadFileTypes)+'&max_size='+encodeURIComponent(uploadFileSize)+'&debug='+$.config.debug+'&upload_type='+uploadType; } s+='<iframe src="'+url+'" frameborder=0 width=358 height=45 ALLOWTRANSPARENCY=true marginwidth=0 marginheight=0 ></iframe>'; s+='</div>'; } s +='</form>'; var o= TQE.CE('DIV',id, s ,true); o.className='ePopPanel'; if(uploadUrl){ var tabClick=function(){ this.className='active'; var pn= this.parentNode.nextSibling; if(this.nextSibling){ this.nextSibling.className=''; pn.style.display=''; pn.nextSibling.style.display='none'; pn.parentNode.getElementsByTagName('INPUT')[0].focus(); }else if(this.previousSibling){ this.previousSibling.className=''; pn.style.display='none'; pn.nextSibling.style.display=''; } }, tabbar = o.firstChild.firstChild; tabbar.firstChild.onclick=tabClick; tabbar.lastChild.onclick=tabClick; } var f= TQE._tags(o,'FORM')[0],es = f.elements; f.srcEditor=$; es['Cancel'].onclick= TQE.hidePop; es['OK'].onclick=cbOK; f.onsubmit=function(){ this.elements['OK'].click(); return false; } if(intInputNames) for(i=intInputNames.length-1;i>=0;i--) $._intEdit(es[intInputNames[i]]); TQE._noSel(o); if(isOpera)TQE._noSel(o,'FORM,DIV'); return o; }; $.insertMusic=function(url,auto_start){ var s = $.config.tplMusic.replace(/\{\$url\}/g,url).replace(/\{\$auto_start\}/g,auto_start); $.insertHtml(s); }; $.insertFlash=function(url,width,height){ var s = $.config.tplFlash.replace(/\{\$url\}/g,url); s = s.replace(/\{\$width\}/g,width); s = s.replace(/\{\$height\}/g,height); $.insertHtml(s); }; $.insertVideo=function(url,auto_start,width,height,video_type){ var tpl='',ext; switch(video_type){ case 'rm':tpl = $.config.tplRm;break; case 'flv':tpl = $.config.tplFlv;break; case 'wm':tpl = $.config.tplVideo;break; default: ext = url.substr(url.lastIndexOf('.')).toLowerCase(); if('.flv'==ext){ tpl = $.config.tplFlv; }else if('.rm'==ext || '.rmvb'==ext){ tpl = $.config.tplRm; }else{ tpl = $.config.tplVideo; } break; } tpl = tpl.replace(/\{\$url\}/g,url).replace(/\{\$auto_start\}/g,auto_start).replace(/\{\$width\}/g,width).replace(/\{\$height\}/g,height); $.insertHtml(tpl); }; //可视模式时有效 //position 可选值[before|after|replace|-1|1|0] $.insertHtml=function(htm, position){// $.focus(); if('code'==$.currentMode()){ var editor=$._editorObj(); if(document.selection){//ie var r = document.selection.createRange(); if('before'==position || -1==position) r.text = htm+r.text; else if('after'==position || 1==position) r.text+=htm; else r.text=htm; r.select(); }else if(editor.selectionStart || editor.selectionStart=='0'){ var startPos = editor.selectionStart, endPos = editor.selectionEnd, scrollTop = editor.scrollTop, str=editor.value; if('before'==position || -1==position) htm = str.substring(startPos,endPos)+htm; else if('after'==position || 1==position) htm += str.substring(startPos,endPos); editor.value=str.substr(0,startPos)+htm+str.substr(endPos, str.length); editor.focus(); editor.selectionStart=editor.selectionEnd= startPos+htm.length; editor.scrollTop=scrollTop; }else{ editor.value+=htm; editor.focus(); } $.save(); return; } //$.unselectAllCells(); if(isGecko){ htm = htm.replace(/<td([^>]*)>\s*<\/td/ig, '<td$1 ><br></td'); } var r = $._getRange(); if(r.length){//ie var d=$._getDoc(), e=r.item(0), tr=d.body.createTextRange(); tr.moveToElementText(e); if('before'==position || -1==position){ tr.collapse(); }else if('after'==position || 1==position){ tr.collapse(false); }else{ r.execCommand('Delete'); } tr.pasteHTML(htm); tr.select();//重设光标 }else if(r.insertNode){//ie9,firefox,chrome,opera var cf,n,sel; if(r.createContextualFragment){//IE9 未实现此方法 cf=r.createContextualFragment(htm); }else{ cf =$._getDoc().createDocumentFragment(); cf.appendChild(TQE.CE('div')); cf.firstChild.outerHTML=htm; } if('before'==position || -1==position){ n= cf.lastChild; r.insertNode(cf); r.setEndAfter(n); }else if('after'==position || 1==position){ r.collapse(false); r.insertNode(cf); }else{ r.deleteContents(); r.insertNode(cf); } r.collapse(false); sel = $._getSelection(); sel.removeAllRanges(); sel.addRange(r); }else{ //ie6,7,8 if('before'==position || -1==position){ r.collapse(true); }else if('after'==position || 1==position){ r.collapse(false); } r.pasteHTML(htm); r.collapse(false); r.select(); } $.save(); }; //最后的地方加入网页代码 $.appendHtml=function(html){ $.unselectAllCells(); $.setContent($.content()+html); //if('code'==$.currentMode()) $._editorObj().value += html; //else $._getDoc().body.innerHTML += html; //return $; }; $._editorObj= function(){ return TQE.find($.objId+'_Editor'); }; $.currentMode=function(){//取得当前的编辑模式, code 代码 , visual 可视化 return ($._editorObj().tagName.toUpperCase()==='IFRAME')?'visual':'code'; }; $._getDoc=function(){ var iframe =$._editorObj(); return iframe.contentDocument || iframe.contentWindow.document; }; $._getSelection=function(){ var win =$._editorObj().contentWindow; return (win.getSelection) ? win.getSelection() : $._getDoc().selection; }; $._getRange=function(){ var selection=$._getSelection(), d=$._getDoc(),r; try{//标准dom r = selection.rangeCount > 0 ? selection.getRangeAt(0) : (selection.createRange ? selection.createRange() : d.createRange()); }catch (e){} if(!r) r = isIE ? d.body.createTextRange() : d.createRange(); return r; }; $.insertImage=function(image_url,width,height,border,alt,align){ if(''==image_url) return; var s='<img src="'+image_url+'" '; if(width!==undefined && ''!=width && !isNaN(parseInt(width)) && parseInt(width)>0 ) s += ' width='+parseInt(width); if(height!==undefined && ''!=height && !isNaN(parseInt(height)) && parseInt(height)>0 ) s +=' height='+parseInt(height); if(border!==undefined && ''!=border && !isNaN(parseInt(border))) s +=' border='+parseInt(border); if(alt!==undefined && ''!=alt) s +=' alt="'+alt+'"'; if(align!==undefined && ''!=align) s +=' align="'+align+'"'; s +=' />'; $.insertHtml(s); return; }; $._enableButton=function(btn,enable){ if(enable){ btn.disabled=false; $.setOpacity(btn,100); TQE.addListener(btn,'click',$._toolbarBottonClick); }else{ btn.disabled=true; $.setOpacity(btn,30); TQE.delListener(btn,'click',$._toolbarBottonClick); } }; $._updateToolbar=function(enable, buttons, exceptFlag){ var tb=$._toolbarDiv, btns = TQE._tags(tb,'LI'), i; for(i=btns.length-1;i>=0;i--){ if($.inArray(btns[i].getAttribute('name'), buttons) ^ exceptFlag ) { $._enableButton(btns[i],enable); } } }; //设置光标插入点 //$.setCaret=function(node, position){ // var d=$._getDoc(), sel = $._getSelection(); // if(isIE){ // tr=d.body.createTextRange(); // tr.moveToElementText(node) // tr.collapse(true); // tr.select(); // }else{ // tr = d.createRange(); // tr.selectNode(node); // tr.collapse(true); // sel.removeAllRanges(); // sel.addRange(tr); // } //}; $._hook=function(){ //if('visual'!=$.currentMode()) return; //!isIE || !$.config.enter2br || var doc=$._getDoc(); doc.onkeydown = function(e){ TQE._hideContext(); if(isIE) e = $._realEvent(e); var key = e.keyCode || e.which; if(e.ctrlKey &&(13==key || 10==key || 83==key)) $.save();//按 Ctrl+(Enter|s) 保存数据至表单 var r=$._call('keydown',e); if(undefined!==r && false==r) return false;//用户已处理 if((8==key || 46==key) && $.selectedCells().length) $.exeCmd('delete'); //清除选中单元格内容 if(key==13){ var o = $.focusNode(), p,br,tr,d; if(!o) return; if(o.nodeName==='#text') o = o.parentNode; if(o.className == 'splitPage'){//分页标题 p=o.parentNode; if(o.nextSibling && o.nextSibling.nodeName==='BR'){ br = o.nextSibling; }else{ br = document.createElement('BR'); if(p.lastChild == o){ p.appendChild(br); }else{ p.insertBefore(br,o.nextSibling); } } //重设光标 d=$._getDoc(); if(isIE){ tr=d.body.createTextRange(); tr.moveToElementText(br) tr.collapse(true); tr.select(); }else{ tr = d.createRange(); tr.selectNode(br); tr.collapse(true); var sel = $._getSelection(); sel.removeAllRanges(); sel.addRange(tr); } return false; } //-- //if(e.shiftKey){e.shiftKey=false;return true;} if($.config.enter2br){ if(o.tagName != 'LI'){ $.insertHtml('<br />'); return false; } }else if(!isIE && !e.shiftKey){//非IE, 回车默认是br的,加以修正 var r=$._getRange(), n, nn; for(n=r.startContainer; n; n=n.parentNode){ nn=n.nodeName; if(nn=='LI' || nn=='P'|| 'H1'==nn|| 'H2'==nn|| 'H3'==nn|| 'H4'==nn|| 'H5'==nn|| 'H6'==nn|| 'DIV'==nn) return true; } $.exeCmd('FormatBlock','p'); } } }; doc.onkeyup =function(e){ e = $._realEvent(e); var key = e.keyCode || e.which, node = this.body.firstChild; if((8===key || 46===key) && node&& node === doc.body.lastChild ){//delete | backspace var nn=node.nodeName, ns=node.innerHTML, reg=/^<(strong|em|b|i|u|font)[^>]*><\/\1>| $/i; if(nn==='P' || nn==='H1'|| nn==='H2'|| nn==='H3'|| nn==='H4'|| nn==='H5'|| nn==='H6' || nn==='BR'){ if(''===ns || reg.test(ns))doc.body.innerHTML=''; } } $._call('keyup',e); }; doc.ondragstart=function(e){TQE._hideContext();$._showTableContext(0);}; doc.onclick=function(e){ var node,r,sel; TQE._hideContext(); //$.focus(); //$._popTableContext(); if(!isIE){ node=e.target; if('IMG'===node.nodeName){ r = $._getDoc().createRange(); sel = $._getSelection(); r.selectNode(e.target); sel.removeAllRanges(); sel.addRange(r); $._popImagePanel(node); } }else{ e=$._realEvent(e); node= e.srcElement; if('IMG'===node.nodeName){ $._popImagePanel(node); } } }; if(isIE){ doc.onmousedown=doc.onclick; doc.onclick=null; } if($.config.autoClean) doc.body.onpaste=function(){setTimeout($.cleanWord,200);}; TQE.addListener(doc,'mouseup',TQE.hidePop); TQE.addListener(doc,'scroll',$._popTableContext); //if(isIE6 || isIE && (document.documentMode==7 || document.compatMode != "CSS1Compat")) TQE.addListener(doc.body,'scroll',$._popTableContext); //IE6或兼容视图 TQE.addListener(doc,'keyup', $._popTableContext); TQE.addListener(doc,'mouseup',$._popTableContext); TQE.addListener(doc,'mousedown',$._startSelectTd); TQE.addListener(doc,'keypress',$.unselectAllCells); //TQE.addListener(doc,'blur',$.unselectAllCells); if(isIE6){ TQE.addListener(doc,'mouseup',$.focus); TQE.addListener(doc,'mousedown',$.focus); } }; $._popImagePanel=function(img){ var o=TQE.find('__tqImagePanel'); if(null==o){ //var s='<form class="ePopForm">网址: <input type="text" id="url" size="50"><br>尺寸: <input type="text" id="width" style="width:30px; overflow:visible;"> × <input type="text" id="height" style="width:30px; overflow:visible;">px <a href="javascript:void(0)" id="resetWH" >重设大小</a><label><input name="lock" type="checkbox" id="lock" value="1" checked>锁定比例</label><br>替换文本: <input type="text" id="alt" /> 边框: <input type="text" id="border" style="width:30px; overflow:visible;" /><br>排版: <a href="javascript:void(0)" id="alignDefault">默认</a> | <a href="javascript:void(0)" id="alignLeft">左浮动</a> | <a href="javascript:void(0)" id="alignC">居中</a> | <a href="javascript:void(0)" id="alignRight">右浮动</a> | <a href="javascript:void(0)" id="alignTop">上对齐</a> | <a href="javascript:void(0)" id="alignAbsMiddle">中对齐</a> | <a href="javascript:void(0)" id="alignBottom">下对齐</a><div>链接: <input type="text" id="link" size="40"><select id="target"><option value="" >默认</option><option value="_blank">新窗口</option><option value="_self">当前窗口</option><option value="_parent">父窗口</option><option value="_top">顶层窗口</option></select></div></form>'; o= TQE.CE('DIV','__tqImagePanel', resStrImageContextUI ,true); o.className='ePopPanel'; var f= TQE._tags(o,'FORM')[0], es = f.elements; $._intEdit(es['width']); $._intEdit(es['height']); $._intEdit(es['border']); o.urlField=es['url']; o.widthField=es['width']; o.heightField=es['height']; o.lockField=es['lock']; o.borderField=es['border']; o.altField=es['alt']; //link attri o.linkField=es['link']; o.targetField=es['target']; o.linkField.onchange=function(){ var o=this.parentNode.parentNode.parentNode, img=o.target, a=img.parentNode; if(a.nodeName!=='A') return; a.setAttribute('href', this.value); }; o.targetField.onchange=function(){ var o=this.parentNode.parentNode.parentNode, img=o.target, a=img.parentNode; if(a.nodeName!=='A') return ; a.setAttribute('target', this.options[this.selectedIndex].value); }; o.urlField.onchange=function(){ this.parentNode.parentNode.target.src=this.value;; }; o.urlField.onfocus=function(){this.select();}; var setwh=function(){ var o=this.parentNode.parentNode, img=o.target, w=h=Math.max(1,this.value); if(o.lockField.checked){ if(this.id=='width') h=o.heightField.value=Math.round(w/ o.rate); else w=o.widthField.value=Math.round(h * o.rate); }else{ if(this.id=='width') h=o.heightField.value; else w=o.widthField.value; } img.width=w; img.height=h; img.style.width=''; img.style.height=''; }; o.widthField.onchange=o.widthField.onblur=o.heightField.onchange=o.heightField.onblur=setwh; o.borderField.onchange=function(){ var img= this.parentNode.parentNode.target; if(''===this.value) img.removeAttribute('border'); else img.border=this.value; }; o.altField.onchange=function(){ var img= this.parentNode.parentNode.target; if(''===this.value) img.removeAttribute('alt'); else img.alt=this.value; }; o.lockField.onclick=function(){ if(this.checked){ var o=this.parentNode.parentNode.parentNode; o.rate=o.widthField.value/o.heightField.value; } }; var aClick=function(e){ var op=this.parentNode.parentNode, o=op.target, id=this.id; if('resetWH'==id){ o.removeAttribute('width'); o.removeAttribute('height'); o.style.width=''; o.style.height=''; op.widthField.value=o.width; op.heightField.value=o.height; op.rate=o.width/o.height; }else{ // if('align'==id.substring(0,5)){ o.align=''; o.style.display=''; o.style.margin=''; $.exeCmd('justifynone'); if('alignC'==id){ //o.style.display='block'; //o.style.margin='5px auto'; $.exeCmd('justifycenter'); }else if('alignDefault'!=id){ o.align=id.substring(5,20).toLowerCase();; } } return false; }; var os = TQE._tags(o,'A'),i; for(i=os.length-1;i>=0;i--){ os[i].onclick=aClick; } TQE._noSel(o); } if(img.parentNode && img.parentNode.nodeName==='A'){ o.lastChild.lastChild.style.display=''; o.linkField.value=img.parentNode.getAttribute('href'); $.__selectOption(o.targetField, img.parentNode.getAttribute('target')); }else{ o.lastChild.lastChild.style.display='none'; o.linkField.value=''; o.targetField.selectedIndex=0; } o.target=img; o.urlField.value=img.getAttribute('src'); o.widthField.value=img.width; o.heightField.value=img.height; o.borderField.value=img.border; o.altField.value=img.alt; o.rate= (img.width>0 && img.height>0) ? img.width / img.height:1; $._popContext(o, img); }; $._popContext=function(o,relateObj){ if(TQE.activeContext != o )TQE._hideContext(); var x,y,my p=TQE.pos($._editorObj()), p2=relateObj.getBoundingClientRect(), d=TQE._doc(); o.style.display="block"; x = Math.min( p.x+ p2.left , TQE._docScrollLeft() + d.clientWidth-o.offsetWidth-5); y = 10+p.y+ p2.bottom; my = TQE._docScrollTop() + d.clientHeight - o.offsetHeight-10; if(y > my) y=p2.top+p.y-o.offsetHeight-10; if(y<TQE._docScrollTop())y=10+Math.max(p.y, TQE._docScrollTop());// isIE? window.event.clientY : o.style.left= x+'px'; o.style.top= y+'px'; TQE.activeContext=o; TQE.drag(o); }; $._showTableContext=function(b){ var i,btn, ids=['TQEAddRowBefore','TQEAddRowAfter','TQEAddColBefore','TQEAddColAfter','TQEDeleteRow','TQEDeleteColumn','TQEDeleteTable']; for(i=ids.length;i>=0;i--){ btn=TQE.find(ids[i]) if(btn){ btn.style.display = b ? '':'none'; } } }; $._popTableContext=function(){ var table,td=$.focusNode(); while(td && td.nodeName !=='TD'){ td = td.parentNode } if(!td){ return $._showTableContext(0); } table=td.parentNode.parentNode.parentNode; var editorPos=TQE.pos($._editorObj()), tablePos=table.getBoundingClientRect(), tdPos=td.getBoundingClientRect(), btnTQEAddRowBefore=TQE.find('TQEAddRowBefore'), btnTQEAddRowAfter=TQE.find('TQEAddRowAfter'), btnTQEAddColBefore=TQE.find('TQEAddColBefore'), btnTQEAddColAfter=TQE.find('TQEAddColAfter'), btnTQEDeleteRow=TQE.find('TQEDeleteRow'), btnTQEDeleteColumn=TQE.find('TQEDeleteColumn'), btnTQEDeleteTable=TQE.find('TQEDeleteTable'), d=$._getDoc().documentElement, p1,p2; //单元格不在可见范围内 if(tdPos.top+td.offsetHeight<0 || tdPos.left+td.offsetWidth<0 || tdPos.top>=d.clientHeight || tdPos.left>=d.clientWidth){ return $._showTableContext(0); } if(!btnTQEAddRowBefore){ btnTQEDeleteTable=TQE.CE('A','TQEDeleteTable','',true); btnTQEDeleteTable.title=resStrDeleteTable; btnTQEAddRowBefore=TQE.CE('A','TQEAddRowBefore','',true); btnTQEAddRowAfter=TQE.CE('A','TQEAddRowAfter','',true); btnTQEAddRowAfter.className=btnTQEAddRowBefore.className='eButtonAddRow'; btnTQEAddRowBefore.title=btnTQEAddRowAfter.title=resStrInsertRow; btnTQEAddColBefore=TQE.CE('A','TQEAddColBefore','',true); btnTQEAddColAfter=TQE.CE('A','TQEAddColAfter','',true); btnTQEAddColAfter.className=btnTQEAddColBefore.className='eButtonAddCol'; btnTQEAddColBefore.title=btnTQEAddColAfter.title=resStrInsertCol; btnTQEDeleteRow=TQE.CE('A','TQEDeleteRow','',true); btnTQEDeleteColumn=TQE.CE('A','TQEDeleteColumn','',true); btnTQEDeleteColumn.className=btnTQEDeleteRow.className=btnTQEDeleteTable.className='eButtonDeleteRC'; btnTQEDeleteRow.title=resStrDeleteRow; btnTQEDeleteColumn.title=resStrDeleteCol; TQE._noSel(btnTQEAddRowBefore); TQE._noSel(btnTQEAddRowAfter); TQE._noSel(btnTQEAddColBefore); TQE._noSel(btnTQEAddColAfter); TQE._noSel(btnTQEDeleteRow); TQE._noSel(btnTQEDeleteColumn); TQE._noSel(btnTQEDeleteTable); btnTQEAddRowBefore.onclick=btnTQEAddRowAfter.onclick=btnTQEAddColBefore.onclick=btnTQEAddColAfter.onclick=btnTQEDeleteRow.onclick=btnTQEDeleteColumn.onclick=btnTQEDeleteTable.onclick=function(){ if(!this.cell) return; var td=this.cell, table=td.parentNode.parentNode.parentNode, $=this.editor; $.unselectAllCells(); switch(this.id){ case 'TQEAddRowBefore': TQE.insertRow(td,1); break; case 'TQEAddRowAfter': TQE.insertRow(td,0); break; case 'TQEAddColBefore': TQE.insertCol(td,1); break; case 'TQEAddColAfter': TQE.insertCol(td,0); break; case 'TQEDeleteRow': TQE.deleteRow(td); break; case 'TQEDeleteColumn': TQE.deleteCol(td); break; case 'TQEDeleteTable': table.parentNode.removeChild(table); break; } $.focus(); $._popTableContext(); }; }else{ $._showTableContext(1); } btnTQEAddRowBefore.cell=btnTQEAddRowAfter.cell=btnTQEAddColBefore.cell=btnTQEAddColAfter.cell=btnTQEDeleteRow.cell=btnTQEDeleteColumn.cell=btnTQEDeleteTable.cell=td; btnTQEAddRowBefore.editor=btnTQEAddRowAfter.editor=btnTQEAddColBefore.editor=btnTQEAddColAfter.editor=btnTQEDeleteRow.editor=btnTQEDeleteColumn.editor=btnTQEDeleteTable.editor=$; btnTQEAddRowAfter.style.left = btnTQEAddRowBefore.style.left= btnTQEDeleteRow.style.left = (Math.min(editorPos.x+$._getDoc().body.offsetWidth-12,editorPos.x+tablePos.left+table.offsetWidth))+'px'; btnTQEAddRowBefore.style.top=(editorPos.y+tdPos.top-5)+'px'; btnTQEAddRowAfter.style.top=(editorPos.y+tdPos.top+td.offsetHeight-4)+'px'; btnTQEDeleteRow.style.top=(editorPos.y+tdPos.top+ (td.offsetHeight >>> 1) -6)+'px'; btnTQEAddColAfter.style.top = btnTQEAddColBefore.style.top= btnTQEDeleteColumn.style.top = (editorPos.y + Math.max(0,tablePos.top-12))+'px'; btnTQEAddColBefore.style.left=(editorPos.x+tdPos.left-5)+'px'; btnTQEAddColAfter.style.left=(editorPos.x+tdPos.left+td.offsetWidth-5)+'px'; btnTQEDeleteColumn.style.left=(editorPos.x+tdPos.left+(td.offsetWidth>>1)-6)+'px'; p1=TQE.pos(btnTQEAddRowBefore); p2=TQE.pos(btnTQEAddColAfter); btnTQEDeleteTable.style.top= Math.min(p2.y,p1.y-13) + 'px'; btnTQEDeleteTable.style.left= Math.max(p2.x+10, p1.x) + 'px'; }; $.activeTable=null; $.unselectAllCells=function(){ if(!$.activeTable) return; var table=$.activeTable,i,j; for( i=table.rows.length-1; i>=0;i--){ for(j=table.rows[i].cells.length-1;j>=0;j--){ td=table.rows[i].cells[j]; p=TQE.pos(td); $._selectCell(td, false ); } } $.activeTable=null; }; $.selectedCells=function(){ if(!$.activeTable) return []; var table=$.activeTable,i,j,result=[]; for( i=table.rows.length-1; i>=0;i--){ for(j=table.rows[i].cells.length-1;j>=0;j--){ if(table.rows[i].cells[j].isSelected) result.push(table.rows[i].cells[j]); } } return result; }; $._selectCell=function(cell,b){ if(cell.isSelected==b) return; cell.className=b?'selectedTD':''; //if(b){ // var rang=document.createRange(), sel=$._getSelection(); // rang.selectNode(cell); // sel.addRange(rang); //} cell.isSelected=b; }; $._pos=function(e){ var x=0,y=0, box = e.getBoundingClientRect(), d=$._getDoc(), dWin= $._editorObj().contentWindow, dRoot= d.compatMode != "CSS1Compat" ? d.body : d.documentElement; x = box.left - dRoot.clientLeft + (dWin.scrollX ? dWin.scrollX : dRoot.scrollLeft); y = box.top - dRoot.clientTop + (dWin.scrollY ? dWin.scrollY : dRoot.scrollTop); return {'x' : x, 'y' : y, left:x, top:y, width:e.offsetWidth, height:e.offsetHeight}; }; $._startSelectTd=function(e){ var x,y,oldX,oldY, table, d,dt,dl, tdP,td, startSelectCell=false, doc = $._getDoc(), docWin=doc.parentWindow, dRoot= doc.compatMode != "CSS1Compat" ? doc.body : doc.documentElement, docMM=doc.onmousemove, docMU=doc.onmouseup, docDS=doc.ondragstart, rootMU=document.onmouseup; e =$._realEvent(e); if(e.ctrlKey || e.altKey || e.button!= isIE ? 1:0) return; $.unselectAllCells(); td =(isIE)? e.srcElement:e.target; while(td && td.nodeName!='BODY' && td.nodeName!='TD' ){ td=td.parentNode; } if(!td || td.nodeName!=='TD') return; table=td.parentNode.parentNode.parentNode; tdP=$._pos(td); //d = (doc.compatMode != "CSS1Compat") ? doc.body : doc.documentElement; //dl=0;// (isIE || isOpera)? d.scrollLeft : docWin.scrollX; //dt=0;// (isIE || isOpera)? d.scrollTop : docWin.scrollY; oldX=isIE ? e.clientX + (docWin.scrollX ? docWin.scrollX : dRoot.scrollLeft) : e.pageX; oldY=isIE ? e.clientY + (docWin.scrollY ? docWin.scrollY : dRoot.scrollTop) : e.pageY; doc.onmousemove=function(docEvent){ var x,y,dl,dt,i,j,x1,x2,y1,y2,p,cell,sel; //dl= (isIE || isOpera)? d.scrollLeft : docWin.scrollX; //dt= (isIE || isOpera)? d.scrollTop : docWin.scrollY; if(isIE){ docEvent=this.parentWindow.event; x=docEvent.clientX + (docWin.scrollX ? docWin.scrollX : dRoot.scrollLeft); y=docEvent.clientY + (docWin.scrollY ? docWin.scrollY : dRoot.scrollTop); }else{ x=docEvent.pageX; y=docEvent.pageY; } if(!startSelectCell && (x<tdP.x || x>tdP.x+tdP.width || y<tdP.y || y>tdP.y+tdP.height)){ startSelectCell=true; $.activeTable=table; } if(! startSelectCell) return; sel= $._getSelection() if(sel.empty) sel.empty(); //ie6,7,8 else if(sel.removeAllRanges) sel.removeAllRanges(); x1=Math.min(oldX,x); x2=Math.max(oldX,x); y1=Math.min(oldY,y); y2=Math.max(oldY,y); for(i=table.rows.length-1; i>=0;i--){ for(j=table.rows[i].cells.length-1;j>=0;j--){ cell=table.rows[i].cells[j]; p=$._pos(cell); $._selectCell(cell, p.x<=x2 && p.y<=y2 && p.x+p.width>=x1 && p.y+p.height>y1 ); } } }; doc.ondragstart=doc.onmouseup=document.onmouseup=function(){ doc.onmousemove=docMM; doc.ondragstart=docDS, document.onmouseup=rootMU; startSelectCell=false; //return; //var i,cells = $.selectedCells(), // rang, // sel=$._getSelection(); //if(startSelectCell){ // if(sel.removeAllRanges) sel.removeAllRanges(); // else if(sel.clear) sel.clear(); //ie6,7,8 //} //for(i=cells.length-1;i>=0;i--){ // rang=document.createRange(); // rang.selectNode(cells[i]); // sel.addRange(rang); //} //sel.selectAllChildren(); }; }; //判断是否可以合并选中的单元格 $.canMergeSelectedCells=function(){ if(!$.activeTable) return false; var table=$.activeTable, i,j, l,t,r,b, p,cell,count=0,cells = $.selectedCells(); if(cells.length<2) return false; TQE.updateCellsStatus(table); l=cells[0].colStart; r=cells[0].colEnd; t=cells[0].rowStart; b=cells[0].rowEnd; for(i=cells.length-1;i>0;i--){ l=Math.min(l,cells[i].colStart); t=Math.min(t,cells[i].rowStart); r=Math.max(r,cells[i].colEnd); b=Math.max(b,cells[i].rowEnd); } for(i=Math.min(b,table.rows.length-1); i>=0;i--){ for(j=table.rows[i].cells.length-1;j>=0;j--){ cell=table.rows[i].cells[j]; if(!cell.isSelected && cell.colStart<=r && cell.colEnd>=l && cell.rowStart<=b && cell.rowEnd>=t){ return false; } } } return true; }; //合并选中的单元格 $.mergeSelectedCells=function(){ if(! $.canMergeSelectedCells() ) return false; var table=$.activeTable,i,j,l,t,p, s='', firstCell=null, rowSpan=1,colSpan=1,cell; for( i=0; i<table.rows.length;i++){ for(j=0;j<table.rows[i].cells.length;j++){ if(table.rows[i].cells[j].isSelected){ cell=table.rows[i].cells[j]; s += cell.innerHTML; p=TQE.pos(cell); if(firstCell===null){ firstCell=cell; l=p.x; t=p.y; rowSpan=firstCell.rowSpan; colSpan=firstCell.colSpan; }else{ if(p.y===t) colSpan+= cell.colSpan; else if(p.x===l) rowSpan+=cell.rowSpan; cell.innerHTML=''; //cell.parentNode.removeChild(cell); } } } } firstCell.innerHTML=s.replace(/( |<br\s*\/?>)+$/,'$1'); firstCell.rowSpan=rowSpan; firstCell.colSpan=colSpan; for(i=table.rows.length-1; i>=0;i--){ p=table.rows[i]; for(j=p.cells.length-1;j>=0;j--){ if(p.cells[j].isSelected){ cell= p.cells[j]; if(cell!=firstCell){ p.removeChild(cell); } } } if(p.cells.length<1)table.deleteRow(i); } TQE.updateCellsStatus(table); }; $.splitCell=function(cell){ if(!cell || cell.rowSpan<2 && cell.colSpan<2) return true; var table=cell.parentNode.parentNode.parentNode, i,j,k, row, td; TQE.updateCellsStatus(table); for(i=cell.rowStart;i<=cell.rowEnd;i++){ row=table.rows[i]; for(j=0;j<row.cells.length;j++){ if(row.cells[j].colStart>cell.colEnd){ break; } } k = cell.colSpan; if(i==cell.rowStart) k--; while( 0 < k-- ){ td=row.insertCell(j); $._selectCell(td,cell.isSelected); td.style.backgroundColor=cell.style.backgroundColor; } } cell.rowSpan=1; cell.colSpan=1; }; $._changed=function(){ $._autoSave(1); $._showTableContext(false); var o; if('visual'===$.currentMode()){ $._keepBookmark(); $._hook(); //if($.config.autoClean) doc.body.onpaste=function(){setTimeout($.cleanWord,200);}; o=$._editorObj().contentWindow; TQE.addListener(o,'resize',$._popTableContext); if(isIE6){ o=o.document.body;//晕,ie6里iframe 不能触发 onfocus 与 onblur 事件 } }else{ o= $._editorObj(); TQE.addListener(o,'mouseup',TQE.hidePop); o.onkeydown=function(e){return $._call('keydown',e);} o.onkeyup=function(e){return $._call('keyup',e);} } //绑定事件 o.onfocus=function(e){ $.hasFocus=true; if($.obj.onfocus) $.obj.onfocus(); $._call('focus',e); }; o.onblur=function(e){ $.hasFocus=false; if($.obj.onblur) $.obj.onblur(); $._call('blur',e); }; }; $._realEvent=function(e){ if(isIE) e = 'code'===$.currentMode() ? window.event : $._editorObj().contentWindow.event; return e; }; $._call=function(eventName,e){ var handler = $.config['on'+eventName]; if('function'===typeof handler) return handler.call($,$._realEvent(e)); }; //mode 可选值[code|visual] $.changeMode=function(mode){//更改编辑方式,空值时自动转另一种方式 var old=$.currentMode(); if(old===mode) return; if(!mode){ mode = ('code'!=old) ? 'code' : 'visual'; } if(mode==old) return; $.hasFocus=false; var eo=$._editorObj(), btn=$._button('mode'),h=eo.offsetHeight, editorHtm, visualMode='visual'===mode; if('code'===mode){ $.unselectAllCells(); h-=4; editorHtm='<table width=100% border=0 cellpadding=0 cellspacing=0><tr><td width=2></td><td><textarea id="'+$.objId+'_Editor" wrap="hard" style="height:'+h+'px"></textarea></td></tr></table>'; } else if(visualMode){ editorHtm='<IFRAME id="'+$.objId+'_Editor" frameborder=0 marginheight=0 marginwidth=0 style="height:'+h+'px" ></IFRAME>'; }else{ return; } $._autoSave(0); TQE._hideContext(); var code = $.content(); $._clientDiv.innerHTML=editorHtm; $._initContent(code); //$._setHeight(visualMode? h: h-4); if(btn) btn.id = visualMode?'eBTNmode':'eBTNmode-reset'; $._updateToolbar(visualMode,['mode','fullscreen','help'], true); }; //自动排版 $.typeset=function(){ if('visual'!=$.currentMode()) return; $._showTableContext(0); var d = $._getDoc(),e,es,s,div,ep,fw; //删除不必要的空格,将DIV转为P s=d.body.innerHTML; s=s.replace(/ /gi,' ').replace(/>\s+</gm,'> <').replace(/ +/gi,' ').replace(/<div/gi,'<p').replace(/<\/div/gi,'</p'); d.body.innerHTML=s; //删除CENTER es=TQE._tags(d,'CENTER'); for(i=es.length-1;i>=0;i--){ TQE.removeNode(es[i],false); } //删除不必要的SPAN es=TQE._tags(d,'SPAN'); for(i=es.length-1;i>=0;i--){ e=es[i]; fw= e.style.fontWeight,c=e.style.color; if(''===e.innerHTML.replace(/<[a-z\/][^>]*>/gi,'') || ( fw=='' && c=='')){ TQE.removeNode(e,false); continue; } e.removeAttribute('style'); e.className='' e.removeAttribute('class'); e.style.fontWeight=fw; e.style.color=c; } //清理分页符 es=TQE._tags(d,'H3'); for(i=es.length-1;i>=0;i--){ if(es[i].className === 'splitPage') es[i].innerHTML=es[i].innerHTML.replace(/<\/?[a-zA-z][^>]*>/g,''); } //清理段落 es=TQE._tags(d,'P'); var emtpyReg=/^( | ){3,}/ for(i=es.length-1;i>=0;i--){ e=es[i]; if(''==e.innerHTML.replace(/<[a-z\/][^>]*>/gi,'').replace( /( |\n|\r|\t| )/gi, '')){//删除空白的段落 TQE.removeNode(e,false); continue; } e.removeAttribute('style'); e.className='' e.removeAttribute('class'); if(emtpyReg.test(e.innerHTML)){ e.align='center'; }else{ e.removeAttribute('align'); e.style.textIndent=$.config.typesetIndentParagraph ? '2em':''; } } //清理链接 es=TQE._tags(d,'A'); for(i=es.length-1;i>=0;i--){ e=es[i]; if(''==e.innerHTML.replace(/<[a-z\/][^>]*>/gi,'').replace( /( |\n|\r|\t| )/gi, '')){//删除空白的链接 TQE.removeNode(e,false); continue; } e.removeAttribute('style'); e.className='' e.removeAttribute('class'); } var isEmptyNode=function(node){ var nn=node.nodeName, emptyReg=/^( |\n|\r|\t| )*$/gi; if(nn==='#text') return emptyReg.test(node.nodeValue) return 'BR'===nn || 'IMG'!==nn && ''==node.innerHTML.replace(/<[a-z\/][^>]*>/gi,'').replace(/(\s| )/gmi,''); }, //排版图片下方的文字 centerImageText=function(node){ var ne,s; while(node && node.tagName!='BODY'){ ne = node; while(ne = ne.nextSibling){ if(isEmptyNode(ne)) continue; if(ne.nodeName==='#text'){ div = TQE.CE('CENTER','',ne.nodeValue); //div.style.textAlign='center'; node.parentNode.insertBefore(div,ne); TQE.removeNode(ne,true); return ; }else{ if(ne.tagName=='CENTER') return; if(ne.tagName=='P') ne.align='center'; else ne.style.textAlign='center'; return ; } } node=node.parentNode; } }; //排版图片 es=TQE._tags(d,'IMG'); for(i=es.length-1;i>=0;i--){ e=es[i]; if(e.getAttribute('emot')) continue;//表情 if($.config.typesetImageTextCenter)centerImageText(e); e.removeAttribute('style'); e.border= $.config.typesetImageBorder ? '1':'0'; e.style.margin='5px'; //e.style.margin='5px auto'; //e.style.display='block'; ep=e.parentNode; if(ep.tagName=='A' && ep.firstChild==ep.lastChild){ e=ep; ep=ep.parentNode; } if(ep.tagName=='P' && ep.align=='center' || ep.tagName=='CENTER' || ep.style.textAlign=='center') continue; div = TQE.CE('CENTER'); ep.insertBefore(div, e); div.appendChild(e); } //排版视频,flash等 es=TQE._tags(d,'OBJECT'); for(i=es.length-1;i>=0;i--){ e=es[i]; if($.config.typesetImageTextCenter)centerImageText(e); ep=e.parentNode; if(ep.tagName=='P' && ep.align=='center' || ep.tagName=='CENTER' || ep.style.textAlign=='center') continue; div = TQE.CE('CENTER'); ep.insertBefore(div, e); div.appendChild(e); } //排版视频,flash等 es=TQE._tags(d,'EMBED'); for(i=es.length-1;i>=0;i--){ e=es[i]; if('OBJECT'===e.parentNode.tagName) continue; if($.config.typesetImageTextCenter) centerImageText(e); ep=e.parentNode; if(ep.tagName=='P' && ep.align=='center' || ep.tagName=='CENTER' || ep.style.textAlign=='center') continue; div = TQE.CE('CENTER'); ep.insertBefore(div, e); div.appendChild(e); } $.cleanWord(true); }; //force 布尔值 $.cleanWord=function(force){ if('visual'!=$.currentMode()) return; var d = $._getDoc(); if(!force){ if(d.body.innerHTML.indexOf('mso') <0) return; } var cleanTag=function(tags, removeOnEmptyStyle){ for(var e,es,s,i=tags.length-1; i>=0; i--){ es=TQE._tags(d,tags[i]); for(i=es.length-1;i>=0;i--){ e=es[i]; e.removeAttribute('lang'); s = e.getAttribute('style'); if(null==s && removeOnEmptyStyle){ TQE.removeNode(e,false); continue; } if(typeof s =='string' && s.indexOf('mso-')>=0){ s+=';'; s=s.replace(/mso\-[^;]+?;/gi,'').replace(/FONT\-FAMILY[^;]+?;/gi,'').replace(/\s+/g,' ').replace(/MARGIN\: 0cm 0cm 0pt/gi,'').replace(/<(\w[^>]*) style="([^"]*)"([^>]*)/gi,''); if(''==s || ' '==s){ if(removeOnEmptyStyle){ TQE.removeNode(e,false); continue; } e.removeAttribute('style'); }else{ e.setAttribute('style',s); } } s = e.getAttribute('class'); if(null!=s){ s=s.replace(/mso[a-z\-]+\s*/gi,''); if(''==s){ e.removeAttribute('class'); }else{ e.setAttribute('class',s); } } } } }; cleanTag(['SPAN'],true); cleanTag(['P','B','I','U','TD','TR','TABLE','DIV'],true); d.body.innerHTML=d.body.innerHTML.replace(/<o:[a-z0-9_]+[^>]*>/gi,'').replace(/<\/o:[a-z0-9_]+>/gi,'').replace(/<\?xml.+?\/>/gi,''); $.save(); }; //$._fixWidth=function(){ //if('code'===$.currentMode())$._editorObj().style.width= $._containerDiv.offsetWidth-6+ 'px'; //} // 设置编辑器高度,值大于1时,单位像, 小于1时是 百分比, 如 0.5表示50% // 参数必须是0-1之间的小数或大于1的整数 $.setWidth=function(value){ //if(!isIE) TQE.delListener(window,'resize',$._fixWidth); if(value>1){ $.config.width=value+'px'; //$._containerDiv.onresize=null; }else{ $.config.width=(value*100)+'%'; //if(!isIE) TQE.addListener(window,'resize',$._fixWidth); } $._containerDiv.style.width= $.config.width; //$._fixWidth(); }; //设置编辑器高度,单位像素 $.setHeight=function(value){ if(value<9) value=9; $.config.height=value+'px'; $._setHeight(value); }; $._setHeight=function(value){ if(value<2)value=2; $._editorObj().style.height= value+'px'; if('visual'==$.currentMode()){ value-=6; if(value<2) value=2; $._getDoc().body.style.minHeight=value+'px'; if(isIE6)$._getDoc().body.style.height=value+'px'; } }; $._fixFull=function(){ var d=TQE._doc(),e=$._containerDiv, h;; e.style.zIndex='10000'; e.style.width=(d.clientWidth-2) + 'px'; e.style.top = TQE._docScrollTop()+'px'; e.style.left = TQE._docScrollLeft()+'px'; h = d.clientHeight-$._toolbarDiv.offsetHeight $._setHeight(h- ('visual'==$.currentMode()?2:6)); //return; //e=$._editorObj(); //if('visual'==$.currentMode()){ // $.setHeight(h-2); // e.style.height= h-2 + 'px'; // d = $._getDoc(); // if(d.body){ // h-=6; // if(h<2)h=2; // d.body.style.minHeight=h+'px'; // if(isIE6)d.body.style.height=h+'px'; // } // //e.style.width=''; //}else{ // //e.style.width=(d.clientWidth-6)+'px'; // e.style.height= h-7 + 'px'; //} }; $._button=function(name){ var btns = TQE._tags($._toolbarDiv,'LI'),i; for(i=btns.length-1;i>=0;i--){ if(name==btns[i].getAttribute('name') ) {// return btns[i]; } } return null; }; $.fullScreen=function(b){ var e=$._containerDiv,isVisualMode = 'visual'===$.currentMode(),o,btn; if(b===undefined || null===b){ b = (e.style.position!='absolute'); }else{ if(b == (ec.style.position=='absolute'))return; } //移动IFrame会导致内容丢失, 所以要转为代码模式 if(isVisualMode){ $.changeMode('code'); } if(b){ document.body.parentNode.style.overflow = 'hidden'; //e.parentNode.removeChild(e); document.body.appendChild(e); if(isVisualMode){ if(isGecko){//算是Firefox的bug吗? window.setTimeout(function(){$.changeMode('visual');},1); }else{ $.changeMode('visual'); } } e.style.position='absolute'; e.style.top = '0px'; $._fixFull(); TQE.addListener(window,'resize',$._fixFull); }else{ document.body.parentNode.style.overflow = 'auto'; TQE.delListener(window,'resize',$._fixFull); e.style.position=''; e.style.width=$.config.width; o=$._editorObj(); //if(!isVisualMode)o.style.width=e.offsetWidth-6+'px'; o.style.height=$.config.height; //e.parentNode.removeChild(e); $.obj.parentNode.insertBefore(e,$.obj); if(isVisualMode){ $.changeMode('visual'); } e.scrollIntoView(false); } //更新全屏按钮图标 btn=$._button('fullscreen'); if(btn){ btn.id = b ? 'eBTNfullscreen-reset' : 'eBTNfullscreen'; } }; $.setContent=function(code){ //code = ('code'==$.currentMode())? changeAsUbb(code): changeAsHtml(code); if('code'===$.currentMode()){ return $._editorObj().value=code; } if('function'===typeof $.config.onsetcontent) code=$.config.onsetcontent.call($,code); $._getDoc().body.innerHTML=code; }; $._initContent=function(code){ if('code'!==$.currentMode()){ if((isGecko || isOpera) && '<br>'==code.substring(0,4)){ code=code.substr(4); // 怪怪的Firefox } if(isGecko) code = code.replace(/<td([^>]*)>\s*<\/td/ig, '<td$1 ><br></td'); var s= '',//isIE6 ?'':'<!DOCTYPE html>', d = $._getDoc(), h; s+='<html><head><style>\nbody{border:none;height:100%;margin:0;padding:2px;overflow:auto;font-size:12px;';//默认字体大小 if($.config.bgColor || $.config.textColor){ if($.config.bgColor) s+='background-color:'+$.config.bgColor+';'; if($.config.textColor) s+='color:'+$.config.textColor+';'; } s +='}\nimg{cursor:default;}\n.selectedTD{background:#3399ff !important;}\n.splitPage{display:block;width:98%;!important;border-top:#999 1px solid;border-bottom:#999 1px solid;background:#FFFFFF; color:#000000;font-weight:bold;text-align:center;margin:30px auto 5;padding-top:30px;clear:both;}\n.splitPage:before{content:"分页标题:";}</style>\n'; if($.config.baseHref!=''){ s +='<base href="'+$.config.baseHref+'" />'; } if ($.config.css) { s += '<link href="' +$.config.css+ '" rel="stylesheet" type="text/css">\n'; } s+='</head><body contenteditable="true" >'+ code+'</body></html>';// d.open(); d.write(s); d.close(); h=Math.max(20,$._editorObj().offsetHeight-6); if(d.body){ d.body.style.minHeight=h+'px'; if(isIE6)d.body.style.height=h+'px'; } } $.setContent(code); $._changed(); }; $.setOpacity=function(e, opacity) { if (isIE) {// && !isIE9 e.style.filter = (opacity == 100) ? '' : 'gray() alpha(opacity=' + opacity + ')'; } else { e.style.opacity = (opacity == 100) ? '' : opacity/100; } }; $.inArray=function(e,arr){ for(var i=arr.length-1;i>=0;i--) if(e==arr[i]) return true; return false; }; $.content=function(){ var m=$.currentMode(), cells,i,code; if('visual'===m){ cells = $.selectedCells(); for(i=cells.length-1;i>=0;i--){ cells[i].className=''; } code= $._getDoc().body.innerHTML; for(i=cells.length-1;i>=0;i--){ cells[i].className='selectedTD'; } if((isGecko || isOpera) && '<br>'==code.substring(0,4)) code=code.substr(4);//怪怪的Firefox if(''==code.replace(/<\/?(div|p|font|b|s|u|i|strong|em|strike)(?![a-z0-9])[^>]*>| |\s/ig , '')) code= ''; if('function'===typeof $.config.ongetcontent) code=$.config.ongetcontent.call($,code); else code=code.replace(/\s*<(p|table|tr|hr|div|object|ol|li|ul|h[1-6])(?![a-z])/ig,'\n<$1') .replace(/<\/(p|table|div|object|ol|ul|h[1-6])>\s*/ig,'</$1>\n') .replace(/(<(?:br|hr)(?![a-z0-9])[^>]*>)\s*/ig,'$1\n') .replace(/^\s*/,'').replace(/\s*$/,''); }else{ code= $._editorObj().value; } return code; }; $._autoSave=function(b){ var e = $._editorObj(), func = b? TQE.addListener : TQE.delListener; if (isIE ){ func(e,'beforedeactivate',$.save); }else if('code'==$.currentMode()){ func(e,'blur',$.save); }else{ func(e.contentWindow,'blur',$.save); } }; $.save=function(){ $.obj.value=$.content(); }; $._intEdit=function(obj){ if(obj.isIniEdit)return; obj.isIniEdit=true; obj.style.imeMode='disabled'; obj.onkeypress=function(){ if(45==event.keyCode){ this.value = ('-'==this.value.charAt(0))? this.value.substr(1) : '-'+this.value; return false; } return event.keyCode>=48&&event.keyCode<=57; }; obj.onpaste=function(){return !clipboardData.getData('text').match(/\D/);}; obj.ondragenter=function(){return ! /\D/.test(event.dataTransfer.getData('text'));}; obj.oldBlur=obj.onblur; obj.onblur=function(){ if(''==this.value) return; this.value=parseInt(this.value,10); var max = this.getAttribute('max'), min = this.getAttribute('min'); if(max!==undefined && parseInt(this.value,10)>parseInt(max,10))this.value=parseInt(max,10); if(min!=undefined && parseInt(this.value,10)<parseInt(min,10))this.value=parseInt(min,10); if(this.oldBlur)this.oldBlur(); }; }; //------------执行初始化 if(isIE6 || isIE && (document.documentMode==7 || document.compatMode != "CSS1Compat")){//IE6或兼容视图或怪异模式 var _topTableNode=function(node){ var reault=null; while(node){ if(node.tagName=='TABLE'){ reault=node; } node = node.parentNode; } return reault; }, t = _topTableNode(document.scripts(document.scripts.length-1)); if(t && _topTableNode(TQE.find(objId))===t ){ window.setTimeout($.init,20); }else{ $.init(); } }else{ $.init(); } }; TQE.url='./';//编辑器相关资源网址 TQE.version = version; //编辑器版本 //-- init TQE resources if(TQE.url==='./'){ var scripts = document.scripts || document.getElementsByTagName('SCRIPT'), //firefox tqJSUrl = scripts[scripts.length-1].getAttribute('src'), skinFind= /[\?&]skin=([a-z0-9_A-Z]+)/.exec(tqJSUrl), l=window.location, urlHost=l.protocol+'//'+l.host + (l.port?':'+l.port:'')+'/', skinUrl=''; TQE.url = tqJSUrl.substring(0,tqJSUrl.toLowerCase().indexOf('tqeditor.')); if(TQE.url.indexOf(urlHost)===0) TQE.url=TQE.url.substring(urlHost.length-1, TQE.url.length); document.write('<link href="'+TQE.url+(skinFind ? 'skin/'+skinFind[1]+'/':'')+'TQEditor.css" id="TQEditorSkinCSS" rel="stylesheet" type="text/css" onload="TQE.checkSkin(this)" />'); } //配置 TQE.config={ "paragraphs" : [ ["正文", "p"], ["标题1", "h1"], ["标题2", "h2"], ["标题3", "h3"], ["标题4", "h4"], ["标题5", "h5"], ["标题6", "h6"], ["预定义", "pre"] ], "fontnames" : [ ["宋体", "宋体"], ["新宋体", "新宋体"], ["仿宋_GB2312", "仿宋_GB2312"], ["黑体", "黑体"], ["微软雅黑", "微软雅黑"], ["楷体_GB2312", "楷体_GB2312"], ["Arial", "arial, helvetica, sans-serif"], ["Courier New", "courier new, courier, mono"], ["Georgia", "Georgia, Times New Roman, Times, Serif"], ["Tahoma", "Tahoma, Arial, Helvetica, sans-serif"], ["Times New Roman", "times new roman, times, serif"] ], "fontsizes": [ //[text,preview, value] ["小", "xx-small", 1], ["中", "x-small", 2], ["大", "small", 3], ["特大","medium", 5] ], "toolbar":'default', "toolbarRight":[], 'showToolbarGroupHandle':true, //显示工具组最前的图 //模板 //插入媒体***时的模板代码, //flash 宏 {$url} {$width} {$height} 'tplFlash':'<embed src="{$url}" width="{$width}" height="{$height}" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" allowscriptaccess="always"></embed>', //flv视频 宏 {$url} {$width} {$height} {$auto_start} 'tplFlv':'<embed src="'+TQE.url+'flvPlayer.swf" flashvars="vcastr_file={$url}&IsAutoPlay={$auto_start}" width="{$width}" height="{$height}" quality="high" bgcolor="#0E0E0E" name="play" align="middle" allowscriptaccess="sameDomain" allowfullscreen="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" wmode="opaque" />', //rm视频 宏 {$url} {$width} {$height} {$auto_start} 'tplRm':'<embed src="{$url}" width={$width} height={$height} autostart="{$auto_start}"type="audio/x-pn-realaudio-plugin" console="Clip1" controls="ImageWindow" ></embed>', //windows的媒体文件 宏 {$url} {$width} {$height} {$auto_start} 'tplVideo':'<object classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-ms-wmp" width="{$width}" height="{$height}"><PARAM NAME="URL" VALUE="{$url}" /><PARAM NAME="autoStart" VALUE="{$auto_start}" /><PARAM NAME="invokeURLs" VALUE="false"><PARAM NAME="playCount" VALUE="100"><PARAM NAME="Volume" VALUE="100"><PARAM NAME="defaultFrame" VALUE="datawindow"></object>', //音乐播放 宏 {$url} {$auto_start} 'tplMusic':'<object id="tqeMP" classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-ms-wmp" width="230" height="64"><PARAM NAME="URL" VALUE="{$url}" /><PARAM NAME="autoStart" VALUE="{$auto_start}" /><PARAM NAME="invokeURLs" VALUE="false"><PARAM NAME="playCount" VALUE="100"><PARAM NAME="Volume" VALUE="100"><PARAM NAME="defaultFrame" VALUE="datawindow"></object>', //分页符代码 'tplSplitPage':'<h3 class="splitPage" name="split_page"></h3>', 'uploadFieldName':'file',//接收上传时的上传表单名 'imageUploadUrl':'',//接收上传图片网址, 留空表示不允许上传, 以#开头, 表示点击上传按扭后的界面网址 'imageFileTypes':'*.jpg;*.gif;*.png;*.jpeg',//允许上传的图片后缀 'imageFileSize':'2MB',//允许上传文件大小 'directInsertUploadImage':false,//直接将上传的图片插入编辑器中 'linkUploadUrl':'',//接收上传网址, 留空表示不允许上传, 以#开头, 表示点击上传按扭后的界面网址 'linkFileTypes':'*.*',//允许上传的后缀 'linkFileSize':'2MB',//允许上传文件大小 'flashUploadUrl':'',//接收上传Flash网址, 留空表示不允许上传, 以#开头, 表示点击上传按扭后的界面网址 'flashFileTypes':'*.swf',//允许上传的图片后缀 'flashFileSize':'2MB',//允许上传文件大小 'musicUploadUrl':'',//接收上传音频文件网址, 留空表示不允许上传, 以#开头, 表示点击上传按扭后的界面网址 'musicFileTypes':'*.mp3;*.wma',//允许上传音频文件后缀 'musicFileSize':'2MB',//允许上传文件大小 'videoUploadUrl':'',//接收上传视频文件网址, 留空表示不允许上传, 以#开头, 表示点击上传按扭后的界面网址 'videoFileTypes':'*.flv;.mp4;*.mkv;*.wmv;*.asf;*.avi;*.rmvb;*.rm',//允许上传的文件后缀 'videoFileSize':'2MB',//允许上传文件大小 'enter2br':false, //'formatHTML':true,//对HTML源码进行美化(换行与缩进) //'height_delta':20, 'width':'auto', 'height':'auto', 'autoClean':true,//在执行粘贴时,自动清理word相关的垃圾代码 'faceCount':55,//表情数量, 在face目录中 'css':'',//设计辅助的相关样式网址 'bgColor':'', //可视化编辑时, 编辑器背景色 'textColor':'', //可视化编辑时, 文字色 'typesetImageTextCenter':true,//自动排版图片下方的文字居中 'typesetIndentParagraph':true,//自动排版段落首行缩进2字 'typesetImageBorder':true,//自动排版图片添边框 'baseHref':'',//设置相对网址的基网址 'resize':true,//允许修改编辑器尺寸 'onfocus':null,//获取焦点时的回调, function(event){} 'onblur':null,//失去焦点时的回调, function(event){} 'onkeydown':null,//当用户按下键盘按键时触发, function(event){} 'onkeyup':null,//当用户释放键盘按键时触发, function(event){} 'oninit':null,//设置执行初始化时的回调函数, function(){} 'ongetcontent':null,//取代码时的事件回调函数, function(code){} 'onsetcontent':null,//设置代码时的事件回调函数, function(code){} //'onuploaded':null,//上传成功后的回调函数 'debug':false }; TQE.find=function(id){return document.getElementById(id);}; TQE.CE=function(tag,id, htm, append){ var o=document.createElement(tag); if(id)o.id=id; if(htm)o.innerHTML=htm; if(append) document.body.appendChild(o); return o; }; TQE.loadSkin=function(skin){ var e = TQE.find('TQEditorSkinCSS'); e.href= TQE.url+(skin &&'default'!=skin ? 'skin/'+skin+'/':'')+'TQEditor.css'; }; TQE.checkSkin=function(linkObj){ var i,objs=document.styleSheets; for(i=objs.length-1;i>=0;i--){ if(objs[i].href==linkObj.href){ if(isOpera && objs[i].cssRules.length<1 || !isOpera&&objs[i].rules.length<1) linkObj.href= TQE.url+'TQEditor.css'; break; } } }; TQE._doc=function(){return (document.compatMode != "CSS1Compat") ? document.body : document.documentElement;}; TQE._docScrollTop=function(){ return window.scrollY ? window.scrollY : TQE._doc().scrollTop ; }; TQE._docScrollLeft=function(){ return window.scrollX ? window.scrollX : TQE._doc().scrollLeft ; }; TQE.pos=function(e){ var x = 0, y = 0; //if (e.getBoundingClientRect) { var box = e.getBoundingClientRect(), d=TQE._doc(); x = box.left + TQE._docScrollLeft() - d.clientLeft; y = box.top + TQE._docScrollTop() - d.clientTop; //} else { // x = e.offsetLeft; // y = e.offsetTop; // var parent = e.offsetParent; // while (parent) { // x += parent.offsetLeft; // y += parent.offsetTop; // parent = parent.offsetParent; // } //} return {'x' : x, 'y' : y, left:x, top:y, width:e.offsetWidth, height:e.offsetHeight}; }; TQE._hideContext=function(){ if(TQE.activeContext){ TQE.activeContext.style.display="none"; TQE.activeContext=null; } }; TQE.pop=function(obj,relateObj){ if(TQE.activePop==obj){ TQE.hidePop(); return false; } TQE._hideContext(); TQE.hidePop(); TQE.activePop=obj; obj.relateObj=relateObj; relateObj.className='eButtonDropDown'; obj.style.display='block'; var p=TQE.pos(relateObj), l=p.x, t= 1+relateObj.clientHeight +p.y, dl = TQE._docScrollLeft(), w = TQE._doc().clientWidth; if(l+obj.offsetWidth>dl+w)l-=obj.offsetWidth-relateObj.offsetWidth; obj.style.left= l + 'px'; obj.style.top = t+ 'px'; return true; }; TQE.hidePop=function(){ if(!TQE.activePop) return; var o=TQE.activePop; TQE.activePop=null; o.style.display='none'; if(o.relateObj && o.relateObj.className=='eButtonDropDown') o.relateObj.className='eButton'; o=TQE.find('ColorPicker'); if(o)o.style.display='none'; }; TQE.delListener=function(e,eventName,func){ if(e.removeEventListener) { e.removeEventListener(eventName, func, false ); }else{ e.detachEvent('on'+eventName, e['e'+eventName+func]); } }; TQE.addListener=function(e,eventName,func){ if(e.addEventListener) { e.addEventListener( eventName, func, false ); }else{ e['fn'+func]=func; e['e'+eventName+func]=function(et){e['fn'+func](et)}; e.attachEvent('on'+eventName, e['e'+eventName+func]);// } }; TQE._tags=function(domNode, tagName){ return domNode.getElementsByTagName(tagName); }; TQE.listenTags=function(node,tag,eventname,func){ var ds = TQE._tags(node,tag),i; for(i=ds.length-1;i>=0;i--){ TQE.addListener(ds[i],eventname,func); } }; TQE._noSel=function(o, tagsName){ var noSel=function(){ if(isIE){ var tn=event.srcElement.tagName; return 'INPUT'==tn || 'TEXTAREA'==tn; } return false; }; if(tagsName){ var a=tagsName.split(','),nodes,i,j; for(j=a.length-1;j>=0;j--){ nodes = TQE._tags(o,a[j]); for(i=nodes.length-1; i>=0;i--){ nodes[i].unselectable='on'; nodes[i].onselectstart = noSel } } }else{ o.unselectable='on'; o.onselectstart = noSel; } }; TQE._colorPickerUI=function(){ var ColorHex=['00','33','66','99','CC','FF'], SpColorHex=['FF0000','00FF00','0000FF','FFFF00','00FFFF','FF00FF'], w=191,//1+19*10 colorTable='<table width="'+w+'" cellpadding=0 ',i,j,k; colorTable += isIE ? 'cellspacing=1 border=0 bgcolor="#000000;">':'cellspacing=0 border=1 style="border-collapse:collapse;" >'; for (i=0;i<2;i++){ for (j=0;j<6;j++){ colorTable += '<tr height=10>'; //colorTable += '<td bgcolor="#000" name="'+name+'" ></td>'; if (i>0) colorTable += '<td bgcolor="#'+SpColorHex[j]+'" name="'+name+'"></td>'; else colorTable += '<td bgcolor="#'+ColorHex[j]+ColorHex[j]+ColorHex[j]+'" ></td>'; //colorTable += '<td bgcolor="#000"></td>'; for (k=0;k<3;k++){ for (l=0;l<6;l++){ //立方色 colorTable += '<td bgcolor="#'+ColorHex[k+i*3]+ColorHex[l]+ColorHex[j]+'" ></td>'; //连续色 //var c1 = 4+i-k*2; //var c2 = i*j + (1-i)*(5-j);// i?j:5-j //var c3 = k!=1? 5-l:l; //k!=1? 5-l:l; //colorTable += '<td bgcolor="#'+ColorHex[c1]+ColorHex[c2]+ColorHex[c3]+'"></td>'; } } colorTable += '</tr>'; } } colorTable +='</table>'+ '<div style="padding:2px 2px 1px 2px;line-height:25px;"><div style="height:25px;width:60px;display:block;float:left; margin-right:5px;" name=colorPreview></div><span name="colorValue" style="width:50px; display:inline-block;"></span><input type="button" value="'+resStrNoColor+'" /></div>'; return colorTable; }; TQE.pickColor=function(callbackFunc,x,y){ var o=TQE.find('ColorPicker'); if(null==o){ o = TQE.CE('DIV','ColorPicker', TQE._colorPickerUI() ,true); o.className='ePopPanel'; o.style.zIndex=99999999; o.onmouseover=function(){this.active=true;}; o.onmouseout=function(){this.active=false;}; TQE._noSel(o);//,'TABLE,TR,TD,DIV'); TQE.listenTags(o,'TD','mouseover',function(){ var self=this, p=this.parentNode.parentNode.parentNode.parentNode.lastChild, iid = window.setInterval(function(){self.style.backgroundColor=(self.style.backgroundColor!='')?'':'#FFFFFF'},500); p.firstChild.style.backgroundColor=this.bgColor; p.firstChild.nextSibling.innerHTML=this.bgColor; self.style.backgroundColor='#FFFFFF'; self.onmouseout=function(){window.clearInterval(iid);this.style.backgroundColor='';} }); o.lastChild.lastChild.onclick=function(){this.parentNode.parentNode.style.display='none';}; TQE.listenTags(o,'TD','mouseup',function(){this.parentNode.parentNode.parentNode.parentNode.style.display='none';}); TQE.addListener(document,'mousedown',function(){var o=TQE.find('ColorPicker');if(!o.active)o.style.display='none';}); } var ds = TQE._tags(o,'TD'); for(var i=ds.length-1;i>=0;i--){ ds[i].onmousedown=function(e){callbackFunc(this.bgColor); e = e || event; e.cancelBubble=true; } } o.lastChild.lastChild.onclick=function(e){callbackFunc(''); e = e || event; e.cancelBubble=true;}; o.style.left=x+'px'; o.style.top=y+'px'; o.style.display='block'; }; TQE.drag=function(o){ o.style.position='absolute'; o.onmousedown=function(a){ var x,y,obj,n, p=TQE.pos(this), scrollLeft = TQE._docScrollLeft(), scrollTop =TQE._docScrollTop(), documentMM=document.onmousemove, documentMU=document.onmouseup; if(isIE){ a=window.event; obj=a.srcElement; x=scrollLeft + a.clientX-p.x; y=scrollTop + a.clientY-p.y; }else{ obj=a.target; x=a.pageX-p.x; y=a.pageY-p.y; } n=obj.tagName; if(obj!=this && ( n=='INPUT' || n=='TEXTAREA'|| n=='BUTTON'|| n=='SELECT')) return; if(o.setCapture) o.setCapture(); else if(window.captureEvents) window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); document.onmousemove=function(a){ if(isIE){ a=window.event; a.pageX=scrollLeft + a.clientX; a.pageY=scrollTop + a.clientY; } var tx=a.pageX-x, ty=a.pageY-y; o.style.left=tx +'px'; o.style.top=ty +'px'; o.style.cursor='move'; }; document.onmouseup=function(){ if(o.releaseCapture) o.releaseCapture(); else if(window.releaseEvents) window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP); document.onmousemove=documentMM; document.onmouseup=documentMU; o.style.cursor=''; }; }; }; TQE.clone=function(srcObj){ if(typeof(srcObj) != 'object') return srcObj; if(srcObj == null) return srcObj; var i, newObj = '[object Array]'==Object.prototype.toString.call(srcObj)? [] : {}; for(i in srcObj) newObj[i] = TQE.clone(srcObj[i]); return newObj; }; TQE.removeNode=function(node, delChild){ if(node.removeNode) return node.removeNode(delChild); //ie if(delChild) return node.parentNode.removeChild(node); while(node.firstChild) node.parentNode.insertBefore(node.firstChild,node); node.parentNode.removeChild(node); }; //table functions TQE.updateCellsStatus=function(table){ var rows=table.rows,cells,cells2,td,td2, i,j,k,l; for(i=0;i<rows.length;i++){ k=0; for(j=0;j<rows[i].cells.length;j++){ td= rows[i].cells[j]; td.colStart=k; k += td.colSpan; td.colEnd= k-1; td.rowStart=i; td.rowEnd= i+td.rowSpan-1; } } //fix colIndex for(i=0;i<rows.length;i++){ cells= rows[i].cells; for(j=0;j<cells.length;j++){ if(cells[j].rowSpan<2) continue; for(k=1;k<cells[j].rowSpan; k++){ if(!rows[i+k]) break; cells2= rows[i+k].cells; td= cells[j]; for(l=0;l<cells2.length;l++){ td2= cells2[l]; if(td2.colStart >= td.colStart){ td2.colStart += td.colSpan; td2.colEnd += td.colSpan; } } } } } //fix rowIndex for(i=rows.length-1;i>=0;i--){ cells= rows[i].cells; var minrs=cells[0].rowSpan; for(j=cells.length-1;j>0;j--){ minrs = Math.min(minrs,cells[j].rowSpan); if(minrs<2)break; } if(--minrs > 0){ for(j=cells.length-1;j>=0;j--){ cells[j].rowSpan-=minrs; cells[j].rowEnd -=minrs; } for(k=i-1;k>=0;k--){ for(l=rows[k].cells.length-1;l>=0;l--){ if(rows[k].cells[l].rowEnd>cells[0].rowStart){ rows[k].cells[l].rowSpan-=minrs; rows[k].cells[l].rowEnd-=minrs; } } } } } }; TQE.insertCol=function(cell, bBegin){ var table=cell.parentNode.parentNode.parentNode,cells,td,td2, i,j, colIndex; TQE.updateCellsStatus(table); colIndex= bBegin?cell.colStart : cell.colEnd+1; for(i=table.rows.length-1;i>=0;i--){ cells= table.rows[i].cells; td=null; for(j=Math.min(colIndex, cells.length-1);j>=0;j--){ if(cells[j].colStart<=colIndex){ if(cells[j].colStart==colIndex){ td=table.rows[i].insertCell(j); }else if(cells[j].colEnd==colIndex-1){ td=table.rows[i].insertCell(j+1); }else if(cells[j].colSpan>1 && cells[j].colEnd>=colIndex){ cells[j].colSpan++; }else if(j==cells.length-1 && cells[j].colEnd<colIndex){ td=table.rows[i].insertCell(j+1); } if(td){ if(bBegin){ td2=td.nextSibling; if(td2 && td2.rowSpan<2 && td2.colStart==colIndex){ td.style.backgroundColor = td2.style.backgroundColor; } }else{ td2 = td.previousSibling; if(td2 && td2.rowSpan<2 && td2.colEnd==colIndex-1){ td.style.backgroundColor = td2.style.backgroundColor; } } } break; } } } }; TQE.insertRow=function(cell, bBegin){ var table=cell.parentNode.parentNode.parentNode,cells, row, cells2, i,j,k=0, rowIndex; TQE.updateCellsStatus(table); rowIndex= bBegin?cell.rowStart : cell.rowEnd+1; for(i=Math.min(table.rows.length-1, rowIndex-1);i>=0;i--){ cells= table.rows[i].cells; for(j=cells.length-1;j>=0;j--){ if(cells[j].rowEnd>=rowIndex){ cells[j].rowSpan++; k+=cells[j].colSpan; } } } cells= table.rows[0].cells; for(j=cells.length-1;j>=0;j--){ k -= cells[j].colSpan; } row = table.insertRow(rowIndex); while(k++ <0){ row.insertCell(0).innerHTML=' '; } TQE.updateCellsStatus(table); cells = row.cells; cells2 = table.rows[ bBegin ? rowIndex+1 : rowIndex-1].cells; j=cells2.length-1; for(i=cells.length-1;i>=0;i--){ while(j>=0 && cells2[j].colStart > cells[i].colStart ) j--; if(j>=0 && cells2[j].colStart == cells[i].colStart && cells2[j].colEnd == cells[i].colEnd ){ cells[i].style.backgroundColor = cells2[j].style.backgroundColor; } } }; TQE.deleteCol=function(cell){ var table=cell.parentNode.parentNode.parentNode,rows=table.rows,td, i,j, start,end; TQE.updateCellsStatus(table); start=cell.colStart; end=cell.colEnd; for(i=rows.length-1;i>=0;i--){ for(j=Math.min(end,rows[i].cells.length-1);j>=0;j--){ td=rows[i].cells[j]; if(td.colEnd>=start && td.colStart<=end){ if(td.colStart>=start && td.colEnd<=end) rows[i].removeChild(td); else if(td.colStart<start && td.colEnd>end) td.colSpan -= 1+end-start; else if(td.colStart<start && td.colEnd>=start) td.colSpan -= td.colEnd-start+1; else if(td.colStart<=end && td.colEnd>end){ td.colSpan -= 1+end-td.colStart; td.innerHTML='';} } } if(rows[i].cells.length<1) rows[i].parentNode.removeChild(rows[i]); } if(rows.length<1) table.parentNode.removeChild(table); }; TQE.deleteRow=function(cell){ var table=cell.parentNode.parentNode.parentNode,rows=table.rows,nextRow,td,td2, i,j,k, start,end; TQE.updateCellsStatus(table); start=cell.rowStart; end=cell.rowEnd; nextRow=rows[end+1]; for(i=Math.min(end,rows.length-1);i>=0;i--){ for(j=rows[i].cells.length-1;j>=0;j--){ td=rows[i].cells[j]; if(td.rowEnd>=start && td.rowStart<=end) { if(td.rowStart>=start && td.rowEnd<=end) rows[i].removeChild(td); else if(td.rowStart<start && td.rowEnd>end) td.rowSpan -= 1+end-start; else if(td.rowStart<start && td.rowEnd>=start) td.rowSpan -= td.rowEnd-start+1; else if(td.rowStart<=end && td.rowEnd>end){ if(nextRow){ for(k=0;k<nextRow.cells.length;k++){ if(nextRow.cells[k].colStart>td.colEnd){ break; } } td2=nextRow.insertCell(k); td2.rowSpan=1+end-td.rowStart; td2.colSpan=td.colSpan; td2.style.backgroundColor=td.style.backgroundColor; } rows[i].removeChild(td); } } } if(rows[i].cells.length<1) rows[i].parentNode.removeChild(rows[i]); } if(rows.length<1) table.parentNode.removeChild(table); }; //常用工具栏模式 TQE.toolbarMode={ admin:{left:['paragraph','fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat','|','justifyleft','justifycenter','orderedlist',['justifyright','unorderedlist','|','indent','outdent','|','superscript','subscript'], '||','createlink','insertimage','inserttable',['splitpage','inserthorizontalrule'],'|','insertmusic','insertflash','insertvideo', '||','cleanword','typeset'], right:['fullscreen','mode','|','help']}, bbs:{left:['fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat','|','justifyleft','justifycenter','orderedlist',['justifyright','unorderedlist','|','indent','outdent'], '||','createlink','insertimage','|','insertface','insertmusic','insertflash','insertvideo','|','typeset'], right:['fullscreen','mode','|','help']}, user:{left:['fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat','|','justifyleft','justifycenter','orderedlist',['justifyright','unorderedlist','|','indent','outdent','|','inserthorizontalrule'], '||','createlink','insertimage','insertvideo','|','typeset'], right:['fullscreen','mode','|','help']}, mini:{left:['fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat','|','align','|','createlink','insertimage'], right:['help']}, message:{left:['insertface','|','fontsize','|','bold','italic','underline','|','forecolor','backcolor','|','removeformat'], right:['help']}, full:{left:['paragraph','fontname','fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat', '||','align','list','iodent',['superscript','subscript'], '||','createlink','unlink','insertimage','inserttable','inserthorizontalrule','splitpage','insertface','|','insertmusic','insertflash','insertvideo', '||','cleanword','typeset'], right:['fullscreen','mode','|','help']}, crm:{left:['paragraph','fontname','fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat', '||','align','superscript','subscript', '||','createlink','unlink','insertimage','inserttable','inserthorizontalrule','insertface', '||','typeset'], right:['fullscreen','mode']}, normal:{left:['paragraph','fontsize','|','bold','italic','underline','forecolor','backcolor','removeformat', '||','justifyleft','justifycenter','orderedlist',['justifyright','unorderedlist','|','indent','outdent','|','superscript','subscript'], '||','createlink','insertimage','inserttable','|','insertvideo','|','typeset'], right:['fullscreen','mode','|','help']} }; //可用的按钮 TQE.toolbarBottons={ paragraph:{ text:'段落', click:function($,sender){ var o=TQE.find($.objId+'Paragraph'),i; if(null==o){ var s='',fs=$.config.paragraphs; for(i=0;i < fs.length; i++){ s +='<div name="FormatBlock" class="eMenuItem" unselectable=on onselectstart="return false" paraValue="'+fs[i][1]+'">'+fs[i][0]+'</div>'; } o = TQE.CE('DIV',$.objId+'Paragraph',s,true); o.className='ePopPanel'; TQE._noSel(o);//,'DIV' TQE.listenTags(o,'DIV','click',function(){ TQE.hidePop(); var pv=this.getAttribute('paraValue'); if(isIE)pv ='<'+pv+'>'; $.exeCmd('FormatBlock', pv); }); if(isIE6){ var es = TQE._tags(o,'DIV'); for(i=es.length-1;i>=0;i--){ $._ieMouseStyle(es[i],'eMenuItem','eMenuItemUp','eMenuItem'); } } } TQE.pop(o,sender); } }, fontsize:{ text:'文字大小', click:function($,sender){ var o=TQE.find($.objId+'FontSize'); if(null==o){ var s='',i,es, fs=$.config.fontsizes; for(i=0;i < fs.length; i++){ s +='<div name="FontSize" class="eMenuItem" unselectable=on onselectstart="return false" paraValue="'+fs[i][2]+'" style="font-size:'+fs[i][1]+';" >'+fs[i][0]+'</div>'; } o = TQE.CE('DIV',$.objId+'FontSize',s,true); o.className='ePopPanel'; TQE._noSel(o);//,'DIV' TQE.listenTags(o,'DIV','click',function(){TQE.hidePop();$.exeCmd('FontSize', this.getAttribute('paraValue'))}); if(isIE6){ es = TQE._tags(o,'DIV'); for(i=es.length-1;i>=0;i--){ $._ieMouseStyle(es[i],'eMenuItem','eMenuItemUp','eMenuItem'); } } } TQE.pop(o,sender); } }, fontname:{ text:'字体', click:function($,sender){ var o=TQE.find($.objId+'FontName'); if(null==o){ var es,i,s='',fs=$.config.fontnames; for(i=0;i < fs.length; i++){ s +='<div name="FontName" class="eMenuItem" unselectable=on onselectstart="return false" paraValue="'+fs[i][1]+'" style="font-family:'+fs[i][1]+';" >'+fs[i][0]+'</div>'; } o = TQE.CE('DIV',$.objId+'FontName',s,true); o.className='ePopPanel'; TQE._noSel(o);//,'DIV' TQE.listenTags(o,'DIV','click',function(){TQE.hidePop();$.exeCmd('FontName', this.getAttribute('paraValue'))}); if(isIE6){ es = TQE._tags(o,'DIV'); for(i=es.length-1;i>=0;i--){ $._ieMouseStyle(es[i],'eMenuItem','eMenuItemUp','eMenuItem'); } } } TQE.pop(o,sender); } }, forecolor:{ text:'文本颜色', click:function($,sender){ $._showColorSelectUI(sender,'forecolor'); } }, backcolor:{ text:'背景色', click:function($,sender){ $._showColorSelectUI(sender, isIE ? 'backcolor':'hilitecolor'); } }, bold:{ text:'粗体', click:null }, italic:{ text:'斜体', click:null }, underline:{ text:'下划线', click:null }, strikethrough:{ text:'删除线', click:null }, removeformat:{ text:'消除格式', click:function($,sender){ TQE.hidePop(); $.exeCmd('removeformat'); if(isGecko || isOpera) return;//ff,opera本身已完美的清理格式, 其他的浏览器还要加代码处理word的代码 var rang=$._getRange(), clear=function(s){return s.replace(/mso\-[^;]+?;/gi,'').replace(/FONT\-FAMILY[^;]+?;/gi,'').replace(/\s+/g,' ').replace(/MARGIN\: 0cm 0cm 0pt;/gi,'').replace(/tab\-stops\:[^;]+?;/gi,'');}, htm='', str=rang.htmlText, nodes, i; if(str){//ie6,7,8 $.insertHtml(clear(s)); }else{//ie9,chrome nodes=rang.cloneContents().childNodes; for(i=0;i<nodes.length;i++){ if('#comment'!=nodes[i].nodeName){ str = nodes[i].outerHTML || nodes[i].nodeValue ; if(str) htm += str; } } $.insertHtml(clear(htm)); } } }, submenu:{ text:'', click:function($,sender){ $._popAsMenu(sender,sender.getAttribute('submenu').split(',')); } }, //使用submenu来替代此功能 //moreformat:{ // text:'', // click:function($,sender){ // $._popAsMenu(sender,['orderedlist','unorderedlist','|','indent','outdent','|','superscript','subscript']); // } //}, subscript:{ text:'下标', click:null }, superscript:{ text:'上标', click:null }, align:{ text:'对齐', click:function($,sender){ $._popAsMenu(sender,['justifyleft','justifycenter','justifyright']); } }, justifyleft:{ text:'左对齐', click:null }, justifycenter:{ text:'居中对齐', click:null }, justifyright:{ text:'右对齐', click:null }, list:{ text:'列表', click:function($,sender){ $._popAsMenu(sender,['orderedlist','unorderedlist']); } }, unorderedlist:{ text:'项目列表', click:function($,sender){ TQE.hidePop(); $.exeCmd('InsertUnorderedList'); } }, orderedlist:{ text:'数目列表', click:function($,sender){ TQE.hidePop(); $.exeCmd('InsertOrderedList'); } }, iodent:{ text:'缩进方向', click:function($,sender){ $._popAsMenu(sender,['indent','outdent']) } }, outdent:{ text:'减少缩进', click:null }, indent:{ text:'增加缩进', click:null }, inserthorizontalrule:{ text:'插入水平线', click:null }, createlink:{ text:'添加链接', click:function($,sender){ var o=TQE.find($.objId+'CreateLink'); if(null==o){ //var s='网址:<input type="text" id="url" value="" size=45 /><br />打开:<select id="target"><option value="" >默认</option><option value="_blank">新窗口</option><option value="_self">当前窗口</option><option value="_parent">父窗口</option><option value="_top">顶层窗口</option></select>'; var okClick= function(){ TQE.hidePop(); var es=this.form.elements, href=es['url'].value, target=es['target'].value, title=es['title'].value, titleTxt=''; if('http://'==href || ''==href){ $.exeCmd('Unlink'); return false; } var r= $._getRange(); if(isWebkit && r.collapsed || !$.exeCmd('CreateLink', href)){ if(target!=='') target = ' target="'+target+'" '; if(title!=='') titleTxt = ' title="'+title+'" '; $.insertHtml('<a href="'+href+'" '+titleTxt+target+'>'+(title?title:href)+'</a>'); return false; } var n=$.focusNode(); do{ if(n.tagName=='A'){ if(''==target) n.removeAttribute('target') ; else n.setAttribute('target',target); if(''==title) n.removeAttribute('title'); else n.setAttribute('title',title); break; } }while(n = n.parentNode); return false; }; o = $._popFormUI($.objId+'CreateLink',resStrCreateLink, resStrInsertLinkUI, okClick,null, $.config.linkUploadUrl,$.config.linkFileTypes,$.config.linkFileSize,'link'); TQE.drag(o); } if(!TQE.pop(o,sender)) return; var f = TQE._tags(o,'FORM')[0], es = f.elements, n = $.focusNode(); f.reset(); do{ if(n.tagName=='A'){ es['url'].value=n.getAttribute('href'); es['title'].value=n.getAttribute('title'); $.__selectOption(es['target'],n.getAttribute('target')); break; } }while(n = n.parentNode); es['url'].focus(); } }, unlink:{ text:'删除链接', click:null }, inserttable:{ text:'插入表格', click:function($,sender){ var o=TQE.find($.objId+'InsertTable'); if(null==o){ var s=resStrTableContextUI + '<div><table border=1 cellspacing=0 cellpadding=0 bgcolor="#FFFFFF" bordercolor="#CCCCCC" style="border:none;border-collapse:collapse;"><tbody>',i=0,j=0; for(i=0;i<5;i++){ s+='<tr>'; for(j=0;j<8;j++){ s+='<td width="20" height="20"></td>'; } s+='</tr>'; } s+='</tbody></table><div style="padding:2px 5px;">1 × 1</div></div>'; o = TQE.CE('DIV',$.objId+'InsertTable', s ,true); o.className='ePopPanel'; TQE._noSel(o);//,'TABLE,TR,TD,DIV'); TQE.listenTags(o.lastChild,'TD','click',function(){ TQE.hidePop(); var i,j,s='<table style="border-collapse:collapse;" width=96% align=center border=1 cellspace=0 cellpadding=3 ><tbody>'; for(i=this.parentNode.rowIndex;i>=0;i--){ s+='<tr>'; for(j=this.cellIndex;j>=0;j--){ s+= isIE ? '<td valign="top"></td>':'<td valign="top"><br></td>'; } s+='</tr>'; } s+='</tbody></table>'; //s = '<p>'+s+'</p>'; //$.exeCmd('InsertParagraph'); //$.exeCmd('FormatBlock','p'); $.insertHtml(s); } ); TQE.listenTags(o.lastChild,'TD','mouseover',function(){ var i,j,ci=this.cellIndex, row=this.parentNode,ri=row.rowIndex,table=row.parentNode.parentNode, rc=table.rows.length,cc=row.cells.length; for(i=0;i<rc;i++){ row=table.rows[i]; for(j=0;j<cc;j++) row.cells[j].bgColor= (i<=ri && j<=ci)?'#3399ff':''; } table.parentNode.lastChild.innerHTML= (ri+1) +' × '+(ci+1); }); } var table, td, selectedCells=$.selectedCells(), propertyPanel=o.firstChild, miMerge=propertyPanel.firstChild, miSplit=miMerge.nextSibling, insertPanel=o.lastChild, row=o.lastChild.firstChild.firstChild.firstChild, cc=row.cells.length, showObj=function(obj,b){obj.style.display=b?'':'none';}; while(row){ for(var i=0;i<cc;i++) row.cells[i].bgColor=''; row=row.nextSibling; } insertPanel.lastChild.innerHTML='1 × 1'; //-- if(selectedCells.length){//选中格 showObj(insertPanel, 0); td=selectedCells[0]; }else{ showObj(insertPanel, 1); td=$.focusNode(); while(td && td.nodeName !=='TD'){ td = td.parentNode } } if(td){ table=td.parentNode.parentNode.parentNode; showObj(propertyPanel, 1); showObj(miMerge, $.canMergeSelectedCells()); showObj(miSplit, selectedCells.length<2 && (td.rowSpan>1 || td.colSpan>1)); showObj(miSplit.nextSibling, miMerge.style.display!='none' || miSplit.style.display!='none'); }else{ showObj(propertyPanel, 0); } showObj(insertPanel.previousSibling, propertyPanel.style.display!='none' && insertPanel.style.display!='none'); var objs=o.firstChild.getElementsByTagName('A'), alignTD=function(align,vAlign){ if(selectedCells.length>0){ for(var i=selectedCells.length-1;i>=0;i--){ selectedCells[i].align=align; selectedCells[i].vAlign=vAlign; } }else if(td){ td.align=align; td.vAlign=vAlign; } }; for(i=objs.length-1;i>=0;i--){ objs[i].href='#'; objs[i].onclick=function(){ switch(this.id){ case 'eTableAlignDefault':table.align=''; break; case 'eTableAlignLeft':table.align='left'; break; case 'eTableAlignCenter':table.align='center'; break; case 'eTableAlignRight':table.align='right'; break; case 'eCellAlignLT':alignTD('left','top');break; case 'eCellAlignCT':alignTD('center','top');break; case 'eCellAlignRT':alignTD('right','top');break; case 'eCellAlignLC':alignTD('left','middle');break; case 'eCellAlignCC':alignTD('center','middle');break; case 'eCellAlignRC':alignTD('right','middle');break; case 'eCellAlignLB':alignTD('left','bottom');break; case 'eCellAlignCB':alignTD('center','bottom');break; case 'eCellAlignRB':alignTD('right','bottom');break; } $.focus(); return false; }; } objs=o.firstChild.getElementsByTagName('INPUT'); for(i=objs.length-1;i>=0;i--){ if(table) objs[i].value= undefined==table[objs[i].id] ? '' : table[objs[i].id]; objs[i].onblur=function(){ if(''==this.value ) table.removeAttribute(this.id); else table[this.id]=this.value; table.style.borderCollapse = table.cellSpacing<1 && table.border==1 ? 'collapse':''; }; } miMerge.onclick=function(){TQE.hidePop();$.mergeSelectedCells();$.focus(); return false;} miSplit.onclick=function(){TQE.hidePop();$.splitCell(td);$.focus();return false;} //-- if(!TQE.pop(o,sender)) return; } }, insertimage:{ text:'插入图片', click:function($,sender){ var o=TQE.find($.objId+'InsertImage'); if(null==o){ //var s='图片网址:<input type="text" id="url" value="" size=40 /><br />替换文本:<input name="alt" type="text" id="alt" size="20" /><br />尺寸:<input name="width" type="text" id="width" size="4" /> × <input name="height" type="text" id="height" size="4" /> px <br />对齐:<select name="align" id="align"><option value="" >默认</option><option value="top">居上</option><option value="textTop">文本上方</option><option value="middle">居中</option><option value="absMiddle">绝对居中</option><option value="baseline">基线</option><option value="bottom">底部</option><option value="absBottom">绝对底部</option><option value="left">左</option><option value="right">右</option></select> 边框:<input name="border" type="text" id="border" size="5" />'; var okClick=function(){ TQE.hidePop(); var es=this.form.elements; $.insertImage(es['url'].value,es['width'].value,es['height'].value,es['border'].value, es['alt'].value,es['align'].value); return false; }; o = $._popFormUI($.objId+'InsertImage',resStrInsertImage, resStrInsertImageUI, okClick ,['width','height','border'], $.config.imageUploadUrl,$.config.imageFileTypes, $.config.imageFileSize, 'image'); TQE.drag(o); } if(!TQE.pop(o,sender)) return; var f = TQE._tags(o,'FORM')[0], es = f.elements, r=$._getRange(), n=r.commonAncestorContainer; f.reset(); if(n){ //标准dom if(!r.collapsed && r.startContainer == r.endContainer && r.startOffset - r.endOffset < 2 && r.startContainer.hasChildNodes()){ n=r.startContainer.childNodes[r.startOffset]; } if(n.tagName!='IMG' && isIE9 && ''===r.toString()){ if(undefined===r.startContainer.length && r.startContainer.firstChild===r.endContainer.previousSibling)n=r.startContainer.firstChild; else if(r.endContainer.lastChild===r.startContainer.nextSibling)n=r.endContainer.lastChild; else if(r.startContainer.length == r.startOffset && r.endOffset==0 && r.startContainer.nextSibling==r.endContainer.previousSibling){ n=r.startContainer.nextSibling; } } if(!n || n.tagName!='IMG') n=null; }else if(r.length && r.item(0).tagName=='IMG'){ //isIE, ie6,7,8 n=r.item(0); } if(n && 'IMG'==n.nodeName){ es['url'].value=n.getAttribute('src'); es['width'].value=n.width; es['height'].value=n.height; es['border'].value=n.border; es['alt'].value=n.alt; $.__selectOption(es['align'],n.align); } es['url'].focus(); } }, insertface:{ text:'表情', click:function($,sender){ var o=TQE.find($.objId+'InsertFace'); if(null==o){ var i,es,s='<div class="eFace">'; for( i=1;i<=$.config.faceCount;i++){ s+='<img src="'+TQE.url+'face/'+i+'.gif" emot="'+i+'" />'; } s+='</div>'; o = TQE.CE('DIV',$.objId+'InsertFace', s ,true); o.className='ePopPanel'; TQE._noSel(o);//,'IMG,DIV'); TQE.listenTags(o,'IMG','click',function(){TQE.hidePop();$.insertHtml('<img align=absMiddle src="'+this.getAttribute('src')+'" emot="'+this.getAttribute('emot')+'" />');}); if(isIE6){ es = TQE._tags(o,'IMG'); for(i=es.length-1;i>=0;i--){ $._ieMouseStyle(es[i],'','imgHover',''); } } } TQE.pop(o,sender); } }, insertflash:{ text:'插入Flash', click:function($,sender){ var o=TQE.find($.objId+'InsertFlash'),form; if(null==o){ //var s='Flash网址:<input type="text" id="url" value="" size=40 /><br />尺寸:<input name="width" type="text" id="width" size="4" value="200" />×<input name="height" type="text" id="height" size="4" value="200" /> px'; var okClick= function(){ TQE.hidePop(); var es=this.form.elements; $.insertFlash(es['url'].value,es['width'].value,es['height'].value); return false; }; o = $._popFormUI($.objId+'InsertFlash',resStrInsertFlash, resStrInsertFlashUI, okClick,['width','height'], $.config.flashUploadUrl,$.config.flashFileTypes,$.config.flashFileSize, 'flash'); TQE.drag(o); } if(!TQE.pop(o,sender)) return; form=TQE._tags(o,'FORM')[0]; form.reset(); form.elements['url'].focus(); } }, insertmusic:{ text:'插入音频', click:function($,sender){ var o=TQE.find($.objId+'InsertMusic'),form; if(null==o){ //var s='音频网址:<input type="text" id="url" value="" size=40 /><br />自动播放:<select id="auto_start" name="auto_start"><option value="0">手动开始</option><option value="1">自动开始</option></select>'; var okClick= function(){ TQE.hidePop(); var es=this.form.elements; $.insertMusic(es['url'].value,es['auto_start'].value); return false; }; o = $._popFormUI($.objId+'InsertMusic',resStrInsertMusic, resStrInsertMusicUI, okClick,null, $.config.musicUploadUrl,$.config.musicFileTypes,$.config.musicFileSize, 'music'); TQE.drag(o); } if(!TQE.pop(o,sender)) return ; form=TQE._tags(o,'FORM')[0]; form.reset(); form.elements['url'].focus(); } }, insertvideo:{ text:'插入视频', click:function($,sender){ var o=TQE.find($.objId+'InsertVideo'),form; if(null==o){ //var s='视频网址:<input type="text" id="url" value="" size=40 /><br />尺寸:<input name="width" type="text" id="width" size="4" value="320"/>×<input name="height" type="text" id="height" size="4" value="240" /> px<br />自动播放:<select id="auto_start" name="auto_start"><option value="0">手动开始</option><option value="1">自动开始</option></select><br />视频类型:<select id="video_type" name="video_type"><option value="auto">自动识别</option><option value="flv">FLV</option><option value="rm">RMVB</option><option value="wm">其他视频</option></select>'; var okClick= function(){ TQE.hidePop(); var es=this.form.elements; $.insertVideo(es['url'].value,es['auto_start'].value,es['width'].value,es['height'].value,es['video_type'].value); return false; }; o = $._popFormUI($.objId+'InsertVideo',resStrInsertVideo, resStrInsertVideoUI, okClick,['width','height'], $.config.videoUploadUrl,$.config.videoFileTypes,$.config.videoFileSize, 'video'); TQE.drag(o); } if(!TQE.pop(o,sender)) return; form=TQE._tags(o,'FORM')[0]; form.reset(); form.elements['url'].focus(); } }, cleanword:{ text:'清理Word代码', click:function($,sender){ TQE.hidePop(); $.cleanWord(true); } }, typeset:{ text:'一键排版', click:function($,sender){ TQE.hidePop(); $.typeset(); } }, mode:{ text:'查看源码', click:function($,sender){ TQE.hidePop(); $.changeMode(); } }, splitpage:{ text:'插入分页符', click:function($,sender){ TQE.hidePop(); //$.insertHtml($.config.tplSplitPage,'after'); $.insertHtml($.config.tplSplitPage); } }, group:{ text:'', click:null }, separator:{ text:'', click:null }, fullscreen:{ text:'全屏', click:function($,sender){ TQE.hidePop(); $.fullScreen(); } }, help:{ text:'帮助', click:function($,sender){ var o=TQE.find($.objId+'TQHelpPanel'); if(null==o){ o = TQE.CE('DIV',$.objId+'TQHelpPanel', '<form class="ePopForm" style="line-height:20px;">TQEditor<br/>'+resStrVersion+': '+version+'<br/>'+resStrAuthor+': 李腾秋(TengQiu Li)<br/>'+resStrSite+': <a href="http://www.e512.net" target="_blank">e512.net</a><br />'+resStrMail+': <a href="mailto:litqqs@163.com">litqqs@163.com</a><br /><a href="tencent://message/?uin=7775038&Site=e512.net&Menu=no" style="clear:both;"><span class="eButton" style="background-position: -1026px 0;width:20px;" ></span> 7775038</a></form>' ,true); o.className='ePopPanel'; } TQE.pop(o,sender); } } }; //运行时对象容器 //TQE.rto={}; //explode names; window.tqEditor=window.tqeditor=window.TQEditor=window.TQE=TQE; window.isIE=isIE; window.isIE6=isIE6; window.isIE9=isIE9; window.isWebkit=isWebkit; window.isOpera=isOpera; window.isGecko=isGecko; })(window);