diff --git a/member/404.php b/member/404.php new file mode 100644 index 0000000..d55b5e3 --- /dev/null +++ b/member/404.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/member/account.php b/member/account.php new file mode 100644 index 0000000..c073119 --- /dev/null +++ b/member/account.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/ad.php b/member/ad.php new file mode 100644 index 0000000..ab6b699 --- /dev/null +++ b/member/ad.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/address.php b/member/address.php new file mode 100644 index 0000000..673805e --- /dev/null +++ b/member/address.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/ajax.php b/member/ajax.php new file mode 100644 index 0000000..2f5f7a1 --- /dev/null +++ b/member/ajax.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/member/alert.php b/member/alert.php new file mode 100644 index 0000000..e11ed06 --- /dev/null +++ b/member/alert.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/ask.php b/member/ask.php new file mode 100644 index 0000000..d9cdf34 --- /dev/null +++ b/member/ask.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/avatar.php b/member/avatar.php new file mode 100644 index 0000000..58e10ca --- /dev/null +++ b/member/avatar.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/member/award.php b/member/award.php new file mode 100644 index 0000000..b0a5302 --- /dev/null +++ b/member/award.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/biz.php b/member/biz.php new file mode 100644 index 0000000..7f399fe --- /dev/null +++ b/member/biz.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/buy.php b/member/buy.php new file mode 100644 index 0000000..876a51a --- /dev/null +++ b/member/buy.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/member/cart.php b/member/cart.php new file mode 100644 index 0000000..2d26aff --- /dev/null +++ b/member/cart.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/member/cash.php b/member/cash.php new file mode 100644 index 0000000..5c2617a --- /dev/null +++ b/member/cash.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/charge.php b/member/charge.php new file mode 100644 index 0000000..029cb1d --- /dev/null +++ b/member/charge.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/member/chat.php b/member/chat.php new file mode 100644 index 0000000..619874c --- /dev/null +++ b/member/chat.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/child.php b/member/child.php new file mode 100644 index 0000000..29c15fc --- /dev/null +++ b/member/child.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/coupon.php b/member/coupon.php new file mode 100644 index 0000000..a95e162 --- /dev/null +++ b/member/coupon.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/credit.php b/member/credit.php new file mode 100644 index 0000000..ab1c966 --- /dev/null +++ b/member/credit.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/deal.php b/member/deal.php new file mode 100644 index 0000000..0d2c708 --- /dev/null +++ b/member/deal.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/deposit.php b/member/deposit.php new file mode 100644 index 0000000..0e085dc --- /dev/null +++ b/member/deposit.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/edit.php b/member/edit.php new file mode 100644 index 0000000..0adeea2 --- /dev/null +++ b/member/edit.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/member/editor/fckeditor/change.log b/member/editor/fckeditor/change.log new file mode 100644 index 0000000..d67aa2f --- /dev/null +++ b/member/editor/fckeditor/change.log @@ -0,0 +1,5 @@ +2009-11-07 editor/fckeditor.html Fix IE8+ +2011-06-22 editor/dialog/common/fck_dialog_common.js Fix FireFox 4+ +2011-06-22 editor/fckeditor.html Fix FireFox 4+ +2012-11-09 fckeditor.js Fix IE 10+ +2012-11-30 editor/js/fckeditorcode_gecko.js Fix FireFox 17+ \ No newline at end of file diff --git a/member/editor/fckeditor/editor/css/behaviors/disablehandles.htc b/member/editor/fckeditor/editor/css/behaviors/disablehandles.htc new file mode 100644 index 0000000..e12aa59 --- /dev/null +++ b/member/editor/fckeditor/editor/css/behaviors/disablehandles.htc @@ -0,0 +1,15 @@ + + + + + diff --git a/member/editor/fckeditor/editor/css/behaviors/showtableborders.htc b/member/editor/fckeditor/editor/css/behaviors/showtableborders.htc new file mode 100644 index 0000000..bb81406 --- /dev/null +++ b/member/editor/fckeditor/editor/css/behaviors/showtableborders.htc @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/member/editor/fckeditor/editor/css/fck_editorarea.css b/member/editor/fckeditor/editor/css/fck_editorarea.css new file mode 100644 index 0000000..3a8ac2c --- /dev/null +++ b/member/editor/fckeditor/editor/css/fck_editorarea.css @@ -0,0 +1 @@ +body{background-color: #ffffff;padding: 5px 5px 5px 5px;margin: 0px;}body, td{font-family: Arial, Verdana, sans-serif;font-size: 14px;}a[href]{color: -moz-hyperlinktext !important;text-decoration: -moz-anchor-decoration;}.Bold{font-weight: bold;}.Title{font-weight: bold;font-size: 18px;color: #cc3300;}.Code{border: #8b4513 1px solid;padding-right: 5px;padding-left: 5px;color: #000066;font-family: 'Courier New' , Monospace;background-color: #ff9933;} p {text-indent:2em;} .de-pagebreak {border:1px dotted #FF6600;font-size:0;height:2px;} .de-photo {} .de-vote {} a {color:#024893;} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/css/fck_internal.css b/member/editor/fckeditor/editor/css/fck_internal.css new file mode 100644 index 0000000..09d0435 --- /dev/null +++ b/member/editor/fckeditor/editor/css/fck_internal.css @@ -0,0 +1 @@ +html{ min-height: 100%;}table.FCK__ShowTableBorders, table.FCK__ShowTableBorders td, table.FCK__ShowTableBorders th{ border: #d3d3d3 1px solid;}form{ border: 1px dotted #FF0000; padding: 2px;}.FCK__Flash{ border: #a9a9a9 1px solid; background-position: center center; background-image: url(images/fck_flashlogo.gif); background-repeat: no-repeat; width: 80px; height: 80px;}.FCK__UnknownObject{ border: #a9a9a9 1px solid; background-position: center center; background-image: url(images/fck_extend.gif); background-repeat: no-repeat; width: 80px; height: 80px;}.FCK__Anchor{ border: 1px dotted #00F; background-position: center center; background-image: url(images/fck_anchor.gif); background-repeat: no-repeat; width: 16px; height: 15px; vertical-align: middle;}.FCK__AnchorC{ border: 1px dotted #00F; background-position: 1px center; background-image: url(images/fck_anchor.gif); background-repeat: no-repeat; padding-left: 18px;}a[name]{ border: 1px dotted #00F; background-position: 0 center; background-image: url(images/fck_anchor.gif); background-repeat: no-repeat; padding-left: 18px;}.FCK__PageBreak{ background-position: center center; background-image: url(images/fck_pagebreak.gif); background-repeat: no-repeat; clear: both; display: block; float: none; width: 100%; border-top: #999999 1px dotted; border-bottom: #999999 1px dotted; border-right: 0px; border-left: 0px; height: 5px;}.FCK__InputHidden{ width: 19px; height: 18px; background-image: url(images/fck_hiddenfield.gif); background-repeat: no-repeat; vertical-align: text-bottom; background-position: center center;}.FCK__ShowBlocks p,.FCK__ShowBlocks div,.FCK__ShowBlocks pre,.FCK__ShowBlocks address,.FCK__ShowBlocks blockquote,.FCK__ShowBlocks h1,.FCK__ShowBlocks h2,.FCK__ShowBlocks h3,.FCK__ShowBlocks h4,.FCK__ShowBlocks h5,.FCK__ShowBlocks h6{ background-repeat: no-repeat; border: 1px dotted gray; padding-top: 8px; padding-left: 8px;}.FCK__ShowBlocks p{ background-image: url(images/block_p.png);}.FCK__ShowBlocks div{ background-image: url(images/block_div.png);}.FCK__ShowBlocks pre{ background-image: url(images/block_pre.png);}.FCK__ShowBlocks address{ background-image: url(images/block_address.png);}.FCK__ShowBlocks blockquote{ background-image: url(images/block_blockquote.png);}.FCK__ShowBlocks h1{ background-image: url(images/block_h1.png);}.FCK__ShowBlocks h2{ background-image: url(images/block_h2.png);}.FCK__ShowBlocks h3{ background-image: url(images/block_h3.png);}.FCK__ShowBlocks h4{ background-image: url(images/block_h4.png);}.FCK__ShowBlocks h5{ background-image: url(images/block_h5.png);}.FCK__ShowBlocks h6{ background-image: url(images/block_h6.png);} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/css/fck_showtableborders_gecko.css b/member/editor/fckeditor/editor/css/fck_showtableborders_gecko.css new file mode 100644 index 0000000..93fa86b --- /dev/null +++ b/member/editor/fckeditor/editor/css/fck_showtableborders_gecko.css @@ -0,0 +1,19 @@ +/* For tables with the "border" attribute set to "0" */ +table[border="0"], +table[border="0"] > tr > td, table[border="0"] > tr > th, +table[border="0"] > tbody > tr > td, table[border="0"] > tbody > tr > th, +table[border="0"] > thead > tr > td, table[border="0"] > thead > tr > th, +table[border="0"] > tfoot > tr > td, table[border="0"] > tfoot > tr > th +{ + border: #d3d3d3 1px dotted ; +} + +/* For tables with no "border" attribute set */ +table:not([border]), +table:not([border]) > tr > td, table:not([border]) > tr > th, +table:not([border]) > tbody > tr > td, table:not([border]) > tbody > tr > th, +table:not([border]) > thead > tr > td, table:not([border]) > thead > tr > th, +table:not([border]) > tfoot > tr > td, table:not([border]) > tfoot > tr > th +{ + border: #d3d3d3 1px dotted ; +} diff --git a/member/editor/fckeditor/editor/css/images/block_address.png b/member/editor/fckeditor/editor/css/images/block_address.png new file mode 100644 index 0000000..8bbae6e Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_address.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_blockquote.png b/member/editor/fckeditor/editor/css/images/block_blockquote.png new file mode 100644 index 0000000..cf065ba Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_blockquote.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_div.png b/member/editor/fckeditor/editor/css/images/block_div.png new file mode 100644 index 0000000..a2806b1 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_div.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_h1.png b/member/editor/fckeditor/editor/css/images/block_h1.png new file mode 100644 index 0000000..d43fbdb Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_h1.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_h2.png b/member/editor/fckeditor/editor/css/images/block_h2.png new file mode 100644 index 0000000..27b5475 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_h2.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_h3.png b/member/editor/fckeditor/editor/css/images/block_h3.png new file mode 100644 index 0000000..3c3034f Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_h3.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_h4.png b/member/editor/fckeditor/editor/css/images/block_h4.png new file mode 100644 index 0000000..ab3f64d Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_h4.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_h5.png b/member/editor/fckeditor/editor/css/images/block_h5.png new file mode 100644 index 0000000..93477d0 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_h5.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_h6.png b/member/editor/fckeditor/editor/css/images/block_h6.png new file mode 100644 index 0000000..11ea1c2 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_h6.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_p.png b/member/editor/fckeditor/editor/css/images/block_p.png new file mode 100644 index 0000000..d055c51 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_p.png differ diff --git a/member/editor/fckeditor/editor/css/images/block_pre.png b/member/editor/fckeditor/editor/css/images/block_pre.png new file mode 100644 index 0000000..be8ad26 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/block_pre.png differ diff --git a/member/editor/fckeditor/editor/css/images/fck_anchor.gif b/member/editor/fckeditor/editor/css/images/fck_anchor.gif new file mode 100644 index 0000000..5aa797b Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/fck_anchor.gif differ diff --git a/member/editor/fckeditor/editor/css/images/fck_flashlogo.gif b/member/editor/fckeditor/editor/css/images/fck_flashlogo.gif new file mode 100644 index 0000000..2d7bc34 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/fck_flashlogo.gif differ diff --git a/member/editor/fckeditor/editor/css/images/fck_hiddenfield.gif b/member/editor/fckeditor/editor/css/images/fck_hiddenfield.gif new file mode 100644 index 0000000..953f643 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/fck_hiddenfield.gif differ diff --git a/member/editor/fckeditor/editor/css/images/fck_pagebreak.gif b/member/editor/fckeditor/editor/css/images/fck_pagebreak.gif new file mode 100644 index 0000000..8d1cffd Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/fck_pagebreak.gif differ diff --git a/member/editor/fckeditor/editor/css/images/fck_plugin.gif b/member/editor/fckeditor/editor/css/images/fck_plugin.gif new file mode 100644 index 0000000..7d58463 Binary files /dev/null and b/member/editor/fckeditor/editor/css/images/fck_plugin.gif differ diff --git a/member/editor/fckeditor/editor/dialog/common/fck_dialog_common.css b/member/editor/fckeditor/editor/dialog/common/fck_dialog_common.css new file mode 100644 index 0000000..01baede --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_dialog_common.css @@ -0,0 +1 @@ +.ImagePreviewArea{ border: #000000 1px solid; overflow: auto; width: 100%; height: 170px; background-color: #ffffff;}.FlashPreviewArea{ border: #000000 1px solid; padding: 5px; overflow: auto; width: 100%; height: 170px; background-color: #ffffff;}.BtnReset{ float: left; background-position: center center; background-image: url(images/reset.gif); width: 16px; height: 16px; background-repeat: no-repeat; border: 1px none; font-size: 1px ;}.BtnLocked, .BtnUnlocked{ float: left; background-position: center center; background-image: url(images/locked.gif); width: 16px; height: 16px; background-repeat: no-repeat; border: none 1px; font-size: 1px ;}.BtnUnlocked{ background-image: url(images/unlocked.gif);}.BtnOver{ border: outset 1px; cursor: pointer; cursor: hand;} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/dialog/common/fck_dialog_common.js b/member/editor/fckeditor/editor/dialog/common/fck_dialog_common.js new file mode 100644 index 0000000..9722c37 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_dialog_common.js @@ -0,0 +1,271 @@ +(function() +{ + var d = document.domain ; + + while ( true ) + { + try + { + var test = window.parent.document.domain ; + /* DT ADD 2011-06-22// Fix Firefox 4+*/ + var uaL = navigator.userAgent.toLowerCase(); + if(uaL.indexOf('firefox') != -1 && parseInt(uaL.match(/firefox\/(\d+)/)[1], 10) >= 4) { + if(test != document.domain) document.domain = test; + } + /* DT ADD 2011-06-22\\*/ + break ; + } + catch( e ) {} + d = d.replace( /.*?(?:\.|$)/, '' ) ; + + if ( d.length == 0 ) + break ; + + try + { + document.domain = d ; + } + catch (e) + { + break ; + } + } +})() ; +function GetCommonDialogCss( prefix ) +{ + return FCKConfig.BasePath + 'dialog/common/' + '|.ImagePreviewArea{border:#000 1px solid;overflow:auto;width:100%;height:170px;background-color:#fff}.FlashPreviewArea{border:#000 1px solid;padding:5px;overflow:auto;width:100%;height:170px;background-color:#fff}.BtnReset{float:left;background-position:center center;background-image:url(images/reset.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.BtnLocked,.BtnUnlocked{float:left;background-position:center center;background-image:url(images/locked.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.BtnUnlocked{background-image:url(images/unlocked.gif)}.BtnOver{border:outset 1px;cursor:pointer;cursor:hand}' ; +} +function GetE( elementId ) +{ + return document.getElementById( elementId ) ; +} + +function ShowE( element, isVisible ) +{ + if ( typeof( element ) == 'string' ) + element = GetE( element ) ; + element.style.display = isVisible ? '' : 'none' ; +} + +function SetAttribute( element, attName, attValue ) +{ + if ( attValue == null || attValue.length == 0 ) + element.removeAttribute( attName, 0 ) ; + else + element.setAttribute( attName, attValue, 0 ) ; +} + +function GetAttribute( element, attName, valueIfNull ) +{ + var oAtt = element.attributes[attName] ; + + if ( oAtt == null || !oAtt.specified ) + return valueIfNull ? valueIfNull : '' ; + + var oValue = element.getAttribute( attName, 2 ) ; + + if ( oValue == null ) + oValue = oAtt.nodeValue ; + + return ( oValue == null ? valueIfNull : oValue ) ; +} + +function SelectField( elementId ) +{ + var element = GetE( elementId ) ; + element.focus() ; + if ( element.select ) + element.select() ; +} +var IsDigit = ( function() + { + var KeyIdentifierMap = + { + End : 35, + Home : 36, + Left : 37, + Right : 39, + 'U+00007F' : 46 + } ; + + return function ( e ) + { + if ( !e ) + e = event ; + + var iCode = ( e.keyCode || e.charCode ) ; + + if ( !iCode && e.keyIdentifier && ( e.keyIdentifier in KeyIdentifierMap ) ) + iCode = KeyIdentifierMap[ e.keyIdentifier ] ; + + return ( + ( iCode >= 48 && iCode <= 57 ) // Numbers + || (iCode >= 35 && iCode <= 40) // Arrows, Home, End + || iCode == 8 // Backspace + || iCode == 46 // Delete + || iCode == 9 // Tab + ) ; + } + } )() ; + +String.prototype.Trim = function() +{ + return this.replace( /(^\s*)|(\s*$)/g, '' ) ; +} + +String.prototype.StartsWith = function( value ) +{ + return ( this.substr( 0, value.length ) == value ) ; +} + +String.prototype.Remove = function( start, length ) +{ + var s = '' ; + + if ( start > 0 ) + s = this.substring( 0, start ) ; + + if ( start + length < this.length ) + s += this.substring( start + length , this.length ) ; + + return s ; +} + +String.prototype.ReplaceAll = function( searchArray, replaceArray ) +{ + var replaced = this ; + + for ( var i = 0 ; i < searchArray.length ; i++ ) + { + replaced = replaced.replace( searchArray[i], replaceArray[i] ) ; + } + + return replaced ; +} + +function OpenFileBrowser( url, width, height ) +{ + // oEditor must be defined. + + var iLeft = ( oEditor.FCKConfig.ScreenWidth - width ) / 2 ; + var iTop = ( oEditor.FCKConfig.ScreenHeight - height ) / 2 ; + + var sOptions = "toolbar=no,status=no,resizable=yes,dependent=yes,scrollbars=yes" ; + sOptions += ",width=" + width ; + sOptions += ",height=" + height ; + sOptions += ",left=" + iLeft ; + sOptions += ",top=" + iTop ; + if ( oEditor.FCKConfig.PreserveSessionOnFileBrowser && oEditor.FCKBrowserInfo.IsIE ) + { + var oWindow = oEditor.window.open( url, 'FCKBrowseWindow', sOptions ) ; + + if ( oWindow ) + { + try + { + var sTest = oWindow.name ; + oWindow.opener = window ; + } + catch(e) + { + alert( oEditor.FCKLang.BrowseServerBlocked ) ; + } + } + else + alert( oEditor.FCKLang.BrowseServerBlocked ) ; + } + else + window.open( url, 'FCKBrowseWindow', sOptions ) ; +} +function CreateNamedElement( oEditor, oOriginal, nodeName, oAttributes ) +{ + var oNewNode ; + var oldNode = null ; + if ( oOriginal && oEditor.FCKBrowserInfo.IsIE ) + { + var bChanged = false; + for( var attName in oAttributes ) + bChanged |= ( oOriginal.getAttribute( attName, 2) != oAttributes[attName] ) ; + + if ( bChanged ) + { + oldNode = oOriginal ; + oOriginal = null ; + } + } + + if ( oOriginal ) + { + oNewNode = oOriginal ; + } + else + { + if ( oEditor.FCKBrowserInfo.IsIE ) + { + var sbHTML = [] ; + sbHTML.push( '<' + nodeName ) ; + for( var prop in oAttributes ) + { + sbHTML.push( ' ' + prop + '="' + oAttributes[prop] + '"' ) ; + } + sbHTML.push( '>' ) ; + if ( !oEditor.FCKListsLib.EmptyElements[nodeName.toLowerCase()] ) + sbHTML.push( '' ) ; + + oNewNode = oEditor.FCK.EditorDocument.createElement( sbHTML.join('') ) ; + if ( oldNode ) + { + CopyAttributes( oldNode, oNewNode, oAttributes ) ; + oEditor.FCKDomTools.MoveChildren( oldNode, oNewNode ) ; + oldNode.parentNode.removeChild( oldNode ) ; + oldNode = null ; + + if ( oEditor.FCK.Selection.SelectionData ) + { + var oSel = oEditor.FCK.EditorDocument.selection ; + oEditor.FCK.Selection.SelectionData = oSel.createRange() ; + } + } + oNewNode = oEditor.FCK.InsertElement( oNewNode ) ; + if ( oEditor.FCK.Selection.SelectionData ) + { + var range = oEditor.FCK.EditorDocument.body.createControlRange() ; + range.add( oNewNode ) ; + oEditor.FCK.Selection.SelectionData = range ; + } + } + else + { + oNewNode = oEditor.FCK.InsertElement( nodeName ) ; + } + } + + // Set the basic attributes + for( var attName in oAttributes ) + oNewNode.setAttribute( attName, oAttributes[attName], 0 ) ; // 0 : Case Insensitive + + return oNewNode ; +} +function CopyAttributes( oSource, oDest, oSkipAttributes ) +{ + var aAttributes = oSource.attributes ; + + for ( var n = 0 ; n < aAttributes.length ; n++ ) + { + var oAttribute = aAttributes[n] ; + + if ( oAttribute.specified ) + { + var sAttName = oAttribute.nodeName ; + if ( sAttName in oSkipAttributes ) + continue ; + + var sAttValue = oSource.getAttribute( sAttName, 2 ) ; + if ( sAttValue == null ) + sAttValue = oAttribute.nodeValue ; + + oDest.setAttribute( sAttName, sAttValue, 0 ) ; // 0 : Case Insensitive + } + } + oDest.style.cssText = oSource.style.cssText ; +} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/dialog/common/fck_flash.js b/member/editor/fckeditor/editor/dialog/common/fck_flash.js new file mode 100644 index 0000000..e3fbe97 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_flash.js @@ -0,0 +1,132 @@ +var dialog = window.parent ; +var oEditor = dialog.InnerDialogLoaded() ; +var FCK = oEditor.FCK ; +var FCKLang = oEditor.FCKLang ; +var FCKConfig = oEditor.FCKConfig ; +var FCKTools = oEditor.FCKTools ; +dialog.AddTab( 'Info', oEditor.FCKLang.DlgInfoTab ) ; +if ( FCKConfig.FlashUpload ) + dialog.AddTab( 'Upload', FCKLang.DlgLnkUpload ) ; +if ( !FCKConfig.FlashDlgHideAdvanced ) + dialog.AddTab( 'Advanced', oEditor.FCKLang.DlgAdvancedTag ) ; +function OnDialogTabChange( tabCode ) +{ + ShowE('divInfo' , ( tabCode == 'Info' ) ) ; + ShowE('divUpload' , ( tabCode == 'Upload' ) ) ; + ShowE('divAdvanced' , ( tabCode == 'Advanced' ) ) ; +} +var oFakeImage = dialog.Selection.GetSelectedElement() ; +var oEmbed ; + +if ( oFakeImage ) +{ + if ( oFakeImage.tagName == 'IMG' && oFakeImage.getAttribute('_fckflash') ) + oEmbed = FCK.GetRealElement( oFakeImage ) ; + else + oFakeImage = null ; +} + +window.onload = function() +{ + oEditor.FCKLanguageManager.TranslatePage(document) ; + LoadSelection() ; + GetE('tdBrowse').style.display = FCKConfig.FlashBrowser ? '' : 'none' ; + if ( FCKConfig.FlashUpload ) + GetE('frmUpload').action = FCKConfig.FlashUploadURL ; + dialog.SetAutoSize( true ) ; + dialog.SetOkButton( true ) ; + + SelectField( 'txtUrl' ) ; +} + +function LoadSelection() +{ + if ( ! oEmbed ) return ; + + GetE('txtUrl').value = GetAttribute( oEmbed, 'src', '' ) ; + if(GetE('txtUrl').value.indexOf('vcastr3.swf') > 0) { + var tmp = GetAttribute( oEmbed, 'flashvars', '' ) ; + var t1 = tmp.split(''); + var t2 = t1[1].split(''); + if(t2[0]) GetE('txtUrl').value = t2[0]; + } + GetE('txtWidth').value = GetAttribute( oEmbed, 'width', '' ) ; + GetE('txtHeight').value = GetAttribute( oEmbed, 'height', '' ) ; + if(GetAttribute( oEmbed, 'autostart', 'true' ) == 'true') { + GetE('autostart').checked = true; + } else { + GetE('autostart0').checked = true; + } + + GetE('txtAttId').value = oEmbed.id ; + //GetE('chkAutoPlay').checked = GetAttribute( oEmbed, 'play', 'true' ) == 'true' ; + GetE('chkLoop').checked = GetAttribute( oEmbed, 'loop', 'true' ) == 'true' ; + GetE('chkMenu').checked = GetAttribute( oEmbed, 'menu', 'true' ) == 'true' ; + GetE('cmbScale').value = GetAttribute( oEmbed, 'scale', '' ).toLowerCase() ; + + GetE('txtAttTitle').value = oEmbed.title ; + + if ( oEditor.FCKBrowserInfo.IsIE ) + { + GetE('txtAttClasses').value = oEmbed.getAttribute('className') || '' ; + GetE('txtAttStyle').value = oEmbed.style.cssText ; + } + else + { + GetE('txtAttClasses').value = oEmbed.getAttribute('class',2) || '' ; + GetE('txtAttStyle').value = oEmbed.getAttribute('style',2) || '' ; + } + + UpdatePreview() ; +} +function Ok() +{ + var v = GetVHTML(); + if (v) { + + //Fix FireFox + if(navigator.userAgent.toLowerCase().indexOf('firefox') != -1) { + v = v.replace(/\:\/\//g, '://fix-firefox-auto.'); + FCK.InsertHtml(v); + v = FCK.GetXHTML(true); + v = v.replace(/\:\/\/fix\-firefox\-auto\./g, '://'); + FCK.SetData(v); + return true; + } + + FCK.InsertHtml(v); + return true ; + } else { + alert(oEditor.FCKLang.DlgAlertUrl) ; + return false ; + } +} + +function UpdatePreview() +{ + var v = GetVHTML(); + if(v) { + var ow = GetE('txtWidth').value; + var oh = GetE('txtHeight').value; + var nw = 200; + var nh = parseInt(nw*oh/ow); + v = v.replace('width="'+ow+'"', 'width="'+nw+'"'); + v = v.replace('height="'+oh+'"', 'height="'+nh+'"'); + GetE('vPreview').innerHTML = v; + } +} + +function SetUrl( url, width, height ) +{ + GetE('txtUrl').value = url ; + + if ( width ) + GetE('txtWidth').value = width ; + + if ( height ) + GetE('txtHeight').value = height ; + + UpdatePreview() ; + + dialog.SetSelectedTab( 'Info' ) ; +} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/dialog/common/fck_flash_preview.html b/member/editor/fckeditor/editor/dialog/common/fck_flash_preview.html new file mode 100644 index 0000000..702fdd5 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_flash_preview.html @@ -0,0 +1,23 @@ + + + + + + + + + + + diff --git a/member/editor/fckeditor/editor/dialog/common/fck_image.js b/member/editor/fckeditor/editor/dialog/common/fck_image.js new file mode 100644 index 0000000..7552684 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_image.js @@ -0,0 +1,487 @@ +var dialog = window.parent ; +var oEditor = dialog.InnerDialogLoaded() ; +var FCK = oEditor.FCK ; +var FCKLang = oEditor.FCKLang ; +var FCKConfig = oEditor.FCKConfig ; +var FCKDebug = oEditor.FCKDebug ; +var FCKTools = oEditor.FCKTools ; + +var bImageButton = ( document.location.search.length > 0 && document.location.search.substr(1) == 'ImageButton' ) ; + +//#### Dialog Tabs + +// Set the dialog tabs. +if ( FCKConfig.ImageUpload ) + dialog.AddTab( 'Upload', FCKLang.DlgLnkUpload ) ; + +dialog.AddTab( 'Info', FCKLang.DlgImgInfoTab ) ; + +if ( !bImageButton && !FCKConfig.ImageDlgHideLink ) + dialog.AddTab( 'Link', FCKLang.DlgImgLinkTab ) ; + + +if ( !FCKConfig.ImageDlgHideAdvanced ) + dialog.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ; + +// Function called when a dialog tag is selected. +function OnDialogTabChange( tabCode ) +{ + ShowE('divUpload' , ( tabCode == 'Upload' ) ) ; + ShowE('divInfo' , ( tabCode == 'Info' ) ) ; + ShowE('divLink' , ( tabCode == 'Link' ) ) ; + ShowE('divAdvanced' , ( tabCode == 'Advanced' ) ) ; +} + +// Get the selected image (if available). +var oImage = dialog.Selection.GetSelectedElement() ; + +if ( oImage && oImage.tagName != 'IMG' && !( oImage.tagName == 'INPUT' && oImage.type == 'image' ) ) + oImage = null ; +// Get the active link. +var oLink; +try{oLink = dialog.Selection.GetSelection().MoveToAncestorNode( 'A' ) ;}catch (e){} + +var oImageOriginal ; + +function UpdateOriginal( resetSize ) +{ + if ( !eImgPreview ) + return ; + + if ( GetE('txtUrl').value.length == 0 ) + { + oImageOriginal = null ; + return ; + } + + oImageOriginal = document.createElement( 'IMG' ) ; // new Image() ; + + if ( resetSize ) + { + oImageOriginal.onload = function() + { + this.onload = null ; + ResetSizes() ; + } + } + + oImageOriginal.src = eImgPreview.src ; +} + +var bPreviewInitialized ; + +window.onload = function() +{ + // Translate the dialog box texts. + oEditor.FCKLanguageManager.TranslatePage(document) ; + + GetE('btnLockSizes').title = FCKLang.DlgImgLockRatio ; + GetE('btnResetSize').title = FCKLang.DlgBtnResetSize ; + + // Load the selected element information (if any). + LoadSelection() ; + + // Show/Hide the "Browse Server" button. + GetE('tdBrowse').style.display = FCKConfig.ImageBrowser ? '' : 'none' ; + GetE('divLnkBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ; + + UpdateOriginal() ; + + // Set the actual uploader URL. + if ( FCKConfig.ImageUpload ) + GetE('frmUpload').action = FCKConfig.ImageUploadURL ; + + dialog.SetAutoSize( true ) ; + + // Activate the "OK" button. + dialog.SetOkButton( true ) ; + //if(oImage != null) OnDialogTabChange('Info') + //SelectField( 'txtUrl' ) ; +} + +function LoadSelection() +{ + if ( ! oImage ) return ; + + var sUrl = oImage.getAttribute( '_fcksavedurl' ) ; + if ( sUrl == null ) + sUrl = GetAttribute( oImage, 'src', '' ) ; + + GetE('txtUrl').value = sUrl ; + GetE('txtAlt').value = GetAttribute( oImage, 'alt', '' ) ; + GetE('txtVSpace').value = GetAttribute( oImage, 'vspace', '' ) ; + GetE('txtHSpace').value = GetAttribute( oImage, 'hspace', '' ) ; + GetE('txtBorder').value = GetAttribute( oImage, 'border', '' ) ; + GetE('cmbAlign').value = GetAttribute( oImage, 'align', '' ) ; + + var iWidth, iHeight ; + + var regexSize = /^\s*(\d+)px\s*$/i ; + + if ( oImage.style.width ) + { + var aMatchW = oImage.style.width.match( regexSize ) ; + if ( aMatchW ) + { + iWidth = aMatchW[1] ; + oImage.style.width = '' ; + SetAttribute( oImage, 'width' , iWidth ) ; + } + } + + if ( oImage.style.height ) + { + var aMatchH = oImage.style.height.match( regexSize ) ; + if ( aMatchH ) + { + iHeight = aMatchH[1] ; + oImage.style.height = '' ; + SetAttribute( oImage, 'height', iHeight ) ; + } + } + + GetE('txtWidth').value = iWidth ? iWidth : GetAttribute( oImage, "width", '' ) ; + GetE('txtHeight').value = iHeight ? iHeight : GetAttribute( oImage, "height", '' ) ; + + // Get Advances Attributes + GetE('txtAttId').value = oImage.id ; + GetE('cmbAttLangDir').value = oImage.dir ; + GetE('txtAttLangCode').value = oImage.lang ; + GetE('txtAttTitle').value = oImage.title ; + GetE('txtLongDesc').value = oImage.longDesc ; + + if ( oEditor.FCKBrowserInfo.IsIE ) + { + GetE('txtAttClasses').value = oImage.className || '' ; + GetE('txtAttStyle').value = oImage.style.cssText ; + } + else + { + GetE('txtAttClasses').value = oImage.getAttribute('class',2) || '' ; + GetE('txtAttStyle').value = oImage.getAttribute('style',2) ; + } + + if ( oLink ) + { + var sLinkUrl = oLink.getAttribute( '_fcksavedurl' ) ; + if ( sLinkUrl == null ) + sLinkUrl = oLink.getAttribute('href',2) ; + + GetE('txtLnkUrl').value = sLinkUrl ; + GetE('cmbLnkTarget').value = oLink.target ; + } + + OnDialogTabChange('Info');//DESTOON ADD + var ss = dialog.document.getElementsByTagName('div'); + ss[5].className = 'PopupTab'; + ss[6].className = 'PopupTabSelected'; + + UpdatePreview() ; +} + +//#### The OK button was hit. +function Ok() +{ + if ( GetE('txtUrl').value.length == 0 ) + { + dialog.SetSelectedTab( 'Info' ) ; + GetE('txtUrl').focus() ; + + alert( FCKLang.DlgImgAlertUrl ) ; + + return false ; + } + + var bHasImage = ( oImage != null ) ; + + if ( bHasImage && bImageButton && oImage.tagName == 'IMG' ) + { + if ( confirm( 'Do you want to transform the selected image on a image button?' ) ) + oImage = null ; + } + else if ( bHasImage && !bImageButton && oImage.tagName == 'INPUT' ) + { + if ( confirm( 'Do you want to transform the selected image button on a simple image?' ) ) + oImage = null ; + } + + oEditor.FCKUndo.SaveUndoStep() ; + if ( !bHasImage ) + { + if ( bImageButton ) + { + oImage = FCK.EditorDocument.createElement( 'input' ) ; + oImage.type = 'image' ; + oImage = FCK.InsertElement( oImage ) ; + } + else + oImage = FCK.InsertElement( 'img' ) ; + } + + UpdateImage( oImage ) ; + + var sLnkUrl = GetE('txtLnkUrl').value.Trim() ; + + if ( sLnkUrl.length == 0 ) + { + if ( oLink ) + FCK.ExecuteNamedCommand( 'Unlink' ) ; + } + else + { + if ( oLink ) // Modifying an existent link. + oLink.href = sLnkUrl ; + else // Creating a new link. + { + if ( !bHasImage ) + oEditor.FCKSelection.SelectNode( oImage ) ; + + oLink = oEditor.FCK.CreateLink( sLnkUrl )[0] ; + + if ( !bHasImage ) + { + oEditor.FCKSelection.SelectNode( oLink ) ; + oEditor.FCKSelection.Collapse( false ) ; + } + } + + SetAttribute( oLink, '_fcksavedurl', sLnkUrl ) ; + SetAttribute( oLink, 'target', GetE('cmbLnkTarget').value ) ; + } + + return true ; +} + +function UpdateImage( e, skipId ) +{ + e.src = GetE('txtUrl').value ; + SetAttribute( e, "_fcksavedurl", GetE('txtUrl').value ) ; + SetAttribute( e, "alt" , GetE('txtAlt').value ) ; + if(GetE('txtWidth').value > 0) SetAttribute( e, "width" , GetE('txtWidth').value ) ;//DESTOON ADD + if(GetE('txtHeight').value > 0) SetAttribute( e, "height", GetE('txtHeight').value ) ;//DESTOON ADD + SetAttribute( e, "vspace", GetE('txtVSpace').value ) ; + SetAttribute( e, "hspace", GetE('txtHSpace').value ) ; + SetAttribute( e, "border", GetE('txtBorder').value ) ; + SetAttribute( e, "align" , GetE('cmbAlign').value ) ; + + // Advances Attributes + + if ( ! skipId ) + SetAttribute( e, 'id', GetE('txtAttId').value ) ; + + SetAttribute( e, 'dir' , GetE('cmbAttLangDir').value ) ; + SetAttribute( e, 'lang' , GetE('txtAttLangCode').value ) ; + SetAttribute( e, 'title' , GetE('txtAttTitle').value ) ; + SetAttribute( e, 'longDesc' , GetE('txtLongDesc').value ) ; + + if ( oEditor.FCKBrowserInfo.IsIE ) + { + e.className = GetE('txtAttClasses').value ; + e.style.cssText = GetE('txtAttStyle').value ; + } + else + { + SetAttribute( e, 'class' , GetE('txtAttClasses').value ) ; + SetAttribute( e, 'style', GetE('txtAttStyle').value ) ; + } +} + +var eImgPreview ; +var eImgPreviewLink ; + +function SetPreviewElements( imageElement, linkElement ) +{ + eImgPreview = imageElement ; + eImgPreviewLink = linkElement ; + + UpdatePreview() ; + UpdateOriginal() ; + + bPreviewInitialized = true ; +} + +function UpdatePreview() +{ + if ( !eImgPreview || !eImgPreviewLink ) + return ; + + if ( GetE('txtUrl').value.length == 0 ) + eImgPreviewLink.style.display = 'none' ; + else + { + UpdateImage( eImgPreview, true ) ; + + if ( GetE('txtLnkUrl').value.Trim().length > 0 ) + eImgPreviewLink.href = 'javascript:void(null);' ; + else + SetAttribute( eImgPreviewLink, 'href', '' ) ; + + eImgPreviewLink.style.display = '' ; + } +} + +var bLockRatio = true ; + +function SwitchLock( lockButton ) +{ + bLockRatio = !bLockRatio ; + lockButton.className = bLockRatio ? 'BtnLocked' : 'BtnUnlocked' ; + lockButton.title = bLockRatio ? 'Lock sizes' : 'Unlock sizes' ; + + if ( bLockRatio ) + { + if ( GetE('txtWidth').value.length > 0 ) + OnSizeChanged( 'Width', GetE('txtWidth').value ) ; + else + OnSizeChanged( 'Height', GetE('txtHeight').value ) ; + } +} + +// Fired when the width or height input texts change +function OnSizeChanged( dimension, value ) +{ + // Verifies if the aspect ration has to be maintained + if ( oImageOriginal && bLockRatio ) + { + var e = dimension == 'Width' ? GetE('txtHeight') : GetE('txtWidth') ; + + if ( value.length == 0 || isNaN( value ) ) + { + e.value = '' ; + return ; + } + + if ( dimension == 'Width' ) + value = value == 0 ? 0 : Math.round( oImageOriginal.height * ( value / oImageOriginal.width ) ) ; + else + value = value == 0 ? 0 : Math.round( oImageOriginal.width * ( value / oImageOriginal.height ) ) ; + + if ( !isNaN( value ) ) + e.value = value ; + } + + UpdatePreview() ; +} + +// Fired when the Reset Size button is clicked +function ResetSizes() +{ + if ( ! oImageOriginal ) return ; + if ( oEditor.FCKBrowserInfo.IsGecko && !oImageOriginal.complete ) + { + setTimeout( ResetSizes, 50 ) ; + return ; + } + + GetE('txtWidth').value = oImageOriginal.width ; + GetE('txtHeight').value = oImageOriginal.height ; + + UpdatePreview() ; +} + +function BrowseServer() +{ + OpenServerBrowser( + 'Image', + FCKConfig.ImageBrowserURL, + FCKConfig.ImageBrowserWindowWidth, + FCKConfig.ImageBrowserWindowHeight ) ; +} + +function LnkBrowseServer() +{ + OpenServerBrowser( + 'Link', + FCKConfig.LinkBrowserURL, + FCKConfig.LinkBrowserWindowWidth, + FCKConfig.LinkBrowserWindowHeight ) ; +} + +function OpenServerBrowser( type, url, width, height ) +{ + sActualBrowser = type ; + OpenFileBrowser( url, width, height ) ; +} + +var sActualBrowser ; + +function SetUrl( url, width, height, alt ) +{ + if ( sActualBrowser == 'Link' ) + { + GetE('txtLnkUrl').value = url ; + UpdatePreview() ; + } + else + { + GetE('txtUrl').value = url ; + GetE('txtWidth').value = width ? width : '' ; + GetE('txtHeight').value = height ? height : '' ; + + if ( alt ) + GetE('txtAlt').value = alt; + + UpdatePreview() ; + UpdateOriginal( true ) ; + } + + dialog.SetSelectedTab( 'Info' ) ; +} + +function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg ) +{ + switch ( errorNumber ) + { + case 0 : // No errors + alert( 'Your file has been successfully uploaded' ) ; + break ; + case 1 : // Custom error + alert( customMsg ) ; + return ; + case 101 : // Custom warning + alert( customMsg ) ; + break ; + case 201 : + alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ; + break ; + case 202 : + alert( 'Invalid file type' ) ; + return ; + case 203 : + alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ; + return ; + case 500 : + alert( 'The connector is disabled' ) ; + break ; + default : + alert( 'Error on file upload. Error number: ' + errorNumber ) ; + return ; + } + + sActualBrowser = '' ; + SetUrl( fileUrl ) ; + GetE('frmUpload').reset() ; +} + +var oUploadAllowedExtRegex = new RegExp( FCKConfig.ImageUploadAllowedExtensions, 'i' ) ; +var oUploadDeniedExtRegex = new RegExp( FCKConfig.ImageUploadDeniedExtensions, 'i' ) ; + +function CheckUpload() +{ + var sFile = GetE('txtUploadFile').value ; + + if ( sFile.length == 0 ) + { + alert( 'Please select a file to upload' ) ; + return false ; + } + + if ( ( FCKConfig.ImageUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) || + ( FCKConfig.ImageUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) ) + { + OnUploadCompleted( 202 ) ; + return false ; + } + + return true ; +} diff --git a/member/editor/fckeditor/editor/dialog/common/fck_image_preview.html b/member/editor/fckeditor/editor/dialog/common/fck_image_preview.html new file mode 100644 index 0000000..81c14de --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_image_preview.html @@ -0,0 +1,48 @@ + + + + + + + + + + +
+ + Lorem ipsum dolor sit amet, consectetuer adipiscing + elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus + a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, + nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed + velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper + nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices + a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus + faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget + tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, + tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis + id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, + eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur + ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris. +
+ + diff --git a/member/editor/fckeditor/editor/dialog/common/fck_link.js b/member/editor/fckeditor/editor/dialog/common/fck_link.js new file mode 100644 index 0000000..2f3c37f --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/common/fck_link.js @@ -0,0 +1,730 @@ +var dialog = window.parent ; +var oEditor = dialog.InnerDialogLoaded() ; + +var FCK = oEditor.FCK ; +var FCKLang = oEditor.FCKLang ; +var FCKConfig = oEditor.FCKConfig ; +var FCKRegexLib = oEditor.FCKRegexLib ; +var FCKTools = oEditor.FCKTools ; + +//#### Dialog Tabs + +// Set the dialog tabs. +dialog.AddTab( 'Info', FCKLang.DlgLnkInfoTab ) ; + +if ( !FCKConfig.LinkDlgHideTarget ) + dialog.AddTab( 'Target', FCKLang.DlgLnkTargetTab, true ) ; + +if ( FCKConfig.LinkUpload ) + dialog.AddTab( 'Upload', FCKLang.DlgLnkUpload, true ) ; + +if ( !FCKConfig.LinkDlgHideAdvanced ) + dialog.AddTab( 'Advanced', FCKLang.DlgAdvancedTag ) ; + +// Function called when a dialog tag is selected. +function OnDialogTabChange( tabCode ) +{ + ShowE('divInfo' , ( tabCode == 'Info' ) ) ; + ShowE('divTarget' , ( tabCode == 'Target' ) ) ; + ShowE('divUpload' , ( tabCode == 'Upload' ) ) ; + ShowE('divAttribs' , ( tabCode == 'Advanced' ) ) ; + + dialog.SetAutoSize( true ) ; +} + +//#### Regular Expressions library. +var oRegex = new Object() ; + +oRegex.UriProtocol = /^(((http|https|ftp|news):\/\/)|mailto:)/gi ; + +oRegex.UrlOnChangeProtocol = /^(http|https|ftp|news):\/\/(?=.)/gi ; + +oRegex.UrlOnChangeTestOther = /^((javascript:)|[#\/\.])/gi ; + +oRegex.ReserveTarget = /^_(blank|self|top|parent)$/i ; + +oRegex.PopupUri = /^javascript:void\(\s*window.open\(\s*'([^']+)'\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*\)\s*$/ ; + +// Accessible popups +oRegex.OnClickPopup = /^\s*on[cC]lick="\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*"$/ ; + +oRegex.PopupFeatures = /(?:^|,)([^=]+)=(\d+|yes|no)/gi ; + +//#### Parser Functions + +var oParser = new Object() ; + +oParser.ParseEMailUrl = function( emailUrl ) +{ + // Initializes the EMailInfo object. + var oEMailInfo = new Object() ; + oEMailInfo.Address = '' ; + oEMailInfo.Subject = '' ; + oEMailInfo.Body = '' ; + + var oParts = emailUrl.match( /^([^\?]+)\??(.+)?/ ) ; + if ( oParts ) + { + // Set the e-mail address. + oEMailInfo.Address = oParts[1] ; + + // Look for the optional e-mail parameters. + if ( oParts[2] ) + { + var oMatch = oParts[2].match( /(^|&)subject=([^&]+)/i ) ; + if ( oMatch ) oEMailInfo.Subject = decodeURIComponent( oMatch[2] ) ; + + oMatch = oParts[2].match( /(^|&)body=([^&]+)/i ) ; + if ( oMatch ) oEMailInfo.Body = decodeURIComponent( oMatch[2] ) ; + } + } + + return oEMailInfo ; +} + +oParser.CreateEMailUri = function( address, subject, body ) +{ + var sBaseUri = 'mailto:' + address ; + + var sParams = '' ; + + if ( subject.length > 0 ) + sParams = '?subject=' + encodeURIComponent( subject ) ; + + if ( body.length > 0 ) + { + sParams += ( sParams.length == 0 ? '?' : '&' ) ; + sParams += 'body=' + encodeURIComponent( body ) ; + } + + return sBaseUri + sParams ; +} + +//#### Initialization Code + +// oLink: The actual selected link in the editor. +var oLink = dialog.Selection.GetSelection().MoveToAncestorNode( 'A' ) ; +if ( oLink ) + FCK.Selection.SelectNode( oLink ) ; + +window.onload = function() +{ + // Translate the dialog box texts. + oEditor.FCKLanguageManager.TranslatePage(document) ; + + // Fill the Anchor Names and Ids combos. + LoadAnchorNamesAndIds() ; + + // Load the selected link information (if any). + LoadSelection() ; + + // Update the dialog box. + SetLinkType( GetE('cmbLinkType').value ) ; + + // Show/Hide the "Browse Server" button. + GetE('divBrowseServer').style.display = FCKConfig.LinkBrowser ? '' : 'none' ; + + // Show the initial dialog content. + GetE('divInfo').style.display = '' ; + + // Set the actual uploader URL. + if ( FCKConfig.LinkUpload ) + GetE('frmUpload').action = FCKConfig.LinkUploadURL ; + + // Set the default target (from configuration). + SetDefaultTarget() ; + + // Activate the "OK" button. + dialog.SetOkButton( true ) ; + + // Select the first field. + switch( GetE('cmbLinkType').value ) + { + case 'url' : + SelectField( 'txtUrl' ) ; + break ; + case 'email' : + SelectField( 'txtEMailAddress' ) ; + break ; + case 'anchor' : + if ( GetE('divSelAnchor').style.display != 'none' ) + SelectField( 'cmbAnchorName' ) ; + else + SelectField( 'cmbLinkType' ) ; + } +} + +var bHasAnchors ; + +function LoadAnchorNamesAndIds() +{ + // Since version 2.0, the anchors are replaced in the DOM by IMGs so the user see the icon + // to edit them. So, we must look for that images now. + var aAnchors = new Array() ; + var i ; + var oImages = oEditor.FCK.EditorDocument.getElementsByTagName( 'IMG' ) ; + for( i = 0 ; i < oImages.length ; i++ ) + { + if ( oImages[i].getAttribute('_fckanchor') ) + aAnchors[ aAnchors.length ] = oEditor.FCK.GetRealElement( oImages[i] ) ; + } + + // Add also real anchors + var oLinks = oEditor.FCK.EditorDocument.getElementsByTagName( 'A' ) ; + for( i = 0 ; i < oLinks.length ; i++ ) + { + if ( oLinks[i].name && ( oLinks[i].name.length > 0 ) ) + aAnchors[ aAnchors.length ] = oLinks[i] ; + } + + var aIds = FCKTools.GetAllChildrenIds( oEditor.FCK.EditorDocument.body ) ; + + bHasAnchors = ( aAnchors.length > 0 || aIds.length > 0 ) ; + + for ( i = 0 ; i < aAnchors.length ; i++ ) + { + var sName = aAnchors[i].name ; + if ( sName && sName.length > 0 ) + FCKTools.AddSelectOption( GetE('cmbAnchorName'), sName, sName ) ; + } + + for ( i = 0 ; i < aIds.length ; i++ ) + { + FCKTools.AddSelectOption( GetE('cmbAnchorId'), aIds[i], aIds[i] ) ; + } + + ShowE( 'divSelAnchor' , bHasAnchors ) ; + ShowE( 'divNoAnchor' , !bHasAnchors ) ; +} + +function LoadSelection() +{ + if ( !oLink ) return ; + + var sType = 'url' ; + + // Get the actual Link href. + var sHRef = oLink.getAttribute( '_fcksavedurl' ) ; + if ( sHRef == null ) + sHRef = oLink.getAttribute( 'href' , 2 ) || '' ; + + // Look for a popup javascript link. + var oPopupMatch = oRegex.PopupUri.exec( sHRef ) ; + if( oPopupMatch ) + { + GetE('cmbTarget').value = 'popup' ; + sHRef = oPopupMatch[1] ; + FillPopupFields( oPopupMatch[2], oPopupMatch[3] ) ; + SetTarget( 'popup' ) ; + } + + // Accessible popups, the popup data is in the onclick attribute + if ( !oPopupMatch ) + { + var onclick = oLink.getAttribute( 'onclick_fckprotectedatt' ) ; + if ( onclick ) + { + // Decode the protected string + onclick = decodeURIComponent( onclick ) ; + + oPopupMatch = oRegex.OnClickPopup.exec( onclick ) ; + if( oPopupMatch ) + { + GetE( 'cmbTarget' ).value = 'popup' ; + FillPopupFields( oPopupMatch[1], oPopupMatch[2] ) ; + SetTarget( 'popup' ) ; + } + } + } + + // Search for the protocol. + var sProtocol = oRegex.UriProtocol.exec( sHRef ) ; + + if ( sProtocol ) + { + sProtocol = sProtocol[0].toLowerCase() ; + GetE('cmbLinkProtocol').value = sProtocol ; + + // Remove the protocol and get the remaining URL. + var sUrl = sHRef.replace( oRegex.UriProtocol, '' ) ; + + if ( sProtocol == 'mailto:' ) // It is an e-mail link. + { + sType = 'email' ; + + var oEMailInfo = oParser.ParseEMailUrl( sUrl ) ; + GetE('txtEMailAddress').value = oEMailInfo.Address ; + GetE('txtEMailSubject').value = oEMailInfo.Subject ; + GetE('txtEMailBody').value = oEMailInfo.Body ; + } + else // It is a normal link. + { + sType = 'url' ; + GetE('txtUrl').value = sUrl ; + } + } + else if ( sHRef.substr(0,1) == '#' && sHRef.length > 1 ) // It is an anchor link. + { + sType = 'anchor' ; + GetE('cmbAnchorName').value = GetE('cmbAnchorId').value = sHRef.substr(1) ; + } + else // It is another type of link. + { + sType = 'url' ; + + GetE('cmbLinkProtocol').value = '' ; + GetE('txtUrl').value = sHRef ; + } + + if ( !oPopupMatch ) + { + // Get the target. + var sTarget = oLink.target ; + + if ( sTarget && sTarget.length > 0 ) + { + if ( oRegex.ReserveTarget.test( sTarget ) ) + { + sTarget = sTarget.toLowerCase() ; + GetE('cmbTarget').value = sTarget ; + } + else + GetE('cmbTarget').value = 'frame' ; + GetE('txtTargetFrame').value = sTarget ; + } + } + + // Get Advances Attributes + GetE('txtAttId').value = oLink.id ; + GetE('txtAttName').value = oLink.name ; + GetE('cmbAttLangDir').value = oLink.dir ; + GetE('txtAttLangCode').value = oLink.lang ; + GetE('txtAttAccessKey').value = oLink.accessKey ; + GetE('txtAttTabIndex').value = oLink.tabIndex <= 0 ? '' : oLink.tabIndex ; + GetE('txtAttTitle').value = oLink.title ; + GetE('txtAttContentType').value = oLink.type ; + GetE('txtAttCharSet').value = oLink.charset ; + + var sClass ; + if ( oEditor.FCKBrowserInfo.IsIE ) + { + sClass = oLink.getAttribute('className',2) || '' ; + // Clean up temporary classes for internal use: + sClass = sClass.replace( FCKRegexLib.FCK_Class, '' ) ; + + GetE('txtAttStyle').value = oLink.style.cssText ; + } + else + { + sClass = oLink.getAttribute('class',2) || '' ; + GetE('txtAttStyle').value = oLink.getAttribute('style',2) || '' ; + } + GetE('txtAttClasses').value = sClass ; + + // Update the Link type combo. + GetE('cmbLinkType').value = sType ; +} + +//#### Link type selection. +function SetLinkType( linkType ) +{ + ShowE('divLinkTypeUrl' , (linkType == 'url') ) ; + ShowE('divLinkTypeAnchor' , (linkType == 'anchor') ) ; + ShowE('divLinkTypeEMail' , (linkType == 'email') ) ; + + if ( !FCKConfig.LinkDlgHideTarget ) + dialog.SetTabVisibility( 'Target' , (linkType == 'url') ) ; + + if ( FCKConfig.LinkUpload ) + dialog.SetTabVisibility( 'Upload' , (linkType == 'url') ) ; + + if ( !FCKConfig.LinkDlgHideAdvanced ) + dialog.SetTabVisibility( 'Advanced' , (linkType != 'anchor' || bHasAnchors) ) ; + + if ( linkType == 'email' ) + dialog.SetAutoSize( true ) ; +} + +//#### Target type selection. +function SetTarget( targetType ) +{ + GetE('tdTargetFrame').style.display = ( targetType == 'popup' ? 'none' : '' ) ; + GetE('tdPopupName').style.display = + GetE('tablePopupFeatures').style.display = ( targetType == 'popup' ? '' : 'none' ) ; + + switch ( targetType ) + { + case "_blank" : + case "_self" : + case "_parent" : + case "_top" : + GetE('txtTargetFrame').value = targetType ; + break ; + case "" : + GetE('txtTargetFrame').value = '' ; + break ; + } + + if ( targetType == 'popup' ) + dialog.SetAutoSize( true ) ; +} + +//#### Called while the user types the URL. +function OnUrlChange() +{ + var sUrl = GetE('txtUrl').value ; + var sProtocol = oRegex.UrlOnChangeProtocol.exec( sUrl ) ; + + if ( sProtocol ) + { + sUrl = sUrl.substr( sProtocol[0].length ) ; + GetE('txtUrl').value = sUrl ; + GetE('cmbLinkProtocol').value = sProtocol[0].toLowerCase() ; + } + else if ( oRegex.UrlOnChangeTestOther.test( sUrl ) ) + { + GetE('cmbLinkProtocol').value = '' ; + } +} + +//#### Called while the user types the target name. +function OnTargetNameChange() +{ + var sFrame = GetE('txtTargetFrame').value ; + + if ( sFrame.length == 0 ) + GetE('cmbTarget').value = '' ; + else if ( oRegex.ReserveTarget.test( sFrame ) ) + GetE('cmbTarget').value = sFrame.toLowerCase() ; + else + GetE('cmbTarget').value = 'frame' ; +} + +// Accessible popups +function BuildOnClickPopup() +{ + var sWindowName = "'" + GetE('txtPopupName').value.replace(/\W/gi, "") + "'" ; + + var sFeatures = '' ; + var aChkFeatures = document.getElementsByName( 'chkFeature' ) ; + for ( var i = 0 ; i < aChkFeatures.length ; i++ ) + { + if ( i > 0 ) sFeatures += ',' ; + sFeatures += aChkFeatures[i].value + '=' + ( aChkFeatures[i].checked ? 'yes' : 'no' ) ; + } + + if ( GetE('txtPopupWidth').value.length > 0 ) sFeatures += ',width=' + GetE('txtPopupWidth').value ; + if ( GetE('txtPopupHeight').value.length > 0 ) sFeatures += ',height=' + GetE('txtPopupHeight').value ; + if ( GetE('txtPopupLeft').value.length > 0 ) sFeatures += ',left=' + GetE('txtPopupLeft').value ; + if ( GetE('txtPopupTop').value.length > 0 ) sFeatures += ',top=' + GetE('txtPopupTop').value ; + + if ( sFeatures != '' ) + sFeatures = sFeatures + ",status" ; + + return ( "window.open(this.href," + sWindowName + ",'" + sFeatures + "'); return false" ) ; +} + +//#### Fills all Popup related fields. +function FillPopupFields( windowName, features ) +{ + if ( windowName ) + GetE('txtPopupName').value = windowName ; + + var oFeatures = new Object() ; + var oFeaturesMatch ; + while( ( oFeaturesMatch = oRegex.PopupFeatures.exec( features ) ) != null ) + { + var sValue = oFeaturesMatch[2] ; + if ( sValue == ( 'yes' || '1' ) ) + oFeatures[ oFeaturesMatch[1] ] = true ; + else if ( ! isNaN( sValue ) && sValue != 0 ) + oFeatures[ oFeaturesMatch[1] ] = sValue ; + } + + // Update all features check boxes. + var aChkFeatures = document.getElementsByName('chkFeature') ; + for ( var i = 0 ; i < aChkFeatures.length ; i++ ) + { + if ( oFeatures[ aChkFeatures[i].value ] ) + aChkFeatures[i].checked = true ; + } + + // Update position and size text boxes. + if ( oFeatures['width'] ) GetE('txtPopupWidth').value = oFeatures['width'] ; + if ( oFeatures['height'] ) GetE('txtPopupHeight').value = oFeatures['height'] ; + if ( oFeatures['left'] ) GetE('txtPopupLeft').value = oFeatures['left'] ; + if ( oFeatures['top'] ) GetE('txtPopupTop').value = oFeatures['top'] ; +} + +//#### The OK button was hit. +function Ok() +{ + var sUri, sInnerHtml ; + oEditor.FCKUndo.SaveUndoStep() ; + + switch ( GetE('cmbLinkType').value ) + { + case 'url' : + sUri = GetE('txtUrl').value ; + + if ( sUri.length == 0 ) + { + alert( FCKLang.DlnLnkMsgNoUrl ) ; + return false ; + } + + sUri = GetE('cmbLinkProtocol').value + sUri ; + break ; + + case 'email' : + sUri = GetE('txtEMailAddress').value ; + + if ( sUri.length == 0 ) + { + alert( FCKLang.DlnLnkMsgNoEMail ) ; + return false ; + } + + sUri = oParser.CreateEMailUri( + sUri, + GetE('txtEMailSubject').value, + GetE('txtEMailBody').value ) ; + break ; + + case 'anchor' : + var sAnchor = GetE('cmbAnchorName').value ; + if ( sAnchor.length == 0 ) sAnchor = GetE('cmbAnchorId').value ; + + if ( sAnchor.length == 0 ) + { + alert( FCKLang.DlnLnkMsgNoAnchor ) ; + return false ; + } + + sUri = '#' + sAnchor ; + break ; + } + + // If no link is selected, create a new one (it may result in more than one link creation - #220). + var aLinks = oLink ? [ oLink ] : oEditor.FCK.CreateLink( sUri, true ) ; + + // If no selection, no links are created, so use the uri as the link text (by dom, 2006-05-26) + var aHasSelection = ( aLinks.length > 0 ) ; + if ( !aHasSelection ) + { + sInnerHtml = sUri; + + // Built a better text for empty links. + switch ( GetE('cmbLinkType').value ) + { + // anchor: use old behavior --> return true + case 'anchor': + sInnerHtml = sInnerHtml.replace( /^#/, '' ) ; + break ; + + // url: try to get path + case 'url': + var oLinkPathRegEx = new RegExp("//?([^?\"']+)([?].*)?$") ; + var asLinkPath = oLinkPathRegEx.exec( sUri ) ; + if (asLinkPath != null) sInnerHtml = asLinkPath[1]; // use matched path + //ADD By Destoon + var ext = sInnerHtml.substring(sInnerHtml.lastIndexOf('.')+1, sInnerHtml.length); + ext = ext.toLowerCase(); + if(ext == 'pdf' || ext == 'doc' || ext == 'xls' || ext == 'ppt') { + ext = ext; + } else if (ext == 'docx' || ext == 'xlsx' || ext == 'pptx') { + ext = ext.substring(0, 3); + } else if (ext == 'jpg' || ext == 'jpeg' || ext == 'gif' || ext == 'png' || ext == 'bmp') { + ext = 'img'; + } else if (ext == 'zip' || ext == 'rar' || ext == 'gz' || ext == 'tar') { + ext = 'zip'; + } else if (ext == 'swf' || ext == 'flv') { + ext = 'swf'; + } else if (ext == 'mp3' || ext == 'wav' || ext == 'asf' || ext == 'avi' || ext == 'mpeg' || ext == 'rm' || ext == 'ram' || ext == 'rmvb') { + ext = 'mov'; + } else { + ext = 'oth'; + } + sInnerHtml = ' ' + sInnerHtml; + break ; + + // mailto: try to get email address + case 'email': + sInnerHtml = GetE('txtEMailAddress').value ; + break ; + } + + // Create a new (empty) anchor. + aLinks = [ oEditor.FCK.InsertElement( 'a' ) ] ; + } + + for ( var i = 0 ; i < aLinks.length ; i++ ) + { + oLink = aLinks[i] ; + + if ( aHasSelection ) + sInnerHtml = oLink.innerHTML ; // Save the innerHTML (IE changes it if it is like an URL). + + oLink.href = sUri ; + SetAttribute( oLink, '_fcksavedurl', sUri ) ; + + var onclick; + // Accessible popups + if( GetE('cmbTarget').value == 'popup' ) + { + onclick = BuildOnClickPopup() ; + // Encode the attribute + onclick = encodeURIComponent( " onclick=\"" + onclick + "\"" ) ; + SetAttribute( oLink, 'onclick_fckprotectedatt', onclick ) ; + } + else + { + // Check if the previous onclick was for a popup: + // In that case remove the onclick handler. + onclick = oLink.getAttribute( 'onclick_fckprotectedatt' ) ; + if ( onclick ) + { + // Decode the protected string + onclick = decodeURIComponent( onclick ) ; + + if( oRegex.OnClickPopup.test( onclick ) ) + SetAttribute( oLink, 'onclick_fckprotectedatt', '' ) ; + } + } + + oLink.innerHTML = sInnerHtml ; // Set (or restore) the innerHTML + + // Target + if( GetE('cmbTarget').value != 'popup' ) + SetAttribute( oLink, 'target', GetE('txtTargetFrame').value ) ; + else + SetAttribute( oLink, 'target', null ) ; + + // Let's set the "id" only for the first link to avoid duplication. + if ( i == 0 ) + SetAttribute( oLink, 'id', GetE('txtAttId').value ) ; + + // Advances Attributes + SetAttribute( oLink, 'name' , GetE('txtAttName').value ) ; + SetAttribute( oLink, 'dir' , GetE('cmbAttLangDir').value ) ; + SetAttribute( oLink, 'lang' , GetE('txtAttLangCode').value ) ; + SetAttribute( oLink, 'accesskey', GetE('txtAttAccessKey').value ) ; + SetAttribute( oLink, 'tabindex' , ( GetE('txtAttTabIndex').value > 0 ? GetE('txtAttTabIndex').value : null ) ) ; + SetAttribute( oLink, 'title' , GetE('txtAttTitle').value ) ; + SetAttribute( oLink, 'type' , GetE('txtAttContentType').value ) ; + SetAttribute( oLink, 'charset' , GetE('txtAttCharSet').value ) ; + + if ( oEditor.FCKBrowserInfo.IsIE ) + { + var sClass = GetE('txtAttClasses').value ; + // If it's also an anchor add an internal class + if ( GetE('txtAttName').value.length != 0 ) + sClass += ' FCK__AnchorC' ; + SetAttribute( oLink, 'className', sClass ) ; + + oLink.style.cssText = GetE('txtAttStyle').value ; + } + else + { + SetAttribute( oLink, 'class', GetE('txtAttClasses').value ) ; + SetAttribute( oLink, 'style', GetE('txtAttStyle').value ) ; + } + } + + // Select the (first) link. + oEditor.FCKSelection.SelectNode( aLinks[0] ); + + return true ; +} + +function BrowseServer() +{ + OpenFileBrowser( FCKConfig.LinkBrowserURL, FCKConfig.LinkBrowserWindowWidth, FCKConfig.LinkBrowserWindowHeight ) ; +} + +function SetUrl( url ) +{ + document.getElementById('txtUrl').value = url ; + OnUrlChange() ; + dialog.SetSelectedTab( 'Info' ) ; +} + +function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg ) +{ + switch ( errorNumber ) + { + case 0 : // No errors + alert( 'Your file has been successfully uploaded' ) ; + break ; + case 1 : // Custom error + alert( customMsg ) ; + return ; + case 101 : // Custom warning + alert( customMsg ) ; + break ; + case 201 : + alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ; + break ; + case 202 : + alert( 'Invalid file type' ) ; + return ; + case 203 : + alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ; + return ; + case 500 : + alert( 'The connector is disabled' ) ; + break ; + default : + alert( 'Error on file upload. Error number: ' + errorNumber ) ; + return ; + } + + SetUrl( fileUrl ) ; + GetE('frmUpload').reset() ; +} + +var oUploadAllowedExtRegex = new RegExp( FCKConfig.LinkUploadAllowedExtensions, 'i' ) ; +var oUploadDeniedExtRegex = new RegExp( FCKConfig.LinkUploadDeniedExtensions, 'i' ) ; + +function CheckUpload() +{ + var sFile = GetE('txtUploadFile').value ; + + if ( sFile.length == 0 ) + { + alert( 'Please select a file to upload' ) ; + return false ; + } + + if ( ( FCKConfig.LinkUploadAllowedExtensions.length > 0 && !oUploadAllowedExtRegex.test( sFile ) ) || + ( FCKConfig.LinkUploadDeniedExtensions.length > 0 && oUploadDeniedExtRegex.test( sFile ) ) ) + { + OnUploadCompleted( 202 ) ; + return false ; + } + + return true ; +} + +function SetDefaultTarget() +{ + var target = FCKConfig.DefaultLinkTarget || '' ; + + if ( oLink || target.length == 0 ) + return ; + + switch ( target ) + { + case '_blank' : + case '_self' : + case '_parent' : + case '_top' : + GetE('cmbTarget').value = target ; + break ; + default : + GetE('cmbTarget').value = 'frame' ; + break ; + } + + GetE('txtTargetFrame').value = target ; +} diff --git a/member/editor/fckeditor/editor/dialog/common/images/locked.gif b/member/editor/fckeditor/editor/dialog/common/images/locked.gif new file mode 100644 index 0000000..ea07870 Binary files /dev/null and b/member/editor/fckeditor/editor/dialog/common/images/locked.gif differ diff --git a/member/editor/fckeditor/editor/dialog/common/images/reset.gif b/member/editor/fckeditor/editor/dialog/common/images/reset.gif new file mode 100644 index 0000000..5e9a2fc Binary files /dev/null and b/member/editor/fckeditor/editor/dialog/common/images/reset.gif differ diff --git a/member/editor/fckeditor/editor/dialog/common/images/template1.gif b/member/editor/fckeditor/editor/dialog/common/images/template1.gif new file mode 100644 index 0000000..efdabbe Binary files /dev/null and b/member/editor/fckeditor/editor/dialog/common/images/template1.gif differ diff --git a/member/editor/fckeditor/editor/dialog/common/images/template2.gif b/member/editor/fckeditor/editor/dialog/common/images/template2.gif new file mode 100644 index 0000000..d1cebb3 Binary files /dev/null and b/member/editor/fckeditor/editor/dialog/common/images/template2.gif differ diff --git a/member/editor/fckeditor/editor/dialog/common/images/template3.gif b/member/editor/fckeditor/editor/dialog/common/images/template3.gif new file mode 100644 index 0000000..db41cb4 Binary files /dev/null and b/member/editor/fckeditor/editor/dialog/common/images/template3.gif differ diff --git a/member/editor/fckeditor/editor/dialog/common/images/unlocked.gif b/member/editor/fckeditor/editor/dialog/common/images/unlocked.gif new file mode 100644 index 0000000..801e423 Binary files /dev/null and b/member/editor/fckeditor/editor/dialog/common/images/unlocked.gif differ diff --git a/member/editor/fckeditor/editor/dialog/fck_anchor.html b/member/editor/fckeditor/editor/dialog/fck_anchor.html new file mode 100644 index 0000000..d3d89b3 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_anchor.html @@ -0,0 +1,190 @@ + + + + Anchor Properties + + + + + + + + + + +
+ + + + +
+ Anchor Name
+ +
+
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_attach.html b/member/editor/fckeditor/editor/dialog/fck_attach.html new file mode 100644 index 0000000..f8d0c11 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_attach.html @@ -0,0 +1,96 @@ + + + + Attachment Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Title
URL
Upload +
+
+ +
+ + + \ No newline at end of file diff --git a/member/editor/fckeditor/editor/dialog/fck_colorselector.html b/member/editor/fckeditor/editor/dialog/fck_colorselector.html new file mode 100644 index 0000000..ae2031e --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_colorselector.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + +
+ + + + + +
+ +
+
+ Highlight +
+
 
+ Selected +
+ +
+ +
+
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_flash.html b/member/editor/fckeditor/editor/dialog/fck_flash.html new file mode 100644 index 0000000..38f8228 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_flash.html @@ -0,0 +1,186 @@ + + + + Flash Properties + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + + + + +
URL +
+
+
+ + + + + + + + +
+ Width
+ +
  + Height
+ +
  + Auto Play
+ Yes + No +
+
+ + + + +
+ + + + + + + +
Preview
 
+
+
+
+ + + + diff --git a/member/editor/fckeditor/editor/dialog/fck_image.html b/member/editor/fckeditor/editor/dialog/fck_image.html new file mode 100644 index 0000000..7c8cb0e --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_image.html @@ -0,0 +1,276 @@ + + + + Image Properties + + + + + + + + +
+
+ Upload
+
+
+ + + WaterMark + + + + +
+






No Preview
+
+ + + + + + \ No newline at end of file diff --git a/member/editor/fckeditor/editor/dialog/fck_link.html b/member/editor/fckeditor/editor/dialog/fck_link.html new file mode 100644 index 0000000..b3c467e --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_link.html @@ -0,0 +1,282 @@ + + + + Link Properties + + + + + + + + + + + + diff --git a/member/editor/fckeditor/editor/dialog/fck_listprop.html b/member/editor/fckeditor/editor/dialog/fck_listprop.html new file mode 100644 index 0000000..c5cc7f0 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_listprop.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + +
+ + + + + +
+ List Type
+ + +   +
+
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_paste.html b/member/editor/fckeditor/editor/dialog/fck_paste.html new file mode 100644 index 0000000..e8a5bbb --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_paste.html @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ Please paste inside the following box using the keyboard + (Ctrl+V) and hit OK.
+   +
+
+ +
+ + + +
+ + + +
+ + + diff --git a/member/editor/fckeditor/editor/dialog/fck_replace.html b/member/editor/fckeditor/editor/dialog/fck_replace.html new file mode 100644 index 0000000..50da0cd --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_replace.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + diff --git a/member/editor/fckeditor/editor/dialog/fck_smiley.html b/member/editor/fckeditor/editor/dialog/fck_smiley.html new file mode 100644 index 0000000..c4fba63 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_smiley.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + + +
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_source.html b/member/editor/fckeditor/editor/dialog/fck_source.html new file mode 100644 index 0000000..db678af --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_source.html @@ -0,0 +1,44 @@ + + + + Source + + + + + + + + + + +
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_specialchar.html b/member/editor/fckeditor/editor/dialog/fck_specialchar.html new file mode 100644 index 0000000..85ebf91 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_specialchar.html @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + +
+ + +
+
     + + + + +
 
+
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_table.html b/member/editor/fckeditor/editor/dialog/fck_table.html new file mode 100644 index 0000000..42b87b5 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_table.html @@ -0,0 +1,276 @@ + + + + Table Properties + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ Rows: +  
+ Columns: +  
+   +  
+ Border size: +  
+ Alignment: +  
+
+     + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Width: +   +  
+ Height: +   +  pixels
+   +   +  
+ Cell spacing: +   +  
+ Cell padding: +   +  
+
+ + + + + + + + + + + +
+ Caption +   +
+ Summary +   +
+
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_tablecell.html b/member/editor/fckeditor/editor/dialog/fck_tablecell.html new file mode 100644 index 0000000..8b3a0e8 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_tablecell.html @@ -0,0 +1,235 @@ + + + + Table Cell Properties + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Width: +   
+ Height: +   pixels
+   +  
+ Word Wrap: +  
+   +  
+ Horizontal Alignment: +  
+ Vertical Alignment: +  
+
+     + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Rows Span: +   + +
+ Columns Span: +   + +
+   +   +  
+ Background Color: +   +   +
+ Border Color: +   +   +
+
+
+ + diff --git a/member/editor/fckeditor/editor/dialog/fck_template.html b/member/editor/fckeditor/editor/dialog/fck_template.html new file mode 100644 index 0000000..a8a50d1 --- /dev/null +++ b/member/editor/fckeditor/editor/dialog/fck_template.html @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + +
+ Please select the template to open in the editor
+ (the actual contents will be lost):
+
+
+ + +
+
+ + diff --git a/member/editor/fckeditor/editor/dtd/fck_dtd_test.html b/member/editor/fckeditor/editor/dtd/fck_dtd_test.html new file mode 100644 index 0000000..714bb34 --- /dev/null +++ b/member/editor/fckeditor/editor/dtd/fck_dtd_test.html @@ -0,0 +1,41 @@ + + + + DTD Test Page + + + + + +

+ DTD Contents +

+ + +
+ + diff --git a/member/editor/fckeditor/editor/dtd/fck_xhtml10strict.js b/member/editor/fckeditor/editor/dtd/fck_xhtml10strict.js new file mode 100644 index 0000000..d5e9540 --- /dev/null +++ b/member/editor/fckeditor/editor/dtd/fck_xhtml10strict.js @@ -0,0 +1,93 @@ +FCK.DTD = (function() +{ + var X = FCKTools.Merge ; + + var H,I,J,K,C,L,M,A,B,D,E,G,N,F ; + A = {ins:1, del:1, script:1} ; + B = {hr:1, ul:1, div:1, blockquote:1, noscript:1, table:1, address:1, pre:1, p:1, h5:1, dl:1, h4:1, ol:1, h6:1, h1:1, h3:1, h2:1} ; + C = X({fieldset:1}, B) ; + D = X({sub:1, bdo:1, 'var':1, sup:1, br:1, kbd:1, map:1, samp:1, b:1, acronym:1, '#':1, abbr:1, code:1, i:1, cite:1, tt:1, strong:1, q:1, em:1, big:1, small:1, span:1, dfn:1}, A) ; + E = X({img:1, object:1}, D) ; + F = {input:1, button:1, textarea:1, select:1, label:1} ; + G = X({a:1}, F) ; + H = {img:1, noscript:1, br:1, kbd:1, button:1, h5:1, h4:1, samp:1, h6:1, ol:1, h1:1, h3:1, h2:1, form:1, select:1, '#':1, ins:1, abbr:1, label:1, code:1, table:1, script:1, cite:1, input:1, strong:1, textarea:1, big:1, small:1, span:1, hr:1, sub:1, bdo:1, 'var':1, div:1, object:1, sup:1, map:1, dl:1, del:1, fieldset:1, ul:1, b:1, acronym:1, a:1, blockquote:1, i:1, address:1, tt:1, q:1, pre:1, p:1, em:1, dfn:1} ; + + I = X({form:1, fieldset:1}, B, E, G) ; + J = {tr:1} ; + K = {'#':1} ; + L = X(E, G) ; + M = {li:1} ; + N = X({form:1}, A, C) ; + + return { + col: {}, + tr: {td:1, th:1}, + img: {}, + colgroup: {col:1}, + noscript: N, + td: I, + br: {}, + th: I, + kbd: L, + button: X(B, E), + h5: L, + h4: L, + samp: L, + h6: L, + ol: M, + h1: L, + h3: L, + option: K, + h2: L, + form: X(A, C), + select: {optgroup:1, option:1}, + ins: I, + abbr: L, + label: L, + code: L, + table: {thead:1, col:1, tbody:1, tr:1, colgroup:1, caption:1, tfoot:1}, + script: K, + tfoot: J, + cite: L, + li: I, + input: {}, + strong: L, + textarea: K, + big: L, + small: L, + span: L, + dt: L, + hr: {}, + sub: L, + optgroup: {option:1}, + bdo: L, + param: {}, + 'var': L, + div: I, + object: X({param:1}, H), + sup: L, + dd: I, + area: {}, + map: X({form:1, area:1}, A, C), + dl: {dt:1, dd:1}, + del: I, + fieldset: X({legend:1}, H), + thead: J, + ul: M, + acronym: L, + b: L, + a: X({img:1, object:1}, D, F), + blockquote: N, + caption: L, + i: L, + tbody: J, + address: L, + tt: L, + legend: L, + q: L, + pre: X({a:1}, D, F), + p: L, + em: L, + dfn: L + } ; +})() ; diff --git a/member/editor/fckeditor/editor/dtd/fck_xhtml10transitional.js b/member/editor/fckeditor/editor/dtd/fck_xhtml10transitional.js new file mode 100644 index 0000000..2c9d365 --- /dev/null +++ b/member/editor/fckeditor/editor/dtd/fck_xhtml10transitional.js @@ -0,0 +1,117 @@ +FCK.DTD = (function() +{ + var X = FCKTools.Merge ; + + var A,L,J,M,N,O,D,H,P,K,Q,F,G,C,B,E,I ; + A = {isindex:1, fieldset:1} ; + B = {input:1, button:1, select:1, textarea:1, label:1} ; + C = X({a:1}, B) ; + D = X({iframe:1}, C) ; + E = {hr:1, ul:1, menu:1, div:1, blockquote:1, noscript:1, table:1, center:1, address:1, dir:1, pre:1, h5:1, dl:1, h4:1, noframes:1, h6:1, ol:1, h1:1, h3:1, h2:1} ; + F = {ins:1, del:1, script:1} ; + G = X({b:1, acronym:1, bdo:1, 'var':1, '#':1, abbr:1, code:1, br:1, i:1, cite:1, kbd:1, u:1, strike:1, s:1, tt:1, strong:1, q:1, samp:1, em:1, dfn:1, span:1}, F) ; + H = X({sub:1, img:1, object:1, sup:1, basefont:1, map:1, applet:1, font:1, big:1, small:1}, G) ; + I = X({p:1}, H) ; + J = X({iframe:1}, H, B) ; + K = {img:1, noscript:1, br:1, kbd:1, center:1, button:1, basefont:1, h5:1, h4:1, samp:1, h6:1, ol:1, h1:1, h3:1, h2:1, form:1, font:1, '#':1, select:1, menu:1, ins:1, abbr:1, label:1, code:1, table:1, script:1, cite:1, input:1, iframe:1, strong:1, textarea:1, noframes:1, big:1, small:1, span:1, hr:1, sub:1, bdo:1, 'var':1, div:1, object:1, sup:1, strike:1, dir:1, map:1, dl:1, applet:1, del:1, isindex:1, fieldset:1, ul:1, b:1, acronym:1, a:1, blockquote:1, i:1, u:1, s:1, tt:1, address:1, q:1, pre:1, p:1, em:1, dfn:1} ; + + L = X({a:1}, J) ; + M = {tr:1} ; + N = {'#':1} ; + O = X({param:1}, K) ; + P = X({form:1}, A, D, E, I) ; + Q = {li:1} ; + + return { + col: {}, + tr: {td:1, th:1}, + img: {}, + colgroup: {col:1}, + noscript: P, + td: P, + br: {}, + th: P, + center: P, + kbd: L, + button: X(I, E), + basefont: {}, + h5: L, + h4: L, + samp: L, + h6: L, + ol: Q, + h1: L, + h3: L, + option: N, + h2: L, + form: X(A, D, E, I), + select: {optgroup:1, option:1}, + font: J, // Changed from L to J (see (1)) + ins: P, + menu: Q, + abbr: L, + label: L, + table: {thead:1, col:1, tbody:1, tr:1, colgroup:1, caption:1, tfoot:1}, + code: L, + script: N, + tfoot: M, + cite: L, + li: P, + input: {}, + iframe: P, + strong: J, // Changed from L to J (see (1)) + textarea: N, + noframes: P, + big: J, // Changed from L to J (see (1)) + small: J, // Changed from L to J (see (1)) + span: J, // Changed from L to J (see (1)) + hr: {}, + dt: L, + sub: J, // Changed from L to J (see (1)) + optgroup: {option:1}, + param: {}, + bdo: L, + 'var': J, // Changed from L to J (see (1)) + div: P, + object: O, + sup: J, // Changed from L to J (see (1)) + dd: P, + strike: J, // Changed from L to J (see (1)) + area: {}, + dir: Q, + map: X({area:1, form:1, p:1}, A, F, E), + applet: O, + dl: {dt:1, dd:1}, + del: P, + isindex: {}, + fieldset: X({legend:1}, K), + thead: M, + ul: Q, + acronym: L, + b: J, // Changed from L to J (see (1)) + a: J, + blockquote: P, + caption: L, + i: J, // Changed from L to J (see (1)) + u: J, // Changed from L to J (see (1)) + tbody: M, + s: L, + address: X(D, I), + tt: J, // Changed from L to J (see (1)) + legend: L, + q: L, + pre: X(G, C), + p: L, + em: J, // Changed from L to J (see (1)) + dfn: L + } ; +})() ; + +/* + Notes: + (1) According to the DTD, many elements, like accept elements + inside of them. But, to produce better output results, we have manually + changed the map to avoid breaking the links on pieces, having + "this is a link test", instead of + "this is a link test". +*/ diff --git a/member/editor/fckeditor/editor/fckdebug.html b/member/editor/fckeditor/editor/fckdebug.html new file mode 100644 index 0000000..0ea6480 --- /dev/null +++ b/member/editor/fckeditor/editor/fckdebug.html @@ -0,0 +1,130 @@ + + + + FCKeditor Debug Window + + + + + + + + + + + +
+ + + + + +
+ FCKeditor Debug Window +
+
+ +
+ + diff --git a/member/editor/fckeditor/editor/fckdialog.html b/member/editor/fckeditor/editor/fckdialog.html new file mode 100644 index 0000000..4b11e3a --- /dev/null +++ b/member/editor/fckeditor/editor/fckdialog.html @@ -0,0 +1,399 @@ + + + + + + + + + +
+ +
+
+ + + + + +
  + +   + +
+
+
+
+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/member/editor/fckeditor/editor/fckeditor.html b/member/editor/fckeditor/editor/fckeditor.html new file mode 100644 index 0000000..b88bda6 --- /dev/null +++ b/member/editor/fckeditor/editor/fckeditor.html @@ -0,0 +1,145 @@ + + +FCKeditor + + + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/member/editor/fckeditor/editor/images/anchor.gif b/member/editor/fckeditor/editor/images/anchor.gif new file mode 100644 index 0000000..5aa797b Binary files /dev/null and b/member/editor/fckeditor/editor/images/anchor.gif differ diff --git a/member/editor/fckeditor/editor/images/arrow_ltr.gif b/member/editor/fckeditor/editor/images/arrow_ltr.gif new file mode 100644 index 0000000..9c59bfe Binary files /dev/null and b/member/editor/fckeditor/editor/images/arrow_ltr.gif differ diff --git a/member/editor/fckeditor/editor/images/arrow_rtl.gif b/member/editor/fckeditor/editor/images/arrow_rtl.gif new file mode 100644 index 0000000..22e8649 Binary files /dev/null and b/member/editor/fckeditor/editor/images/arrow_rtl.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/att.gif b/member/editor/fckeditor/editor/images/ext/att.gif new file mode 100644 index 0000000..23ecf80 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/att.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/doc.gif b/member/editor/fckeditor/editor/images/ext/doc.gif new file mode 100644 index 0000000..a3bee14 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/doc.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/img.gif b/member/editor/fckeditor/editor/images/ext/img.gif new file mode 100644 index 0000000..7bfc0b2 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/img.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/index.html b/member/editor/fckeditor/editor/images/ext/index.html new file mode 100644 index 0000000..c1e1f00 --- /dev/null +++ b/member/editor/fckeditor/editor/images/ext/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/member/editor/fckeditor/editor/images/ext/mov.gif b/member/editor/fckeditor/editor/images/ext/mov.gif new file mode 100644 index 0000000..2865600 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/mov.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/oth.gif b/member/editor/fckeditor/editor/images/ext/oth.gif new file mode 100644 index 0000000..69dc001 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/oth.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/pdf.gif b/member/editor/fckeditor/editor/images/ext/pdf.gif new file mode 100644 index 0000000..4bcc421 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/pdf.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/ppt.gif b/member/editor/fckeditor/editor/images/ext/ppt.gif new file mode 100644 index 0000000..658a957 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/ppt.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/swf.gif b/member/editor/fckeditor/editor/images/ext/swf.gif new file mode 100644 index 0000000..34ba1ec Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/swf.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/xls.gif b/member/editor/fckeditor/editor/images/ext/xls.gif new file mode 100644 index 0000000..1cf7bc9 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/xls.gif differ diff --git a/member/editor/fckeditor/editor/images/ext/zip.gif b/member/editor/fckeditor/editor/images/ext/zip.gif new file mode 100644 index 0000000..59401f1 Binary files /dev/null and b/member/editor/fckeditor/editor/images/ext/zip.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/001.gif b/member/editor/fckeditor/editor/images/smiley/msn/001.gif new file mode 100644 index 0000000..dabfa0a Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/001.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/002.gif b/member/editor/fckeditor/editor/images/smiley/msn/002.gif new file mode 100644 index 0000000..642bf69 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/002.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/003.gif b/member/editor/fckeditor/editor/images/smiley/msn/003.gif new file mode 100644 index 0000000..95125d1 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/003.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/004.gif b/member/editor/fckeditor/editor/images/smiley/msn/004.gif new file mode 100644 index 0000000..760fe07 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/004.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/005.gif b/member/editor/fckeditor/editor/images/smiley/msn/005.gif new file mode 100644 index 0000000..5ca7d6e Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/005.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/006.gif b/member/editor/fckeditor/editor/images/smiley/msn/006.gif new file mode 100644 index 0000000..5ba5842 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/006.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/007.gif b/member/editor/fckeditor/editor/images/smiley/msn/007.gif new file mode 100644 index 0000000..eece0af Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/007.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/008.gif b/member/editor/fckeditor/editor/images/smiley/msn/008.gif new file mode 100644 index 0000000..8b4af4a Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/008.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/009.gif b/member/editor/fckeditor/editor/images/smiley/msn/009.gif new file mode 100644 index 0000000..54cd051 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/009.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/010.gif b/member/editor/fckeditor/editor/images/smiley/msn/010.gif new file mode 100644 index 0000000..ffb9a02 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/010.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/011.gif b/member/editor/fckeditor/editor/images/smiley/msn/011.gif new file mode 100644 index 0000000..a3286c8 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/011.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/012.gif b/member/editor/fckeditor/editor/images/smiley/msn/012.gif new file mode 100644 index 0000000..2b03caf Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/012.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/013.gif b/member/editor/fckeditor/editor/images/smiley/msn/013.gif new file mode 100644 index 0000000..fe630c8 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/013.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/014.gif b/member/editor/fckeditor/editor/images/smiley/msn/014.gif new file mode 100644 index 0000000..9cadda1 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/014.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/015.gif b/member/editor/fckeditor/editor/images/smiley/msn/015.gif new file mode 100644 index 0000000..40b2603 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/015.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/016.gif b/member/editor/fckeditor/editor/images/smiley/msn/016.gif new file mode 100644 index 0000000..5b1c836 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/016.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/017.gif b/member/editor/fckeditor/editor/images/smiley/msn/017.gif new file mode 100644 index 0000000..361789e Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/017.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/018.gif b/member/editor/fckeditor/editor/images/smiley/msn/018.gif new file mode 100644 index 0000000..e91abab Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/018.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/019.gif b/member/editor/fckeditor/editor/images/smiley/msn/019.gif new file mode 100644 index 0000000..3d05845 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/019.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/020.gif b/member/editor/fckeditor/editor/images/smiley/msn/020.gif new file mode 100644 index 0000000..b884cb3 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/020.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/021.gif b/member/editor/fckeditor/editor/images/smiley/msn/021.gif new file mode 100644 index 0000000..6765468 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/021.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/022.gif b/member/editor/fckeditor/editor/images/smiley/msn/022.gif new file mode 100644 index 0000000..9b2dbc4 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/022.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/023.gif b/member/editor/fckeditor/editor/images/smiley/msn/023.gif new file mode 100644 index 0000000..9272958 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/023.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/024.gif b/member/editor/fckeditor/editor/images/smiley/msn/024.gif new file mode 100644 index 0000000..264da2d Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/024.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/025.gif b/member/editor/fckeditor/editor/images/smiley/msn/025.gif new file mode 100644 index 0000000..83876e6 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/025.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/026.gif b/member/editor/fckeditor/editor/images/smiley/msn/026.gif new file mode 100644 index 0000000..67340f8 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/026.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/027.gif b/member/editor/fckeditor/editor/images/smiley/msn/027.gif new file mode 100644 index 0000000..4cc4ae2 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/027.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/028.gif b/member/editor/fckeditor/editor/images/smiley/msn/028.gif new file mode 100644 index 0000000..60a3754 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/028.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/029.gif b/member/editor/fckeditor/editor/images/smiley/msn/029.gif new file mode 100644 index 0000000..5c66d5a Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/029.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/030.gif b/member/editor/fckeditor/editor/images/smiley/msn/030.gif new file mode 100644 index 0000000..638a54f Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/030.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/031.gif b/member/editor/fckeditor/editor/images/smiley/msn/031.gif new file mode 100644 index 0000000..5110729 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/031.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/032.gif b/member/editor/fckeditor/editor/images/smiley/msn/032.gif new file mode 100644 index 0000000..46bb6a8 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/032.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/033.gif b/member/editor/fckeditor/editor/images/smiley/msn/033.gif new file mode 100644 index 0000000..8617878 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/033.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/034.gif b/member/editor/fckeditor/editor/images/smiley/msn/034.gif new file mode 100644 index 0000000..4e4275d Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/034.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/035.gif b/member/editor/fckeditor/editor/images/smiley/msn/035.gif new file mode 100644 index 0000000..fb95cd2 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/035.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/036.gif b/member/editor/fckeditor/editor/images/smiley/msn/036.gif new file mode 100644 index 0000000..b4f9f11 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/036.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/037.gif b/member/editor/fckeditor/editor/images/smiley/msn/037.gif new file mode 100644 index 0000000..eac07fe Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/037.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/038.gif b/member/editor/fckeditor/editor/images/smiley/msn/038.gif new file mode 100644 index 0000000..738b605 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/038.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/039.gif b/member/editor/fckeditor/editor/images/smiley/msn/039.gif new file mode 100644 index 0000000..899df8b Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/039.gif differ diff --git a/member/editor/fckeditor/editor/images/smiley/msn/040.gif b/member/editor/fckeditor/editor/images/smiley/msn/040.gif new file mode 100644 index 0000000..5c69fc2 Binary files /dev/null and b/member/editor/fckeditor/editor/images/smiley/msn/040.gif differ diff --git a/member/editor/fckeditor/editor/images/spacer.gif b/member/editor/fckeditor/editor/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/member/editor/fckeditor/editor/images/spacer.gif differ diff --git a/member/editor/fckeditor/editor/index.html b/member/editor/fckeditor/editor/index.html new file mode 100644 index 0000000..c1e1f00 --- /dev/null +++ b/member/editor/fckeditor/editor/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/member/editor/fckeditor/editor/js/fckadobeair.js b/member/editor/fckeditor/editor/js/fckadobeair.js new file mode 100644 index 0000000..1093abc --- /dev/null +++ b/member/editor/fckeditor/editor/js/fckadobeair.js @@ -0,0 +1,74 @@ +if ( FCKBrowserInfo.IsAIR ) { + var FCKAdobeAIR = (function() { + var getDocumentHead = function( doc ) { + var head ; + var heads = doc.getElementsByTagName( 'head' ) ; + if( heads && heads[0] ) { + head = heads[0] ; + } else { + head = doc.createElement( 'head' ) ; + doc.documentElement.insertBefore( head, doc.documentElement.firstChild ) ; + } + return head ; + } ; + return { + FCKeditorAPI_Evaluate : function( parentWindow, script ) { + eval( script ) ; + parentWindow.FCKeditorAPI = window.FCKeditorAPI ; + }, + EditingArea_Start : function( doc, html ) { + var headInnerHtml = html.match( /([\s\S]*)<\/head>/i )[1] ; + if ( headInnerHtml && headInnerHtml.length > 0 ) { + var div = doc.createElement( 'div' ) ; + div.innerHTML = headInnerHtml ; + FCKDomTools.MoveChildren( div, getDocumentHead( doc ) ) ; + } + doc.body.innerHTML = html.match( /([\s\S]*)<\/body>/i )[1] ; + doc.addEventListener('click', function( ev ) { + ev.preventDefault() ; + ev.stopPropagation() ; + }, true ) ; + }, + Panel_Contructor : function( doc, baseLocation ) { + var head = getDocumentHead( doc ) ; + head.appendChild( doc.createElement('base') ).href = baseLocation ; + doc.body.style.margin = '0px' ; + doc.body.style.padding = '0px' ; + }, + ToolbarSet_GetOutElement : function( win, outMatch ) { + var toolbarTarget = win.parent ; + var targetWindowParts = outMatch[1].split( '.' ) ; + while ( targetWindowParts.length > 0 ) { + var part = targetWindowParts.shift() ; + if ( part.length > 0 ) toolbarTarget = toolbarTarget[ part ] ; + } + toolbarTarget = toolbarTarget.document.getElementById( outMatch[2] ) ; + }, + ToolbarSet_InitOutFrame : function( doc ) { + var head = getDocumentHead( doc ) ; + head.appendChild( doc.createElement('base') ).href = window.document.location ; + var targetWindow = doc.defaultView; + targetWindow.adjust = function() { targetWindow.frameElement.height = doc.body.scrollHeight; } ; + targetWindow.onresize = targetWindow.adjust ; + targetWindow.setTimeout( targetWindow.adjust, 0 ) ; + doc.body.style.overflow = 'hidden'; + doc.body.innerHTML = document.getElementById( 'xToolbarSpace' ).innerHTML ; + } + } ; + })(); + ( function() { + var _Original_FCKPanel_Window_OnFocus = FCKPanel_Window_OnFocus ; + var _Original_FCKPanel_Window_OnBlur = FCKPanel_Window_OnBlur ; + var _Original_FCK_StartEditor = FCK.StartEditor ; + FCKPanel_Window_OnFocus = function( e, panel ) { + _Original_FCKPanel_Window_OnFocus.call( this, e, panel ) ; + if ( panel._focusTimer ) clearTimeout( panel._focusTimer ) ; + } + FCKPanel_Window_OnBlur = function( e, panel ) { panel._focusTimer = FCKTools.SetTimeout( _Original_FCKPanel_Window_OnBlur, 100, this, [ e, panel ] ) ; } + FCK.StartEditor = function() { + window.FCK_InternalCSS = FCKConfig.FullBasePath + 'css/fck_internal.css' ; + window.FCK_ShowTableBordersCSS = FCKConfig.FullBasePath + 'css/fck_showtableborders_gecko.css' ; + _Original_FCK_StartEditor.apply( this, arguments ) ; + } + })(); +} diff --git a/member/editor/fckeditor/editor/js/fckeditorcode_gecko.js b/member/editor/fckeditor/editor/js/fckeditorcode_gecko.js new file mode 100644 index 0000000..5164543 --- /dev/null +++ b/member/editor/fckeditor/editor/js/fckeditorcode_gecko.js @@ -0,0 +1,90 @@ +var FCK_STATUS_NOTLOADED=window.parent.FCK_STATUS_NOTLOADED=0;var FCK_STATUS_ACTIVE=window.parent.FCK_STATUS_ACTIVE=1;var FCK_STATUS_COMPLETE=window.parent.FCK_STATUS_COMPLETE=2;var FCK_TRISTATE_OFF=window.parent.FCK_TRISTATE_OFF=0;var FCK_TRISTATE_ON=window.parent.FCK_TRISTATE_ON=1;var FCK_TRISTATE_DISABLED=window.parent.FCK_TRISTATE_DISABLED=-1;var FCK_UNKNOWN=window.parent.FCK_UNKNOWN=-9;var FCK_TOOLBARITEM_ONLYICON=window.parent.FCK_TOOLBARITEM_ONLYICON=0;var FCK_TOOLBARITEM_ONLYTEXT=window.parent.FCK_TOOLBARITEM_ONLYTEXT=1;var FCK_TOOLBARITEM_ICONTEXT=window.parent.FCK_TOOLBARITEM_ICONTEXT=2;var FCK_EDITMODE_WYSIWYG=window.parent.FCK_EDITMODE_WYSIWYG=0;var FCK_EDITMODE_SOURCE=window.parent.FCK_EDITMODE_SOURCE=1;var FCK_IMAGES_PATH='images/';var FCK_SPACER_PATH='images/spacer.gif';var CTRL=1000;var SHIFT=2000;var ALT=4000;var FCK_STYLE_BLOCK=0;var FCK_STYLE_INLINE=1;var FCK_STYLE_OBJECT=2; +String.prototype.Contains=function(A){return (this.indexOf(A)>-1);};String.prototype.Equals=function(){var A=arguments;if (A.length==1&&A[0].pop) A=A[0];for (var i=0;iC) return false;if (B){var E=new RegExp(A+'$','i');return E.test(this);}else return (D==0||this.substr(C-D,D)==A);};String.prototype.Remove=function(A,B){var s='';if (A>0) s=this.substring(0,A);if (A+B=7),IsIE6:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=6),IsGecko:s.Contains('gecko/'),IsSafari:s.Contains(' applewebkit/'),IsOpera:!!window.opera,IsAIR:s.Contains(' adobeair/'),IsMac:s.Contains('macintosh')};(function(A){A.IsGeckoLike=(A.IsGecko||A.IsSafari||A.IsOpera);if (A.IsGecko){var B=s.match(/gecko\/(\d+)/)[1];A.IsGecko10=((B<20051111)||(/rv:1\.7/.test(s)));A.IsGecko19=/rv:1\.9/.test(s);}else A.IsGecko10=false;})(FCKBrowserInfo); +var FCKURLParams={};(function(){var A=document.location.search.substr(1).split('&');for (var i=0;i';if (!FCKRegexLib.HtmlOpener.test(A)) A=''+A+'';if (!FCKRegexLib.HeadOpener.test(A)) A=A.replace(FCKRegexLib.HtmlOpener,'$&');return A;}else{var B=FCKConfig.DocType+'0&&!FCKRegexLib.Html4DocType.test(FCKConfig.DocType)) B+=' style="overflow-y: scroll"';B+='>'+A+'';return B;}},ConvertToDataFormat:function(A,B,C,D){var E=FCKXHtml.GetXHTML(A,!B,D);if (C&&FCKRegexLib.EmptyOutParagraph.test(E)) return '';return E;},FixHtml:function(A){return A;}}; +var FCK={Name:FCKURLParams['InstanceName'],Status:0,EditMode:0,Toolbar:null,HasFocus:false,DataProcessor:new FCKDataProcessor(),GetInstanceObject:(function(){var w=window;return function(name){return w[name];}})(),AttachToOnSelectionChange:function(A){this.Events.AttachEvent('OnSelectionChange',A);},GetLinkedFieldValue:function(){return this.LinkedField.value;},GetParentForm:function(){return this.LinkedField.form;},StartupValue:'',IsDirty:function(){if (this.EditMode==1) return (this.StartupValue!=this.EditingArea.Textarea.value);else{if (!this.EditorDocument) return false;return (this.StartupValue!=this.EditorDocument.body.innerHTML);}},ResetIsDirty:function(){if (this.EditMode==1) this.StartupValue=this.EditingArea.Textarea.value;else if (this.EditorDocument.body) this.StartupValue=this.EditorDocument.body.innerHTML;},StartEditor:function(){this.TempBaseTag=FCKConfig.BaseHref.length>0?'':'';var A=FCK.KeystrokeHandler=new FCKKeystrokeHandler();A.OnKeystroke=_FCK_KeystrokeHandler_OnKeystroke;A.SetKeystrokes(FCKConfig.Keystrokes);if (FCKBrowserInfo.IsIE7){if ((CTRL+86/*V*/) in A.Keystrokes) A.SetKeystrokes([CTRL+86,true]);if ((SHIFT+45/*INS*/) in A.Keystrokes) A.SetKeystrokes([SHIFT+45,true]);};A.SetKeystrokes([CTRL+8,true]);this.EditingArea=new FCKEditingArea(document.getElementById('xEditingArea'));this.EditingArea.FFSpellChecker=FCKConfig.FirefoxSpellChecker;this.SetData(this.GetLinkedFieldValue(),true);FCKTools.AddEventListener(document,"keydown",this._TabKeyHandler);this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);},Focus:function(){FCK.EditingArea.Focus();},SetStatus:function(A){this.Status=A;if (A==1){FCKFocusManager.AddWindow(window,true);if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement,true);if (FCKConfig.StartupFocus) FCK.Focus();};this.Events.FireEvent('OnStatusChange',A);},FixBody:function(){var A=FCKConfig.EnterMode;if (A!='p'&&A!='div') return;var B=this.EditorDocument;if (!B) return;var C=B.body;if (!C) return;FCKDomTools.TrimNode(C);var D=C.firstChild;var E;while (D){var F=false;switch (D.nodeType){case 1:var G=D.nodeName.toLowerCase();if (!FCKListsLib.BlockElements[G]&&G!='li'&&!D.getAttribute('_fckfakelement')&&D.getAttribute('_moz_dirty')==null) F=true;break;case 3:if (E||D.nodeValue.Trim().length>0) F=true;};if (F){var H=D.parentNode;if (!E) E=H.insertBefore(B.createElement(A),D);E.appendChild(H.removeChild(D));D=E.nextSibling;}else{if (E){FCKDomTools.TrimNode(E);E=null;};D=D.nextSibling;}};if (E) FCKDomTools.TrimNode(E);},GetData:function(A){if (FCK.EditMode==1) return FCK.EditingArea.Textarea.value;this.FixBody();var B=FCK.EditorDocument;if (!B) return null;var C=FCKConfig.FullPage;var D=FCK.DataProcessor.ConvertToDataFormat(C?B.documentElement:B.body,!C,FCKConfig.IgnoreEmptyParagraphValue,A);D=FCK.ProtectEventsRestore(D);if (FCKBrowserInfo.IsIE) D=D.replace(FCKRegexLib.ToReplace,'$1');if (C){if (FCK.DocTypeDeclaration&&FCK.DocTypeDeclaration.length>0) D=FCK.DocTypeDeclaration+'\n'+D;if (FCK.XmlDeclaration&&FCK.XmlDeclaration.length>0) D=FCK.XmlDeclaration+'\n'+D;};return FCKConfig.ProtectedSource.Revert(D);},UpdateLinkedField:function(){var A=FCK.GetXHTML(FCKConfig.FormatOutput);if (FCKConfig.HtmlEncodeOutput) A=FCKTools.HTMLEncode(A);FCK.LinkedField.value=A;FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');},RegisteredDoubleClickHandlers:{},OnDoubleClick:function(A){var B=FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];if (B){for (var i=0;i0?'|ABBR|XML|EMBED|OBJECT':'ABBR|XML|EMBED|OBJECT';var C;if (B.length>0){C=new RegExp('<('+B+')(?!\w|:)','gi');A=A.replace(C,'','gi');A=A.replace(C,'<\/FCK:$1>');};B='META';if (FCKBrowserInfo.IsIE) B+='|HR';C=new RegExp('<(('+B+')(?=\\s|>|/)[\\s\\S]*?)/?>','gi');A=A.replace(C,'');return A;},SetData:function(A,B){this.EditingArea.Mode=FCK.EditMode;if (FCKBrowserInfo.IsIE&&FCK.EditorDocument){FCK.EditorDocument.detachEvent("onselectionchange",Doc_OnSelectionChange);};if (FCK.EditMode==0){this._ForceResetIsDirty=(B===true);A=FCKConfig.ProtectedSource.Protect(A);A=FCK.DataProcessor.ConvertToHtml(A);A=A.replace(FCKRegexLib.InvalidSelfCloseTags,'$1>');A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);if (FCK.TempBaseTag.length>0&&!FCKRegexLib.HasBaseTag.test(A)) A=A.replace(FCKRegexLib.HeadOpener,'$&'+FCK.TempBaseTag);var C='';if (!FCKConfig.FullPage) C+=_FCK_GetEditorAreaStyleTags();if (FCKBrowserInfo.IsIE) C+=FCK._GetBehaviorsStyle();else if (FCKConfig.ShowBorders) C+=FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS,true);C+=FCKTools.GetStyleHtml(FCK_InternalCSS,true);A=A.replace(FCKRegexLib.HeadCloser,C+'$&');this.EditingArea.OnLoad=_FCK_EditingArea_OnLoad;this.EditingArea.Start(A);}else{FCK.EditorWindow=null;FCK.EditorDocument=null;FCKDomTools.PaddingNode=null;this.EditingArea.OnLoad=null;this.EditingArea.Start(A);this.EditingArea.Textarea._FCKShowContextMenu=true;FCK.EnterKeyHandler=null;if (B) this.ResetIsDirty();FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);this.EditingArea.Textarea.focus();FCK.Events.FireEvent('OnAfterSetHTML');};if (FCKBrowserInfo.IsGecko) window.onresize();},RedirectNamedCommands:{},ExecuteNamedCommand:function(A,B,C,D){if (!D) FCKUndo.SaveUndoStep();if (!C&&FCK.RedirectNamedCommands[A]!=null) FCK.ExecuteRedirectedNamedCommand(A,B);else{FCK.Focus();FCK.EditorDocument.execCommand(A,false,B);FCK.Events.FireEvent('OnSelectionChange');};if (!D) FCKUndo.SaveUndoStep();},GetNamedCommandState:function(A){try{if (FCKBrowserInfo.IsSafari&&FCK.EditorWindow&&A.IEquals('Paste')) return 0;if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;else{return FCK.EditorDocument.queryCommandState(A)?1:0;}}catch (e){return 0;}},GetNamedCommandValue:function(A){var B='';var C=FCK.GetNamedCommandState(A);if (C==-1) return null;try{B=this.EditorDocument.queryCommandValue(A);}catch(e) {};return B?B:'';},Paste:function(A){if (FCK.Status!=2||!FCK.Events.FireEvent('OnPaste')) return false;return A||FCK._ExecPaste();},PasteFromWord:function(){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteFromWord,'dialog/fck_paste.html',400,330,'Word');},Preview:function(){var A;if (FCKConfig.FullPage){if (FCK.TempBaseTag.length>0) A=FCK.TempBaseTag+FCK.GetXHTML();else A=FCK.GetXHTML();}else{A=FCKConfig.DocType+''+FCK.TempBaseTag+''+FCKLang.Preview+''+_FCK_GetEditorAreaStyleTags()+''+FCK.GetXHTML()+'';};var B=FCKConfig.ScreenWidth*0.8;var C=FCKConfig.ScreenHeight*0.7;var D=(FCKConfig.ScreenWidth-B)/2;var E='';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A;E='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';};var F=window.open(E,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+B+',height='+C+',left='+D);if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){F.document.write(A);F.document.close();}},SwitchEditMode:function(A){var B=(FCK.EditMode==0);var C=FCK.IsDirty();var D;if (B){FCKCommands.GetCommand('ShowBlocks').SaveState();if (!A&&FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();D=FCK.GetXHTML(FCKConfig.FormatSource);if (D==null) return false;}else D=this.EditingArea.Textarea.value;FCK.EditMode=B?1:0;FCK.SetData(D,!C);FCK.Focus();FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState,FCK.ToolbarSet);return true;},InsertElement:function(A){if (typeof A=='string') A=this.EditorDocument.createElement(A);var B=A.nodeName.toLowerCase();FCKSelection.Restore();var C=new FCKDomRange(this.EditorWindow);if (FCKListsLib.BlockElements[B]!=null){C.SplitBlock();C.InsertNode(A);var D=FCKDomTools.GetNextSourceElement(A,false,null,['hr','br','param','img','area','input'],true);if (!D&&FCKConfig.EnterMode!='br'){D=this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);};if (FCKListsLib.EmptyElements[B]==null) C.MoveToElementEditStart(A);else if (D) C.MoveToElementEditStart(D);else C.MoveToPosition(A,4);if (FCKBrowserInfo.IsGecko){if (D) D.scrollIntoView(false);A.scrollIntoView(false);}}else{C.MoveToSelection();C.DeleteContents();C.InsertNode(A);C.SetStart(A,4);C.SetEnd(A,4);};C.Select();C.Release();this.Focus();return A;},_InsertBlockElement:function(A){},_IsFunctionKey:function(A){if (A>=16&&A<=20) return true;if (A==27||(A>=33&&A<=40)) return true;if (A==45) return true;return false;},_KeyDownListener:function(A){if (!A) A=FCK.EditorWindow.event;if (FCK.EditorWindow){if (!FCK._IsFunctionKey(A.keyCode)&&!(A.ctrlKey||A.metaKey)&&!(A.keyCode==46)) FCK._KeyDownUndo();};return true;},_KeyDownUndo:function(){if (!FCKUndo.Typing){FCKUndo.SaveUndoStep();FCKUndo.Typing=true;FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.TypesCount++;FCKUndo.Changed=1;if (FCKUndo.TypesCount>FCKUndo.MaxTypes){FCKUndo.TypesCount=0;FCKUndo.SaveUndoStep();}},_TabKeyHandler:function(A){if (!A) A=window.event;var B=A.keyCode;if (B==9&&FCK.EditMode!=0){if (FCKBrowserInfo.IsIE){var C=document.selection.createRange();if (C.parentElement()!=FCK.EditingArea.Textarea) return true;C.text='\t';C.select();}else{var a=[];var D=FCK.EditingArea.Textarea;var E=D.selectionStart;var F=D.selectionEnd;a.push(D.value.substr(0,E));a.push('\t');a.push(D.value.substr(F));D.value=a.join('');D.setSelectionRange(E+1,E+1);};if (A.preventDefault) return A.preventDefault();return A.returnValue=false;};return true;}};FCK.Events=new FCKEvents(FCK);FCK.GetHTML=FCK.GetXHTML=FCK.GetData;FCK.SetHTML=FCK.SetData;FCK.InsertElementAndGetIt=FCK.CreateElement=FCK.InsertElement;function _FCK_ProtectEvents_ReplaceTags(A){return A.replace(FCKRegexLib.EventAttributes,_FCK_ProtectEvents_ReplaceEvents);};function _FCK_ProtectEvents_ReplaceEvents(A,B){return ' '+B+'_fckprotectedatt="'+encodeURIComponent(A)+'"';};function _FCK_ProtectEvents_RestoreEvents(A,B){return decodeURIComponent(B);};function _FCK_MouseEventsListener(A){if (!A) A=window.event;if (A.type=='mousedown') FCK.MouseDownFlag=true;else if (A.type=='mouseup') FCK.MouseDownFlag=false;else if (A.type=='mousemove') FCK.Events.FireEvent('OnMouseMove',A);};function _FCK_PaddingNodeListener(){if (FCKConfig.EnterMode.IEquals('br')) return;FCKDomTools.EnforcePaddingNode(FCK.EditorDocument,FCKConfig.EnterMode);if (!FCKBrowserInfo.IsIE&&FCKDomTools.PaddingNode){var A=FCKSelection.GetSelection();if (A&&A.rangeCount==1){var B=A.getRangeAt(0);if (B.collapsed&&B.startContainer==FCK.EditorDocument.body&&B.startOffset==0){B.selectNodeContents(FCKDomTools.PaddingNode);B.collapse(true);A.removeAllRanges();A.addRange(B);}}}else if (FCKDomTools.PaddingNode){var C=FCKSelection.GetParentElement();var D=FCKDomTools.PaddingNode;if (C&&C.nodeName.IEquals('body')){if (FCK.EditorDocument.body.childNodes.length==1&&FCK.EditorDocument.body.firstChild==D){var B=FCK.EditorDocument.body.createTextRange();var F=false;if (!D.childNodes.firstChild){D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));F=true;};B.moveToElementText(D);B.select();if (F) B.pasteHTML('');}}}};function _FCK_EditingArea_OnLoad(){FCK.EditorWindow=FCK.EditingArea.Window;FCK.EditorDocument=FCK.EditingArea.Document;FCK.InitializeBehaviors();FCK.MouseDownFlag=false;FCKTools.AddEventListener(FCK.EditorDocument,'mousemove',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mouseup',_FCK_MouseEventsListener);if (FCKBrowserInfo.IsSafari){var A=function(evt){if (!(evt.ctrlKey||evt.metaKey)) return;if (FCK.EditMode!=0) return;switch (evt.keyCode){case 89:FCKUndo.Redo();break;case 90:FCKUndo.Undo();break;}};FCKTools.AddEventListener(FCK.EditorDocument,'keyup',A);};FCK.EnterKeyHandler=new FCKEnterKey(FCK.EditorWindow,FCKConfig.EnterMode,FCKConfig.ShiftEnterMode,FCKConfig.TabSpaces);FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();if (FCKBrowserInfo.IsIE&&FCK.HasFocus) FCK.EditorDocument.body.setActive();FCK.OnAfterSetHTML();FCKCommands.GetCommand('ShowBlocks').RestoreState();if (FCK.Status!=0) return;FCK.SetStatus(1);};function _FCK_GetEditorAreaStyleTags(){return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS)+FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);};function _FCK_KeystrokeHandler_OnKeystroke(A,B){if (FCK.Status!=2) return false;if (FCK.EditMode==0){switch (B){case 'Paste':return!FCK.Paste();case 'Cut':FCKUndo.SaveUndoStep();return false;}}else{if (B.Equals('Paste','Undo','Redo','SelectAll','Cut')) return false;};var C=FCK.Commands.GetCommand(B);if (C.GetState()==-1) return false;return (C.Execute.apply(C,FCKTools.ArgumentsToArray(arguments,2))!==false);};(function(){var A=window.parent.document;var B=A.getElementById(FCK.Name);var i=0;while (B||i==0){if (B&&B.tagName.toLowerCase().Equals('input','textarea')){FCK.LinkedField=B;break;};B=A.getElementsByName(FCK.Name)[i++];}})();var FCKTempBin={Elements:[],AddElement:function(A){var B=this.Elements.length;this.Elements[B]=A;return B;},RemoveElement:function(A){var e=this.Elements[A];this.Elements[A]=null;return e;},Reset:function(){var i=0;while (i40) return;};var C=function(H){if (H.nodeType!=1) return false;var D=H.tagName.toLowerCase();return (FCKListsLib.BlockElements[D]||FCKListsLib.EmptyElements[D]);};var E=function(){var F=FCKSelection.GetSelection();var G=F.getRangeAt(0);if (!G||!G.collapsed) return;var H=G.endContainer;if (H.nodeType!=3) return;if (H.nodeValue.length!=G.endOffset) return;var I=H.parentNode.tagName.toLowerCase();if (!(I=='a'||String(H.parentNode.contentEditable)=='false'||(!(FCKListsLib.BlockElements[I]||FCKListsLib.NonEmptyBlockElements[I])&&B==35))) return;var J=FCKTools.GetNextTextNode(H,H.parentNode,C);if (J) return;G=FCK.EditorDocument.createRange();J=FCKTools.GetNextTextNode(H,H.parentNode.parentNode,C);if (J){if (FCKBrowserInfo.IsOpera&&B==37) return;G.setStart(J,0);G.setEnd(J,0);}else{while (H.parentNode&&H.parentNode!=FCK.EditorDocument.body&&H.parentNode!=FCK.EditorDocument.documentElement&&H==H.parentNode.lastChild&&(!FCKListsLib.BlockElements[H.parentNode.tagName.toLowerCase()]&&!FCKListsLib.NonEmptyBlockElements[H.parentNode.tagName.toLowerCase()])) H=H.parentNode;if (FCKListsLib.BlockElements[I]||FCKListsLib.EmptyElements[I]||H==FCK.EditorDocument.body){G.setStart(H,H.childNodes.length);G.setEnd(H,H.childNodes.length);}else{var K=H.nextSibling;while (K){if (K.nodeType!=1){K=K.nextSibling;continue;};var L=K.tagName.toLowerCase();if (FCKListsLib.BlockElements[L]||FCKListsLib.EmptyElements[L]||FCKListsLib.NonEmptyBlockElements[L]) break;K=K.nextSibling;};var M=FCK.EditorDocument.createTextNode('');if (K) H.parentNode.insertBefore(M,K);else H.parentNode.appendChild(M);G.setStart(M,0);G.setEnd(M,0);}};F.removeAllRanges();F.addRange(G);FCK.Events.FireEvent("OnSelectionChange");};setTimeout(E,1);};this.ExecOnSelectionChangeTimer=function(){if (FCK.LastOnChangeTimer) window.clearTimeout(FCK.LastOnChangeTimer);FCK.LastOnChangeTimer=window.setTimeout(FCK.ExecOnSelectionChange,100);};this.EditorDocument.addEventListener('mouseup',this.ExecOnSelectionChange,false);this.EditorDocument.addEventListener('keyup',this.ExecOnSelectionChangeTimer,false);this._DblClickListener=function(e){FCK.OnDoubleClick(e.target);e.stopPropagation();};this.EditorDocument.addEventListener('dblclick',this._DblClickListener,true);this.EditorDocument.addEventListener('keydown',this._KeyDownListener,false);if (FCKBrowserInfo.IsGecko){this.EditorWindow.addEventListener('dragdrop',this._ExecDrop,true);}else if (FCKBrowserInfo.IsSafari){var N=function(evt){ if (!FCK.MouseDownFlag) evt.returnValue=false;};this.EditorDocument.addEventListener('dragenter',N,true);this.EditorDocument.addEventListener('dragover',N,true);this.EditorDocument.addEventListener('drop',this._ExecDrop,true);this.EditorDocument.addEventListener('mousedown',function(ev){var O=ev.srcElement;if (O.nodeName.IEquals('IMG','HR','INPUT','TEXTAREA','SELECT')){FCKSelection.SelectNode(O);}},true);this.EditorDocument.addEventListener('mouseup',function(ev){if (ev.srcElement.nodeName.IEquals('INPUT','TEXTAREA','SELECT')) ev.preventDefault()},true);this.EditorDocument.addEventListener('click',function(ev){if (ev.srcElement.nodeName.IEquals('INPUT','TEXTAREA','SELECT')) ev.preventDefault()},true);};if (FCKBrowserInfo.IsGecko||FCKBrowserInfo.IsOpera){this.EditorDocument.addEventListener('keypress',this._ExecCheckCaret,false);this.EditorDocument.addEventListener('click',this._ExecCheckCaret,false);};FCK.ContextMenu._InnerContextMenu.SetMouseClickWindow(FCK.EditorWindow);FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument);};FCK.MakeEditable=function(){this.EditingArea.MakeEditable();};function Document_OnContextMenu(e){if (!e.target._FCKShowContextMenu) e.preventDefault();};document.oncontextmenu=Document_OnContextMenu;FCK._BaseGetNamedCommandState=FCK.GetNamedCommandState;FCK.GetNamedCommandState=function(A){switch (A){case 'Unlink':return FCKSelection.HasAncestorNode('A')?0:-1;default:return FCK._BaseGetNamedCommandState(A);}};FCK.RedirectNamedCommands={Print:true,Paste:true};FCK.ExecuteRedirectedNamedCommand=function(A,B){switch (A){case 'Print':FCK.EditorWindow.print();break;case 'Paste':try{if (FCKBrowserInfo.IsSafari) throw '';if (FCK.Paste()) FCK.ExecuteNamedCommand('Paste',null,true);}catch (e) { FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.Paste,'dialog/fck_paste.html',400,330,'Security');};break;default:FCK.ExecuteNamedCommand(A,B);}};FCK._ExecPaste=function(){FCKUndo.SaveUndoStep();if (FCKConfig.ForcePasteAsPlainText){FCK.PasteAsPlainText();return false;};return true;};FCK.InsertHtml=function(A){A=FCKConfig.ProtectedSource.Protect(A);A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);FCKUndo.SaveUndoStep();this.EditorDocument.execCommand('inserthtml',false,A);this.Focus();FCKDocumentProcessor.Process(FCK.EditorDocument);this.Events.FireEvent("OnSelectionChange");};FCK.PasteAsPlainText=function(){FCKTools.RunFunction(FCKDialog.OpenDialog,FCKDialog,['FCKDialog_Paste',FCKLang.PasteAsText,'dialog/fck_paste.html',400,330,'PlainText']);};FCK.GetClipboardHTML=function(){return '';};FCK.CreateLink=function(A,B){var C=[];FCK.ExecuteNamedCommand('Unlink',null,false,!!B);if (A.length>0){var D='javascript:void(0);/*'+(new Date().getTime())+'*/';FCK.ExecuteNamedCommand('CreateLink',D,false,!!B);var E=this.EditorDocument.evaluate("//a[@href='"+D+"']",this.EditorDocument.body,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);for (var i=0;i0&&!isNaN(E)) this.PageConfig[D]=parseInt(E,10);else this.PageConfig[D]=E;}};function FCKConfig_LoadPageConfig(){var A=FCKConfig.PageConfig;for (var B in A) FCKConfig[B]=A[B];};function FCKConfig_PreProcess(){var A=FCKConfig;if (A.AllowQueryStringDebug){try{if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug=true;}catch (e) {/*Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error).*/}};if (!A.PluginsPath.EndsWith('/')) A.PluginsPath+='/';var B=A.ToolbarComboPreviewCSS;if (!B||B.length==0) A.ToolbarComboPreviewCSS=A.EditorAreaCSS;A.RemoveAttributesArray=(A.RemoveAttributes||'').split(',');if (!FCKConfig.SkinEditorCSS||FCKConfig.SkinEditorCSS.length==0) FCKConfig.SkinEditorCSS=FCKConfig.SkinPath+'fck_editor.css';if (!FCKConfig.SkinDialogCSS||FCKConfig.SkinDialogCSS.length==0) FCKConfig.SkinDialogCSS=FCKConfig.SkinPath+'fck_dialog.css';};FCKConfig.ToolbarSets={};FCKConfig.Plugins={};FCKConfig.Plugins.Items=[];FCKConfig.Plugins.Add=function(A,B,C){FCKConfig.Plugins.Items.AddItem([A,B,C]);};FCKConfig.ProtectedSource={};FCKConfig.ProtectedSource._CodeTag=(new Date()).valueOf();FCKConfig.ProtectedSource.RegexEntries=[//g,//gi,//gi];FCKConfig.ProtectedSource.Add=function(A){this.RegexEntries.AddItem(A);};FCKConfig.ProtectedSource.Protect=function(A){var B=this._CodeTag;function _Replace(protectedSource){var C=FCKTempBin.AddElement(protectedSource);return '';};for (var i=0;i|>)","g");return A.replace(D,_Replace);};FCKConfig.GetBodyAttributes=function(){var A='';if (this.BodyId&&this.BodyId.length>0) A+=' id="'+this.BodyId+'"';if (this.BodyClass&&this.BodyClass.length>0) A+=' class="'+this.BodyClass+'"';return A;};FCKConfig.ApplyBodyAttributes=function(A){if (this.BodyId&&this.BodyId.length>0) A.id=FCKConfig.BodyId;if (this.BodyClass&&this.BodyClass.length>0) A.className+=' '+FCKConfig.BodyClass;}; +var FCKDebug={};FCKDebug._GetWindow=function(){if (!this.DebugWindow||this.DebugWindow.closed) this.DebugWindow=window.open(FCKConfig.BasePath+'fckdebug.html','FCKeditorDebug','menubar=no,scrollbars=yes,resizable=yes,location=no,toolbar=no,width=600,height=500',true);return this.DebugWindow;};FCKDebug.Output=function(A,B,C){if (!FCKConfig.Debug) return;try{this._GetWindow().Output(A,B);}catch (e) {}};FCKDebug.OutputObject=function(A,B){if (!FCKConfig.Debug) return;try{this._GetWindow().OutputObject(A,B);}catch (e) {}}; +var FCKDomTools={MoveChildren:function(A,B,C){if (A==B) return;var D;if (C){while ((D=A.lastChild)) B.insertBefore(A.removeChild(D),B.firstChild);}else{while ((D=A.firstChild)) B.appendChild(A.removeChild(D));}},MoveNode:function(A,B,C){if (C) B.insertBefore(FCKDomTools.RemoveNode(A),B.firstChild);else B.appendChild(FCKDomTools.RemoveNode(A));},TrimNode:function(A){this.LTrimNode(A);this.RTrimNode(A);},LTrimNode:function(A){var B;while ((B=A.firstChild)){if (B.nodeType==3){var C=B.nodeValue.LTrim();var D=B.nodeValue.length;if (C.length==0){A.removeChild(B);continue;}else if (C.length0) break;if (A.lastChild) A=A.lastChild;else return this.GetPreviousSourceElement(A,B,C,D);};return null;},GetNextSourceElement:function(A,B,C,D,E){while((A=this.GetNextSourceNode(A,E))){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (D&&A.nodeName.IEquals(D)) return this.GetNextSourceElement(A,B,C,D);return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;};return null;},GetNextSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.firstChild) E=A.firstChild;else{if (D&&A==D) return null;E=A.nextSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetNextSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetNextSourceNode(E,false,C,D);return E;},GetPreviousSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.lastChild) E=A.lastChild;else{if (D&&A==D) return null;E=A.previousSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetPreviousSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetPreviousSourceNode(E,false,C,D);return E;},InsertAfterNode:function(A,B){return A.parentNode.insertBefore(B,A.nextSibling);},GetParents:function(A){var B=[];while (A){B.unshift(A);A=A.parentNode;};return B;},GetCommonParents:function(A,B){var C=this.GetParents(A);var D=this.GetParents(B);var E=[];for (var i=0;i0) D[C.pop().toLowerCase()]=1;var E=this.GetCommonParents(A,B);var F=null;while ((F=E.pop())){if (D[F.nodeName.toLowerCase()]) return F;};return null;},GetIndexOf:function(A){var B=A.parentNode?A.parentNode.firstChild:null;var C=-1;while (B){C++;if (B==A) return C;B=B.nextSibling;};return-1;},PaddingNode:null,EnforcePaddingNode:function(A,B){try{if (!A||!A.body) return;}catch (e){return;};this.CheckAndRemovePaddingNode(A,B,true);try{if (A.body.lastChild&&(A.body.lastChild.nodeType!=1||A.body.lastChild.tagName.toLowerCase()==B.toLowerCase())) return;}catch (e){return;};var C=A.createElement(B);if (FCKBrowserInfo.IsGecko&&FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);this.PaddingNode=C;if (A.body.childNodes.length==1&&A.body.firstChild.nodeType==1&&A.body.firstChild.tagName.toLowerCase()=='br'&&(A.body.firstChild.getAttribute('_moz_dirty')!=null||A.body.firstChild.getAttribute('type')=='_moz')) A.body.replaceChild(C,A.body.firstChild);else A.body.appendChild(C);},CheckAndRemovePaddingNode:function(A,B,C){var D=this.PaddingNode;if (!D) return;try{if (D.parentNode!=A.body||D.tagName.toLowerCase()!=B||(D.childNodes.length>1)||(D.firstChild&&D.firstChild.nodeValue!='\xa0'&&String(D.firstChild.tagName).toLowerCase()!='br')){this.PaddingNode=null;return;}}catch (e){this.PaddingNode=null;return;};if (!C){if (D.parentNode.childNodes.length>1) D.parentNode.removeChild(D);this.PaddingNode=null;}},HasAttribute:function(A,B){if (A.hasAttribute) return A.hasAttribute(B);else{var C=A.attributes[B];return (C!=undefined&&C.specified);}},HasAttributes:function(A){var B=A.attributes;for (var i=0;i0) return true;}else if (B[i].specified) return true;};return false;},RemoveAttribute:function(A,B){if (FCKBrowserInfo.IsIE&&B.toLowerCase()=='class') B='className';return A.removeAttribute(B,0);},RemoveAttributes:function (A,B){for (var i=0;i0) return false;C=C.nextSibling;};return D?this.CheckIsEmptyElement(D,B):true;},SetElementStyles:function(A,B){var C=A.style;for (var D in B) C[D]=B[D];},SetOpacity:function(A,B){if (FCKBrowserInfo.IsIE){B=Math.round(B*100);A.style.filter=(B>100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+B+')');}else A.style.opacity=B;},GetCurrentElementStyle:function(A,B){if (FCKBrowserInfo.IsIE) return A.currentStyle[B];else return A.ownerDocument.defaultView.getComputedStyle(A,'').getPropertyValue(B);},GetPositionedAncestor:function(A){var B=A;while (B!=FCKTools.GetElementDocument(B).documentElement){if (this.GetCurrentElementStyle(B,'position')!='static') return B;if (B==FCKTools.GetElementDocument(B).documentElement&¤tWindow!=w) B=currentWindow.frameElement;else B=B.parentNode;};return null;},ScrollIntoView:function(A,B){var C=FCKTools.GetElementWindow(A);var D=FCKTools.GetViewPaneSize(C).Height;var E=D*-1;if (B===false){E+=A.offsetHeight;E+=parseInt(this.GetCurrentElementStyle(A,'marginBottom')||0,10);};E+=A.offsetTop;while ((A=A.offsetParent)) E+=A.offsetTop||0;var F=FCKTools.GetScrollPosition(C).Y;if (E>0&&E>F) C.scrollTo(0,E);},CheckIsEditable:function(A){var B=A.nodeName.toLowerCase();var C=FCK.DTD[B]||FCK.DTD.span;return (C['#']&&!FCKListsLib.NonEditableElements[B]);}}; +var FCKTools={};FCKTools.CreateBogusBR=function(A){var B=A.createElement('br');B.setAttribute('type','_moz');return B;};FCKTools.FixCssUrls=function(A,B){if (!A||A.length==0) return B;return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,function(match,opener,path,closer){if (/^\/|^\w?:/.test(path)) return match;else return 'url('+opener+A+path+closer+')';});};FCKTools._GetUrlFixedCss=function(A,B){var C=A.match(/^([^|]+)\|([\s\S]*)/);if (C) return FCKTools.FixCssUrls(C[1],C[2]);else return A;};FCKTools.AppendStyleSheet=function(A,B){if (!B) return [];if (typeof(B)=='string'){if (/[\\\/\.]\w*$/.test(B)){return this.AppendStyleSheet(A,B.split(','));}else return [this.AppendStyleString(A,FCKTools._GetUrlFixedCss(B))];}else{var C=[];for (var i=0;i'+styleDef+'';};var C=function(cssFileUrl,markTemp){if (cssFileUrl.length==0) return '';var B=markTemp?' _fcktemp="true"':'';return '';};return function(cssFileOrArrayOrDef,markTemp){if (!cssFileOrArrayOrDef) return '';if (typeof(cssFileOrArrayOrDef)=='string'){if (/[\\\/\.]\w*$/.test(cssFileOrArrayOrDef)){return this.GetStyleHtml(cssFileOrArrayOrDef.split(','),markTemp);}else return A(this._GetUrlFixedCss(cssFileOrArrayOrDef),markTemp);}else{var E='';for (var i=0;i/g,'>');return A;};FCKTools.HTMLDecode=function(A){if (!A) return '';A=A.replace(/>/g,'>');A=A.replace(/</g,'<');A=A.replace(/&/g,'&');return A;};FCKTools._ProcessLineBreaksForPMode=function(A,B,C,D,E){var F=0;var G="

";var H="

";var I="
";if (C){G="
  • ";H="
  • ";F=1;};while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='p'){F=1;break;};D=D.parentNode;};for (var i=0;i0) return A[A.length-1];return null;};FCKTools.GetDocumentPosition=function(w,A){var x=0;var y=0;var B=A;var C=null;var D=FCKTools.GetElementWindow(B);while (B&&!(D==w&&(B==w.document.body||B==w.document.documentElement))){x+=B.offsetLeft-B.scrollLeft;y+=B.offsetTop-B.scrollTop;if (!FCKBrowserInfo.IsOpera){var E=C;while (E&&E!=B){x-=E.scrollLeft;y-=E.scrollTop;E=E.parentNode;}};C=B;if (B.offsetParent) B=B.offsetParent;else{if (D!=w){B=D.frameElement;C=null;if (B) D=B.contentWindow.parent;}else B=null;}};if (FCKDomTools.GetCurrentElementStyle(w.document.body,'position')!='static'||(FCKBrowserInfo.IsIE&&FCKDomTools.GetPositionedAncestor(A)==null)){x+=w.document.body.offsetLeft;y+=w.document.body.offsetTop;};return { "x":x,"y":y };};FCKTools.GetWindowPosition=function(w,A){var B=this.GetDocumentPosition(w,A);var C=FCKTools.GetScrollPosition(w);B.x-=C.X;B.y-=C.Y;return B;};FCKTools.ProtectFormStyles=function(A){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return [];var B=[];var C=['style','className'];for (var i=0;i0){for (var i=B.length-1;i>=0;i--){var C=B[i][0];var D=B[i][1];if (D) A.insertBefore(C,D);else A.appendChild(C);}}};FCKTools.GetNextNode=function(A,B){if (A.firstChild) return A.firstChild;else if (A.nextSibling) return A.nextSibling;else{var C=A.parentNode;while (C){if (C==B) return null;if (C.nextSibling) return C.nextSibling;else C=C.parentNode;}};return null;};FCKTools.GetNextTextNode=function(A,B,C){node=this.GetNextNode(A,B);if (C&&node&&C(node)) return null;while (node&&node.nodeType!=3){node=this.GetNextNode(node,B);if (C&&node&&C(node)) return null;};return node;};FCKTools.Merge=function(){var A=arguments;var o=A[0];for (var i=1;i');document.domain = '"+FCK_RUNTIME_DOMAIN+"';document.close();}() ) ;";if (FCKBrowserInfo.IsIE){if (FCKBrowserInfo.IsIE7||!FCKBrowserInfo.IsIE6) return "";else return "javascript: '';";};return "javascript: void(0);";}; +FCKTools.CancelEvent=function(e){if (e) e.preventDefault();};FCKTools.DisableSelection=function(A){if (FCKBrowserInfo.IsGecko) A.style.MozUserSelect='none';else if (FCKBrowserInfo.IsSafari) A.style.KhtmlUserSelect='none';else A.style.userSelect='none';};FCKTools._AppendStyleSheet=function(A,B){var e=A.createElement('LINK');e.rel='stylesheet';e.type='text/css';e.href=B;A.getElementsByTagName("HEAD")[0].appendChild(e);return e;};FCKTools.AppendStyleString=function(A,B){if (!B) return null;var e=A.createElement("STYLE");e.appendChild(A.createTextNode(B));A.getElementsByTagName("HEAD")[0].appendChild(e);return e;};FCKTools.ClearElementAttributes=function(A){for (var i=0;i0) B[B.length]=D;C(parent.childNodes[i]);}};C(A);return B;};FCKTools.RemoveOuterTags=function(e){var A=e.ownerDocument.createDocumentFragment();for (var i=0;i','text/xml');FCKDomTools.RemoveNode(B.firstChild);return B;};return null;};FCKTools.GetScrollPosition=function(A){return { X:A.pageXOffset,Y:A.pageYOffset };};FCKTools.AddEventListener=function(A,B,C){A.addEventListener(B,C,false);};FCKTools.RemoveEventListener=function(A,B,C){A.removeEventListener(B,C,false);};FCKTools.AddEventListenerEx=function(A,B,C,D){A.addEventListener(B,function(e){C.apply(A,[e].concat(D||[]));},false);};FCKTools.GetViewPaneSize=function(A){return { Width:A.innerWidth,Height:A.innerHeight };};FCKTools.SaveStyles=function(A){var B=FCKTools.ProtectFormStyles(A);var C={};if (A.className.length>0){C.Class=A.className;A.className='';};var D=A.getAttribute('style');if (D&&D.length>0){C.Inline=D;A.setAttribute('style','',0);};FCKTools.RestoreFormStyles(A,B);return C;};FCKTools.RestoreStyles=function(A,B){var C=FCKTools.ProtectFormStyles(A);A.className=B.Class||'';if (B.Inline) A.setAttribute('style',B.Inline,0);else A.removeAttribute('style',0);FCKTools.RestoreFormStyles(A,C);};FCKTools.RegisterDollarFunction=function(A){A.$=function(id){return A.document.getElementById(id);};};FCKTools.AppendElement=function(A,B){return A.appendChild(A.ownerDocument.createElement(B));};FCKTools.GetElementPosition=function(A,B){var c={ X:0,Y:0 };var C=B||window;var D=FCKTools.GetElementWindow(A);var E=null;while (A){var F=D.getComputedStyle(A,'').position;if (F&&F!='static'&&A.style.zIndex!=FCKConfig.FloatingPanelsZIndex) break;c.X+=A.offsetLeft-A.scrollLeft;c.Y+=A.offsetTop-A.scrollTop;if (!FCKBrowserInfo.IsOpera){var G=E;while (G&&G!=A){c.X-=G.scrollLeft;c.Y-=G.scrollTop;G=G.parentNode;}};E=A;if (A.offsetParent) A=A.offsetParent;else{if (D!=C){A=D.frameElement;E=null;if (A) D=FCKTools.GetElementWindow(A);}else{c.X+=A.scrollLeft;c.Y+=A.scrollTop;break;}}};return c;}; +var FCKeditorAPI; +function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6",VersionBuild : "18638",Instances : new Object(),GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){ + /*DT 2012/11/30 Fix Firefox 17+*/ + var isFF17x = (navigator.userAgent.toLowerCase().indexOf('firefox') != -1 && parseInt(navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)[1], 10) >= 17) ? 1 :0; + isFF17x ? A.eval(B) : eval.call(A,B); +}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari||FCKBrowserInfo.IsGecko19){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;}; +function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup); +var FCKImagePreloader=function(){this._Images=[];};FCKImagePreloader.prototype={AddImages:function(A){if (typeof(A)=='string') A=A.split(';');this._Images=this._Images.concat(A);},Start:function(){var A=this._Images;this._PreloadCount=A.length;for (var i=0;i]*\>)/i,AfterBody:/(\<\/body\>[\s\S]*$)/i,ToReplace:/___fcktoreplace:([\w]+)/ig,MetaHttpEquiv:/http-equiv\s*=\s*["']?([^"' ]+)/i,HasBaseTag:/]/i,HtmlOpener:/]*>/i,HeadOpener:/]*>/i,HeadCloser:/<\/head\s*>/i,FCK_Class:/\s*FCK__[^ ]*(?=\s+|$)/,ElementName:/(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/,ForceSimpleAmpersand:/___FCKAmp___/g,SpaceNoClose:/\/>/g,EmptyParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/,EmptyOutParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*| )(<\/\1>)?$/,TagBody:/>]+))/gi,ProtectUrlsA:/]+))/gi,ProtectUrlsArea:/]+))/gi,Html4DocType:/HTML 4\.0 Transitional/i,DocTypeTag:/]*>/i,TagsWithEvent:/<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g,EventAttributes:/\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,ProtectedEvents:/\s\w+_fckprotectedatt="([^"]+)"/g,StyleProperties:/\S+\s*:/g,InvalidSelfCloseTags:/(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,StyleVariableAttName:/#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,RegExp:/^\/(.*)\/([gim]*)$/,HtmlTag:/<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/}; +var FCKListsLib={BlockElements:{ address:1,blockquote:1,center:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,marquee:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },NonEmptyBlockElements:{ p:1,div:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 },InlineChildReqElements:{ abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },InlineNonEmptyElements:{ a:1,abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },EmptyElements:{ base:1,col:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },PathBlockElements:{ address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 },PathBlockLimitElements:{ body:1,div:1,td:1,th:1,caption:1,form:1 },StyleBlockElements:{ address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },StyleObjectElements:{ img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1 },NonEditableElements:{ button:1,option:1,script:1,iframe:1,textarea:1,object:1,embed:1,map:1,applet:1 },BlockBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1 },ListBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1,br:1 }}; +var FCKLanguageManager=FCK.Language={AvailableLanguages:{af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-uk':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',it:'Italian',ja:'Japanese',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},GetActiveLanguage:function(){if (FCKConfig.AutoDetectLanguage){var A;if (navigator.userLanguage) A=navigator.userLanguage.toLowerCase();else if (navigator.language) A=navigator.language.toLowerCase();else{return FCKConfig.DefaultLanguage;};if (A.length>=5){A=A.substr(0,5);if (this.AvailableLanguages[A]) return A;};if (A.length>=2){A=A.substr(0,2);if (this.AvailableLanguages[A]) return A;}};return this.DefaultLanguage;},TranslateElements:function(A,B,C,D){var e=A.getElementsByTagName(B);var E,s;for (var i=0;i0) C+='|'+FCKConfig.AdditionalNumericEntities;FCKXHtmlEntities.EntitiesRegex=new RegExp(C,'g');}; +var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^/,'');E=E.substr(7,E.length-15).Trim();E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol; +FCKXHtml._GetMainXmlString=function(){return (new XMLSerializer()).serializeToString(this.MainNode);};FCKXHtml._AppendAttributes=function(A,B,C){var D=B.attributes;for (var n=0;n]*\>/gi;A.BlocksCloser=/\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.NewLineTags=/\<(BR|HR)[^\>]*\>/gi;A.MainTags=/\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi;A.LineSplitter=/\s*\n+\s*/g;A.IncreaseIndent=/^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i;A.DecreaseIndent=/^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i;A.FormatIndentatorRemove=new RegExp('^'+FCKConfig.FormatIndentator);A.ProtectedTags=/(]*>)([\s\S]*?)(<\/PRE>)/gi;};FCKCodeFormatter._ProtectData=function(A,B,C,D){return B+'___FCKpd___'+FCKCodeFormatter.ProtectedData.AddItem(C)+D;};FCKCodeFormatter.Format=function(A){if (!this.Regex) this.Init();FCKCodeFormatter.ProtectedData=[];var B=A.replace(this.Regex.ProtectedTags,FCKCodeFormatter._ProtectData);B=B.replace(this.Regex.BlocksOpener,'\n$&');B=B.replace(this.Regex.BlocksCloser,'$&\n');B=B.replace(this.Regex.NewLineTags,'$&\n');B=B.replace(this.Regex.MainTags,'\n$&\n');var C='';var D=B.split(this.Regex.LineSplitter);B='';for (var i=0;iB[i]) return 1;};if (A.lengthB.length) return 1;return 0;};FCKUndo._CheckIsBookmarksEqual=function(A,B){if (!(A&&B)) return false;if (FCKBrowserInfo.IsIE){var C=A[1].search(A[0].StartId);var D=B[1].search(B[0].StartId);var E=A[1].search(A[0].EndId);var F=B[1].search(B[0].EndId);return C==D&&E==F;}else{return this._CompareCursors(A.Start,B.Start)==0&&this._CompareCursors(A.End,B.End)==0;}};FCKUndo.SaveUndoStep=function(){if (FCK.EditMode!=0||this.SaveLocked) return;if (this.SavedData.length) this.Changed=true;var A=FCK.EditorDocument.body.innerHTML;var B=this._GetBookmark();this.SavedData=this.SavedData.slice(0,this.CurrentIndex+1);if (this.CurrentIndex>0&&A==this.SavedData[this.CurrentIndex][0]&&this._CheckIsBookmarksEqual(B,this.SavedData[this.CurrentIndex][1])) return;else if (this.CurrentIndex==0&&this.SavedData.length&&A==this.SavedData[0][0]){this.SavedData[0][1]=B;return;};if (this.CurrentIndex+1>=FCKConfig.MaxUndoLevels) this.SavedData.shift();else this.CurrentIndex++;this.SavedData[this.CurrentIndex]=[A,B];FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.CheckUndoState=function(){return (this.Changed||this.CurrentIndex>0);};FCKUndo.CheckRedoState=function(){return (this.CurrentIndex<(this.SavedData.length-1));};FCKUndo.Undo=function(){if (this.CheckUndoState()){if (this.CurrentIndex==(this.SavedData.length-1)){this.SaveUndoStep();};this._ApplyUndoLevel(--this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo.Redo=function(){if (this.CheckRedoState()){this._ApplyUndoLevel(++this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo._ApplyUndoLevel=function(A){var B=this.SavedData[A];if (!B) return;if (FCKBrowserInfo.IsIE){if (B[1]&&B[1][1]) FCK.SetInnerHtml(B[1][1]);else FCK.SetInnerHtml(B[0]);}else FCK.EditorDocument.body.innerHTML=B[0];this._SelectBookmark(B[1]);this.TypesCount=0;this.Changed=false;this.Typing=false;}; +var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A=''+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='
    ';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='';H.frameBorder=0;H.width=H.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=I+A;H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(I+A);J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;(H.onreadystatechange=function(){if (H.readyState=='complete'){H.onreadystatechange=null;K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);}})();}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}}; +var FCKKeystrokeHandler=function(A){this.Keystrokes={};this.CancelCtrlDefaults=(A!==false);};FCKKeystrokeHandler.prototype.AttachToElement=function(A){FCKTools.AddEventListenerEx(A,'keydown',_FCKKeystrokeHandler_OnKeyDown,this);if (FCKBrowserInfo.IsGecko10||FCKBrowserInfo.IsOpera||(FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac)) FCKTools.AddEventListenerEx(A,'keypress',_FCKKeystrokeHandler_OnKeyPress,this);};FCKKeystrokeHandler.prototype.SetKeystrokes=function(){for (var i=0;i40))){B._CancelIt=true;if (A.preventDefault) return A.preventDefault();A.returnValue=false;A.cancelBubble=true;return false;};return true;};function _FCKKeystrokeHandler_OnKeyPress(A,B){if (B._CancelIt){if (A.preventDefault) return A.preventDefault();return false;};return true;}; +FCK.DTD=(function(){var X=FCKTools.Merge;var A,L,J,M,N,O,D,H,P,K,Q,F,G,C,B,E,I;A={isindex:1,fieldset:1};B={input:1,button:1,select:1,textarea:1,label:1};C=X({a:1},B);D=X({iframe:1},C);E={hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1};F={ins:1,del:1,script:1};G=X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F);H=X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G);I=X({p:1},H);J=X({iframe:1},H,B);K={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1};L=X({a:1},J);M={tr:1};N={'#':1};O=X({param:1},K);P=X({form:1},A,D,E,I);Q={li:1};return {col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:P,td:P,br:{},th:P,center:P,kbd:L,button:X(I,E),basefont:{},h5:L,h4:L,samp:L,h6:L,ol:Q,h1:L,h3:L,option:N,h2:L,form:X(A,D,E,I),select:{optgroup:1,option:1},font:J,ins:P,menu:Q,abbr:L,label:L,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:L,script:N,tfoot:M,cite:L,li:P,input:{},iframe:P,strong:J,textarea:N,noframes:P,big:J,small:J,span:J,hr:{},dt:L,sub:J,optgroup:{option:1},param:{},bdo:L,'var':J,div:P,object:O,sup:J,dd:P,strike:J,area:{},dir:Q,map:X({area:1,form:1,p:1},A,F,E),applet:O,dl:{dt:1,dd:1},del:P,isindex:{},fieldset:X({legend:1},K),thead:M,ul:Q,acronym:L,b:J,a:J,blockquote:P,caption:L,i:J,u:J,tbody:M,s:L,address:X(D,I),tt:J,legend:L,q:L,pre:X(G,C),p:L,em:J,dfn:L};})(); +var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'
    ');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(]*>)[ \t\r\n]*/gi,'
    ');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='
    ') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='
    \n'+F.join('')+'
    ';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H=[];var I=[];while((F=E.GetNextParagraph())){var J=this.BuildElement(G);var K=J.nodeName.IEquals('pre');var L=F.nodeName.IEquals('pre');if (K&&!L){J=this._ToPre(G,F,J);H.push(J);}else if (!K&&L){J=this._FromPre(G,F,J);I.push(J);}else FCKDomTools.MoveChildren(F,J);F.parentNode.insertBefore(J,F);FCKDomTools.RemoveNode(F);};for (var i=0;i0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i0) return true;};B=B.nextSibling;};return false;}}; +var FCKElementPath=function(A){var B=null;var C=null;var D=[];var e=A;while (e){if (e.nodeType==1){if (!this.LastElement) this.LastElement=e;var E=e.nodeName.toLowerCase();if (FCKBrowserInfo.IsIE&&e.scopeName!='HTML') E=e.scopeName.toLowerCase()+':'+E;if (!C){if (!B&&FCKListsLib.PathBlockElements[E]!=null) B=e;if (FCKListsLib.PathBlockLimitElements[E]!=null){if (!B&&E=='div'&&!FCKElementPath._CheckHasBlock(e)) B=e;else C=e;}};D.push(e);if (E=='body') break;};e=e.parentNode;};this.Block=B;this.BlockLimit=C;this.Elements=D;};FCKElementPath._CheckHasBlock=function(A){var B=A.childNodes;for (var i=0,count=B.length;i0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&B.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;};while (C&&C.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;};while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;};while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}}; +FCKDomRange.prototype.MoveToSelection=function(){this.Release(true);var A=this.Window.getSelection();if (A&&A.rangeCount>0){this._Range=FCKW3CRange.CreateFromRange(this.Window.document,A.getRangeAt(0));this._UpdateElementInfo();}else if (this.Window.document) this.MoveToElementStart(this.Window.document.body);};FCKDomRange.prototype.Select=function(){var A=this._Range;if (A){var B=A.startContainer;if (A.collapsed&&B.nodeType==1&&B.childNodes.length==0) B.appendChild(A._Document.createTextNode(''));var C=this.Window.document.createRange();C.setStart(B,A.startOffset);try{C.setEnd(A.endContainer,A.endOffset);}catch (e){if (e.toString().Contains('NS_ERROR_ILLEGAL_VALUE')){A.collapse(true);C.setEnd(A.endContainer,A.endOffset);}else throw(e);};var D=this.Window.getSelection();D.removeAllRanges();D.addRange(C);}};FCKDomRange.prototype.SelectBookmark=function(A){var B=this.Window.document.createRange();var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);B.setStart(C.parentNode,FCKDomTools.GetIndexOf(C));FCKDomTools.RemoveNode(C);if (D){B.setEnd(D.parentNode,FCKDomTools.GetIndexOf(D));FCKDomTools.RemoveNode(D);};var E=this.Window.getSelection();E.removeAllRanges();E.addRange(B);}; +var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=H;};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}}; +var FCKDocumentFragment=function(A,B){this.RootNode=B||A.createDocumentFragment();};FCKDocumentFragment.prototype={AppendTo:function(A){A.appendChild(this.RootNode);},InsertAfterNode:function(A){FCKDomTools.InsertAfterNode(A,this.RootNode);}}; +var FCKW3CRange=function(A){this._Document=A;this.startContainer=null;this.startOffset=null;this.endContainer=null;this.endOffset=null;this.collapsed=true;};FCKW3CRange.CreateRange=function(A){return new FCKW3CRange(A);};FCKW3CRange.CreateFromRange=function(A,B){var C=FCKW3CRange.CreateRange(A);C.setStart(B.startContainer,B.startOffset);C.setEnd(B.endContainer,B.endOffset);return C;};FCKW3CRange.prototype={_UpdateCollapsed:function(){this.collapsed=(this.startContainer==this.endContainer&&this.startOffset==this.endOffset);},setStart:function(A,B){this.startContainer=A;this.startOffset=B;if (!this.endContainer){this.endContainer=A;this.endOffset=B;};this._UpdateCollapsed();},setEnd:function(A,B){this.endContainer=A;this.endOffset=B;if (!this.startContainer){this.startContainer=A;this.startOffset=B;};this._UpdateCollapsed();},setStartAfter:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setStartBefore:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A));},setEndAfter:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setEndBefore:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A));},collapse:function(A){if (A){this.endContainer=this.startContainer;this.endOffset=this.startOffset;}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset;};this.collapsed=true;},selectNodeContents:function(A){this.setStart(A,0);this.setEnd(A,A.nodeType==3?A.data.length:A.childNodes.length);},insertNode:function(A){var B=this.startContainer;var C=this.startOffset;if (B.nodeType==3){B.splitText(C);if (B==this.endContainer) this.setEnd(B.nextSibling,this.endOffset-this.startOffset);FCKDomTools.InsertAfterNode(B,A);return;}else{B.insertBefore(A,B.childNodes[C]||null);if (B==this.endContainer){this.endOffset++;this.collapsed=false;}}},deleteContents:function(){if (this.collapsed) return;this._ExecContentsAction(0);},extractContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(1,A);return A;},cloneContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(2,A);return A;},_ExecContentsAction:function(A,B){var C=this.startContainer;var D=this.endContainer;var E=this.startOffset;var F=this.endOffset;var G=false;var H=false;if (D.nodeType==3) D=D.splitText(F);else{if (D.childNodes.length>0){if (F>D.childNodes.length-1){D=FCKDomTools.InsertAfterNode(D.lastChild,this._Document.createTextNode(''));H=true;}else D=D.childNodes[F];}};if (C.nodeType==3){C.splitText(E);if (C==D) D=C.nextSibling;}else{if (E==0){C=C.insertBefore(this._Document.createTextNode(''),C.firstChild);G=true;}else if (E>C.childNodes.length-1){C=C.appendChild(this._Document.createTextNode(''));G=true;}else C=C.childNodes[E].previousSibling;};var I=FCKDomTools.GetParents(C);var J=FCKDomTools.GetParents(D);var i,topStart,topEnd;for (i=0;i0&&levelStartNode!=D) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==D));if (!I[k]||levelStartNode.parentNode!=I[k].parentNode){currentNode=levelStartNode.previousSibling;while(currentNode){if (currentNode==I[k]||currentNode==C) break;currentSibling=currentNode.previousSibling;if (A==2) K.insertBefore(currentNode.cloneNode(true),K.firstChild);else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.insertBefore(currentNode,K.firstChild);};currentNode=currentSibling;}};if (K) K=levelClone;};if (A==2){var L=this.startContainer;if (L.nodeType==3){L.data+=L.nextSibling.data;L.parentNode.removeChild(L.nextSibling);};var M=this.endContainer;if (M.nodeType==3&&M.nextSibling){M.data+=M.nextSibling.data;M.parentNode.removeChild(M.nextSibling);}}else{if (topStart&&topEnd&&(C.parentNode!=topStart.parentNode||D.parentNode!=topEnd.parentNode)){var N=FCKDomTools.GetIndexOf(topEnd);if (G&&topEnd.parentNode==C.parentNode) N--;this.setStart(topEnd.parentNode,N);};this.collapse(true);};if(G) C.parentNode.removeChild(C);if(H&&D.parentNode) D.parentNode.removeChild(D);},cloneRange:function(){return FCKW3CRange.CreateFromRange(this._Document,this);}}; +var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[9,'Tab'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);if (D>0){this.TabText='';while (D-->0) this.TabText+='\xa0';};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};var F=B.StartBlock;var G=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&F&&G){if (!C){var H=B.CheckEndOfBlock();B.DeleteContents();if (F!=G){B.SetStart(G,1);B.SetEnd(G,1);};B.Select();A=(F==G);};if (B.CheckStartOfBlock()){var I=B.StartBlock;var J=FCKDomTools.GetPreviousSourceElement(I,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,J,I);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i=0;i--) B(F[i]);var G=doc.getElementsByTagName('embed');for (var i=G.length-1;i>=0;i--) B(G[i]);});},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed')&&(A.type=='application/x-shockwave-flash'||/\.swf($|#|\?)/i.test(A.src)))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);}); +var FCKSelection=FCK.Selection={GetParentBlock:function(){var A=this.GetParentElement();while (A){if (FCKListsLib.BlockBoundaries[A.nodeName.toLowerCase()]) break;A=A.parentNode;};return A;},ApplyStyle:function(A){FCKStyles.ApplyStyle(new FCKStyle(A));}}; +FCKSelection.GetType=function(){var A='Text';var B;try { B=this.GetSelection();} catch (e) {};if (B&&B.rangeCount==1){var C=B.getRangeAt(0);if (C.startContainer==C.endContainer&&(C.endOffset-C.startOffset)==1&&C.startContainer.nodeType==1&&FCKListsLib.StyleObjectElements[C.startContainer.childNodes[C.startOffset].nodeName.toLowerCase()]){A='Control';}};return A;};FCKSelection.GetSelectedElement=function(){var A=!!FCK.EditorWindow&&this.GetSelection();if (!A||A.rangeCount<1) return null;var B=A.getRangeAt(0);if (B.startContainer!=B.endContainer||B.startContainer.nodeType!=1||B.startOffset!=B.endOffset-1) return null;var C=B.startContainer.childNodes[B.startOffset];if (C.nodeType!=1) return null;return C;};FCKSelection.GetParentElement=function(){if (this.GetType()=='Control') return FCKSelection.GetSelectedElement().parentNode;else{var A=this.GetSelection();if (A){if (A.anchorNode&&A.anchorNode==A.focusNode) return A.anchorNode.parentNode;var B=new FCKElementPath(A.anchorNode);var C=new FCKElementPath(A.focusNode);var D=null;var E=null;if (B.Elements.length>C.Elements.length){D=B.Elements;E=C.Elements;}else{D=C.Elements;E=B.Elements;};var F=D.length-E.length;for(var i=0;i0){var C=B.getRangeAt(A?0:(B.rangeCount-1));var D=A?C.startContainer:C.endContainer;return (D.nodeType==1?D:D.parentNode);}};return null;};FCKSelection.SelectNode=function(A){var B=FCK.EditorDocument.createRange();B.selectNode(A);var C=this.GetSelection();C.removeAllRanges();C.addRange(B);};FCKSelection.Collapse=function(A){var B=this.GetSelection();if (A==null||A===true) B.collapseToStart();else B.collapseToEnd();};FCKSelection.HasAncestorNode=function(A){var B=this.GetSelectedElement();if (!B&&FCK.EditorWindow){try { B=this.GetSelection().getRangeAt(0).startContainer;}catch(e){}};while (B){if (B.nodeType==1&&B.tagName==A) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B;var C=this.GetSelectedElement();if (!C) C=this.GetSelection().getRangeAt(0).startContainer;while (C){if (C.nodeName==A) return C;C=C.parentNode;};return null;};FCKSelection.Delete=function(){var A=this.GetSelection();for (var i=0;i=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(FCKTools.GetElementAscensor(A,'TR'));return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i=E.height){for (D=F;D0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCKTools.GetElementDocument(B).createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCKTools.GetElementDocument(D).createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCKTools.GetElementDocument(B).createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r1){B.rowSpan=Math.ceil(E/2);var G=F+Math.ceil(E/2);var H=null;for (var i=D+1;i0){var C=B.rows[0];C.parentNode.removeChild(C);};for (var i=0;iE) E=j;if (D._colScanned===true) continue;if (A[i][j-1]==D) D.colSpan++;if (A[i][j+1]!=D) D._colScanned=true;}};for (var i=0;i<=E;i++){for (var j=0;j ';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}}; +var FCKShowBlockCommand=function(A,B){this.Name=A;if (B!=undefined) this._SavedState=B;else this._SavedState=null;};FCKShowBlockCommand.prototype.Execute=function(){var A=this.GetState();if (A==-1) return;var B=FCK.EditorDocument.body;if (A==1) B.className=B.className.replace(/(^| )FCK__ShowBlocks/g,'');else B.className+=' FCK__ShowBlocks';FCK.Events.FireEvent('OnSelectionChange');};FCKShowBlockCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;if (!FCK.EditorDocument) return 0;if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;return 0;};FCKShowBlockCommand.prototype.SaveState=function(){this._SavedState=this.GetState();};FCKShowBlockCommand.prototype.RestoreState=function(){if (this._SavedState!=null&&this.GetState()!=this._SavedState) this.Execute();}; +var FCKSpellCheckCommand=function(){this.Name='SpellCheck';this.IsEnabled=(FCKConfig.SpellChecker=='SpellerPages');};FCKSpellCheckCommand.prototype.Execute=function(){FCKDialog.OpenDialog('FCKDialog_SpellCheck','Spell Check','dialog/fck_spellerpages.html',440,480);};FCKSpellCheckCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return this.IsEnabled?0:-1;}; +var FCKTextColorCommand=function(A){this.Name=A=='ForeColor'?'TextColor':'BGColor';this.Type=A;var B;if (FCKBrowserInfo.IsIE) B=window;else if (FCK.ToolbarSet._IFrame) B=FCKTools.GetElementWindow(FCK.ToolbarSet._IFrame);else B=window.parent;this._Panel=new FCKPanel(B);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._Panel.MainNode.className='FCK_Panel';this._CreatePanelBody(this._Panel.Document,this._Panel.MainNode);FCK.ToolbarSet.ToolbarItems.GetItem(this.Name).RegisterPanel(this._Panel);FCKTools.DisableSelection(this._Panel.Document.body);};FCKTextColorCommand.prototype.Execute=function(A,B,C){this._Panel.Show(A,B,C);};FCKTextColorCommand.prototype.SetColor=function(A){FCKUndo.SaveUndoStep();var B=FCKStyles.GetStyle('_FCK_'+(this.Type=='ForeColor'?'Color':'BackColor'));if (!A||A.length==0) FCK.Styles.RemoveStyle(B);else{B.SetVariable('Color',A);FCKStyles.ApplyStyle(B);};FCKUndo.SaveUndoStep();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');};FCKTextColorCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};function FCKTextColorCommand_OnMouseOver(){this.className='ColorSelected';};function FCKTextColorCommand_OnMouseOut(){this.className='ColorDeselected';};function FCKTextColorCommand_OnClick(A,B,C){this.className='ColorDeselected';B.SetColor(C);B._Panel.Hide();};function FCKTextColorCommand_AutoOnClick(A,B){this.className='ColorDeselected';B.SetColor('');B._Panel.Hide();};function FCKTextColorCommand_MoreOnClick(A,B){this.className='ColorDeselected';B._Panel.Hide();FCKDialog.OpenDialog('FCKDialog_Color',FCKLang.DlgColorTitle,'dialog/fck_colorselector.html',410,320,FCKTools.Bind(B,B.SetColor));};FCKTextColorCommand.prototype._CreatePanelBody=function(A,B){function CreateSelectionDiv(){var C=A.createElement("DIV");C.className='ColorDeselected';FCKTools.AddEventListenerEx(C,'mouseover',FCKTextColorCommand_OnMouseOver);FCKTools.AddEventListenerEx(C,'mouseout',FCKTextColorCommand_OnMouseOut);return C;};var D=B.appendChild(A.createElement("TABLE"));D.className='ForceBaseFont';D.style.tableLayout='fixed';D.cellPadding=0;D.cellSpacing=0;D.border=0;D.width=150;var E=D.insertRow(-1).insertCell(-1);E.colSpan=8;var C=E.appendChild(CreateSelectionDiv());C.innerHTML='\n \n \n \n \n
    '+FCKLang.ColorAutomatic+'
    ';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_AutoOnClick,this);if (!FCKBrowserInfo.IsIE) C.style.width='96%';var G=FCKConfig.FontColors.toString().split(',');var H=0;while (H
    ';if (H>=G.length) C.style.visibility='hidden';else FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_OnClick,[this,L]);}};if (FCKConfig.EnableMoreFontColors){E=D.insertRow(-1).insertCell(-1);E.colSpan=8;C=E.appendChild(CreateSelectionDiv());C.innerHTML='
    '+FCKLang.ColorMoreColors+'
    ';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_MoreOnClick,this);};if (!FCKBrowserInfo.IsIE) C.style.width='96%';}; +var FCKPastePlainTextCommand=function(){this.Name='PasteText';};FCKPastePlainTextCommand.prototype.Execute=function(){FCK.PasteAsPlainText();};FCKPastePlainTextCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}; +var FCKPasteWordCommand=function(){this.Name='PasteWord';};FCKPasteWordCommand.prototype.Execute=function(){FCK.PasteFromWord();};FCKPasteWordCommand.prototype.GetState=function(){if (FCK.EditMode!=0||FCKConfig.ForcePasteAsPlainText) return -1;else return FCK.GetNamedCommandState('Paste');}; +var FCKTableCommand=function(A){this.Name=A;};FCKTableCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (!FCKBrowserInfo.IsGecko){switch (this.Name){case 'TableMergeRight':return FCKTableHandler.MergeRight();case 'TableMergeDown':return FCKTableHandler.MergeDown();}};switch (this.Name){case 'TableInsertRowAfter':return FCKTableHandler.InsertRow(false);case 'TableInsertRowBefore':return FCKTableHandler.InsertRow(true);case 'TableDeleteRows':return FCKTableHandler.DeleteRows();case 'TableInsertColumnAfter':return FCKTableHandler.InsertColumn(false);case 'TableInsertColumnBefore':return FCKTableHandler.InsertColumn(true);case 'TableDeleteColumns':return FCKTableHandler.DeleteColumns();case 'TableInsertCellAfter':return FCKTableHandler.InsertCell(null,false);case 'TableInsertCellBefore':return FCKTableHandler.InsertCell(null,true);case 'TableDeleteCells':return FCKTableHandler.DeleteCells();case 'TableMergeCells':return FCKTableHandler.MergeCells();case 'TableHorizontalSplitCell':return FCKTableHandler.HorizontalSplitCell();case 'TableVerticalSplitCell':return FCKTableHandler.VerticalSplitCell();case 'TableDelete':return FCKTableHandler.DeleteTable();default:return alert(FCKLang.UnknownCommand.replace(/%1/g,this.Name));}};FCKTableCommand.prototype.GetState=function(){if (FCK.EditorDocument!=null&&FCKSelection.HasAncestorNode('TABLE')){switch (this.Name){case 'TableHorizontalSplitCell':case 'TableVerticalSplitCell':if (FCKTableHandler.GetSelectedCells().length==1) return 0;else return -1;case 'TableMergeCells':if (FCKTableHandler.CheckIsSelectionRectangular()&&FCKTableHandler.GetSelectedCells().length>1) return 0;else return -1;case 'TableMergeRight':return FCKTableHandler.GetMergeRightTarget()?0:-1;case 'TableMergeDown':return FCKTableHandler.GetMergeDownTarget()?0:-1;default:return 0;}}else return -1;}; +var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var H=FCKTools.GetViewPaneSize(C);B.position="absolute";B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=H.Width+"px";B.height=H.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var I=FCKTools.GetWindowPosition(C,A);if (I.x!=0) B.left=(-1*I.x)+"px";if (I.y!=0) B.top=(-1*I.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';}; +var FCKListCommand=function(A,B){this.Name=A;this.TagName=B;};FCKListCommand.prototype={GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=FCKSelection.GetBoundaryParentElement(true);var B=A;while (B){if (B.nodeName.IEquals(['ul','ol'])) break;B=B.parentNode;};if (B&&B.nodeName.IEquals(this.TagName)) return 1;else return 0;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCK.EditorDocument;var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=this.GetState();if (C==0){FCKDomTools.TrimNode(A.body);if (!A.body.firstChild){var D=A.createElement('p');A.body.appendChild(D);B.MoveToNodeContents(D);}};var E=B.CreateBookmark();var F=[];var G={};var H=new FCKDomRangeIterator(B);var I;H.ForceBrBreak=(C==0);var J=true;var K=null;while (J){while ((I=H.GetNextParagraph())){var L=new FCKElementPath(I);var M=null;var N=false;var O=L.BlockLimit;for (var i=L.Elements.length-1;i>=0;i--){var P=L.Elements[i];if (P.nodeName.IEquals(['ol','ul'])){if (O._FCK_ListGroupObject) O._FCK_ListGroupObject=null;var Q=P._FCK_ListGroupObject;if (Q) Q.contents.push(I);else{Q={ 'root':P,'contents':[I] };F.push(Q);FCKDomTools.SetElementMarker(G,P,'_FCK_ListGroupObject',Q);};N=true;break;}};if (N) continue;var R=O;if (R._FCK_ListGroupObject) R._FCK_ListGroupObject.contents.push(I);else{var Q={ 'root':R,'contents':[I] };FCKDomTools.SetElementMarker(G,R,'_FCK_ListGroupObject',Q);F.push(Q);}};if (FCKBrowserInfo.IsIE) J=false;else{if (K==null){K=[];var T=FCKSelection.GetSelection();if (T&&F.length==0) K.push(T.getRangeAt(0));for (var i=1;T&&i0){var Q=F.shift();if (C==0){if (Q.root.nodeName.IEquals(['ul','ol'])) this._ChangeListType(Q,G,W);else this._CreateList(Q,W);}else if (C==1&&Q.root.nodeName.IEquals(['ul','ol'])) this._RemoveList(Q,G);};for (var i=0;iC[i-1].indent+1){var H=C[i-1].indent+1-C[i].indent;var I=C[i].indent;while (C[i]&&C[i].indent>=I){C[i].indent+=H;i++;};i--;}};var J=FCKDomTools.ArrayToList(C,B);if (A.root.nextSibling==null||A.root.nextSibling.nodeName.IEquals('br')){if (J.listNode.lastChild.nodeName.IEquals('br')) J.listNode.removeChild(J.listNode.lastChild);};A.root.parentNode.replaceChild(J.listNode,A.root);}}; +var FCKJustifyCommand=function(A){this.AlignValue=A;var B=FCKConfig.ContentLangDirection.toLowerCase();this.IsDefaultAlign=(A=='left'&&B=='ltr')||(A=='right'&&B=='rtl');var C=this._CssClassName=(function(){var D=FCKConfig.JustifyClasses;if (D){switch (A){case 'left':return D[0]||null;case 'center':return D[1]||null;case 'right':return D[2]||null;case 'justify':return D[3]||null;}};return null;})();if (C&&C.length>0) this._CssClassRegex=new RegExp('(?:^|\\s+)'+C+'(?=$|\\s)');};FCKJustifyCommand._GetClassNameRegex=function(){var A=FCKJustifyCommand._ClassRegex;if (A!=undefined) return A;var B=[];var C=FCKConfig.JustifyClasses;if (C){for (var i=0;i<4;i++){var D=C[i];if (D&&D.length>0) B.push(D);}};if (B.length>0) A=new RegExp('(?:^|\\s+)(?:'+B.join('|')+')(?=$|\\s)');else A=null;return FCKJustifyCommand._ClassRegex=A;};FCKJustifyCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=this.GetState();if (B==-1) return;var C=A.CreateBookmark();var D=this._CssClassName;var E=new FCKDomRangeIterator(A);var F;while ((F=E.GetNextParagraph())){F.removeAttribute('align');if (D){var G=F.className.replace(FCKJustifyCommand._GetClassNameRegex(),'');if (B==0){if (G.length>0) G+=' ';F.className=G+D;}else if (G.length==0) FCKDomTools.RemoveAttribute(F,'class');}else{var H=F.style;if (B==0) H.textAlign=this.AlignValue;else{H.textAlign='';if (H.cssText.length==0) F.removeAttribute('style');}}};A.MoveToBookmark(C);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;var C;if (FCKBrowserInfo.IsIE) C=B.currentStyle.textAlign;else C=FCK.EditorWindow.getComputedStyle(B,'').getPropertyValue('text-align');C=C.replace(/(-moz-|-webkit-|start|auto)/i,'');if ((!C&&this.IsDefaultAlign)||C==this.AlignValue) return 1;return 0;}}; +var FCKIndentCommand=function(A,B){this.Name=A;this.Offset=B;this.IndentCSSProperty=FCKConfig.ContentLangDirection.IEquals('ltr')?'marginLeft':'marginRight';};FCKIndentCommand._InitIndentModeParameters=function(){if (FCKConfig.IndentClasses&&FCKConfig.IndentClasses.length>0){this._UseIndentClasses=true;this._IndentClassMap={};for (var i=0;i0?H+' ':'')+FCKConfig.IndentClasses[G-1];}else{var I=parseInt(E.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;I+=this.Offset;I=Math.max(I,0);I=Math.ceil(I/this.Offset)*this.Offset;E.style[this.IndentCSSProperty]=I?I+FCKConfig.IndentUnit:'';if (E.getAttribute('style')=='') E.removeAttribute('style');}}},_IndentList:function(A,B){var C=A.StartContainer;var D=A.EndContainer;while (C&&C.parentNode!=B) C=C.parentNode;while (D&&D.parentNode!=B) D=D.parentNode;if (!C||!D) return;var E=C;var F=[];var G=false;while (G==false){if (E==D) G=true;F.push(E);E=E.nextSibling;};if (F.length<1) return;var H=FCKDomTools.GetParents(B);for (var i=0;iN;i++) M[i].indent+=I;var O=FCKDomTools.ArrayToList(M);if (O) B.parentNode.replaceChild(O.listNode,B);FCKDomTools.ClearAllMarkers(L);}}; +var FCKBlockQuoteCommand=function(){};FCKBlockQuoteCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=this.GetState();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();if (FCKBrowserInfo.IsIE){var D=B.GetBookmarkNode(C,true);var E=B.GetBookmarkNode(C,false);var F;if (D&&D.parentNode.nodeName.IEquals('blockquote')&&!D.previousSibling){F=D;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]) FCKDomTools.MoveNode(D,F,true);}};if (E&&E.parentNode.nodeName.IEquals('blockquote')&&!E.previousSibling){F=E;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]){if (F.firstChild==D) FCKDomTools.InsertAfterNode(D,E);else FCKDomTools.MoveNode(E,F,true);}}}};var G=new FCKDomRangeIterator(B);var H;if (A==0){G.EnforceRealBlocks=true;var I=[];while ((H=G.GetNextParagraph())) I.push(H);if (I.length<1){para=B.Window.document.createElement(FCKConfig.EnterMode.IEquals('p')?'p':'div');B.InsertNode(para);para.appendChild(B.Window.document.createTextNode('\ufeff'));B.MoveToBookmark(C);B.MoveToNodeContents(para);B.Collapse(true);C=B.CreateBookmark();I.push(para);};var J=I[0].parentNode;var K=[];for (var i=0;i0){H=I.shift();while (H.parentNode!=J) H=H.parentNode;if (H!=L) K.push(H);L=H;};while (K.length>0){H=K.shift();if (H.nodeName.IEquals('blockquote')){var M=FCKTools.GetElementDocument(H).createDocumentFragment();while (H.firstChild){M.appendChild(H.removeChild(H.firstChild));I.push(M.lastChild);};H.parentNode.replaceChild(M,H);}else I.push(H);};var N=B.Window.document.createElement('blockquote');J.insertBefore(N,I[0]);while (I.length>0){H=I.shift();N.appendChild(H);}}else if (A==1){var O=[];while ((H=G.GetNextParagraph())){var P=null;var Q=null;while (H.parentNode){if (H.parentNode.nodeName.IEquals('blockquote')){P=H.parentNode;Q=H;break;};H=H.parentNode;};if (P&&Q) O.push(Q);};var R=[];while (O.length>0){var S=O.shift();var N=S.parentNode;if (S==S.parentNode.firstChild){N.parentNode.insertBefore(N.removeChild(S),N);if (!N.firstChild) N.parentNode.removeChild(N);}else if (S==S.parentNode.lastChild){N.parentNode.insertBefore(N.removeChild(S),N.nextSibling);if (!N.firstChild) N.parentNode.removeChild(N);}else FCKDomTools.BreakParent(S,S.parentNode,B);R.push(S);};if (FCKConfig.EnterMode.IEquals('br')){while (R.length){var S=R.shift();var W=true;if (S.nodeName.IEquals('div')){var M=FCKTools.GetElementDocument(S).createDocumentFragment();var Y=W&&S.previousSibling&&!FCKListsLib.BlockBoundaries[S.previousSibling.nodeName.toLowerCase()];if (W&&Y) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));var Z=S.nextSibling&&!FCKListsLib.BlockBoundaries[S.nextSibling.nodeName.toLowerCase()];while (S.firstChild) M.appendChild(S.removeChild(S.firstChild));if (Z) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));S.parentNode.replaceChild(M,S);W=false;}}}};B.MoveToBookmark(C);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;for (var i=0;i';B.open();B.write(''+F+'<\/head><\/body><\/html>');B.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.Panel_Contructor(B,window.document.location);FCKTools.AddEventListenerEx(E,'focus',FCKPanel_Window_OnFocus,this);FCKTools.AddEventListenerEx(E,'blur',FCKPanel_Window_OnBlur,this);};B.dir=FCKLang.Dir;FCKTools.AddEventListener(B,'contextmenu',FCKTools.CancelEvent);this.MainNode=B.body.appendChild(B.createElement('DIV'));this.MainNode.style.cssFloat=this.IsRTL?'right':'left';};FCKPanel.prototype.AppendStyleSheet=function(A){FCKTools.AppendStyleSheet(this.Document,A);};FCKPanel.prototype.Preload=function(x,y,A){if (this._Popup) this._Popup.show(x,y,0,0,A);};FCKPanel.prototype.Show=function(x,y,A,B,C){var D;var E=this.MainNode;if (this._Popup){this._Popup.show(x,y,0,0,A);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=(x*-1)+A.offsetWidth-D;};this._Popup.show(x,y,D,E.offsetHeight,A);if (this.OnHide){if (this._Timer) CheckPopupOnHide.call(this,true);this._Timer=FCKTools.SetInterval(CheckPopupOnHide,100,this);}}else{if (typeof(FCK.ToolbarSet.CurrentInstance.FocusManager)!='undefined') FCK.ToolbarSet.CurrentInstance.FocusManager.Lock();if (this.ParentPanel){this.ParentPanel.Lock();FCKPanel_Window_OnBlur(null,this.ParentPanel);};if (FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac){this._IFrame.scrolling='';FCKTools.RunFunction(function(){ this._IFrame.scrolling='no';},this);};if (FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel&&FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel!=this) FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel.Hide(false,true);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (!B) this._IFrame.width=1;if (!C) this._IFrame.height=1;D=E.offsetWidth||E.firstChild.offsetWidth;var F=FCKTools.GetDocumentPosition(this._Window,A.nodeType==9?(FCKTools.IsStrictMode(A)?A.documentElement:A.body):A);var G=FCKDomTools.GetPositionedAncestor(this._IFrame.parentNode);if (G){var H=FCKTools.GetDocumentPosition(FCKTools.GetElementWindow(G),G);F.x-=H.x;F.y-=H.y;};if (this.IsRTL&&!this.IsContextMenu) x=(x*-1);x+=F.x;y+=F.y;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=x+A.offsetWidth-D;}else{var I=FCKTools.GetViewPaneSize(this._Window);var J=FCKTools.GetScrollPosition(this._Window);var K=I.Height+J.Y;var L=I.Width+J.X;if ((x+D)>L) x-=x+D-L;if ((y+E.offsetHeight)>K) y-=y+E.offsetHeight-K;};FCKDomTools.SetElementStyles(this._IFrame,{left:x+'px',top:y+'px'});this._IFrame.contentWindow.focus();this._IsOpened=true;var M=this;this._resizeTimer=setTimeout(function(){var N=E.offsetWidth||E.firstChild.offsetWidth;var O=E.offsetHeight;M._IFrame.width=N;M._IFrame.height=O;},0);FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel=this;};FCKTools.RunFunction(this.OnShow,this);};FCKPanel.prototype.Hide=function(A,B){if (this._Popup) this._Popup.hide();else{if (!this._IsOpened||this._LockCounter>0) return;if (typeof(FCKFocusManager)!='undefined'&&!B) FCKFocusManager.Unlock();this._IFrame.width=this._IFrame.height=0;this._IsOpened=false;if (this._resizeTimer){clearTimeout(this._resizeTimer);this._resizeTimer=null;};if (this.ParentPanel) this.ParentPanel.Unlock();if (!A) FCKTools.RunFunction(this.OnHide,this);}};FCKPanel.prototype.CheckIsOpened=function(){if (this._Popup) return this._Popup.isOpen;else return this._IsOpened;};FCKPanel.prototype.CreateChildPanel=function(){var A=this._Popup?FCKTools.GetDocumentWindow(this.Document):this._Window;var B=new FCKPanel(A);B.ParentPanel=this;return B;};FCKPanel.prototype.Lock=function(){this._LockCounter++;};FCKPanel.prototype.Unlock=function(){if (--this._LockCounter==0&&!this.HasFocus) this.Hide();};function FCKPanel_Window_OnFocus(e,A){A.HasFocus=true;};function FCKPanel_Window_OnBlur(e,A){A.HasFocus=false;if (A._LockCounter==0) FCKTools.RunFunction(A.Hide,A);};function CheckPopupOnHide(A){if (A||!this._Popup.isOpen){window.clearInterval(this._Timer);this._Timer=null;FCKTools.RunFunction(this.OnHide,this);}};function FCKPanel_Cleanup(){this._Popup=null;this._Window=null;this.Document=null;this.MainNode=null;}; +var FCKIcon=function(A){var B=A?typeof(A):'undefined';switch (B){case 'number':this.Path=FCKConfig.SkinPath+'fck_strip.gif';this.Size=16;this.Position=A;break;case 'undefined':this.Path=FCK_SPACER_PATH;break;case 'string':this.Path=A;break;default:this.Path=A[0];this.Size=A[1];this.Position=A[2];}};FCKIcon.prototype.CreateIconElement=function(A){var B,eIconImage;if (this.Position){var C='-'+((this.Position-1)*this.Size)+'px';if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path;eIconImage.style.top=C;}else{B=A.createElement('IMG');B.src=FCK_SPACER_PATH;B.style.backgroundPosition='0px '+C;B.style.backgroundImage='url("'+this.Path+'")';}}else{if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path?this.Path:FCK_SPACER_PATH;}else{B=A.createElement('IMG');B.src=this.Path?this.Path:FCK_SPACER_PATH;}};B.className='TB_Button_Image';return B;}; +var FCKToolbarButtonUI=function(A,B,C,D,E,F){this.Name=A;this.Label=B||A;this.Tooltip=C||this.Label;this.Style=E||0;this.State=F||0;this.Icon=new FCKIcon(D);if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarButtonUI_Cleanup);};FCKToolbarButtonUI.prototype._CreatePaddingElement=function(A){var B=A.createElement('IMG');B.className='TB_Button_Padding';B.src=FCK_SPACER_PATH;return B;};FCKToolbarButtonUI.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this.MainElement=B.createElement('DIV');C.title=this.Tooltip;if (FCKBrowserInfo.IsGecko) C.onmousedown=FCKTools.CancelEvent;FCKTools.AddEventListenerEx(C,'mouseover',FCKToolbarButtonUI_OnMouseOver,this);FCKTools.AddEventListenerEx(C,'mouseout',FCKToolbarButtonUI_OnMouseOut,this);FCKTools.AddEventListenerEx(C,'click',FCKToolbarButtonUI_OnClick,this);this.ChangeState(this.State,true);if (this.Style==0&&!this.ShowArrow){C.appendChild(this.Icon.CreateIconElement(B));}else{var D=C.appendChild(B.createElement('TABLE'));D.cellPadding=0;D.cellSpacing=0;var E=D.insertRow(-1);var F=E.insertCell(-1);if (this.Style==0||this.Style==2) F.appendChild(this.Icon.CreateIconElement(B));else F.appendChild(this._CreatePaddingElement(B));if (this.Style==1||this.Style==2){F=E.insertCell(-1);F.className='TB_Button_Text';F.noWrap=true;F.appendChild(B.createTextNode(this.Label));};if (this.ShowArrow){if (this.Style!=0){E.insertCell(-1).appendChild(this._CreatePaddingElement(B));};F=E.insertCell(-1);var G=F.appendChild(B.createElement('IMG'));G.src=FCKConfig.SkinPath+'images/toolbar.buttonarrow.gif';G.width=5;G.height=3;};F=E.insertCell(-1);F.appendChild(this._CreatePaddingElement(B));};A.appendChild(C);};FCKToolbarButtonUI.prototype.ChangeState=function(A,B){if (!B&&this.State==A) return;var e=this.MainElement;if (!e) return;switch (parseInt(A,10)){case 0:e.className='TB_Button_Off';break;case 1:e.className='TB_Button_On';break;case -1:e.className='TB_Button_Disabled';break;};this.State=A;};function FCKToolbarButtonUI_OnMouseOver(A,B){if (B.State==0) this.className='TB_Button_Off_Over';else if (B.State==1) this.className='TB_Button_On_Over';};function FCKToolbarButtonUI_OnMouseOut(A,B){if (B.State==0) this.className='TB_Button_Off';else if (B.State==1) this.className='TB_Button_On';};function FCKToolbarButtonUI_OnClick(A,B){if (B.OnClick&&B.State!=-1) B.OnClick(B);};function FCKToolbarButtonUI_Cleanup(){this.MainElement=null;}; +var FCKToolbarButton=function(A,B,C,D,E,F,G){this.CommandName=A;this.Label=B;this.Tooltip=C;this.Style=D;this.SourceView=E?true:false;this.ContextSensitive=F?true:false;if (G==null) this.IconPath=FCKConfig.SkinPath+'toolbar/'+A.toLowerCase()+'.gif';else if (typeof(G)=='number') this.IconPath=[FCKConfig.SkinPath+'fck_strip.gif',16,G];else this.IconPath=G;};FCKToolbarButton.prototype.Create=function(A){this._UIButton=new FCKToolbarButtonUI(this.CommandName,this.Label,this.Tooltip,this.IconPath,this.Style);this._UIButton.OnClick=this.Click;this._UIButton._ToolbarButton=this;this._UIButton.Create(A);};FCKToolbarButton.prototype.RefreshState=function(){var A=this._UIButton;if (!A) return;var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();if (B==A.State) return;A.ChangeState(B);};FCKToolbarButton.prototype.Click=function(){var A=this._ToolbarButton||this;FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(A.CommandName).Execute();};FCKToolbarButton.prototype.Enable=function(){this.RefreshState();};FCKToolbarButton.prototype.Disable=function(){this._UIButton.ChangeState(-1);}; +var FCKSpecialCombo=function(A,B,C,D,E){this.FieldWidth=B||100;this.PanelWidth=C||150;this.PanelMaxHeight=D||150;this.Label=' ';this.Caption=A;this.Tooltip=A;this.Style=2;this.Enabled=true;this.Items={};this._Panel=new FCKPanel(E||window);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._PanelBox=this._Panel.MainNode.appendChild(this._Panel.Document.createElement('DIV'));this._PanelBox.className='SC_Panel';this._PanelBox.style.width=this.PanelWidth+'px';this._PanelBox.innerHTML='
    ';this._ItemsHolderEl=this._PanelBox.getElementsByTagName('TD')[0];if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKSpecialCombo_Cleanup);};function FCKSpecialCombo_ItemOnMouseOver(){this.className+=' SC_ItemOver';};function FCKSpecialCombo_ItemOnMouseOut(){this.className=this.originalClass;};function FCKSpecialCombo_ItemOnClick(A,B,C){this.className=this.originalClass;B._Panel.Hide();B.SetLabel(this.FCKItemLabel);if (typeof(B.OnSelect)=='function') B.OnSelect(C,this);};FCKSpecialCombo.prototype.ClearItems=function (){if (this.Items) this.Items={};var A=this._ItemsHolderEl;while (A.firstChild) A.removeChild(A.firstChild);};FCKSpecialCombo.prototype.AddItem=function(A,B,C,D){var E=this._ItemsHolderEl.appendChild(this._Panel.Document.createElement('DIV'));E.className=E.originalClass='SC_Item';E.innerHTML=B;E.FCKItemLabel=C||A;E.Selected=false;if (FCKBrowserInfo.IsIE) E.style.width='100%';if (D) E.style.backgroundColor=D;FCKTools.AddEventListenerEx(E,'mouseover',FCKSpecialCombo_ItemOnMouseOver);FCKTools.AddEventListenerEx(E,'mouseout',FCKSpecialCombo_ItemOnMouseOut);FCKTools.AddEventListenerEx(E,'click',FCKSpecialCombo_ItemOnClick,[this,A]);this.Items[A.toString().toLowerCase()]=E;return E;};FCKSpecialCombo.prototype.SelectItem=function(A){if (typeof A=='string') A=this.Items[A.toString().toLowerCase()];if (A){A.className=A.originalClass='SC_ItemSelected';A.Selected=true;}};FCKSpecialCombo.prototype.SelectItemByLabel=function(A,B){for (var C in this.Items){var D=this.Items[C];if (D.FCKItemLabel==A){D.className=D.originalClass='SC_ItemSelected';D.Selected=true;if (B) this.SetLabel(A);}}};FCKSpecialCombo.prototype.DeselectAll=function(A){for (var i in this.Items){if (!this.Items[i]) continue;this.Items[i].className=this.Items[i].originalClass='SC_Item';this.Items[i].Selected=false;};if (A) this.SetLabel('');};FCKSpecialCombo.prototype.SetLabelById=function(A){A=A?A.toString().toLowerCase():'';var B=this.Items[A];this.SetLabel(B?B.FCKItemLabel:'');};FCKSpecialCombo.prototype.SetLabel=function(A){A=(!A||A.length==0)?' ':A;if (A==this.Label) return;this.Label=A;var B=this._LabelEl;if (B){B.innerHTML=A;FCKTools.DisableSelection(B);}};FCKSpecialCombo.prototype.SetEnabled=function(A){this.Enabled=A;if (this._OuterTable) this._OuterTable.className=A?'':'SC_FieldDisabled';};FCKSpecialCombo.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this._OuterTable=A.appendChild(B.createElement('TABLE'));C.cellPadding=0;C.cellSpacing=0;C.insertRow(-1);var D;var E;switch (this.Style){case 0:D='TB_ButtonType_Icon';E=false;break;case 1:D='TB_ButtonType_Text';E=false;break;case 2:E=true;break;};if (this.Caption&&this.Caption.length>0&&E){var F=C.rows[0].insertCell(-1);F.innerHTML=this.Caption;F.className='SC_FieldCaption';};var G=FCKTools.AppendElement(C.rows[0].insertCell(-1),'div');if (E){G.className='SC_Field';G.style.width=this.FieldWidth+'px';G.innerHTML='
     
    ';this._LabelEl=G.getElementsByTagName('label')[0];this._LabelEl.innerHTML=this.Label;}else{G.className='TB_Button_Off';G.innerHTML='
    '+this.Caption+'
    ';};FCKTools.AddEventListenerEx(G,'mouseover',FCKSpecialCombo_OnMouseOver,this);FCKTools.AddEventListenerEx(G,'mouseout',FCKSpecialCombo_OnMouseOut,this);FCKTools.AddEventListenerEx(G,'click',FCKSpecialCombo_OnClick,this);FCKTools.DisableSelection(this._Panel.Document.body);};function FCKSpecialCombo_Cleanup(){this._LabelEl=null;this._OuterTable=null;this._ItemsHolderEl=null;this._PanelBox=null;if (this.Items){for (var A in this.Items) this.Items[A]=null;}};function FCKSpecialCombo_OnMouseOver(A,B){if (B.Enabled){switch (B.Style){case 0:this.className='TB_Button_On_Over';break;case 1:this.className='TB_Button_On_Over';break;case 2:this.className='SC_Field SC_FieldOver';break;}}};function FCKSpecialCombo_OnMouseOut(A,B){switch (B.Style){case 0:this.className='TB_Button_Off';break;case 1:this.className='TB_Button_Off';break;case 2:this.className='SC_Field';break;}};function FCKSpecialCombo_OnClick(e,A){if (A.Enabled){var B=A._Panel;var C=A._PanelBox;var D=A._ItemsHolderEl;var E=A.PanelMaxHeight;if (A.OnBeforeClick) A.OnBeforeClick(A);if (FCKBrowserInfo.IsIE) B.Preload(0,this.offsetHeight,this);if (D.offsetHeight>E) C.style.height=E+'px';else C.style.height='';B.Show(0,this.offsetHeight,this);}}; +var FCKToolbarSpecialCombo=function(){this.SourceView=false;this.ContextSensitive=true;this.FieldWidth=null;this.PanelWidth=null;this.PanelMaxHeight=null;};FCKToolbarSpecialCombo.prototype.DefaultLabel='';function FCKToolbarSpecialCombo_OnSelect(A,B){FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).Execute(A,B);};FCKToolbarSpecialCombo.prototype.Create=function(A){this._Combo=new FCKSpecialCombo(this.GetLabel(),this.FieldWidth,this.PanelWidth,this.PanelMaxHeight,FCKBrowserInfo.IsIE?window:FCKTools.GetElementWindow(A).parent);this._Combo.Tooltip=this.Tooltip;this._Combo.Style=this.Style;this.CreateItems(this._Combo);this._Combo.Create(A);this._Combo.CommandName=this.CommandName;this._Combo.OnSelect=FCKToolbarSpecialCombo_OnSelect;};function FCKToolbarSpecialCombo_RefreshActiveItems(A,B){A.DeselectAll();A.SelectItem(B);A.SetLabelById(B);};FCKToolbarSpecialCombo.prototype.RefreshState=function(){var A;var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();if (B!=-1){A=1;if (this.RefreshActiveItems) this.RefreshActiveItems(this._Combo,B);else{if (this._LastValue!==B){this._LastValue=B;if (!B||B.length==0){this._Combo.DeselectAll();this._Combo.SetLabel(this.DefaultLabel);}else FCKToolbarSpecialCombo_RefreshActiveItems(this._Combo,B);}}}else A=-1;if (A==this.State) return;if (A==-1){this._Combo.DeselectAll();this._Combo.SetLabel('');};this.State=A;this._Combo.SetEnabled(A!=-1);};FCKToolbarSpecialCombo.prototype.Enable=function(){this.RefreshState();};FCKToolbarSpecialCombo.prototype.Disable=function(){this.State=-1;this._Combo.DeselectAll();this._Combo.SetLabel('');this._Combo.SetEnabled(false);}; +var FCKToolbarStyleCombo=function(A,B){if (A===false) return;this.CommandName='Style';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultStyleLabel||'';};FCKToolbarStyleCombo.prototype=new FCKToolbarSpecialCombo;FCKToolbarStyleCombo.prototype.GetLabel=function(){return FCKLang.Style;};FCKToolbarStyleCombo.prototype.GetStyles=function(){var A={};var B=FCK.ToolbarSet.CurrentInstance.Styles.GetStyles();for (var C in B){var D=B[C];if (!D.IsCore) A[C]=D;};return A;};FCKToolbarStyleCombo.prototype.CreateItems=function(A){var B=A._Panel.Document;FCKTools.AppendStyleSheet(B,FCKConfig.ToolbarComboPreviewCSS);FCKTools.AppendStyleString(B,FCKConfig.EditorAreaStyles);B.body.className+=' ForceBaseFont';FCKConfig.ApplyBodyAttributes(B.body);var C=this.GetStyles();for (var D in C){var E=C[D];var F=E.GetType()==2?D:FCKToolbarStyleCombo_BuildPreview(E,E.Label||D);var G=A.AddItem(D,F);G.Style=E;};A.OnBeforeClick=this.StyleCombo_OnBeforeClick;};FCKToolbarStyleCombo.prototype.RefreshActiveItems=function(A){var B=FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement(true);if (B){var C=new FCKElementPath(B);var D=C.Elements;for (var e=0;e');var E=A.Element;if (E=='bdo') E='span';D=['<',E];var F=A._StyleDesc.Attributes;if (F){for (var G in F){D.push(' ',G,'="',A.GetFinalAttributeValue(G),'"');}};if (A._GetStyleText().length>0) D.push(' style="',A.GetFinalStyleValue(),'"');D.push('>',B,'');if (C==0) D.push('');return D.join('');}; +var FCKToolbarFontFormatCombo=function(A,B){if (A===false) return;this.CommandName='FontFormat';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.NormalLabel='Normal';this.PanelWidth=190;this.DefaultLabel=FCKConfig.DefaultFontFormatLabel||'';};FCKToolbarFontFormatCombo.prototype=new FCKToolbarStyleCombo(false);FCKToolbarFontFormatCombo.prototype.GetLabel=function(){return FCKLang.FontFormat;};FCKToolbarFontFormatCombo.prototype.GetStyles=function(){var A={};var B=FCKLang['FontFormats'].split(';');var C={p:B[0],pre:B[1],address:B[2],h1:B[3],h2:B[4],h3:B[5],h4:B[6],h5:B[7],h6:B[8],div:B[9]||(B[0]+' (DIV)')};var D=FCKConfig.FontFormats.split(';');for (var i=0;i';G.open();G.write(''+H+''+document.getElementById('xToolbarSpace').innerHTML+'');G.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_InitOutFrame(G);FCKTools.AddEventListener(G,'contextmenu',FCKTools.CancelEvent);FCKTools.AppendStyleSheet(G,FCKConfig.SkinEditorCSS);B=D.__FCKToolbarSet=new FCKToolbarSet(G);B._IFrame=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(D,FCKToolbarSet_Target_Cleanup);};B.CurrentInstance=FCK;if (!B.ToolbarItems) B.ToolbarItems=FCKToolbarItems;FCK.AttachToOnSelectionChange(B.RefreshItemsState);return B;};function FCK_OnBlur(A){var B=A.ToolbarSet;if (B.CurrentInstance==A) B.Disable();};function FCK_OnFocus(A){var B=A.ToolbarSet;var C=A||FCK;B.CurrentInstance.FocusManager.RemoveWindow(B._IFrame.contentWindow);B.CurrentInstance=C;C.FocusManager.AddWindow(B._IFrame.contentWindow,true);B.Enable();};function FCKToolbarSet_Cleanup(){this._TargetElement=null;this._IFrame=null;};function FCKToolbarSet_Target_Cleanup(){this.__FCKToolbarSet=null;};var FCKToolbarSet=function(A){this._Document=A;this._TargetElement=A.getElementById('xToolbar');var B=A.getElementById('xExpandHandle');var C=A.getElementById('xCollapseHandle');B.title=FCKLang.ToolbarExpand;FCKTools.AddEventListener(B,'click',FCKToolbarSet_Expand_OnClick);C.title=FCKLang.ToolbarCollapse;FCKTools.AddEventListener(C,'click',FCKToolbarSet_Collapse_OnClick);if (!FCKConfig.ToolbarCanCollapse||FCKConfig.ToolbarStartExpanded) this.Expand();else this.Collapse();C.style.display=FCKConfig.ToolbarCanCollapse?'':'none';if (FCKConfig.ToolbarCanCollapse) C.style.display='';else A.getElementById('xTBLeftBorder').style.display='';this.Toolbars=[];this.IsLoaded=false;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarSet_Cleanup);};function FCKToolbarSet_Expand_OnClick(){FCK.ToolbarSet.Expand();};function FCKToolbarSet_Collapse_OnClick(){FCK.ToolbarSet.Collapse();};FCKToolbarSet.prototype.Expand=function(){this._ChangeVisibility(false);};FCKToolbarSet.prototype.Collapse=function(){this._ChangeVisibility(true);};FCKToolbarSet.prototype._ChangeVisibility=function(A){this._Document.getElementById('xCollapsed').style.display=A?'':'none';this._Document.getElementById('xExpanded').style.display=A?'none':'';if (FCKBrowserInfo.IsGecko){FCKTools.RunFunction(window.onresize);}};FCKToolbarSet.prototype.Load=function(A){this.Name=A;this.Items=[];this.ItemsWysiwygOnly=[];this.ItemsContextSensitive=[];this._TargetElement.innerHTML='';var B=FCKConfig.ToolbarSets[A];if (!B){alert(FCKLang.UnknownToolbarSet.replace(/%1/g,A));return;};this.Toolbars=[];for (var x=0;x0) break;}catch (e){break;};D=D.parent;};var E=D.document;var F=function(){if (!B) B=FCKConfig.FloatingPanelsZIndex+999;return++B;};var G=function(){if (!C) return;var H=FCKTools.IsStrictMode(E)?E.documentElement:E.body;FCKDomTools.SetElementStyles(C,{'width':Math.max(H.scrollWidth,H.clientWidth,E.scrollWidth||0)-1+'px','height':Math.max(H.scrollHeight,H.clientHeight,E.scrollHeight||0)-1+'px'});};var I=function(element){element.style.cssText='margin:0;padding:0;border:0;background-color:transparent;background-image:none;';};return {OpenDialog:function(dialogName,dialogTitle,dialogPage,width,height,customValue,parentWindow,resizable){if (!A) this.DisplayMainCover();var J={Title:dialogTitle,Page:dialogPage,Editor:window,CustomValue:customValue,TopWindow:D};FCK.ToolbarSet.CurrentInstance.Selection.Save();var K=FCKTools.GetViewPaneSize(D);var L=FCKTools.GetScrollPosition(D);var M=Math.max(L.Y+(K.Height-height-20)/2,0);var N=Math.max(L.X+(K.Width-width-20)/2,0);var O=E.createElement('iframe');I(O);O.src=FCKConfig.EDPath+'editor/fckdialog.html';O.frameBorder=0;O.allowTransparency=true;FCKDomTools.SetElementStyles(O,{'position':'absolute','top':M+'px','left':N+'px','width':width+'px','height':height+'px','zIndex':F()});O._DialogArguments=J;E.body.appendChild(O);O._ParentDialog=A;A=O;},OnDialogClose:function(dialogWindow){var O=dialogWindow.frameElement;FCKDomTools.RemoveNode(O);if (O._ParentDialog){A=O._ParentDialog;O._ParentDialog.contentWindow.SetEnabled(true);}else{if (!FCKBrowserInfo.IsIE) FCK.Focus();this.HideMainCover();setTimeout(function(){ A=null;},0);FCK.ToolbarSet.CurrentInstance.Selection.Release();}},DisplayMainCover:function(){C=E.createElement('div');I(C);FCKDomTools.SetElementStyles(C,{'position':'absolute','zIndex':F(),'top':'0px','left':'0px','backgroundColor':FCKConfig.BackgroundBlockerColor});FCKDomTools.SetOpacity(C,FCKConfig.BackgroundBlockerOpacity);if (FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsIE7){var Q=E.createElement('iframe');I(Q);Q.hideFocus=true;Q.frameBorder=0;Q.src=FCKTools.GetVoidUrl();FCKDomTools.SetElementStyles(Q,{'width':'100%','height':'100%','position':'absolute','left':'0px','top':'0px','filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'});C.appendChild(Q);};FCKTools.AddEventListener(D,'resize',G);G();E.body.appendChild(C);FCKFocusManager.Lock();},HideMainCover:function(){FCKDomTools.RemoveNode(C);FCKFocusManager.Unlock();},GetCover:function(){return C;}};})(); +var FCKMenuItem=function(A,B,C,D,E,F){this.Name=B;this.Label=C||B;this.IsDisabled=E;this.Icon=new FCKIcon(D);this.SubMenu=new FCKMenuBlockPanel();this.SubMenu.Parent=A;this.SubMenu.OnClick=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnClick,this);this.CustomData=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuItem_Cleanup);};FCKMenuItem.prototype.AddItem=function(A,B,C,D,E){this.HasSubMenu=true;return this.SubMenu.AddItem(A,B,C,D,E);};FCKMenuItem.prototype.AddSeparator=function(){this.SubMenu.AddSeparator();};FCKMenuItem.prototype.Create=function(A){var B=this.HasSubMenu;var C=FCKTools.GetElementDocument(A);var r=this.MainElement=A.insertRow(-1);r.className=this.IsDisabled?'MN_Item_Disabled':'MN_Item';if (!this.IsDisabled){FCKTools.AddEventListenerEx(r,'mouseover',FCKMenuItem_OnMouseOver,[this]);FCKTools.AddEventListenerEx(r,'click',FCKMenuItem_OnClick,[this]);if (!B) FCKTools.AddEventListenerEx(r,'mouseout',FCKMenuItem_OnMouseOut,[this]);};var D=r.insertCell(-1);D.className='MN_Icon';D.appendChild(this.Icon.CreateIconElement(C));D=r.insertCell(-1);D.className='MN_Label';D.noWrap=true;D.appendChild(C.createTextNode(this.Label));D=r.insertCell(-1);if (B){D.className='MN_Arrow';var E=D.appendChild(C.createElement('IMG'));E.src=FCK_IMAGES_PATH+'arrow_'+FCKLang.Dir+'.gif';E.width=4;E.height=7;this.SubMenu.Create();this.SubMenu.Panel.OnHide=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnHide,this);}};FCKMenuItem.prototype.Activate=function(){this.MainElement.className='MN_Item_Over';if (this.HasSubMenu){this.SubMenu.Show(this.MainElement.offsetWidth+2,-2,this.MainElement);};FCKTools.RunFunction(this.OnActivate,this);};FCKMenuItem.prototype.Deactivate=function(){this.MainElement.className='MN_Item';if (this.HasSubMenu) this.SubMenu.Hide();};function FCKMenuItem_SubMenu_OnClick(A,B){FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuItem_SubMenu_OnHide(A){A.Deactivate();};function FCKMenuItem_OnClick(A,B){if (B.HasSubMenu) B.Activate();else{B.Deactivate();FCKTools.RunFunction(B.OnClick,B,[B]);}};function FCKMenuItem_OnMouseOver(A,B){B.Activate();};function FCKMenuItem_OnMouseOut(A,B){B.Deactivate();};function FCKMenuItem_Cleanup(){this.MainElement=null;}; +var FCKMenuBlock=function(){this._Items=[];};FCKMenuBlock.prototype.Count=function(){return this._Items.length;};FCKMenuBlock.prototype.AddItem=function(A,B,C,D,E){var F=new FCKMenuItem(this,A,B,C,D,E);F.OnClick=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnClick,this);F.OnActivate=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnActivate,this);this._Items.push(F);return F;};FCKMenuBlock.prototype.AddSeparator=function(){this._Items.push(new FCKMenuSeparator());};FCKMenuBlock.prototype.RemoveAllItems=function(){this._Items=[];var A=this._ItemsTable;if (A){while (A.rows.length>0) A.deleteRow(0);}};FCKMenuBlock.prototype.Create=function(A){if (!this._ItemsTable){if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuBlock_Cleanup);this._Window=FCKTools.GetElementWindow(A);var B=FCKTools.GetElementDocument(A);var C=A.appendChild(B.createElement('table'));C.cellPadding=0;C.cellSpacing=0;FCKTools.DisableSelection(C);var D=C.insertRow(-1).insertCell(-1);D.className='MN_Menu';var E=this._ItemsTable=D.appendChild(B.createElement('table'));E.cellPadding=0;E.cellSpacing=0;};for (var i=0;i0&&F.href.length==0);if (G) return;menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}}; +var FCKPlugin=function(A,B,C){this.Name=A;this.BasePath=C?C:FCKConfig.PluginsPath;this.Path=this.BasePath+A+'/';if (!B||B.length==0) this.AvailableLangs=[];else this.AvailableLangs=B.split(',');};FCKPlugin.prototype.Load=function(){if (this.AvailableLangs.length>0){var A;if (this.AvailableLangs.IndexOf(FCKLanguageManager.ActiveLanguage.Code)>=0) A=FCKLanguageManager.ActiveLanguage.Code;else A=this.AvailableLangs[0];LoadScript(this.Path+'lang/'+A+'.js');};LoadScript(this.Path+'fckextend.js');}; +var FCKPlugins=FCK.Plugins={};FCKPlugins.ItemsCount=0;FCKPlugins.Items={};FCKPlugins.Load=function(){var A=FCKPlugins.Items;for (var i=0;i-1);};String.prototype.Equals=function(){var A=arguments;if (A.length==1&&A[0].pop) A=A[0];for (var i=0;iC) return false;if (B){var E=new RegExp(A+'$','i');return E.test(this);}else return (D==0||this.substr(C-D,D)==A);};String.prototype.Remove=function(A,B){var s='';if (A>0) s=this.substring(0,A);if (A+B0){var B=A.pop();if (B) B[1].call(B[0]);};this._FCKCleanupObj=null;if (CollectGarbage) CollectGarbage();}; +var s=navigator.userAgent.toLowerCase();var FCKBrowserInfo={IsIE:/*@cc_on!@*/false,IsIE7:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=7),IsIE6:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=6),IsGecko:s.Contains('gecko/'),IsSafari:s.Contains(' applewebkit/'),IsOpera:!!window.opera,IsAIR:s.Contains(' adobeair/'),IsMac:s.Contains('macintosh')};(function(A){A.IsGeckoLike=(A.IsGecko||A.IsSafari||A.IsOpera);if (A.IsGecko){var B=s.match(/gecko\/(\d+)/)[1];A.IsGecko10=((B<20051111)||(/rv:1\.7/.test(s)));A.IsGecko19=/rv:1\.9/.test(s);}else A.IsGecko10=false;})(FCKBrowserInfo); +var FCKURLParams={};(function(){var A=document.location.search.substr(1).split('&');for (var i=0;i';if (!FCKRegexLib.HtmlOpener.test(A)) A=''+A+'';if (!FCKRegexLib.HeadOpener.test(A)) A=A.replace(FCKRegexLib.HtmlOpener,'$&');return A;}else{var B=FCKConfig.DocType+'0&&!FCKRegexLib.Html4DocType.test(FCKConfig.DocType)) B+=' style="overflow-y: scroll"';B+='>'+A+'';return B;}},ConvertToDataFormat:function(A,B,C,D){var E=FCKXHtml.GetXHTML(A,!B,D);if (C&&FCKRegexLib.EmptyOutParagraph.test(E)) return '';return E;},FixHtml:function(A){return A;}}; +var FCK={Name:FCKURLParams['InstanceName'],Status:0,EditMode:0,Toolbar:null,HasFocus:false,DataProcessor:new FCKDataProcessor(),GetInstanceObject:(function(){var w=window;return function(name){return w[name];}})(),AttachToOnSelectionChange:function(A){this.Events.AttachEvent('OnSelectionChange',A);},GetLinkedFieldValue:function(){return this.LinkedField.value;},GetParentForm:function(){return this.LinkedField.form;},StartupValue:'',IsDirty:function(){if (this.EditMode==1) return (this.StartupValue!=this.EditingArea.Textarea.value);else{if (!this.EditorDocument) return false;return (this.StartupValue!=this.EditorDocument.body.innerHTML);}},ResetIsDirty:function(){if (this.EditMode==1) this.StartupValue=this.EditingArea.Textarea.value;else if (this.EditorDocument.body) this.StartupValue=this.EditorDocument.body.innerHTML;},StartEditor:function(){this.TempBaseTag=FCKConfig.BaseHref.length>0?'':'';var A=FCK.KeystrokeHandler=new FCKKeystrokeHandler();A.OnKeystroke=_FCK_KeystrokeHandler_OnKeystroke;A.SetKeystrokes(FCKConfig.Keystrokes);if (FCKBrowserInfo.IsIE7){if ((CTRL+86/*V*/) in A.Keystrokes) A.SetKeystrokes([CTRL+86,true]);if ((SHIFT+45/*INS*/) in A.Keystrokes) A.SetKeystrokes([SHIFT+45,true]);};A.SetKeystrokes([CTRL+8,true]);this.EditingArea=new FCKEditingArea(document.getElementById('xEditingArea'));this.EditingArea.FFSpellChecker=FCKConfig.FirefoxSpellChecker;this.SetData(this.GetLinkedFieldValue(),true);FCKTools.AddEventListener(document,"keydown",this._TabKeyHandler);this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);},Focus:function(){FCK.EditingArea.Focus();},SetStatus:function(A){this.Status=A;if (A==1){FCKFocusManager.AddWindow(window,true);if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement,true);if (FCKConfig.StartupFocus) FCK.Focus();};this.Events.FireEvent('OnStatusChange',A);},FixBody:function(){var A=FCKConfig.EnterMode;if (A!='p'&&A!='div') return;var B=this.EditorDocument;if (!B) return;var C=B.body;if (!C) return;FCKDomTools.TrimNode(C);var D=C.firstChild;var E;while (D){var F=false;switch (D.nodeType){case 1:var G=D.nodeName.toLowerCase();if (!FCKListsLib.BlockElements[G]&&G!='li'&&!D.getAttribute('_fckfakelement')&&D.getAttribute('_moz_dirty')==null) F=true;break;case 3:if (E||D.nodeValue.Trim().length>0) F=true;};if (F){var H=D.parentNode;if (!E) E=H.insertBefore(B.createElement(A),D);E.appendChild(H.removeChild(D));D=E.nextSibling;}else{if (E){FCKDomTools.TrimNode(E);E=null;};D=D.nextSibling;}};if (E) FCKDomTools.TrimNode(E);},GetData:function(A){if (FCK.EditMode==1) return FCK.EditingArea.Textarea.value;this.FixBody();var B=FCK.EditorDocument;if (!B) return null;var C=FCKConfig.FullPage;var D=FCK.DataProcessor.ConvertToDataFormat(C?B.documentElement:B.body,!C,FCKConfig.IgnoreEmptyParagraphValue,A);D=FCK.ProtectEventsRestore(D);if (FCKBrowserInfo.IsIE) D=D.replace(FCKRegexLib.ToReplace,'$1');if (C){if (FCK.DocTypeDeclaration&&FCK.DocTypeDeclaration.length>0) D=FCK.DocTypeDeclaration+'\n'+D;if (FCK.XmlDeclaration&&FCK.XmlDeclaration.length>0) D=FCK.XmlDeclaration+'\n'+D;};return FCKConfig.ProtectedSource.Revert(D);},UpdateLinkedField:function(){var A=FCK.GetXHTML(FCKConfig.FormatOutput);if (FCKConfig.HtmlEncodeOutput) A=FCKTools.HTMLEncode(A);FCK.LinkedField.value=A;FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');},RegisteredDoubleClickHandlers:{},OnDoubleClick:function(A){var B=FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];if (B){for (var i=0;i0?'|ABBR|XML|EMBED|OBJECT':'ABBR|XML|EMBED|OBJECT';var C;if (B.length>0){C=new RegExp('<('+B+')(?!\w|:)','gi');A=A.replace(C,'','gi');A=A.replace(C,'<\/FCK:$1>');};B='META';if (FCKBrowserInfo.IsIE) B+='|HR';C=new RegExp('<(('+B+')(?=\\s|>|/)[\\s\\S]*?)/?>','gi');A=A.replace(C,'');return A;},SetData:function(A,B){this.EditingArea.Mode=FCK.EditMode;if (FCKBrowserInfo.IsIE&&FCK.EditorDocument){FCK.EditorDocument.detachEvent("onselectionchange",Doc_OnSelectionChange);};if (FCK.EditMode==0){this._ForceResetIsDirty=(B===true);A=FCKConfig.ProtectedSource.Protect(A);A=FCK.DataProcessor.ConvertToHtml(A);A=A.replace(FCKRegexLib.InvalidSelfCloseTags,'$1>');A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);if (FCK.TempBaseTag.length>0&&!FCKRegexLib.HasBaseTag.test(A)) A=A.replace(FCKRegexLib.HeadOpener,'$&'+FCK.TempBaseTag);var C='';if (!FCKConfig.FullPage) C+=_FCK_GetEditorAreaStyleTags();if (FCKBrowserInfo.IsIE) C+=FCK._GetBehaviorsStyle();else if (FCKConfig.ShowBorders) C+=FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS,true);C+=FCKTools.GetStyleHtml(FCK_InternalCSS,true);A=A.replace(FCKRegexLib.HeadCloser,C+'$&');this.EditingArea.OnLoad=_FCK_EditingArea_OnLoad;this.EditingArea.Start(A);}else{FCK.EditorWindow=null;FCK.EditorDocument=null;FCKDomTools.PaddingNode=null;this.EditingArea.OnLoad=null;this.EditingArea.Start(A);this.EditingArea.Textarea._FCKShowContextMenu=true;FCK.EnterKeyHandler=null;if (B) this.ResetIsDirty();FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);this.EditingArea.Textarea.focus();FCK.Events.FireEvent('OnAfterSetHTML');};if (FCKBrowserInfo.IsGecko) window.onresize();},RedirectNamedCommands:{},ExecuteNamedCommand:function(A,B,C,D){if (!D) FCKUndo.SaveUndoStep();if (!C&&FCK.RedirectNamedCommands[A]!=null) FCK.ExecuteRedirectedNamedCommand(A,B);else{FCK.Focus();FCK.EditorDocument.execCommand(A,false,B);FCK.Events.FireEvent('OnSelectionChange');};if (!D) FCKUndo.SaveUndoStep();},GetNamedCommandState:function(A){try{if (FCKBrowserInfo.IsSafari&&FCK.EditorWindow&&A.IEquals('Paste')) return 0;if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;else{return FCK.EditorDocument.queryCommandState(A)?1:0;}}catch (e){return 0;}},GetNamedCommandValue:function(A){var B='';var C=FCK.GetNamedCommandState(A);if (C==-1) return null;try{B=this.EditorDocument.queryCommandValue(A);}catch(e) {};return B?B:'';},Paste:function(A){if (FCK.Status!=2||!FCK.Events.FireEvent('OnPaste')) return false;return A||FCK._ExecPaste();},PasteFromWord:function(){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteFromWord,'dialog/fck_paste.html',400,330,'Word');},Preview:function(){var A;if (FCKConfig.FullPage){if (FCK.TempBaseTag.length>0) A=FCK.TempBaseTag+FCK.GetXHTML();else A=FCK.GetXHTML();}else{A=FCKConfig.DocType+''+FCK.TempBaseTag+''+FCKLang.Preview+''+_FCK_GetEditorAreaStyleTags()+''+FCK.GetXHTML()+'';};var B=FCKConfig.ScreenWidth*0.8;var C=FCKConfig.ScreenHeight*0.7;var D=(FCKConfig.ScreenWidth-B)/2;var E='';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A;E='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';};var F=window.open(E,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+B+',height='+C+',left='+D);if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){F.document.write(A);F.document.close();}},SwitchEditMode:function(A){var B=(FCK.EditMode==0);var C=FCK.IsDirty();var D;if (B){FCKCommands.GetCommand('ShowBlocks').SaveState();if (!A&&FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();D=FCK.GetXHTML(FCKConfig.FormatSource);if (D==null) return false;}else D=this.EditingArea.Textarea.value;FCK.EditMode=B?1:0;FCK.SetData(D,!C);FCK.Focus();FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState,FCK.ToolbarSet);return true;},InsertElement:function(A){if (typeof A=='string') A=this.EditorDocument.createElement(A);var B=A.nodeName.toLowerCase();FCKSelection.Restore();var C=new FCKDomRange(this.EditorWindow);if (FCKListsLib.BlockElements[B]!=null){C.SplitBlock();C.InsertNode(A);var D=FCKDomTools.GetNextSourceElement(A,false,null,['hr','br','param','img','area','input'],true);if (!D&&FCKConfig.EnterMode!='br'){D=this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);};if (FCKListsLib.EmptyElements[B]==null) C.MoveToElementEditStart(A);else if (D) C.MoveToElementEditStart(D);else C.MoveToPosition(A,4);if (FCKBrowserInfo.IsGecko){if (D) D.scrollIntoView(false);A.scrollIntoView(false);}}else{C.MoveToSelection();C.DeleteContents();C.InsertNode(A);C.SetStart(A,4);C.SetEnd(A,4);};C.Select();C.Release();this.Focus();return A;},_InsertBlockElement:function(A){},_IsFunctionKey:function(A){if (A>=16&&A<=20) return true;if (A==27||(A>=33&&A<=40)) return true;if (A==45) return true;return false;},_KeyDownListener:function(A){if (!A) A=FCK.EditorWindow.event;if (FCK.EditorWindow){if (!FCK._IsFunctionKey(A.keyCode)&&!(A.ctrlKey||A.metaKey)&&!(A.keyCode==46)) FCK._KeyDownUndo();};return true;},_KeyDownUndo:function(){if (!FCKUndo.Typing){FCKUndo.SaveUndoStep();FCKUndo.Typing=true;FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.TypesCount++;FCKUndo.Changed=1;if (FCKUndo.TypesCount>FCKUndo.MaxTypes){FCKUndo.TypesCount=0;FCKUndo.SaveUndoStep();}},_TabKeyHandler:function(A){if (!A) A=window.event;var B=A.keyCode;if (B==9&&FCK.EditMode!=0){if (FCKBrowserInfo.IsIE){var C=document.selection.createRange();if (C.parentElement()!=FCK.EditingArea.Textarea) return true;C.text='\t';C.select();}else{var a=[];var D=FCK.EditingArea.Textarea;var E=D.selectionStart;var F=D.selectionEnd;a.push(D.value.substr(0,E));a.push('\t');a.push(D.value.substr(F));D.value=a.join('');D.setSelectionRange(E+1,E+1);};if (A.preventDefault) return A.preventDefault();return A.returnValue=false;};return true;}};FCK.Events=new FCKEvents(FCK);FCK.GetHTML=FCK.GetXHTML=FCK.GetData;FCK.SetHTML=FCK.SetData;FCK.InsertElementAndGetIt=FCK.CreateElement=FCK.InsertElement;function _FCK_ProtectEvents_ReplaceTags(A){return A.replace(FCKRegexLib.EventAttributes,_FCK_ProtectEvents_ReplaceEvents);};function _FCK_ProtectEvents_ReplaceEvents(A,B){return ' '+B+'_fckprotectedatt="'+encodeURIComponent(A)+'"';};function _FCK_ProtectEvents_RestoreEvents(A,B){return decodeURIComponent(B);};function _FCK_MouseEventsListener(A){if (!A) A=window.event;if (A.type=='mousedown') FCK.MouseDownFlag=true;else if (A.type=='mouseup') FCK.MouseDownFlag=false;else if (A.type=='mousemove') FCK.Events.FireEvent('OnMouseMove',A);};function _FCK_PaddingNodeListener(){if (FCKConfig.EnterMode.IEquals('br')) return;FCKDomTools.EnforcePaddingNode(FCK.EditorDocument,FCKConfig.EnterMode);if (!FCKBrowserInfo.IsIE&&FCKDomTools.PaddingNode){var A=FCKSelection.GetSelection();if (A&&A.rangeCount==1){var B=A.getRangeAt(0);if (B.collapsed&&B.startContainer==FCK.EditorDocument.body&&B.startOffset==0){B.selectNodeContents(FCKDomTools.PaddingNode);B.collapse(true);A.removeAllRanges();A.addRange(B);}}}else if (FCKDomTools.PaddingNode){var C=FCKSelection.GetParentElement();var D=FCKDomTools.PaddingNode;if (C&&C.nodeName.IEquals('body')){if (FCK.EditorDocument.body.childNodes.length==1&&FCK.EditorDocument.body.firstChild==D){var B=FCK.EditorDocument.body.createTextRange();var F=false;if (!D.childNodes.firstChild){D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));F=true;};B.moveToElementText(D);B.select();if (F) B.pasteHTML('');}}}};function _FCK_EditingArea_OnLoad(){FCK.EditorWindow=FCK.EditingArea.Window;FCK.EditorDocument=FCK.EditingArea.Document;FCK.InitializeBehaviors();FCK.MouseDownFlag=false;FCKTools.AddEventListener(FCK.EditorDocument,'mousemove',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mouseup',_FCK_MouseEventsListener);if (FCKBrowserInfo.IsSafari){var A=function(evt){if (!(evt.ctrlKey||evt.metaKey)) return;if (FCK.EditMode!=0) return;switch (evt.keyCode){case 89:FCKUndo.Redo();break;case 90:FCKUndo.Undo();break;}};FCKTools.AddEventListener(FCK.EditorDocument,'keyup',A);};FCK.EnterKeyHandler=new FCKEnterKey(FCK.EditorWindow,FCKConfig.EnterMode,FCKConfig.ShiftEnterMode,FCKConfig.TabSpaces);FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();if (FCKBrowserInfo.IsIE&&FCK.HasFocus) FCK.EditorDocument.body.setActive();FCK.OnAfterSetHTML();FCKCommands.GetCommand('ShowBlocks').RestoreState();if (FCK.Status!=0) return;FCK.SetStatus(1);};function _FCK_GetEditorAreaStyleTags(){return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS)+FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);};function _FCK_KeystrokeHandler_OnKeystroke(A,B){if (FCK.Status!=2) return false;if (FCK.EditMode==0){switch (B){case 'Paste':return!FCK.Paste();case 'Cut':FCKUndo.SaveUndoStep();return false;}}else{if (B.Equals('Paste','Undo','Redo','SelectAll','Cut')) return false;};var C=FCK.Commands.GetCommand(B);if (C.GetState()==-1) return false;return (C.Execute.apply(C,FCKTools.ArgumentsToArray(arguments,2))!==false);};(function(){var A=window.parent.document;var B=A.getElementById(FCK.Name);var i=0;while (B||i==0){if (B&&B.tagName.toLowerCase().Equals('input','textarea')){FCK.LinkedField=B;break;};B=A.getElementsByName(FCK.Name)[i++];}})();var FCKTempBin={Elements:[],AddElement:function(A){var B=this.Elements.length;this.Elements[B]=A;return B;},RemoveElement:function(A){var e=this.Elements[A];this.Elements[A]=null;return e;},Reset:function(){var i=0;while (i0) C+='TABLE { behavior: '+B+' ; }';C+='';FCK._BehaviorsStyle=C;};return FCK._BehaviorsStyle;};function Doc_OnMouseUp(){if (FCK.EditorWindow.event.srcElement.tagName=='HTML'){FCK.Focus();FCK.EditorWindow.event.cancelBubble=true;FCK.EditorWindow.event.returnValue=false;}};function Doc_OnPaste(){var A=FCK.EditorDocument.body;A.detachEvent('onpaste',Doc_OnPaste);var B=FCK.Paste(!FCKConfig.ForcePasteAsPlainText&&!FCKConfig.AutoDetectPasteFromWord);A.attachEvent('onpaste',Doc_OnPaste);return B;};function Doc_OnDblClick(){FCK.OnDoubleClick(FCK.EditorWindow.event.srcElement);FCK.EditorWindow.event.cancelBubble=true;};function Doc_OnSelectionChange(){if (!FCK.IsSelectionChangeLocked&&FCK.EditorDocument) FCK.Events.FireEvent("OnSelectionChange");};function Doc_OnDrop(){if (FCK.MouseDownFlag){FCK.MouseDownFlag=false;return;};if (FCKConfig.ForcePasteAsPlainText){var A=FCK.EditorWindow.event;if (FCK._CheckIsPastingEnabled()||FCKConfig.ShowDropDialog) FCK.PasteAsPlainText(A.dataTransfer.getData('Text'));A.returnValue=false;A.cancelBubble=true;}};FCK.InitializeBehaviors=function(A){this.EditorDocument.attachEvent('onmouseup',Doc_OnMouseUp);this.EditorDocument.body.attachEvent('onpaste',Doc_OnPaste);this.EditorDocument.body.attachEvent('ondrop',Doc_OnDrop);FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument.body);this.EditorDocument.attachEvent("onkeydown",FCK._KeyDownListener);this.EditorDocument.attachEvent("ondblclick",Doc_OnDblClick);this.EditorDocument.attachEvent("onselectionchange",Doc_OnSelectionChange);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',Doc_OnMouseDown);};FCK.InsertHtml=function(A){A=FCKConfig.ProtectedSource.Protect(A);A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);FCK.EditorWindow.focus();FCKUndo.SaveUndoStep();var B=FCKSelection.GetSelection();if (B.type.toLowerCase()=='control') B.clear();A=''+A;B.createRange().pasteHTML(A);FCK.EditorDocument.getElementById('__fakeFCKRemove__').removeNode(true);FCKDocumentProcessor.Process(FCK.EditorDocument);this.Events.FireEvent("OnSelectionChange");};FCK.SetInnerHtml=function(A){var B=FCK.EditorDocument;B.body.innerHTML='
     
    '+A;B.getElementById('__fakeFCKRemove__').removeNode(true);};function FCK_PreloadImages(){var A=new FCKImagePreloader();A.AddImages(FCKConfig.PreloadImages);A.AddImages(FCKConfig.SkinPath+'fck_strip.gif');A.OnComplete=LoadToolbarSetup;A.Start();};function Document_OnContextMenu(){return (event.srcElement._FCKShowContextMenu==true);};document.oncontextmenu=Document_OnContextMenu;function FCK_Cleanup(){this.LinkedField=null;this.EditorWindow=null;this.EditorDocument=null;};FCK._ExecPaste=function(){if (FCK._PasteIsRunning) return true;if (FCKConfig.ForcePasteAsPlainText){FCK.PasteAsPlainText();return false;};var A=FCK._CheckIsPastingEnabled(true);if (A===false) FCKTools.RunFunction(FCKDialog.OpenDialog,FCKDialog,['FCKDialog_Paste',FCKLang.Paste,'dialog/fck_paste.html',400,330,'Security']);else{if (FCKConfig.AutoDetectPasteFromWord&&A.length>0){var B=/<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi;if (B.test(A)){FCK.PasteFromWord();return false;}};FCK._PasteIsRunning=true;FCK.ExecuteNamedCommand('Paste');delete FCK._PasteIsRunning;};return false;};FCK.PasteAsPlainText=function(A){if (!FCK._CheckIsPastingEnabled()){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteAsText,'dialog/fck_paste.html',400,330,'PlainText');return;};var B=null;if (!A) B=clipboardData.getData("Text");else B=A;if (B&&B.length>0){B=FCKTools.HTMLEncode(B);B=FCKTools.ProcessLineBreaks(window,FCKConfig,B);var C=B.search('

    ');var D=B.search('

    ');if ((C!=-1&&D!=-1&&C0){if (FCKSelection.GetType()=='Control'){var D=this.EditorDocument.createElement('A');D.href=A;var E=FCKSelection.GetSelectedElement();E.parentNode.insertBefore(D,E);E.parentNode.removeChild(E);D.appendChild(E);return [D];};var F='javascript:void(0);/*'+(new Date().getTime())+'*/';FCK.ExecuteNamedCommand('CreateLink',F,false,!!B);var G=this.EditorDocument.links;for (i=0;i0&&!isNaN(E)) this.PageConfig[D]=parseInt(E,10);else this.PageConfig[D]=E;}};function FCKConfig_LoadPageConfig(){var A=FCKConfig.PageConfig;for (var B in A) FCKConfig[B]=A[B];};function FCKConfig_PreProcess(){var A=FCKConfig;if (A.AllowQueryStringDebug){try{if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug=true;}catch (e) {/*Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error).*/}};if (!A.PluginsPath.EndsWith('/')) A.PluginsPath+='/';var B=A.ToolbarComboPreviewCSS;if (!B||B.length==0) A.ToolbarComboPreviewCSS=A.EditorAreaCSS;A.RemoveAttributesArray=(A.RemoveAttributes||'').split(',');if (!FCKConfig.SkinEditorCSS||FCKConfig.SkinEditorCSS.length==0) FCKConfig.SkinEditorCSS=FCKConfig.SkinPath+'fck_editor.css';if (!FCKConfig.SkinDialogCSS||FCKConfig.SkinDialogCSS.length==0) FCKConfig.SkinDialogCSS=FCKConfig.SkinPath+'fck_dialog.css';};FCKConfig.ToolbarSets={};FCKConfig.Plugins={};FCKConfig.Plugins.Items=[];FCKConfig.Plugins.Add=function(A,B,C){FCKConfig.Plugins.Items.AddItem([A,B,C]);};FCKConfig.ProtectedSource={};FCKConfig.ProtectedSource._CodeTag=(new Date()).valueOf();FCKConfig.ProtectedSource.RegexEntries=[//g,//gi,//gi];FCKConfig.ProtectedSource.Add=function(A){this.RegexEntries.AddItem(A);};FCKConfig.ProtectedSource.Protect=function(A){var B=this._CodeTag;function _Replace(protectedSource){var C=FCKTempBin.AddElement(protectedSource);return '';};for (var i=0;i|>)","g");return A.replace(D,_Replace);};FCKConfig.GetBodyAttributes=function(){var A='';if (this.BodyId&&this.BodyId.length>0) A+=' id="'+this.BodyId+'"';if (this.BodyClass&&this.BodyClass.length>0) A+=' class="'+this.BodyClass+'"';return A;};FCKConfig.ApplyBodyAttributes=function(A){if (this.BodyId&&this.BodyId.length>0) A.id=FCKConfig.BodyId;if (this.BodyClass&&this.BodyClass.length>0) A.className+=' '+FCKConfig.BodyClass;}; +var FCKDebug={};FCKDebug._GetWindow=function(){if (!this.DebugWindow||this.DebugWindow.closed) this.DebugWindow=window.open(FCKConfig.BasePath+'fckdebug.html','FCKeditorDebug','menubar=no,scrollbars=yes,resizable=yes,location=no,toolbar=no,width=600,height=500',true);return this.DebugWindow;};FCKDebug.Output=function(A,B,C){if (!FCKConfig.Debug) return;try{this._GetWindow().Output(A,B);}catch (e) {}};FCKDebug.OutputObject=function(A,B){if (!FCKConfig.Debug) return;try{this._GetWindow().OutputObject(A,B);}catch (e) {}}; +var FCKDomTools={MoveChildren:function(A,B,C){if (A==B) return;var D;if (C){while ((D=A.lastChild)) B.insertBefore(A.removeChild(D),B.firstChild);}else{while ((D=A.firstChild)) B.appendChild(A.removeChild(D));}},MoveNode:function(A,B,C){if (C) B.insertBefore(FCKDomTools.RemoveNode(A),B.firstChild);else B.appendChild(FCKDomTools.RemoveNode(A));},TrimNode:function(A){this.LTrimNode(A);this.RTrimNode(A);},LTrimNode:function(A){var B;while ((B=A.firstChild)){if (B.nodeType==3){var C=B.nodeValue.LTrim();var D=B.nodeValue.length;if (C.length==0){A.removeChild(B);continue;}else if (C.length0) break;if (A.lastChild) A=A.lastChild;else return this.GetPreviousSourceElement(A,B,C,D);};return null;},GetNextSourceElement:function(A,B,C,D,E){while((A=this.GetNextSourceNode(A,E))){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (D&&A.nodeName.IEquals(D)) return this.GetNextSourceElement(A,B,C,D);return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;};return null;},GetNextSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.firstChild) E=A.firstChild;else{if (D&&A==D) return null;E=A.nextSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetNextSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetNextSourceNode(E,false,C,D);return E;},GetPreviousSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.lastChild) E=A.lastChild;else{if (D&&A==D) return null;E=A.previousSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetPreviousSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetPreviousSourceNode(E,false,C,D);return E;},InsertAfterNode:function(A,B){return A.parentNode.insertBefore(B,A.nextSibling);},GetParents:function(A){var B=[];while (A){B.unshift(A);A=A.parentNode;};return B;},GetCommonParents:function(A,B){var C=this.GetParents(A);var D=this.GetParents(B);var E=[];for (var i=0;i0) D[C.pop().toLowerCase()]=1;var E=this.GetCommonParents(A,B);var F=null;while ((F=E.pop())){if (D[F.nodeName.toLowerCase()]) return F;};return null;},GetIndexOf:function(A){var B=A.parentNode?A.parentNode.firstChild:null;var C=-1;while (B){C++;if (B==A) return C;B=B.nextSibling;};return-1;},PaddingNode:null,EnforcePaddingNode:function(A,B){try{if (!A||!A.body) return;}catch (e){return;};this.CheckAndRemovePaddingNode(A,B,true);try{if (A.body.lastChild&&(A.body.lastChild.nodeType!=1||A.body.lastChild.tagName.toLowerCase()==B.toLowerCase())) return;}catch (e){return;};var C=A.createElement(B);if (FCKBrowserInfo.IsGecko&&FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);this.PaddingNode=C;if (A.body.childNodes.length==1&&A.body.firstChild.nodeType==1&&A.body.firstChild.tagName.toLowerCase()=='br'&&(A.body.firstChild.getAttribute('_moz_dirty')!=null||A.body.firstChild.getAttribute('type')=='_moz')) A.body.replaceChild(C,A.body.firstChild);else A.body.appendChild(C);},CheckAndRemovePaddingNode:function(A,B,C){var D=this.PaddingNode;if (!D) return;try{if (D.parentNode!=A.body||D.tagName.toLowerCase()!=B||(D.childNodes.length>1)||(D.firstChild&&D.firstChild.nodeValue!='\xa0'&&String(D.firstChild.tagName).toLowerCase()!='br')){this.PaddingNode=null;return;}}catch (e){this.PaddingNode=null;return;};if (!C){if (D.parentNode.childNodes.length>1) D.parentNode.removeChild(D);this.PaddingNode=null;}},HasAttribute:function(A,B){if (A.hasAttribute) return A.hasAttribute(B);else{var C=A.attributes[B];return (C!=undefined&&C.specified);}},HasAttributes:function(A){var B=A.attributes;for (var i=0;i0) return true;}else if (B[i].specified) return true;};return false;},RemoveAttribute:function(A,B){if (FCKBrowserInfo.IsIE&&B.toLowerCase()=='class') B='className';return A.removeAttribute(B,0);},RemoveAttributes:function (A,B){for (var i=0;i0) return false;C=C.nextSibling;};return D?this.CheckIsEmptyElement(D,B):true;},SetElementStyles:function(A,B){var C=A.style;for (var D in B) C[D]=B[D];},SetOpacity:function(A,B){if (FCKBrowserInfo.IsIE){B=Math.round(B*100);A.style.filter=(B>100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+B+')');}else A.style.opacity=B;},GetCurrentElementStyle:function(A,B){if (FCKBrowserInfo.IsIE) return A.currentStyle[B];else return A.ownerDocument.defaultView.getComputedStyle(A,'').getPropertyValue(B);},GetPositionedAncestor:function(A){var B=A;while (B!=FCKTools.GetElementDocument(B).documentElement){if (this.GetCurrentElementStyle(B,'position')!='static') return B;if (B==FCKTools.GetElementDocument(B).documentElement&¤tWindow!=w) B=currentWindow.frameElement;else B=B.parentNode;};return null;},ScrollIntoView:function(A,B){var C=FCKTools.GetElementWindow(A);var D=FCKTools.GetViewPaneSize(C).Height;var E=D*-1;if (B===false){E+=A.offsetHeight;E+=parseInt(this.GetCurrentElementStyle(A,'marginBottom')||0,10);};E+=A.offsetTop;while ((A=A.offsetParent)) E+=A.offsetTop||0;var F=FCKTools.GetScrollPosition(C).Y;if (E>0&&E>F) C.scrollTo(0,E);},CheckIsEditable:function(A){var B=A.nodeName.toLowerCase();var C=FCK.DTD[B]||FCK.DTD.span;return (C['#']&&!FCKListsLib.NonEditableElements[B]);}}; +var FCKTools={};FCKTools.CreateBogusBR=function(A){var B=A.createElement('br');B.setAttribute('type','_moz');return B;};FCKTools.FixCssUrls=function(A,B){if (!A||A.length==0) return B;return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,function(match,opener,path,closer){if (/^\/|^\w?:/.test(path)) return match;else return 'url('+opener+A+path+closer+')';});};FCKTools._GetUrlFixedCss=function(A,B){var C=A.match(/^([^|]+)\|([\s\S]*)/);if (C) return FCKTools.FixCssUrls(C[1],C[2]);else return A;};FCKTools.AppendStyleSheet=function(A,B){if (!B) return [];if (typeof(B)=='string'){if (/[\\\/\.]\w*$/.test(B)){return this.AppendStyleSheet(A,B.split(','));}else return [this.AppendStyleString(A,FCKTools._GetUrlFixedCss(B))];}else{var C=[];for (var i=0;i'+styleDef+'';};var C=function(cssFileUrl,markTemp){if (cssFileUrl.length==0) return '';var B=markTemp?' _fcktemp="true"':'';return '';};return function(cssFileOrArrayOrDef,markTemp){if (!cssFileOrArrayOrDef) return '';if (typeof(cssFileOrArrayOrDef)=='string'){if (/[\\\/\.]\w*$/.test(cssFileOrArrayOrDef)){return this.GetStyleHtml(cssFileOrArrayOrDef.split(','),markTemp);}else return A(this._GetUrlFixedCss(cssFileOrArrayOrDef),markTemp);}else{var E='';for (var i=0;i/g,'>');return A;};FCKTools.HTMLDecode=function(A){if (!A) return '';A=A.replace(/>/g,'>');A=A.replace(/</g,'<');A=A.replace(/&/g,'&');return A;};FCKTools._ProcessLineBreaksForPMode=function(A,B,C,D,E){var F=0;var G="

    ";var H="

    ";var I="
    ";if (C){G="
  • ";H="
  • ";F=1;};while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='p'){F=1;break;};D=D.parentNode;};for (var i=0;i0) return A[A.length-1];return null;};FCKTools.GetDocumentPosition=function(w,A){var x=0;var y=0;var B=A;var C=null;var D=FCKTools.GetElementWindow(B);while (B&&!(D==w&&(B==w.document.body||B==w.document.documentElement))){x+=B.offsetLeft-B.scrollLeft;y+=B.offsetTop-B.scrollTop;if (!FCKBrowserInfo.IsOpera){var E=C;while (E&&E!=B){x-=E.scrollLeft;y-=E.scrollTop;E=E.parentNode;}};C=B;if (B.offsetParent) B=B.offsetParent;else{if (D!=w){B=D.frameElement;C=null;if (B) D=B.contentWindow.parent;}else B=null;}};if (FCKDomTools.GetCurrentElementStyle(w.document.body,'position')!='static'||(FCKBrowserInfo.IsIE&&FCKDomTools.GetPositionedAncestor(A)==null)){x+=w.document.body.offsetLeft;y+=w.document.body.offsetTop;};return { "x":x,"y":y };};FCKTools.GetWindowPosition=function(w,A){var B=this.GetDocumentPosition(w,A);var C=FCKTools.GetScrollPosition(w);B.x-=C.X;B.y-=C.Y;return B;};FCKTools.ProtectFormStyles=function(A){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return [];var B=[];var C=['style','className'];for (var i=0;i0){for (var i=B.length-1;i>=0;i--){var C=B[i][0];var D=B[i][1];if (D) A.insertBefore(C,D);else A.appendChild(C);}}};FCKTools.GetNextNode=function(A,B){if (A.firstChild) return A.firstChild;else if (A.nextSibling) return A.nextSibling;else{var C=A.parentNode;while (C){if (C==B) return null;if (C.nextSibling) return C.nextSibling;else C=C.parentNode;}};return null;};FCKTools.GetNextTextNode=function(A,B,C){node=this.GetNextNode(A,B);if (C&&node&&C(node)) return null;while (node&&node.nodeType!=3){node=this.GetNextNode(node,B);if (C&&node&&C(node)) return null;};return node;};FCKTools.Merge=function(){var A=arguments;var o=A[0];for (var i=1;i');document.domain = '"+FCK_RUNTIME_DOMAIN+"';document.close();}() ) ;";if (FCKBrowserInfo.IsIE){if (FCKBrowserInfo.IsIE7||!FCKBrowserInfo.IsIE6) return "";else return "javascript: '';";};return "javascript: void(0);";}; +FCKTools.CancelEvent=function(e){return false;};FCKTools._AppendStyleSheet=function(A,B){return A.createStyleSheet(B).owningElement;};FCKTools.AppendStyleString=function(A,B){if (!B) return null;var s=A.createStyleSheet("");s.cssText=B;return s;};FCKTools.ClearElementAttributes=function(A){A.clearAttributes();};FCKTools.GetAllChildrenIds=function(A){var B=[];for (var i=0;i0) B[B.length]=C;};return B;};FCKTools.RemoveOuterTags=function(e){e.insertAdjacentHTML('beforeBegin',e.innerHTML);e.parentNode.removeChild(e);};FCKTools.CreateXmlObject=function(A){var B;switch (A){case 'XmlHttp':try { return new XMLHttpRequest();} catch (e) {};B=['MSXML2.XmlHttp','Microsoft.XmlHttp'];break;case 'DOMDocument':B=['MSXML2.DOMDocument','Microsoft.XmlDom'];break;};for (var i=0;i<2;i++){try { return new ActiveXObject(B[i]);}catch (e){}};if (FCKLang.NoActiveX){alert(FCKLang.NoActiveX);FCKLang.NoActiveX=null;};return null;};FCKTools.DisableSelection=function(A){A.unselectable='on';var e,i=0;while ((e=A.all[i++])){switch (e.tagName){case 'IFRAME':case 'TEXTAREA':case 'INPUT':case 'SELECT':break;default:e.unselectable='on';}}};FCKTools.GetScrollPosition=function(A){var B=A.document;var C={ X:B.documentElement.scrollLeft,Y:B.documentElement.scrollTop };if (C.X>0||C.Y>0) return C;return { X:B.body.scrollLeft,Y:B.body.scrollTop };};FCKTools.AddEventListener=function(A,B,C){A.attachEvent('on'+B,C);};FCKTools.RemoveEventListener=function(A,B,C){A.detachEvent('on'+B,C);};FCKTools.AddEventListenerEx=function(A,B,C,D){var o={};o.Source=A;o.Params=D||[];o.Listener=function(ev){return C.apply(o.Source,[ev].concat(o.Params));};if (FCK.IECleanup) FCK.IECleanup.AddItem(null,function() { o.Source=null;o.Params=null;});A.attachEvent('on'+B,o.Listener);A=null;D=null;};FCKTools.GetViewPaneSize=function(A){var B;var C=A.document.documentElement;if (C&&C.clientWidth) B=C;else B=A.document.body;if (B) return { Width:B.clientWidth,Height:B.clientHeight };else return { Width:0,Height:0 };};FCKTools.SaveStyles=function(A){var B=FCKTools.ProtectFormStyles(A);var C={};if (A.className.length>0){C.Class=A.className;A.className='';};var D=A.style.cssText;if (D.length>0){C.Inline=D;A.style.cssText='';};FCKTools.RestoreFormStyles(A,B);return C;};FCKTools.RestoreStyles=function(A,B){var C=FCKTools.ProtectFormStyles(A);A.className=B.Class||'';A.style.cssText=B.Inline||'';FCKTools.RestoreFormStyles(A,C);};FCKTools.RegisterDollarFunction=function(A){A.$=function(v){return A.document.getElementById(v);}};/*Fix IE9 2011-04-08*/FCKTools.AppendElement=function(A,B){return A.appendChild(this.GetElementDocument(A).createElement(B));};FCKTools.ToLowerCase=function(A){return A.toLowerCase();}; +var FCKeditorAPI;function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6",VersionBuild : "18638",Instances : new Object(),GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){eval.call(A,B);}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari||FCKBrowserInfo.IsGecko19){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;};function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup); +var FCKImagePreloader=function(){this._Images=[];};FCKImagePreloader.prototype={AddImages:function(A){if (typeof(A)=='string') A=A.split(';');this._Images=this._Images.concat(A);},Start:function(){var A=this._Images;this._PreloadCount=A.length;for (var i=0;i]*\>)/i,AfterBody:/(\<\/body\>[\s\S]*$)/i,ToReplace:/___fcktoreplace:([\w]+)/ig,MetaHttpEquiv:/http-equiv\s*=\s*["']?([^"' ]+)/i,HasBaseTag:/]/i,HtmlOpener:/]*>/i,HeadOpener:/]*>/i,HeadCloser:/<\/head\s*>/i,FCK_Class:/\s*FCK__[^ ]*(?=\s+|$)/,ElementName:/(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/,ForceSimpleAmpersand:/___FCKAmp___/g,SpaceNoClose:/\/>/g,EmptyParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/,EmptyOutParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*| )(<\/\1>)?$/,TagBody:/>]+))/gi,ProtectUrlsA:/]+))/gi,ProtectUrlsArea:/]+))/gi,Html4DocType:/HTML 4\.0 Transitional/i,DocTypeTag:/]*>/i,TagsWithEvent:/<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g,EventAttributes:/\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,ProtectedEvents:/\s\w+_fckprotectedatt="([^"]+)"/g,StyleProperties:/\S+\s*:/g,InvalidSelfCloseTags:/(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,StyleVariableAttName:/#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,RegExp:/^\/(.*)\/([gim]*)$/,HtmlTag:/<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/}; +var FCKListsLib={BlockElements:{ address:1,blockquote:1,center:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,marquee:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },NonEmptyBlockElements:{ p:1,div:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 },InlineChildReqElements:{ abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },InlineNonEmptyElements:{ a:1,abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },EmptyElements:{ base:1,col:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },PathBlockElements:{ address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 },PathBlockLimitElements:{ body:1,div:1,td:1,th:1,caption:1,form:1 },StyleBlockElements:{ address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },StyleObjectElements:{ img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1 },NonEditableElements:{ button:1,option:1,script:1,iframe:1,textarea:1,object:1,embed:1,map:1,applet:1 },BlockBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1 },ListBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1,br:1 }}; +var FCKLanguageManager=FCK.Language={AvailableLanguages:{af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-uk':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',it:'Italian',ja:'Japanese',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},GetActiveLanguage:function(){if (FCKConfig.AutoDetectLanguage){var A;if (navigator.userLanguage) A=navigator.userLanguage.toLowerCase();else if (navigator.language) A=navigator.language.toLowerCase();else{return FCKConfig.DefaultLanguage;};if (A.length>=5){A=A.substr(0,5);if (this.AvailableLanguages[A]) return A;};if (A.length>=2){A=A.substr(0,2);if (this.AvailableLanguages[A]) return A;}};return this.DefaultLanguage;},TranslateElements:function(A,B,C,D){var e=A.getElementsByTagName(B);var E,s;for (var i=0;i0) C+='|'+FCKConfig.AdditionalNumericEntities;FCKXHtmlEntities.EntitiesRegex=new RegExp(C,'g');}; +var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^/,'');E=E.substr(7,E.length-15).Trim();E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol; +FCKXHtml._GetMainXmlString=function(){return this.MainNode.xml;};FCKXHtml._AppendAttributes=function(A,B,C,D){var E=B.attributes;for (var n=0;n0) FCKXHtml._AppendAttribute(A,'align',B.align);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['font']=function(A,B){if (A.attributes.length==0) A=FCKXHtml.XML.createDocumentFragment();A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['form']=function(A,B){if (B.acceptCharset&&B.acceptCharset.length>0&&B.acceptCharset!='UNKNOWN') FCKXHtml._AppendAttribute(A,'accept-charset',B.acceptCharset);var C=B.attributes['name'];if (C&&C.value.length>0) FCKXHtml._AppendAttribute(A,'name',C.value);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['input']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);if (B.value&&!A.attributes.getNamedItem('value')) FCKXHtml._AppendAttribute(A,'value',B.value);if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text');return A;};FCKXHtml.TagProcessors['label']=function(A,B){if (B.htmlFor.length>0) FCKXHtml._AppendAttribute(A,'for',B.htmlFor);A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['map']=function(A,B){if (!A.attributes.getNamedItem('name')){var C=B.name;if (C) FCKXHtml._AppendAttribute(A,'name',C);};A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['meta']=function(A,B){var C=A.attributes.getNamedItem('http-equiv');if (C==null||C.value.length==0){var D=B.outerHTML.match(FCKRegexLib.MetaHttpEquiv);if (D){D=D[1];FCKXHtml._AppendAttribute(A,'http-equiv',D);}};return A;};FCKXHtml.TagProcessors['option']=function(A,B){if (B.selected&&!A.attributes.getNamedItem('selected')) FCKXHtml._AppendAttribute(A,'selected','selected');A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['textarea']=FCKXHtml.TagProcessors['select']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);A=FCKXHtml._AppendChildNodes(A,B);return A;}; +var FCKCodeFormatter={};FCKCodeFormatter.Init=function(){var A=this.Regex={};A.BlocksOpener=/\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.BlocksCloser=/\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.NewLineTags=/\<(BR|HR)[^\>]*\>/gi;A.MainTags=/\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi;A.LineSplitter=/\s*\n+\s*/g;A.IncreaseIndent=/^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i;A.DecreaseIndent=/^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i;A.FormatIndentatorRemove=new RegExp('^'+FCKConfig.FormatIndentator);A.ProtectedTags=/(]*>)([\s\S]*?)(<\/PRE>)/gi;};FCKCodeFormatter._ProtectData=function(A,B,C,D){return B+'___FCKpd___'+FCKCodeFormatter.ProtectedData.AddItem(C)+D;};FCKCodeFormatter.Format=function(A){if (!this.Regex) this.Init();FCKCodeFormatter.ProtectedData=[];var B=A.replace(this.Regex.ProtectedTags,FCKCodeFormatter._ProtectData);B=B.replace(this.Regex.BlocksOpener,'\n$&');B=B.replace(this.Regex.BlocksCloser,'$&\n');B=B.replace(this.Regex.NewLineTags,'$&\n');B=B.replace(this.Regex.MainTags,'\n$&\n');var C='';var D=B.split(this.Regex.LineSplitter);B='';for (var i=0;iB[i]) return 1;};if (A.lengthB.length) return 1;return 0;};FCKUndo._CheckIsBookmarksEqual=function(A,B){if (!(A&&B)) return false;if (FCKBrowserInfo.IsIE){var C=A[1].search(A[0].StartId);var D=B[1].search(B[0].StartId);var E=A[1].search(A[0].EndId);var F=B[1].search(B[0].EndId);return C==D&&E==F;}else{return this._CompareCursors(A.Start,B.Start)==0&&this._CompareCursors(A.End,B.End)==0;}};FCKUndo.SaveUndoStep=function(){if (FCK.EditMode!=0||this.SaveLocked) return;if (this.SavedData.length) this.Changed=true;var A=FCK.EditorDocument.body.innerHTML;var B=this._GetBookmark();this.SavedData=this.SavedData.slice(0,this.CurrentIndex+1);if (this.CurrentIndex>0&&A==this.SavedData[this.CurrentIndex][0]&&this._CheckIsBookmarksEqual(B,this.SavedData[this.CurrentIndex][1])) return;else if (this.CurrentIndex==0&&this.SavedData.length&&A==this.SavedData[0][0]){this.SavedData[0][1]=B;return;};if (this.CurrentIndex+1>=FCKConfig.MaxUndoLevels) this.SavedData.shift();else this.CurrentIndex++;this.SavedData[this.CurrentIndex]=[A,B];FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.CheckUndoState=function(){return (this.Changed||this.CurrentIndex>0);};FCKUndo.CheckRedoState=function(){return (this.CurrentIndex<(this.SavedData.length-1));};FCKUndo.Undo=function(){if (this.CheckUndoState()){if (this.CurrentIndex==(this.SavedData.length-1)){this.SaveUndoStep();};this._ApplyUndoLevel(--this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo.Redo=function(){if (this.CheckRedoState()){this._ApplyUndoLevel(++this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo._ApplyUndoLevel=function(A){var B=this.SavedData[A];if (!B) return;if (FCKBrowserInfo.IsIE){if (B[1]&&B[1][1]) FCK.SetInnerHtml(B[1][1]);else FCK.SetInnerHtml(B[0]);}else FCK.EditorDocument.body.innerHTML=B[0];this._SelectBookmark(B[1]);this.TypesCount=0;this.Changed=false;this.Typing=false;}; +var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A=''+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='
    ';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='';H.frameBorder=0;H.width=H.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=I+A;H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(I+A);J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;(H.onreadystatechange=function(){if (H.readyState=='complete'){H.onreadystatechange=null;K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);}})();}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}}; +var FCKKeystrokeHandler=function(A){this.Keystrokes={};this.CancelCtrlDefaults=(A!==false);};FCKKeystrokeHandler.prototype.AttachToElement=function(A){FCKTools.AddEventListenerEx(A,'keydown',_FCKKeystrokeHandler_OnKeyDown,this);if (FCKBrowserInfo.IsGecko10||FCKBrowserInfo.IsOpera||(FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac)) FCKTools.AddEventListenerEx(A,'keypress',_FCKKeystrokeHandler_OnKeyPress,this);};FCKKeystrokeHandler.prototype.SetKeystrokes=function(){for (var i=0;i40))){B._CancelIt=true;if (A.preventDefault) return A.preventDefault();A.returnValue=false;A.cancelBubble=true;return false;};return true;};function _FCKKeystrokeHandler_OnKeyPress(A,B){if (B._CancelIt){if (A.preventDefault) return A.preventDefault();return false;};return true;}; +FCK.DTD=(function(){var X=FCKTools.Merge;var A,L,J,M,N,O,D,H,P,K,Q,F,G,C,B,E,I;A={isindex:1,fieldset:1};B={input:1,button:1,select:1,textarea:1,label:1};C=X({a:1},B);D=X({iframe:1},C);E={hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1};F={ins:1,del:1,script:1};G=X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F);H=X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G);I=X({p:1},H);J=X({iframe:1},H,B);K={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1};L=X({a:1},J);M={tr:1};N={'#':1};O=X({param:1},K);P=X({form:1},A,D,E,I);Q={li:1};return {col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:P,td:P,br:{},th:P,center:P,kbd:L,button:X(I,E),basefont:{},h5:L,h4:L,samp:L,h6:L,ol:Q,h1:L,h3:L,option:N,h2:L,form:X(A,D,E,I),select:{optgroup:1,option:1},font:J,ins:P,menu:Q,abbr:L,label:L,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:L,script:N,tfoot:M,cite:L,li:P,input:{},iframe:P,strong:J,textarea:N,noframes:P,big:J,small:J,span:J,hr:{},dt:L,sub:J,optgroup:{option:1},param:{},bdo:L,'var':J,div:P,object:O,sup:J,dd:P,strike:J,area:{},dir:Q,map:X({area:1,form:1,p:1},A,F,E),applet:O,dl:{dt:1,dd:1},del:P,isindex:{},fieldset:X({legend:1},K),thead:M,ul:Q,acronym:L,b:J,a:J,blockquote:P,caption:L,i:J,u:J,tbody:M,s:L,address:X(D,I),tt:J,legend:L,q:L,pre:X(G,C),p:L,em:J,dfn:L};})(); +var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'
    ');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(]*>)[ \t\r\n]*/gi,'
    ');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='
    ') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='
    \n'+F.join('')+'
    ';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H=[];var I=[];while((F=E.GetNextParagraph())){var J=this.BuildElement(G);var K=J.nodeName.IEquals('pre');var L=F.nodeName.IEquals('pre');if (K&&!L){J=this._ToPre(G,F,J);H.push(J);}else if (!K&&L){J=this._FromPre(G,F,J);I.push(J);}else FCKDomTools.MoveChildren(F,J);F.parentNode.insertBefore(J,F);FCKDomTools.RemoveNode(F);};for (var i=0;i0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i0) return true;};B=B.nextSibling;};return false;}}; +var FCKElementPath=function(A){var B=null;var C=null;var D=[];var e=A;while (e){if (e.nodeType==1){if (!this.LastElement) this.LastElement=e;var E=e.nodeName.toLowerCase();if (FCKBrowserInfo.IsIE&&e.scopeName!='HTML') E=e.scopeName.toLowerCase()+':'+E;if (!C){if (!B&&FCKListsLib.PathBlockElements[E]!=null) B=e;if (FCKListsLib.PathBlockLimitElements[E]!=null){if (!B&&E=='div'&&!FCKElementPath._CheckHasBlock(e)) B=e;else C=e;}};D.push(e);if (E=='body') break;};e=e.parentNode;};this.Block=B;this.BlockLimit=C;this.Elements=D;};FCKElementPath._CheckHasBlock=function(A){var B=A.childNodes;for (var i=0,count=B.length;i0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&B.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;};while (C&&C.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;};while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;};while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}}; +FCKDomRange.prototype.MoveToSelection=function(){this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var A=this.Window.document.selection;if (A.type!='Control'){var B=this._GetSelectionMarkerTag(true);var C=this._GetSelectionMarkerTag(false);if (!B&&!C){this._Range.setStart(this.Window.document.body,0);this._UpdateElementInfo();return;};this._Range.setStart(B.parentNode,FCKDomTools.GetIndexOf(B));B.parentNode.removeChild(B);this._Range.setEnd(C.parentNode,FCKDomTools.GetIndexOf(C));C.parentNode.removeChild(C);this._UpdateElementInfo();}else{var D=A.createRange().item(0);if (D){this._Range.setStartBefore(D);this._Range.setEndAfter(D);this._UpdateElementInfo();}}};FCKDomRange.prototype.Select=function(A){if (this._Range) this.SelectBookmark(this.CreateBookmark(true),A);};FCKDomRange.prototype.SelectBookmark=function(A,B){var C=this.CheckIsCollapsed();var D;var E;var F=this.GetBookmarkNode(A,true);if (!F) return;var G;if (!C) G=this.GetBookmarkNode(A,false);var H=this.Window.document.body.createTextRange();H.moveToElementText(F);H.moveStart('character',1);if (G){var I=this.Window.document.body.createTextRange();I.moveToElementText(G);H.setEndPoint('EndToEnd',I);H.moveEnd('character',-1);}else{D=(B||!F.previousSibling||F.previousSibling.nodeName.toLowerCase()=='br')&&!F.nextSibing;E=this.Window.document.createElement('span');E.innerHTML='';F.parentNode.insertBefore(E,F);if (D){F.parentNode.insertBefore(this.Window.document.createTextNode('\ufeff'),F);}};if (!this._Range) this._Range=this.CreateRange();this._Range.setStartBefore(F);F.parentNode.removeChild(F);if (C){if (D){H.moveStart('character',-1);H.select();this.Window.document.selection.clear();}else H.select();FCKDomTools.RemoveNode(E);}else{this._Range.setEndBefore(G);G.parentNode.removeChild(G);H.select();}};FCKDomRange.prototype._GetSelectionMarkerTag=function(A){var B=this.Window.document;var C=B.selection;var D;try{D=C.createRange();}catch (e){return null;};if (D.parentElement().document!=B) return null;D.collapse(A===true);var E='fck_dom_range_temp_'+(new Date()).valueOf()+'_'+Math.floor(Math.random()*1000);D.pasteHTML('');return B.getElementById(E);}; +var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=H;};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}}; +var FCKDocumentFragment=function(A){this._Document=A;this.RootNode=A.createElement('div');};FCKDocumentFragment.prototype={AppendTo:function(A){FCKDomTools.MoveChildren(this.RootNode,A);},AppendHtml:function(A){var B=this._Document.createElement('div');B.innerHTML=A;FCKDomTools.MoveChildren(B,this.RootNode);},InsertAfterNode:function(A){var B=this.RootNode;var C;while((C=B.lastChild)) FCKDomTools.InsertAfterNode(A,B.removeChild(C));}}; +var FCKW3CRange=function(A){this._Document=A;this.startContainer=null;this.startOffset=null;this.endContainer=null;this.endOffset=null;this.collapsed=true;};FCKW3CRange.CreateRange=function(A){return new FCKW3CRange(A);};FCKW3CRange.CreateFromRange=function(A,B){var C=FCKW3CRange.CreateRange(A);C.setStart(B.startContainer,B.startOffset);C.setEnd(B.endContainer,B.endOffset);return C;};FCKW3CRange.prototype={_UpdateCollapsed:function(){this.collapsed=(this.startContainer==this.endContainer&&this.startOffset==this.endOffset);},setStart:function(A,B){this.startContainer=A;this.startOffset=B;if (!this.endContainer){this.endContainer=A;this.endOffset=B;};this._UpdateCollapsed();},setEnd:function(A,B){this.endContainer=A;this.endOffset=B;if (!this.startContainer){this.startContainer=A;this.startOffset=B;};this._UpdateCollapsed();},setStartAfter:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setStartBefore:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A));},setEndAfter:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setEndBefore:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A));},collapse:function(A){if (A){this.endContainer=this.startContainer;this.endOffset=this.startOffset;}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset;};this.collapsed=true;},selectNodeContents:function(A){this.setStart(A,0);this.setEnd(A,A.nodeType==3?A.data.length:A.childNodes.length);},insertNode:function(A){var B=this.startContainer;var C=this.startOffset;if (B.nodeType==3){B.splitText(C);if (B==this.endContainer) this.setEnd(B.nextSibling,this.endOffset-this.startOffset);FCKDomTools.InsertAfterNode(B,A);return;}else{B.insertBefore(A,B.childNodes[C]||null);if (B==this.endContainer){this.endOffset++;this.collapsed=false;}}},deleteContents:function(){if (this.collapsed) return;this._ExecContentsAction(0);},extractContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(1,A);return A;},cloneContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(2,A);return A;},_ExecContentsAction:function(A,B){var C=this.startContainer;var D=this.endContainer;var E=this.startOffset;var F=this.endOffset;var G=false;var H=false;if (D.nodeType==3) D=D.splitText(F);else{if (D.childNodes.length>0){if (F>D.childNodes.length-1){D=FCKDomTools.InsertAfterNode(D.lastChild,this._Document.createTextNode(''));H=true;}else D=D.childNodes[F];}};if (C.nodeType==3){C.splitText(E);if (C==D) D=C.nextSibling;}else{if (E==0){C=C.insertBefore(this._Document.createTextNode(''),C.firstChild);G=true;}else if (E>C.childNodes.length-1){C=C.appendChild(this._Document.createTextNode(''));G=true;}else C=C.childNodes[E].previousSibling;};var I=FCKDomTools.GetParents(C);var J=FCKDomTools.GetParents(D);var i,topStart,topEnd;for (i=0;i0&&levelStartNode!=D) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==D));if (!I[k]||levelStartNode.parentNode!=I[k].parentNode){currentNode=levelStartNode.previousSibling;while(currentNode){if (currentNode==I[k]||currentNode==C) break;currentSibling=currentNode.previousSibling;if (A==2) K.insertBefore(currentNode.cloneNode(true),K.firstChild);else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.insertBefore(currentNode,K.firstChild);};currentNode=currentSibling;}};if (K) K=levelClone;};if (A==2){var L=this.startContainer;if (L.nodeType==3){L.data+=L.nextSibling.data;L.parentNode.removeChild(L.nextSibling);};var M=this.endContainer;if (M.nodeType==3&&M.nextSibling){M.data+=M.nextSibling.data;M.parentNode.removeChild(M.nextSibling);}}else{if (topStart&&topEnd&&(C.parentNode!=topStart.parentNode||D.parentNode!=topEnd.parentNode)){var N=FCKDomTools.GetIndexOf(topEnd);if (G&&topEnd.parentNode==C.parentNode) N--;this.setStart(topEnd.parentNode,N);};this.collapse(true);};if(G) C.parentNode.removeChild(C);if(H&&D.parentNode) D.parentNode.removeChild(D);},cloneRange:function(){return FCKW3CRange.CreateFromRange(this._Document,this);}}; +var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[9,'Tab'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);if (D>0){this.TabText='';while (D-->0) this.TabText+='\xa0';};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};var F=B.StartBlock;var G=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&F&&G){if (!C){var H=B.CheckEndOfBlock();B.DeleteContents();if (F!=G){B.SetStart(G,1);B.SetEnd(G,1);};B.Select();A=(F==G);};if (B.CheckStartOfBlock()){var I=B.StartBlock;var J=FCKDomTools.GetPreviousSourceElement(I,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,J,I);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i=0;i--) B(F[i]);var G=doc.getElementsByTagName('embed');for (var i=G.length-1;i>=0;i--) B(G[i]);});},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed'))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);}); +var FCKSelection=FCK.Selection={GetParentBlock:function(){var A=this.GetParentElement();while (A){if (FCKListsLib.BlockBoundaries[A.nodeName.toLowerCase()]) break;A=A.parentNode;};return A;},ApplyStyle:function(A){FCKStyles.ApplyStyle(new FCKStyle(A));}}; +FCKSelection.GetType=function(){try{var A=FCKSelection.GetSelection().type;if (A=='Control'||A=='Text') return A;if (this.GetSelection().createRange().parentElement) return 'Text';}catch(e){};return 'None';};FCKSelection.GetSelectedElement=function(){if (this.GetType()=='Control'){var A=this.GetSelection().createRange();if (A&&A.item) return this.GetSelection().createRange().item(0);};return null;};FCKSelection.GetParentElement=function(){switch (this.GetType()){case 'Control':var A=FCKSelection.GetSelectedElement();return A?A.parentElement:null;case 'None':return null;default:return this.GetSelection().createRange().parentElement();}};FCKSelection.GetBoundaryParentElement=function(A){switch (this.GetType()){case 'Control':var B=FCKSelection.GetSelectedElement();return B?B.parentElement:null;case 'None':return null;default:var C=FCK.EditorDocument;var D=C.selection.createRange();D.collapse(A!==false);var B=D.parentElement();return FCKTools.GetElementDocument(B)==C?B:null;}};FCKSelection.SelectNode=function(A){FCK.Focus();this.GetSelection().empty();var B;try{B=FCK.EditorDocument.body.createControlRange();B.addElement(A);}catch(e){B=FCK.EditorDocument.body.createTextRange();B.moveToElementText(A);};B.select();};FCKSelection.Collapse=function(A){FCK.Focus();if (this.GetType()=='Text'){var B=this.GetSelection().createRange();B.collapse(A==null||A===true);B.select();}};FCKSelection.HasAncestorNode=function(A){var B;if (this.GetSelection().type=="Control"){B=this.GetSelectedElement();}else{var C=this.GetSelection().createRange();B=C.parentElement();};while (B){if (B.tagName==A) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B,oRange;if (!FCK.EditorDocument) return null;if (this.GetSelection().type=="Control"){oRange=this.GetSelection().createRange();for (i=0;i=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(FCKTools.GetElementAscensor(A,'TR'));return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i=E.height){for (D=F;D0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCKTools.GetElementDocument(B).createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCKTools.GetElementDocument(D).createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCKTools.GetElementDocument(B).createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r1){B.rowSpan=Math.ceil(E/2);var G=F+Math.ceil(E/2);var H=null;for (var i=D+1;i0){var C=B.rows[0];C.parentNode.removeChild(C);};for (var i=0;iE) E=j;if (D._colScanned===true) continue;if (A[i][j-1]==D) D.colSpan++;if (A[i][j+1]!=D) D._colScanned=true;}};for (var i=0;i<=E;i++){for (var j=0;j=0&&C.compareEndPoints('StartToEnd',E)<=0)||(C.compareEndPoints('EndToStart',E)>=0&&C.compareEndPoints('EndToEnd',E)<=0)){B[B.length]=D.cells[i];}}}};return B;}; +var FCKXml=function(){this.Error=false;};FCKXml.GetAttribute=function(A,B,C){var D=A.attributes.getNamedItem(B);return D?D.value:C;};FCKXml.TransformToObject=function(A){if (!A) return null;var B={};var C=A.attributes;for (var i=0;i ';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}}; +var FCKShowBlockCommand=function(A,B){this.Name=A;if (B!=undefined) this._SavedState=B;else this._SavedState=null;};FCKShowBlockCommand.prototype.Execute=function(){var A=this.GetState();if (A==-1) return;var B=FCK.EditorDocument.body;if (A==1) B.className=B.className.replace(/(^| )FCK__ShowBlocks/g,'');else B.className+=' FCK__ShowBlocks';FCK.Events.FireEvent('OnSelectionChange');};FCKShowBlockCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;if (!FCK.EditorDocument) return 0;if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;return 0;};FCKShowBlockCommand.prototype.SaveState=function(){this._SavedState=this.GetState();};FCKShowBlockCommand.prototype.RestoreState=function(){if (this._SavedState!=null&&this.GetState()!=this._SavedState) this.Execute();}; +var FCKSpellCheckCommand=function(){this.Name='SpellCheck';this.IsEnabled=(FCKConfig.SpellChecker=='ieSpell'||FCKConfig.SpellChecker=='SpellerPages');};FCKSpellCheckCommand.prototype.Execute=function(){switch (FCKConfig.SpellChecker){case 'ieSpell':this._RunIeSpell();break;case 'SpellerPages':FCKDialog.OpenDialog('FCKDialog_SpellCheck','Spell Check','dialog/fck_spellerpages.html',440,480);break;}};FCKSpellCheckCommand.prototype._RunIeSpell=function(){try{var A=new ActiveXObject("ieSpell.ieSpellExtension");A.CheckAllLinkedDocuments(FCK.EditorDocument);}catch(e){if(e.number==-2146827859){if (confirm(FCKLang.IeSpellDownload)) window.open(FCKConfig.IeSpellDownloadUrl,'IeSpellDownload');}else alert('Error Loading ieSpell: '+e.message+' ('+e.number+')');}};FCKSpellCheckCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return this.IsEnabled?0:-1;}; +var FCKTextColorCommand=function(A){this.Name=A=='ForeColor'?'TextColor':'BGColor';this.Type=A;var B;if (FCKBrowserInfo.IsIE) B=window;else if (FCK.ToolbarSet._IFrame) B=FCKTools.GetElementWindow(FCK.ToolbarSet._IFrame);else B=window.parent;this._Panel=new FCKPanel(B);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._Panel.MainNode.className='FCK_Panel';this._CreatePanelBody(this._Panel.Document,this._Panel.MainNode);FCK.ToolbarSet.ToolbarItems.GetItem(this.Name).RegisterPanel(this._Panel);FCKTools.DisableSelection(this._Panel.Document.body);};FCKTextColorCommand.prototype.Execute=function(A,B,C){this._Panel.Show(A,B,C);};FCKTextColorCommand.prototype.SetColor=function(A){FCKUndo.SaveUndoStep();var B=FCKStyles.GetStyle('_FCK_'+(this.Type=='ForeColor'?'Color':'BackColor'));if (!A||A.length==0) FCK.Styles.RemoveStyle(B);else{B.SetVariable('Color',A);FCKStyles.ApplyStyle(B);};FCKUndo.SaveUndoStep();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');};FCKTextColorCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};function FCKTextColorCommand_OnMouseOver(){this.className='ColorSelected';};function FCKTextColorCommand_OnMouseOut(){this.className='ColorDeselected';};function FCKTextColorCommand_OnClick(A,B,C){this.className='ColorDeselected';B.SetColor(C);B._Panel.Hide();};function FCKTextColorCommand_AutoOnClick(A,B){this.className='ColorDeselected';B.SetColor('');B._Panel.Hide();};function FCKTextColorCommand_MoreOnClick(A,B){this.className='ColorDeselected';B._Panel.Hide();FCKDialog.OpenDialog('FCKDialog_Color',FCKLang.DlgColorTitle,'dialog/fck_colorselector.html',410,320,FCKTools.Bind(B,B.SetColor));};FCKTextColorCommand.prototype._CreatePanelBody=function(A,B){function CreateSelectionDiv(){var C=A.createElement("DIV");C.className='ColorDeselected';FCKTools.AddEventListenerEx(C,'mouseover',FCKTextColorCommand_OnMouseOver);FCKTools.AddEventListenerEx(C,'mouseout',FCKTextColorCommand_OnMouseOut);return C;};var D=B.appendChild(A.createElement("TABLE"));D.className='ForceBaseFont';D.style.tableLayout='fixed';D.cellPadding=0;D.cellSpacing=0;D.border=0;D.width=150;var E=D.insertRow(-1).insertCell(-1);E.colSpan=8;var C=E.appendChild(CreateSelectionDiv());C.innerHTML='\n \n \n \n \n
    '+FCKLang.ColorAutomatic+'
    ';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_AutoOnClick,this);if (!FCKBrowserInfo.IsIE) C.style.width='96%';var G=FCKConfig.FontColors.toString().split(',');var H=0;while (H
    ';if (H>=G.length) C.style.visibility='hidden';else FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_OnClick,[this,L]);}};if (FCKConfig.EnableMoreFontColors){E=D.insertRow(-1).insertCell(-1);E.colSpan=8;C=E.appendChild(CreateSelectionDiv());C.innerHTML='
    '+FCKLang.ColorMoreColors+'
    ';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_MoreOnClick,this);};if (!FCKBrowserInfo.IsIE) C.style.width='96%';}; +var FCKPastePlainTextCommand=function(){this.Name='PasteText';};FCKPastePlainTextCommand.prototype.Execute=function(){FCK.PasteAsPlainText();};FCKPastePlainTextCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}; +var FCKPasteWordCommand=function(){this.Name='PasteWord';};FCKPasteWordCommand.prototype.Execute=function(){FCK.PasteFromWord();};FCKPasteWordCommand.prototype.GetState=function(){if (FCK.EditMode!=0||FCKConfig.ForcePasteAsPlainText) return -1;else return FCK.GetNamedCommandState('Paste');}; +var FCKTableCommand=function(A){this.Name=A;};FCKTableCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (!FCKBrowserInfo.IsGecko){switch (this.Name){case 'TableMergeRight':return FCKTableHandler.MergeRight();case 'TableMergeDown':return FCKTableHandler.MergeDown();}};switch (this.Name){case 'TableInsertRowAfter':return FCKTableHandler.InsertRow(false);case 'TableInsertRowBefore':return FCKTableHandler.InsertRow(true);case 'TableDeleteRows':return FCKTableHandler.DeleteRows();case 'TableInsertColumnAfter':return FCKTableHandler.InsertColumn(false);case 'TableInsertColumnBefore':return FCKTableHandler.InsertColumn(true);case 'TableDeleteColumns':return FCKTableHandler.DeleteColumns();case 'TableInsertCellAfter':return FCKTableHandler.InsertCell(null,false);case 'TableInsertCellBefore':return FCKTableHandler.InsertCell(null,true);case 'TableDeleteCells':return FCKTableHandler.DeleteCells();case 'TableMergeCells':return FCKTableHandler.MergeCells();case 'TableHorizontalSplitCell':return FCKTableHandler.HorizontalSplitCell();case 'TableVerticalSplitCell':return FCKTableHandler.VerticalSplitCell();case 'TableDelete':return FCKTableHandler.DeleteTable();default:return alert(FCKLang.UnknownCommand.replace(/%1/g,this.Name));}};FCKTableCommand.prototype.GetState=function(){if (FCK.EditorDocument!=null&&FCKSelection.HasAncestorNode('TABLE')){switch (this.Name){case 'TableHorizontalSplitCell':case 'TableVerticalSplitCell':if (FCKTableHandler.GetSelectedCells().length==1) return 0;else return -1;case 'TableMergeCells':if (FCKTableHandler.CheckIsSelectionRectangular()&&FCKTableHandler.GetSelectedCells().length>1) return 0;else return -1;case 'TableMergeRight':return FCKTableHandler.GetMergeRightTarget()?0:-1;case 'TableMergeDown':return FCKTableHandler.GetMergeDownTarget()?0:-1;default:return 0;}}else return -1;}; +var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var H=FCKTools.GetViewPaneSize(C);B.position="absolute";B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=H.Width+"px";B.height=H.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var I=FCKTools.GetWindowPosition(C,A);if (I.x!=0) B.left=(-1*I.x)+"px";if (I.y!=0) B.top=(-1*I.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';}; +var FCKListCommand=function(A,B){this.Name=A;this.TagName=B;};FCKListCommand.prototype={GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=FCKSelection.GetBoundaryParentElement(true);var B=A;while (B){if (B.nodeName.IEquals(['ul','ol'])) break;B=B.parentNode;};if (B&&B.nodeName.IEquals(this.TagName)) return 1;else return 0;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCK.EditorDocument;var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=this.GetState();if (C==0){FCKDomTools.TrimNode(A.body);if (!A.body.firstChild){var D=A.createElement('p');A.body.appendChild(D);B.MoveToNodeContents(D);}};var E=B.CreateBookmark();var F=[];var G={};var H=new FCKDomRangeIterator(B);var I;H.ForceBrBreak=(C==0);var J=true;var K=null;while (J){while ((I=H.GetNextParagraph())){var L=new FCKElementPath(I);var M=null;var N=false;var O=L.BlockLimit;for (var i=L.Elements.length-1;i>=0;i--){var P=L.Elements[i];if (P.nodeName.IEquals(['ol','ul'])){if (O._FCK_ListGroupObject) O._FCK_ListGroupObject=null;var Q=P._FCK_ListGroupObject;if (Q) Q.contents.push(I);else{Q={ 'root':P,'contents':[I] };F.push(Q);FCKDomTools.SetElementMarker(G,P,'_FCK_ListGroupObject',Q);};N=true;break;}};if (N) continue;var R=O;if (R._FCK_ListGroupObject) R._FCK_ListGroupObject.contents.push(I);else{var Q={ 'root':R,'contents':[I] };FCKDomTools.SetElementMarker(G,R,'_FCK_ListGroupObject',Q);F.push(Q);}};if (FCKBrowserInfo.IsIE) J=false;else{if (K==null){K=[];var T=FCKSelection.GetSelection();if (T&&F.length==0) K.push(T.getRangeAt(0));for (var i=1;T&&i0){var Q=F.shift();if (C==0){if (Q.root.nodeName.IEquals(['ul','ol'])) this._ChangeListType(Q,G,W);else this._CreateList(Q,W);}else if (C==1&&Q.root.nodeName.IEquals(['ul','ol'])) this._RemoveList(Q,G);};for (var i=0;iC[i-1].indent+1){var H=C[i-1].indent+1-C[i].indent;var I=C[i].indent;while (C[i]&&C[i].indent>=I){C[i].indent+=H;i++;};i--;}};var J=FCKDomTools.ArrayToList(C,B);if (A.root.nextSibling==null||A.root.nextSibling.nodeName.IEquals('br')){if (J.listNode.lastChild.nodeName.IEquals('br')) J.listNode.removeChild(J.listNode.lastChild);};A.root.parentNode.replaceChild(J.listNode,A.root);}}; +var FCKJustifyCommand=function(A){this.AlignValue=A;var B=FCKConfig.ContentLangDirection.toLowerCase();this.IsDefaultAlign=(A=='left'&&B=='ltr')||(A=='right'&&B=='rtl');var C=this._CssClassName=(function(){var D=FCKConfig.JustifyClasses;if (D){switch (A){case 'left':return D[0]||null;case 'center':return D[1]||null;case 'right':return D[2]||null;case 'justify':return D[3]||null;}};return null;})();if (C&&C.length>0) this._CssClassRegex=new RegExp('(?:^|\\s+)'+C+'(?=$|\\s)');};FCKJustifyCommand._GetClassNameRegex=function(){var A=FCKJustifyCommand._ClassRegex;if (A!=undefined) return A;var B=[];var C=FCKConfig.JustifyClasses;if (C){for (var i=0;i<4;i++){var D=C[i];if (D&&D.length>0) B.push(D);}};if (B.length>0) A=new RegExp('(?:^|\\s+)(?:'+B.join('|')+')(?=$|\\s)');else A=null;return FCKJustifyCommand._ClassRegex=A;};FCKJustifyCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=this.GetState();if (B==-1) return;var C=A.CreateBookmark();var D=this._CssClassName;var E=new FCKDomRangeIterator(A);var F;while ((F=E.GetNextParagraph())){F.removeAttribute('align');if (D){var G=F.className.replace(FCKJustifyCommand._GetClassNameRegex(),'');if (B==0){if (G.length>0) G+=' ';F.className=G+D;}else if (G.length==0) FCKDomTools.RemoveAttribute(F,'class');}else{var H=F.style;if (B==0) H.textAlign=this.AlignValue;else{H.textAlign='';if (H.cssText.length==0) F.removeAttribute('style');}}};A.MoveToBookmark(C);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;var C;if (FCKBrowserInfo.IsIE) C=B.currentStyle.textAlign;else C=FCK.EditorWindow.getComputedStyle(B,'').getPropertyValue('text-align');C=C.replace(/(-moz-|-webkit-|start|auto)/i,'');if ((!C&&this.IsDefaultAlign)||C==this.AlignValue) return 1;return 0;}}; +var FCKIndentCommand=function(A,B){this.Name=A;this.Offset=B;this.IndentCSSProperty=FCKConfig.ContentLangDirection.IEquals('ltr')?'marginLeft':'marginRight';};FCKIndentCommand._InitIndentModeParameters=function(){if (FCKConfig.IndentClasses&&FCKConfig.IndentClasses.length>0){this._UseIndentClasses=true;this._IndentClassMap={};for (var i=0;i0?H+' ':'')+FCKConfig.IndentClasses[G-1];}else{var I=parseInt(E.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;I+=this.Offset;I=Math.max(I,0);I=Math.ceil(I/this.Offset)*this.Offset;E.style[this.IndentCSSProperty]=I?I+FCKConfig.IndentUnit:'';if (E.getAttribute('style')=='') E.removeAttribute('style');}}},_IndentList:function(A,B){var C=A.StartContainer;var D=A.EndContainer;while (C&&C.parentNode!=B) C=C.parentNode;while (D&&D.parentNode!=B) D=D.parentNode;if (!C||!D) return;var E=C;var F=[];var G=false;while (G==false){if (E==D) G=true;F.push(E);E=E.nextSibling;};if (F.length<1) return;var H=FCKDomTools.GetParents(B);for (var i=0;iN;i++) M[i].indent+=I;var O=FCKDomTools.ArrayToList(M);if (O) B.parentNode.replaceChild(O.listNode,B);FCKDomTools.ClearAllMarkers(L);}}; +var FCKBlockQuoteCommand=function(){};FCKBlockQuoteCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=this.GetState();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();if (FCKBrowserInfo.IsIE){var D=B.GetBookmarkNode(C,true);var E=B.GetBookmarkNode(C,false);var F;if (D&&D.parentNode.nodeName.IEquals('blockquote')&&!D.previousSibling){F=D;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]) FCKDomTools.MoveNode(D,F,true);}};if (E&&E.parentNode.nodeName.IEquals('blockquote')&&!E.previousSibling){F=E;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]){if (F.firstChild==D) FCKDomTools.InsertAfterNode(D,E);else FCKDomTools.MoveNode(E,F,true);}}}};var G=new FCKDomRangeIterator(B);var H;if (A==0){G.EnforceRealBlocks=true;var I=[];while ((H=G.GetNextParagraph())) I.push(H);if (I.length<1){para=B.Window.document.createElement(FCKConfig.EnterMode.IEquals('p')?'p':'div');B.InsertNode(para);para.appendChild(B.Window.document.createTextNode('\ufeff'));B.MoveToBookmark(C);B.MoveToNodeContents(para);B.Collapse(true);C=B.CreateBookmark();I.push(para);};var J=I[0].parentNode;var K=[];for (var i=0;i0){H=I.shift();while (H.parentNode!=J) H=H.parentNode;if (H!=L) K.push(H);L=H;};while (K.length>0){H=K.shift();if (H.nodeName.IEquals('blockquote')){var M=FCKTools.GetElementDocument(H).createDocumentFragment();while (H.firstChild){M.appendChild(H.removeChild(H.firstChild));I.push(M.lastChild);};H.parentNode.replaceChild(M,H);}else I.push(H);};var N=B.Window.document.createElement('blockquote');J.insertBefore(N,I[0]);while (I.length>0){H=I.shift();N.appendChild(H);}}else if (A==1){var O=[];while ((H=G.GetNextParagraph())){var P=null;var Q=null;while (H.parentNode){if (H.parentNode.nodeName.IEquals('blockquote')){P=H.parentNode;Q=H;break;};H=H.parentNode;};if (P&&Q) O.push(Q);};var R=[];while (O.length>0){var S=O.shift();var N=S.parentNode;if (S==S.parentNode.firstChild){N.parentNode.insertBefore(N.removeChild(S),N);if (!N.firstChild) N.parentNode.removeChild(N);}else if (S==S.parentNode.lastChild){N.parentNode.insertBefore(N.removeChild(S),N.nextSibling);if (!N.firstChild) N.parentNode.removeChild(N);}else FCKDomTools.BreakParent(S,S.parentNode,B);R.push(S);};if (FCKConfig.EnterMode.IEquals('br')){while (R.length){var S=R.shift();var W=true;if (S.nodeName.IEquals('div')){var M=FCKTools.GetElementDocument(S).createDocumentFragment();var Y=W&&S.previousSibling&&!FCKListsLib.BlockBoundaries[S.previousSibling.nodeName.toLowerCase()];if (W&&Y) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));var Z=S.nextSibling&&!FCKListsLib.BlockBoundaries[S.nextSibling.nodeName.toLowerCase()];while (S.firstChild) M.appendChild(S.removeChild(S.firstChild));if (Z) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));S.parentNode.replaceChild(M,S);W=false;}}}};B.MoveToBookmark(C);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;for (var i=0;i';B.open();B.write(''+F+'<\/head><\/body><\/html>');B.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.Panel_Contructor(B,window.document.location);FCKTools.AddEventListenerEx(E,'focus',FCKPanel_Window_OnFocus,this);FCKTools.AddEventListenerEx(E,'blur',FCKPanel_Window_OnBlur,this); +}; +B.dir=FCKLang.Dir;FCKTools.AddEventListener(B,'contextmenu',FCKTools.CancelEvent);this.MainNode=B.body.appendChild(B.createElement('DIV'));this.MainNode.style.cssFloat=this.IsRTL?'right':'left';};FCKPanel.prototype.AppendStyleSheet=function(A){FCKTools.AppendStyleSheet(this.Document,A);};FCKPanel.prototype.Preload=function(x,y,A){if (this._Popup) this._Popup.show(x,y,0,0,A);};FCKPanel.prototype.Show=function(x,y,A,B,C){var D;var E=this.MainNode;if (this._Popup){this._Popup.show(x,y,0,0,A);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=(x*-1)+A.offsetWidth-D;};this._Popup.show(x,y,D,E.offsetHeight,A);if (this.OnHide){if (this._Timer) CheckPopupOnHide.call(this,true);this._Timer=FCKTools.SetInterval(CheckPopupOnHide,100,this);}}else{if (typeof(FCK.ToolbarSet.CurrentInstance.FocusManager)!='undefined') FCK.ToolbarSet.CurrentInstance.FocusManager.Lock();if (this.ParentPanel){this.ParentPanel.Lock();FCKPanel_Window_OnBlur(null,this.ParentPanel);};if (FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac){this._IFrame.scrolling='';FCKTools.RunFunction(function(){ this._IFrame.scrolling='no';},this);};if (FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel&&FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel!=this) FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel.Hide(false,true);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (!B) this._IFrame.width=1;if (!C) this._IFrame.height=1;D=E.offsetWidth||E.firstChild.offsetWidth;var F=FCKTools.GetDocumentPosition(this._Window,A.nodeType==9?(FCKTools.IsStrictMode(A)?A.documentElement:A.body):A);var G=FCKDomTools.GetPositionedAncestor(this._IFrame.parentNode);if (G){var H=FCKTools.GetDocumentPosition(FCKTools.GetElementWindow(G),G);F.x-=H.x;F.y-=H.y;};if (this.IsRTL&&!this.IsContextMenu) x=(x*-1);x+=F.x;y+=F.y;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=x+A.offsetWidth-D;}else{var I=FCKTools.GetViewPaneSize(this._Window);var J=FCKTools.GetScrollPosition(this._Window);var K=I.Height+J.Y;var L=I.Width+J.X;if ((x+D)>L) x-=x+D-L;if ((y+E.offsetHeight)>K) y-=y+E.offsetHeight-K;};FCKDomTools.SetElementStyles(this._IFrame,{left:x+'px',top:y+'px'});this._IFrame.contentWindow.focus();this._IsOpened=true;var M=this;this._resizeTimer=setTimeout(function(){var N=E.offsetWidth||E.firstChild.offsetWidth;var O=E.offsetHeight;M._IFrame.width=N;M._IFrame.height=O;},0);FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel=this;};FCKTools.RunFunction(this.OnShow,this);};FCKPanel.prototype.Hide=function(A,B){if (this._Popup) this._Popup.hide();else{if (!this._IsOpened||this._LockCounter>0) return;if (typeof(FCKFocusManager)!='undefined'&&!B) FCKFocusManager.Unlock();this._IFrame.width=this._IFrame.height=0;this._IsOpened=false;if (this._resizeTimer){clearTimeout(this._resizeTimer);this._resizeTimer=null;};if (this.ParentPanel) this.ParentPanel.Unlock();if (!A) FCKTools.RunFunction(this.OnHide,this);}};FCKPanel.prototype.CheckIsOpened=function(){if (this._Popup) return this._Popup.isOpen;else return this._IsOpened;};FCKPanel.prototype.CreateChildPanel=function(){var A=this._Popup?FCKTools.GetDocumentWindow(this.Document):this._Window;var B=new FCKPanel(A);B.ParentPanel=this;return B;};FCKPanel.prototype.Lock=function(){this._LockCounter++;};FCKPanel.prototype.Unlock=function(){if (--this._LockCounter==0&&!this.HasFocus) this.Hide();};function FCKPanel_Window_OnFocus(e,A){A.HasFocus=true;};function FCKPanel_Window_OnBlur(e,A){A.HasFocus=false;if (A._LockCounter==0) FCKTools.RunFunction(A.Hide,A);};function CheckPopupOnHide(A){if (A||!this._Popup.isOpen){window.clearInterval(this._Timer);this._Timer=null;FCKTools.RunFunction(this.OnHide,this);}};function FCKPanel_Cleanup(){this._Popup=null;this._Window=null;this.Document=null;this.MainNode=null;}; +var FCKIcon=function(A){var B=A?typeof(A):'undefined';switch (B){case 'number':this.Path=FCKConfig.SkinPath+'fck_strip.gif';this.Size=16;this.Position=A;break;case 'undefined':this.Path=FCK_SPACER_PATH;break;case 'string':this.Path=A;break;default:this.Path=A[0];this.Size=A[1];this.Position=A[2];}};FCKIcon.prototype.CreateIconElement=function(A){var B,eIconImage;if (this.Position){var C='-'+((this.Position-1)*this.Size)+'px';if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path;eIconImage.style.top=C;}else{B=A.createElement('IMG');B.src=FCK_SPACER_PATH;B.style.backgroundPosition='0px '+C;B.style.backgroundImage='url("'+this.Path+'")';}}else{if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path?this.Path:FCK_SPACER_PATH;}else{B=A.createElement('IMG');B.src=this.Path?this.Path:FCK_SPACER_PATH;}};B.className='TB_Button_Image';return B;}; +var FCKToolbarButtonUI=function(A,B,C,D,E,F){this.Name=A;this.Label=B||A;this.Tooltip=C||this.Label;this.Style=E||0;this.State=F||0;this.Icon=new FCKIcon(D);if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarButtonUI_Cleanup);};FCKToolbarButtonUI.prototype._CreatePaddingElement=function(A){var B=A.createElement('IMG');B.className='TB_Button_Padding';B.src=FCK_SPACER_PATH;return B;};FCKToolbarButtonUI.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this.MainElement=B.createElement('DIV');C.title=this.Tooltip;if (FCKBrowserInfo.IsGecko) C.onmousedown=FCKTools.CancelEvent;FCKTools.AddEventListenerEx(C,'mouseover',FCKToolbarButtonUI_OnMouseOver,this);FCKTools.AddEventListenerEx(C,'mouseout',FCKToolbarButtonUI_OnMouseOut,this);FCKTools.AddEventListenerEx(C,'click',FCKToolbarButtonUI_OnClick,this);this.ChangeState(this.State,true);if (this.Style==0&&!this.ShowArrow){C.appendChild(this.Icon.CreateIconElement(B));}else{var D=C.appendChild(B.createElement('TABLE'));D.cellPadding=0;D.cellSpacing=0;var E=D.insertRow(-1);var F=E.insertCell(-1);if (this.Style==0||this.Style==2) F.appendChild(this.Icon.CreateIconElement(B));else F.appendChild(this._CreatePaddingElement(B));if (this.Style==1||this.Style==2){F=E.insertCell(-1);F.className='TB_Button_Text';F.noWrap=true;F.appendChild(B.createTextNode(this.Label));};if (this.ShowArrow){if (this.Style!=0){E.insertCell(-1).appendChild(this._CreatePaddingElement(B));};F=E.insertCell(-1);var G=F.appendChild(B.createElement('IMG'));G.src=FCKConfig.SkinPath+'images/toolbar.buttonarrow.gif';G.width=5;G.height=3;};F=E.insertCell(-1);F.appendChild(this._CreatePaddingElement(B));};A.appendChild(C);};FCKToolbarButtonUI.prototype.ChangeState=function(A,B){if (!B&&this.State==A) return;var e=this.MainElement;if (!e) return;switch (parseInt(A,10)){case 0:e.className='TB_Button_Off';break;case 1:e.className='TB_Button_On';break;case -1:e.className='TB_Button_Disabled';break;};this.State=A;};function FCKToolbarButtonUI_OnMouseOver(A,B){if (B.State==0) this.className='TB_Button_Off_Over';else if (B.State==1) this.className='TB_Button_On_Over';};function FCKToolbarButtonUI_OnMouseOut(A,B){if (B.State==0) this.className='TB_Button_Off';else if (B.State==1) this.className='TB_Button_On';};function FCKToolbarButtonUI_OnClick(A,B){if (B.OnClick&&B.State!=-1) B.OnClick(B);};function FCKToolbarButtonUI_Cleanup(){this.MainElement=null;}; +var FCKToolbarButton=function(A,B,C,D,E,F,G){this.CommandName=A;this.Label=B;this.Tooltip=C;this.Style=D;this.SourceView=E?true:false;this.ContextSensitive=F?true:false;if (G==null) this.IconPath=FCKConfig.SkinPath+'toolbar/'+A.toLowerCase()+'.gif';else if (typeof(G)=='number') this.IconPath=[FCKConfig.SkinPath+'fck_strip.gif',16,G];else this.IconPath=G;};FCKToolbarButton.prototype.Create=function(A){this._UIButton=new FCKToolbarButtonUI(this.CommandName,this.Label,this.Tooltip,this.IconPath,this.Style);this._UIButton.OnClick=this.Click;this._UIButton._ToolbarButton=this;this._UIButton.Create(A);};FCKToolbarButton.prototype.RefreshState=function(){var A=this._UIButton;if (!A) return;var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();if (B==A.State) return;A.ChangeState(B);};FCKToolbarButton.prototype.Click=function(){var A=this._ToolbarButton||this;FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(A.CommandName).Execute();};FCKToolbarButton.prototype.Enable=function(){this.RefreshState();};FCKToolbarButton.prototype.Disable=function(){this._UIButton.ChangeState(-1);}; +var FCKSpecialCombo=function(A,B,C,D,E){this.FieldWidth=B||100;this.PanelWidth=C||150;this.PanelMaxHeight=D||150;this.Label=' ';this.Caption=A;this.Tooltip=A;this.Style=2;this.Enabled=true;this.Items={};this._Panel=new FCKPanel(E||window);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._PanelBox=this._Panel.MainNode.appendChild(this._Panel.Document.createElement('DIV'));this._PanelBox.className='SC_Panel';this._PanelBox.style.width=this.PanelWidth+'px';this._PanelBox.innerHTML='
    ';this._ItemsHolderEl=this._PanelBox.getElementsByTagName('TD')[0];if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKSpecialCombo_Cleanup);};function FCKSpecialCombo_ItemOnMouseOver(){this.className+=' SC_ItemOver';};function FCKSpecialCombo_ItemOnMouseOut(){this.className=this.originalClass;};function FCKSpecialCombo_ItemOnClick(A,B,C){this.className=this.originalClass;B._Panel.Hide();B.SetLabel(this.FCKItemLabel);if (typeof(B.OnSelect)=='function') B.OnSelect(C,this);};FCKSpecialCombo.prototype.ClearItems=function (){if (this.Items) this.Items={};var A=this._ItemsHolderEl;while (A.firstChild) A.removeChild(A.firstChild);};FCKSpecialCombo.prototype.AddItem=function(A,B,C,D){var E=this._ItemsHolderEl.appendChild(this._Panel.Document.createElement('DIV'));E.className=E.originalClass='SC_Item';E.innerHTML=B;E.FCKItemLabel=C||A;E.Selected=false;if (FCKBrowserInfo.IsIE) E.style.width='100%';if (D) E.style.backgroundColor=D;FCKTools.AddEventListenerEx(E,'mouseover',FCKSpecialCombo_ItemOnMouseOver);FCKTools.AddEventListenerEx(E,'mouseout',FCKSpecialCombo_ItemOnMouseOut);FCKTools.AddEventListenerEx(E,'click',FCKSpecialCombo_ItemOnClick,[this,A]);this.Items[A.toString().toLowerCase()]=E;return E;};FCKSpecialCombo.prototype.SelectItem=function(A){if (typeof A=='string') A=this.Items[A.toString().toLowerCase()];if (A){A.className=A.originalClass='SC_ItemSelected';A.Selected=true;}};FCKSpecialCombo.prototype.SelectItemByLabel=function(A,B){for (var C in this.Items){var D=this.Items[C];if (D.FCKItemLabel==A){D.className=D.originalClass='SC_ItemSelected';D.Selected=true;if (B) this.SetLabel(A);}}};FCKSpecialCombo.prototype.DeselectAll=function(A){for (var i in this.Items){if (!this.Items[i]) continue;this.Items[i].className=this.Items[i].originalClass='SC_Item';this.Items[i].Selected=false;};if (A) this.SetLabel('');};FCKSpecialCombo.prototype.SetLabelById=function(A){A=A?A.toString().toLowerCase():'';var B=this.Items[A];this.SetLabel(B?B.FCKItemLabel:'');};FCKSpecialCombo.prototype.SetLabel=function(A){A=(!A||A.length==0)?' ':A;if (A==this.Label) return;this.Label=A;var B=this._LabelEl;if (B){B.innerHTML=A;FCKTools.DisableSelection(B);}};FCKSpecialCombo.prototype.SetEnabled=function(A){this.Enabled=A;if (this._OuterTable) this._OuterTable.className=A?'':'SC_FieldDisabled';};FCKSpecialCombo.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this._OuterTable=A.appendChild(B.createElement('TABLE'));C.cellPadding=0;C.cellSpacing=0;C.insertRow(-1);var D;var E;switch (this.Style){case 0:D='TB_ButtonType_Icon';E=false;break;case 1:D='TB_ButtonType_Text';E=false;break;case 2:E=true;break;};if (this.Caption&&this.Caption.length>0&&E){var F=C.rows[0].insertCell(-1);F.innerHTML=this.Caption;F.className='SC_FieldCaption';};var G=FCKTools.AppendElement(C.rows[0].insertCell(-1),'div');if (E){G.className='SC_Field';G.style.width=this.FieldWidth+'px';G.innerHTML='
     
    ';this._LabelEl=G.getElementsByTagName('label')[0];this._LabelEl.innerHTML=this.Label;}else{G.className='TB_Button_Off';G.innerHTML='
    '+this.Caption+'
    ';};FCKTools.AddEventListenerEx(G,'mouseover',FCKSpecialCombo_OnMouseOver,this);FCKTools.AddEventListenerEx(G,'mouseout',FCKSpecialCombo_OnMouseOut,this);FCKTools.AddEventListenerEx(G,'click',FCKSpecialCombo_OnClick,this);FCKTools.DisableSelection(this._Panel.Document.body);};function FCKSpecialCombo_Cleanup(){this._LabelEl=null;this._OuterTable=null;this._ItemsHolderEl=null;this._PanelBox=null;if (this.Items){for (var A in this.Items) this.Items[A]=null;}};function FCKSpecialCombo_OnMouseOver(A,B){if (B.Enabled){switch (B.Style){case 0:this.className='TB_Button_On_Over';break;case 1:this.className='TB_Button_On_Over';break;case 2:this.className='SC_Field SC_FieldOver';break;}}};function FCKSpecialCombo_OnMouseOut(A,B){switch (B.Style){case 0:this.className='TB_Button_Off';break;case 1:this.className='TB_Button_Off';break;case 2:this.className='SC_Field';break;}};function FCKSpecialCombo_OnClick(e,A){if (A.Enabled){var B=A._Panel;var C=A._PanelBox;var D=A._ItemsHolderEl;var E=A.PanelMaxHeight;if (A.OnBeforeClick) A.OnBeforeClick(A);if (FCKBrowserInfo.IsIE) B.Preload(0,this.offsetHeight,this);if (D.offsetHeight>E) C.style.height=E+'px';else C.style.height='';B.Show(0,this.offsetHeight,this);}}; +var FCKToolbarSpecialCombo=function(){this.SourceView=false;this.ContextSensitive=true;this.FieldWidth=null;this.PanelWidth=null;this.PanelMaxHeight=null;};FCKToolbarSpecialCombo.prototype.DefaultLabel='';function FCKToolbarSpecialCombo_OnSelect(A,B){FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).Execute(A,B);};FCKToolbarSpecialCombo.prototype.Create=function(A){this._Combo=new FCKSpecialCombo(this.GetLabel(),this.FieldWidth,this.PanelWidth,this.PanelMaxHeight,FCKBrowserInfo.IsIE?window:FCKTools.GetElementWindow(A).parent);this._Combo.Tooltip=this.Tooltip;this._Combo.Style=this.Style;this.CreateItems(this._Combo);this._Combo.Create(A);this._Combo.CommandName=this.CommandName;this._Combo.OnSelect=FCKToolbarSpecialCombo_OnSelect;};function FCKToolbarSpecialCombo_RefreshActiveItems(A,B){A.DeselectAll();A.SelectItem(B);A.SetLabelById(B);};FCKToolbarSpecialCombo.prototype.RefreshState=function(){var A;var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();if (B!=-1){A=1;if (this.RefreshActiveItems) this.RefreshActiveItems(this._Combo,B);else{if (this._LastValue!==B){this._LastValue=B;if (!B||B.length==0){this._Combo.DeselectAll();this._Combo.SetLabel(this.DefaultLabel);}else FCKToolbarSpecialCombo_RefreshActiveItems(this._Combo,B);}}}else A=-1;if (A==this.State) return;if (A==-1){this._Combo.DeselectAll();this._Combo.SetLabel('');};this.State=A;this._Combo.SetEnabled(A!=-1);};FCKToolbarSpecialCombo.prototype.Enable=function(){this.RefreshState();};FCKToolbarSpecialCombo.prototype.Disable=function(){this.State=-1;this._Combo.DeselectAll();this._Combo.SetLabel('');this._Combo.SetEnabled(false);}; +var FCKToolbarStyleCombo=function(A,B){if (A===false) return;this.CommandName='Style';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultStyleLabel||'';};FCKToolbarStyleCombo.prototype=new FCKToolbarSpecialCombo;FCKToolbarStyleCombo.prototype.GetLabel=function(){return FCKLang.Style;};FCKToolbarStyleCombo.prototype.GetStyles=function(){var A={};var B=FCK.ToolbarSet.CurrentInstance.Styles.GetStyles();for (var C in B){var D=B[C];if (!D.IsCore) A[C]=D;};return A;};FCKToolbarStyleCombo.prototype.CreateItems=function(A){var B=A._Panel.Document;FCKTools.AppendStyleSheet(B,FCKConfig.ToolbarComboPreviewCSS);FCKTools.AppendStyleString(B,FCKConfig.EditorAreaStyles);B.body.className+=' ForceBaseFont';FCKConfig.ApplyBodyAttributes(B.body);var C=this.GetStyles();for (var D in C){var E=C[D];var F=E.GetType()==2?D:FCKToolbarStyleCombo_BuildPreview(E,E.Label||D);var G=A.AddItem(D,F);G.Style=E;};A.OnBeforeClick=this.StyleCombo_OnBeforeClick;};FCKToolbarStyleCombo.prototype.RefreshActiveItems=function(A){var B=FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement(true);if (B){var C=new FCKElementPath(B);var D=C.Elements;for (var e=0;e');var E=A.Element;if (E=='bdo') E='span';D=['<',E];var F=A._StyleDesc.Attributes;if (F){for (var G in F){D.push(' ',G,'="',A.GetFinalAttributeValue(G),'"');}};if (A._GetStyleText().length>0) D.push(' style="',A.GetFinalStyleValue(),'"');D.push('>',B,'');if (C==0) D.push('');return D.join('');}; +var FCKToolbarFontFormatCombo=function(A,B){if (A===false) return;this.CommandName='FontFormat';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.NormalLabel='Normal';this.PanelWidth=190;this.DefaultLabel=FCKConfig.DefaultFontFormatLabel||'';};FCKToolbarFontFormatCombo.prototype=new FCKToolbarStyleCombo(false);FCKToolbarFontFormatCombo.prototype.GetLabel=function(){return FCKLang.FontFormat;};FCKToolbarFontFormatCombo.prototype.GetStyles=function(){var A={};var B=FCKLang['FontFormats'].split(';');var C={p:B[0],pre:B[1],address:B[2],h1:B[3],h2:B[4],h3:B[5],h4:B[6],h5:B[7],h6:B[8],div:B[9]||(B[0]+' (DIV)')};var D=FCKConfig.FontFormats.split(';');for (var i=0;i';G.open();G.write(''+H+''+document.getElementById('xToolbarSpace').innerHTML+'');G.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_InitOutFrame(G);FCKTools.AddEventListener(G,'contextmenu',FCKTools.CancelEvent);FCKTools.AppendStyleSheet(G,FCKConfig.SkinEditorCSS);B=D.__FCKToolbarSet=new FCKToolbarSet(G);B._IFrame=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(D,FCKToolbarSet_Target_Cleanup);};B.CurrentInstance=FCK;if (!B.ToolbarItems) B.ToolbarItems=FCKToolbarItems;FCK.AttachToOnSelectionChange(B.RefreshItemsState);return B;};function FCK_OnBlur(A){var B=A.ToolbarSet;if (B.CurrentInstance==A) B.Disable();};function FCK_OnFocus(A){var B=A.ToolbarSet;var C=A||FCK;B.CurrentInstance.FocusManager.RemoveWindow(B._IFrame.contentWindow);B.CurrentInstance=C;C.FocusManager.AddWindow(B._IFrame.contentWindow,true);B.Enable();};function FCKToolbarSet_Cleanup(){this._TargetElement=null;this._IFrame=null;};function FCKToolbarSet_Target_Cleanup(){this.__FCKToolbarSet=null;};var FCKToolbarSet=function(A){this._Document=A;this._TargetElement=A.getElementById('xToolbar');var B=A.getElementById('xExpandHandle');var C=A.getElementById('xCollapseHandle');B.title=FCKLang.ToolbarExpand;FCKTools.AddEventListener(B,'click',FCKToolbarSet_Expand_OnClick);C.title=FCKLang.ToolbarCollapse;FCKTools.AddEventListener(C,'click',FCKToolbarSet_Collapse_OnClick);if (!FCKConfig.ToolbarCanCollapse||FCKConfig.ToolbarStartExpanded) this.Expand();else this.Collapse();C.style.display=FCKConfig.ToolbarCanCollapse?'':'none';if (FCKConfig.ToolbarCanCollapse) C.style.display='';else A.getElementById('xTBLeftBorder').style.display='';this.Toolbars=[];this.IsLoaded=false;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarSet_Cleanup);};function FCKToolbarSet_Expand_OnClick(){FCK.ToolbarSet.Expand();};function FCKToolbarSet_Collapse_OnClick(){FCK.ToolbarSet.Collapse();};FCKToolbarSet.prototype.Expand=function(){this._ChangeVisibility(false);};FCKToolbarSet.prototype.Collapse=function(){this._ChangeVisibility(true);};FCKToolbarSet.prototype._ChangeVisibility=function(A){this._Document.getElementById('xCollapsed').style.display=A?'':'none';this._Document.getElementById('xExpanded').style.display=A?'none':'';if (FCKBrowserInfo.IsGecko){FCKTools.RunFunction(window.onresize);}};FCKToolbarSet.prototype.Load=function(A){this.Name=A;this.Items=[];this.ItemsWysiwygOnly=[];this.ItemsContextSensitive=[];this._TargetElement.innerHTML='';var B=FCKConfig.ToolbarSets[A];if (!B){alert(FCKLang.UnknownToolbarSet.replace(/%1/g,A));return;};this.Toolbars=[];for (var x=0;x0) break;}catch (e){break;};D=D.parent;};var E=D.document;var F=function(){if (!B) B=FCKConfig.FloatingPanelsZIndex+999;return++B;};var G=function(){if (!C) return;var H=FCKTools.IsStrictMode(E)?E.documentElement:E.body;FCKDomTools.SetElementStyles(C,{'width':Math.max(H.scrollWidth,H.clientWidth,E.scrollWidth||0)-1+'px','height':Math.max(H.scrollHeight,H.clientHeight,E.scrollHeight||0)-1+'px'});};var I=function(element){element.style.cssText='margin:0;padding:0;border:0;background-color:transparent;background-image:none;';};return {OpenDialog:function(dialogName,dialogTitle,dialogPage,width,height,customValue,parentWindow,resizable){if (!A) this.DisplayMainCover();var J={Title:dialogTitle,Page:dialogPage,Editor:window,CustomValue:customValue,TopWindow:D};FCK.ToolbarSet.CurrentInstance.Selection.Save();var K=FCKTools.GetViewPaneSize(D);var L=FCKTools.GetScrollPosition(D);var M=Math.max(L.Y+(K.Height-height-20)/2,0);var N=Math.max(L.X+(K.Width-width-20)/2,0);var O=E.createElement('iframe');I(O);O.src=FCKConfig.EDPath+'editor/fckdialog.html';O.frameBorder=0;O.allowTransparency=true;FCKDomTools.SetElementStyles(O,{'position':'absolute','top':M+'px','left':N+'px','width':width+'px','height':height+'px','zIndex':F()});O._DialogArguments=J;E.body.appendChild(O);O._ParentDialog=A;A=O;},OnDialogClose:function(dialogWindow){var O=dialogWindow.frameElement;FCKDomTools.RemoveNode(O);if (O._ParentDialog){A=O._ParentDialog;O._ParentDialog.contentWindow.SetEnabled(true);}else{if (!FCKBrowserInfo.IsIE) FCK.Focus();this.HideMainCover();setTimeout(function(){ A=null;},0);FCK.ToolbarSet.CurrentInstance.Selection.Release();}},DisplayMainCover:function(){C=E.createElement('div');I(C);FCKDomTools.SetElementStyles(C,{'position':'absolute','zIndex':F(),'top':'0px','left':'0px','backgroundColor':FCKConfig.BackgroundBlockerColor});FCKDomTools.SetOpacity(C,FCKConfig.BackgroundBlockerOpacity);if (FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsIE7){var Q=E.createElement('iframe');I(Q);Q.hideFocus=true;Q.frameBorder=0;Q.src=FCKTools.GetVoidUrl();FCKDomTools.SetElementStyles(Q,{'width':'100%','height':'100%','position':'absolute','left':'0px','top':'0px','filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'});C.appendChild(Q);};FCKTools.AddEventListener(D,'resize',G);G();E.body.appendChild(C);FCKFocusManager.Lock();},HideMainCover:function(){FCKDomTools.RemoveNode(C);FCKFocusManager.Unlock();},GetCover:function(){return C;}};})(); +var FCKMenuItem=function(A,B,C,D,E,F){this.Name=B;this.Label=C||B;this.IsDisabled=E;this.Icon=new FCKIcon(D);this.SubMenu=new FCKMenuBlockPanel();this.SubMenu.Parent=A;this.SubMenu.OnClick=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnClick,this);this.CustomData=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuItem_Cleanup);};FCKMenuItem.prototype.AddItem=function(A,B,C,D,E){this.HasSubMenu=true;return this.SubMenu.AddItem(A,B,C,D,E);};FCKMenuItem.prototype.AddSeparator=function(){this.SubMenu.AddSeparator();};FCKMenuItem.prototype.Create=function(A){var B=this.HasSubMenu;var C=FCKTools.GetElementDocument(A);var r=this.MainElement=A.insertRow(-1);r.className=this.IsDisabled?'MN_Item_Disabled':'MN_Item';if (!this.IsDisabled){FCKTools.AddEventListenerEx(r,'mouseover',FCKMenuItem_OnMouseOver,[this]);FCKTools.AddEventListenerEx(r,'click',FCKMenuItem_OnClick,[this]);if (!B) FCKTools.AddEventListenerEx(r,'mouseout',FCKMenuItem_OnMouseOut,[this]);};var D=r.insertCell(-1);D.className='MN_Icon';D.appendChild(this.Icon.CreateIconElement(C));D=r.insertCell(-1);D.className='MN_Label';D.noWrap=true;D.appendChild(C.createTextNode(this.Label));D=r.insertCell(-1);if (B){D.className='MN_Arrow';var E=D.appendChild(C.createElement('IMG'));E.src=FCK_IMAGES_PATH+'arrow_'+FCKLang.Dir+'.gif';E.width=4;E.height=7;this.SubMenu.Create();this.SubMenu.Panel.OnHide=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnHide,this);}};FCKMenuItem.prototype.Activate=function(){this.MainElement.className='MN_Item_Over';if (this.HasSubMenu){this.SubMenu.Show(this.MainElement.offsetWidth+2,-2,this.MainElement);};FCKTools.RunFunction(this.OnActivate,this);};FCKMenuItem.prototype.Deactivate=function(){this.MainElement.className='MN_Item';if (this.HasSubMenu) this.SubMenu.Hide();};function FCKMenuItem_SubMenu_OnClick(A,B){FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuItem_SubMenu_OnHide(A){A.Deactivate();};function FCKMenuItem_OnClick(A,B){if (B.HasSubMenu) B.Activate();else{B.Deactivate();FCKTools.RunFunction(B.OnClick,B,[B]);}};function FCKMenuItem_OnMouseOver(A,B){B.Activate();};function FCKMenuItem_OnMouseOut(A,B){B.Deactivate();};function FCKMenuItem_Cleanup(){this.MainElement=null;}; +var FCKMenuBlock=function(){this._Items=[];};FCKMenuBlock.prototype.Count=function(){return this._Items.length;};FCKMenuBlock.prototype.AddItem=function(A,B,C,D,E){var F=new FCKMenuItem(this,A,B,C,D,E);F.OnClick=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnClick,this);F.OnActivate=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnActivate,this);this._Items.push(F);return F;};FCKMenuBlock.prototype.AddSeparator=function(){this._Items.push(new FCKMenuSeparator());};FCKMenuBlock.prototype.RemoveAllItems=function(){this._Items=[];var A=this._ItemsTable;if (A){while (A.rows.length>0) A.deleteRow(0);}};FCKMenuBlock.prototype.Create=function(A){if (!this._ItemsTable){if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuBlock_Cleanup);this._Window=FCKTools.GetElementWindow(A);var B=FCKTools.GetElementDocument(A);var C=A.appendChild(B.createElement('table'));C.cellPadding=0;C.cellSpacing=0;FCKTools.DisableSelection(C);var D=C.insertRow(-1).insertCell(-1);D.className='MN_Menu';var E=this._ItemsTable=D.appendChild(B.createElement('table'));E.cellPadding=0;E.cellSpacing=0;};for (var i=0;i0&&F.href.length==0);if (G) return;menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}}; +var FCKPlugin=function(A,B,C){this.Name=A;this.BasePath=C?C:FCKConfig.PluginsPath;this.Path=this.BasePath+A+'/';if (!B||B.length==0) this.AvailableLangs=[];else this.AvailableLangs=B.split(',');};FCKPlugin.prototype.Load=function(){if (this.AvailableLangs.length>0){var A;if (this.AvailableLangs.IndexOf(FCKLanguageManager.ActiveLanguage.Code)>=0) A=FCKLanguageManager.ActiveLanguage.Code;else A=this.AvailableLangs[0];LoadScript(this.Path+'lang/'+A+'.js');};LoadScript(this.Path+'fckextend.js');}; +var FCKPlugins=FCK.Plugins={};FCKPlugins.ItemsCount=0;FCKPlugins.Items={};FCKPlugins.Load=function(){var A=FCKPlugins.Items;for (var i=0;i", +DlgInfoTab : "Info", +DlgAlertUrl : "Please insert the URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Language Direction", +DlgGenLangDirLtr : "Left to Right (LTR)", +DlgGenLangDirRtl : "Right to Left (RTL)", +DlgGenLangCode : "Language Code", +DlgGenAccessKey : "Access Key", +DlgGenName : "Name", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Long Description URL", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Advisory Title", +DlgGenContType : "Advisory Content Type", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Image Properties", +DlgImgInfoTab : "Image Info", +DlgImgBtnUpload : "Send it to the Server", +DlgImgURL : "URL", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternative Text", +DlgImgWidth : "Width", +DlgImgHeight : "Height", +DlgImgLockRatio : "Lock Ratio", +DlgBtnResetSize : "Reset Size", +DlgImgBorder : "Border", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Align", +DlgImgAlignLeft : "Left", +DlgImgAlignAbsBottom: "Abs Bottom", +DlgImgAlignAbsMiddle: "Abs Middle", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Bottom", +DlgImgAlignMiddle : "Middle", +DlgImgAlignRight : "Right", +DlgImgAlignTextTop : "Text Top", +DlgImgAlignTop : "Top", +DlgImgPreview : "Preview", +DlgImgAlertUrl : "Please type the image URL", +DlgImgLinkTab : "Link", +DlgImgWaterMark : "WaterMark", + +// Flash Dialog +DlgFlashTitle : "Video Properties", +DlgFlashChkPlay : "Auto Play", +DlgFlashChkLoop : "Loop", +DlgFlashChkMenu : "Enable Flash Menu", +DlgFlashScale : "Scale", +DlgFlashScaleAll : "Show all", +DlgFlashScaleNoBorder : "No Border", +DlgFlashScaleFit : "Exact Fit", + +//Media Dialog +DlgMediaTitle : "Media Properties", + +// Attach Dialog +DlgAttachTitle : "Attachment Upload", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link Info", +DlgLnkTargetTab : "Target", + +DlgLnkType : "Link Type", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Link to anchor in the text", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Select an Anchor", +DlgLnkAnchorByName : "By Anchor Name", +DlgLnkAnchorById : "By Element Id", +DlgLnkNoAnchors : "(No anchors available in the document)", +DlgLnkEMail : "E-Mail Address", +DlgLnkEMailSubject : "Message Subject", +DlgLnkEMailBody : "Message Body", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Send it to the Server", + +DlgLnkTarget : "Target", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "New Window (_blank)", +DlgLnkTargetParent : "Parent Window (_parent)", +DlgLnkTargetSelf : "Same Window (_self)", +DlgLnkTargetTop : "Topmost Window (_top)", +DlgLnkTargetFrameName : "Target Frame Name", +DlgLnkPopWinName : "Popup Window Name", +DlgLnkPopWinFeat : "Popup Window Features", +DlgLnkPopResize : "Resizable", +DlgLnkPopLocation : "Location Bar", +DlgLnkPopMenu : "Menu Bar", +DlgLnkPopScroll : "Scroll Bars", +DlgLnkPopStatus : "Status Bar", +DlgLnkPopToolbar : "Toolbar", +DlgLnkPopFullScrn : "Full Screen (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "Width", +DlgLnkPopHeight : "Height", +DlgLnkPopLeft : "Left Position", +DlgLnkPopTop : "Top Position", + +DlnLnkMsgNoUrl : "Please type the link URL", +DlnLnkMsgNoEMail : "Please type the e-mail address", +DlnLnkMsgNoAnchor : "Please select an anchor", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", + +// Color Dialog +DlgColorTitle : "Select Color", +DlgColorBtnClear : "Clear", +DlgColorHighlight : "Highlight", +DlgColorSelected : "Selected", + +// Smiley Dialog +DlgSmileyTitle : "Insert a Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Select Special Character", + +// Table Dialog +DlgTableTitle : "Table Properties", +DlgTableRows : "Rows", +DlgTableColumns : "Columns", +DlgTableBorder : "Border size", +DlgTableAlign : "Alignment", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Left", +DlgTableAlignCenter : "Center", +DlgTableAlignRight : "Right", +DlgTableWidth : "Width", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Height", +DlgTableCellSpace : "Cell spacing", +DlgTableCellPad : "Cell padding", +DlgTableCaption : "Caption", +DlgTableSummary : "Summary", + +// Table Cell Dialog +DlgCellTitle : "Cell Properties", +DlgCellWidth : "Width", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Height", +DlgCellWordWrap : "Word Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Yes", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Horizontal Alignment", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Left", +DlgCellHorAlignCenter : "Center", +DlgCellHorAlignRight: "Right", +DlgCellVerAlign : "Vertical Alignment", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Top", +DlgCellVerAlignMiddle : "Middle", +DlgCellVerAlignBottom : "Bottom", +DlgCellVerAlignBaseline : "Baseline", +DlgCellRowSpan : "Rows Span", +DlgCellCollSpan : "Columns Span", +DlgCellBackColor : "Background Color", +DlgCellBorderColor : "Border Color", +DlgCellBtnSelect : "Select...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", + +// Find Dialog +DlgFindTitle : "Find", +DlgFindFindBtn : "Find", +DlgFindNotFoundMsg : "The specified text was not found.", + +// Replace Dialog +DlgReplaceTitle : "Replace", +DlgReplaceFindLbl : "Find what:", +DlgReplaceReplaceLbl : "Replace with:", +DlgReplaceCaseChk : "Match case", +DlgReplaceReplaceBtn : "Replace", +DlgReplaceReplAllBtn : "Replace All", +DlgReplaceWordChk : "Match whole word", + +// Paste Operations / Dialog +PasteErrorCut : "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).", +PasteErrorCopy : "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).", + +PasteAsText : "Paste as Plain Text", +PasteFromWord : "Paste from Word", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", +DlgPasteIgnoreFont : "Ignore Font Face definitions", +DlgPasteRemoveStyles : "Remove Styles definitions", + +// Color Picker +ColorAutomatic : "Automatic", +ColorMoreColors : "More Colors...", + +// Document Properties +DocProps : "Document Properties", + +// Anchor Dialog +DlgAnchorTitle : "Anchor Properties", +DlgAnchorName : "Anchor Name", +DlgAnchorErrorName : "Please type the anchor name", + +// Speller Pages Dialog +DlgSpellNotInDic : "Not in dictionary", +DlgSpellChangeTo : "Change to", +DlgSpellBtnIgnore : "Ignore", +DlgSpellBtnIgnoreAll : "Ignore All", +DlgSpellBtnReplace : "Replace", +DlgSpellBtnReplaceAll : "Replace All", +DlgSpellBtnUndo : "Undo", +DlgSpellNoSuggestions : "- No suggestions -", +DlgSpellProgress : "Spell check in progress...", +DlgSpellNoMispell : "Spell check complete: No misspellings found", +DlgSpellNoChanges : "Spell check complete: No words changed", +DlgSpellOneChange : "Spell check complete: One word changed", +DlgSpellManyChanges : "Spell check complete: %1 words changed", + +IeSpellDownload : "Spell checker not installed. Do you want to download it now?", + +// Button Dialog +DlgButtonText : "Text (Value)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Button", +DlgButtonTypeSbm : "Submit", +DlgButtonTypeRst : "Reset", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", +DlgCheckboxValue : "Value", +DlgCheckboxSelected : "Selected", + +// Form Dialog +DlgFormName : "Name", +DlgFormAction : "Action", +DlgFormMethod : "Method", + +// Select Field Dialog +DlgSelectName : "Name", +DlgSelectValue : "Value", +DlgSelectSize : "Size", +DlgSelectLines : "lines", +DlgSelectChkMulti : "Allow multiple selections", +DlgSelectOpAvail : "Available Options", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Value", +DlgSelectBtnAdd : "Add", +DlgSelectBtnModify : "Modify", +DlgSelectBtnUp : "Up", +DlgSelectBtnDown : "Down", +DlgSelectBtnSetValue : "Set as selected value", +DlgSelectBtnDelete : "Delete", + +// Textarea Dialog +DlgTextareaName : "Name", +DlgTextareaCols : "Columns", +DlgTextareaRows : "Rows", + +// Text Field Dialog +DlgTextName : "Name", +DlgTextValue : "Value", +DlgTextCharWidth : "Character Width", +DlgTextMaxChars : "Maximum Characters", +DlgTextType : "Type", +DlgTextTypeText : "Text", +DlgTextTypePass : "Password", + +// Hidden Field Dialog +DlgHiddenName : "Name", +DlgHiddenValue : "Value", + +// Bulleted List Dialog +BulletedListProp : "Bulleted List Properties", +NumberedListProp : "Numbered List Properties", +DlgLstStart : "Start", +DlgLstType : "Type", +DlgLstTypeCircle : "Circle", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "Square", +DlgLstTypeNumbers : "Numbers (1, 2, 3)", +DlgLstTypeLCase : "Lowercase Letters (a, b, c)", +DlgLstTypeUCase : "Uppercase Letters (A, B, C)", +DlgLstTypeSRoman : "Small Roman Numerals (i, ii, iii)", +DlgLstTypeLRoman : "Large Roman Numerals (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Background", +DlgDocColorsTab : "Colors and Margins", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Page Title", +DlgDocLangDir : "Language Direction", +DlgDocLangDirLTR : "Left to Right (LTR)", +DlgDocLangDirRTL : "Right to Left (RTL)", +DlgDocLangCode : "Language Code", +DlgDocCharSet : "Character Set Encoding", +DlgDocCharSetCE : "Central European", +DlgDocCharSetCT : "Chinese Traditional (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Greek", +DlgDocCharSetJP : "Japanese", +DlgDocCharSetKR : "Korean", +DlgDocCharSetTR : "Turkish", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "Other Character Set Encoding", + +DlgDocDocType : "Document Type Heading", +DlgDocDocTypeOther : "Other Document Type Heading", +DlgDocIncXHTML : "Include XHTML Declarations", +DlgDocBgColor : "Background Color", +DlgDocBgImage : "Background Image URL", +DlgDocBgNoScroll : "Nonscrolling Background", +DlgDocCText : "Text", +DlgDocCLink : "Link", +DlgDocCVisited : "Visited Link", +DlgDocCActive : "Active Link", +DlgDocMargins : "Page Margins", +DlgDocMaTop : "Top", +DlgDocMaLeft : "Left", +DlgDocMaRight : "Right", +DlgDocMaBottom : "Bottom", +DlgDocMeIndex : "Document Indexing Keywords (comma separated)", +DlgDocMeDescr : "Document Description", +DlgDocMeAuthor : "Author", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Preview", + +// Templates Dialog +Templates : "Templates", +DlgTemplatesTitle : "Content Templates", +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", +DlgTemplatesLoading : "Loading templates list. Please wait...", +DlgTemplatesNoTpl : "(No templates defined)", +DlgTemplatesReplace : "Replace actual contents", + +// About Dialog +DlgAboutAboutTab : "About", +DlgAboutBrowserInfoTab : "Browser Info", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "version", +DlgAboutInfo : "For further information go to" +}; diff --git a/member/editor/fckeditor/editor/lang/zh-cn.js b/member/editor/fckeditor/editor/lang/zh-cn.js new file mode 100644 index 0000000..cdbd6bb --- /dev/null +++ b/member/editor/fckeditor/editor/lang/zh-cn.js @@ -0,0 +1,504 @@ +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "折叠工具栏", +ToolbarExpand : "展开工具栏", + +// Toolbar Items and Context Menu +Save : "保存", +NewPage : "新建", +Preview : "预览", +Cut : "剪切", +Copy : "复制", +Paste : "粘贴", +PasteText : "粘贴为无格式文本", +PasteWord : "从 MS Word 粘贴", +Print : "打印", +SelectAll : "全选", +RemoveFormat : "清除格式", +InsertLinkLbl : "超链接", +InsertLink : "插入/编辑超链接", +RemoveLink : "取消超链接", +Anchor : "插入/编辑锚点链接", +AnchorDelete : "清除锚点链接", +InsertImageLbl : "图象", +InsertImage : "插入/编辑图象", +InsertFlashLbl : "Flash", +InsertFlash : "插入/编辑视频", +InsertMedia : "插入多媒体文件", +InsertMediaLbl : "多媒体文件", +InsertAttachLbl : "附件", +InsertAttach : "上传附件", +InsertTableLbl : "表格", +InsertTable : "插入/编辑表格", +InsertLineLbl : "水平线", +InsertLine : "插入水平线", +InsertSpecialCharLbl: "特殊符号", +InsertSpecialChar : "插入特殊符号", +InsertSmileyLbl : "表情符", +InsertSmiley : "插入表情图标", +About : "关于 FCKeditor", +Bold : "加粗", +Italic : "倾斜", +Underline : "下划线", +StrikeThrough : "删除线", +Subscript : "下标", +Superscript : "上标", +LeftJustify : "左对齐", +CenterJustify : "居中对齐", +RightJustify : "右对齐", +BlockJustify : "两端对齐", +DecreaseIndent : "减少缩进量", +IncreaseIndent : "增加缩进量", +Blockquote : "引用文字", +Undo : "撤消", +Redo : "重做", +NumberedListLbl : "编号列表", +NumberedList : "插入/删除编号列表", +BulletedListLbl : "项目列表", +BulletedList : "插入/删除项目列表", +ShowTableBorders : "显示表格边框", +ShowDetails : "显示详细资料", +Style : "样式", +FontFormat : "格式", +Font : "字体", +FontSize : "大小", +TextColor : "文本颜色", +BGColor : "背景颜色", +Source : "源代码", +Find : "查找", +Replace : "替换", +SpellCheck : "拼写检查", +UniversalKeyboard : "软键盘", +PageBreakLbl : "分页符", +PageBreak : "插入分页符", + +Form : "表单", +Checkbox : "复选框", +RadioButton : "单选按钮", +TextField : "单行文本", +Textarea : "多行文本", +HiddenField : "隐藏域", +Button : "按钮", +SelectionField : "列表/菜单", +ImageButton : "图像域", + +FitWindow : "全屏编辑", +ShowBlocks : "显示区块", + +// Context Menu +EditLink : "编辑超链接", +CellCM : "单元格", +RowCM : "行", +ColumnCM : "列", +InsertRowAfter : "下插入行", +InsertRowBefore : "上插入行", +DeleteRows : "删除行", +InsertColumnAfter : "右插入列", +InsertColumnBefore : "左插入列", +DeleteColumns : "删除列", +InsertCellAfter : "右插入单元格", +InsertCellBefore : "左插入单元格", +DeleteCells : "删除单元格", +MergeCells : "合并单元格", +MergeRight : "右合并单元格", +MergeDown : "下合并单元格", +HorizontalSplitCell : "橫拆分单元格", +VerticalSplitCell : "縱拆分单元格", +TableDelete : "删除表格", +CellProperties : "单元格属性", +TableProperties : "表格属性", +ImageProperties : "图象属性", +FlashProperties : "视频属性", +MediaProperties : "媒体", + +AnchorProp : "锚点链接属性", +ButtonProp : "按钮属性", +CheckboxProp : "复选框属性", +HiddenFieldProp : "隐藏域属性", +RadioButtonProp : "单选按钮属性", +ImageButtonProp : "图像域属性", +TextFieldProp : "单行文本属性", +SelectionFieldProp : "菜单/列表属性", +TextareaProp : "多行文本属性", +FormProp : "表单属性", + +FontFormats : "普通;已编排格式;地址;标题 1;标题 2;标题 3;标题 4;标题 5;标题 6;段落(DIV)", + +// Alerts and Messages +ProcessingXHTML : "正在处理 XHTML,请稍等...", +Done : "完成", +PasteWordConfirm : "您要粘贴的内容好像是来自 MS Word,是否要清除 MS Word 格式后再粘贴?", +NotCompatiblePaste : "该命令需要 Internet Explorer 5.5 或更高版本的支持,是否按常规粘贴进行?", +UnknownToolbarItem : "未知工具栏项目 \"%1\"", +UnknownCommand : "未知命令名称 \"%1\"", +NotImplemented : "命令无法执行", +UnknownToolbarSet : "工具栏设置 \"%1\" 不存在", +NoActiveX : "浏览器安全设置限制了本编辑器的某些功能。您必须启用安全设置中的“运行 ActiveX 控件和插件”,否则将出现某些错误并缺少功能。", +BrowseServerBlocked : "无法打开资源浏览器,请确认是否启用了禁止弹出窗口。", +DialogBlocked : "无法打开对话框窗口,请确认是否启用了禁止弹出窗口或网页对话框(IE)。", + +// Dialogs +DlgBtnOK : "确定", +DlgBtnCancel : "取消", +DlgBtnClose : "关闭", +DlgBtnBrowseServer : "浏览服务器", +DlgAdvancedTag : "高级", +DlgOpOther : "<其它>", +DlgInfoTab : "信息", +DlgAlertUrl : "请插入 URL", + +// General Dialogs Labels +DlgGenNotSet : "<没有设置>", +DlgGenId : "ID", +DlgGenLangDir : "语言方向", +DlgGenLangDirLtr : "从左到右 (LTR)", +DlgGenLangDirRtl : "从右到左 (RTL)", +DlgGenLangCode : "语言代码", +DlgGenAccessKey : "访问键", +DlgGenName : "名称", +DlgGenTabIndex : "Tab 键次序", +DlgGenLongDescr : "详细说明地址", +DlgGenClass : "样式类名称", +DlgGenTitle : "标题", +DlgGenContType : "内容类型", +DlgGenLinkCharset : "字符编码", +DlgGenStyle : "行内样式", + +// Image Dialog +DlgImgTitle : "图象属性", +DlgImgInfoTab : "图象", +DlgImgBtnUpload : "上传到服务器上", +DlgImgURL : "文件地址", +DlgImgUpload : "上传", +DlgImgAlt : "Alt属性", +DlgImgWidth : "宽度", +DlgImgHeight : "高度", +DlgImgLockRatio : "锁定比例", +DlgBtnResetSize : "恢复尺寸", +DlgImgBorder : "边框大小", +DlgImgHSpace : "水平间距", +DlgImgVSpace : "垂直间距", +DlgImgAlign : "对齐方式", +DlgImgAlignLeft : "左对齐", +DlgImgAlignAbsBottom: "绝对底边", +DlgImgAlignAbsMiddle: "绝对居中", +DlgImgAlignBaseline : "基线", +DlgImgAlignBottom : "底边", +DlgImgAlignMiddle : "居中", +DlgImgAlignRight : "右对齐", +DlgImgAlignTextTop : "文本上方", +DlgImgAlignTop : "顶端", +DlgImgPreview : "预览", +DlgImgAlertUrl : "请输入图象地址", +DlgImgLinkTab : "链接", +DlgImgWaterMark : "水印", + +// Flash Dialog +DlgFlashTitle : "视频属性", +DlgFlashChkPlay : "自动播放", +DlgFlashChkLoop : "循环", +DlgFlashChkMenu : "启用菜单", +DlgFlashScale : "缩放", +DlgFlashScaleAll : "全部显示", +DlgFlashScaleNoBorder : "无边框", +DlgFlashScaleFit : "严格匹配", + +//Media Dialog +DlgMediaTitle : "多媒体属性", + +// Attach Dialog +DlgAttachTitle : "上传附件", + +// Link Dialog +DlgLnkWindowTitle : "超链接", +DlgLnkInfoTab : "超链接信息", +DlgLnkTargetTab : "目标", + +DlgLnkType : "超链接类型", +DlgLnkTypeURL : "超链接", +DlgLnkTypeAnchor : "页内锚点链接", +DlgLnkTypeEMail : "电子邮件", +DlgLnkProto : "协议", +DlgLnkProtoOther : "<其它>", +DlgLnkURL : "地址", +DlgLnkAnchorSel : "选择一个锚点", +DlgLnkAnchorByName : "按锚点名称", +DlgLnkAnchorById : "按锚点 ID", +DlgLnkNoAnchors : "(此文档没有可用的锚点)", +DlgLnkEMail : "地址", +DlgLnkEMailSubject : "主题", +DlgLnkEMailBody : "内容", +DlgLnkUpload : "上传", +DlgLnkBtnUpload : "上传到服务器上", + +DlgLnkTarget : "目标", +DlgLnkTargetFrame : "<框架>", +DlgLnkTargetPopup : "<弹出窗口>", +DlgLnkTargetBlank : "新窗口 (_blank)", +DlgLnkTargetParent : "父窗口 (_parent)", +DlgLnkTargetSelf : "本窗口 (_self)", +DlgLnkTargetTop : "整页 (_top)", +DlgLnkTargetFrameName : "目标框架名称", +DlgLnkPopWinName : "弹出窗口名称", +DlgLnkPopWinFeat : "弹出窗口属性", +DlgLnkPopResize : "调整大小", +DlgLnkPopLocation : "地址栏", +DlgLnkPopMenu : "菜单栏", +DlgLnkPopScroll : "滚动条", +DlgLnkPopStatus : "状态栏", +DlgLnkPopToolbar : "工具栏", +DlgLnkPopFullScrn : "全屏 (IE)", +DlgLnkPopDependent : "依附 (NS)", +DlgLnkPopWidth : "宽", +DlgLnkPopHeight : "高", +DlgLnkPopLeft : "左", +DlgLnkPopTop : "右", + +DlnLnkMsgNoUrl : "请输入超链接地址", +DlnLnkMsgNoEMail : "请输入电子邮件地址", +DlnLnkMsgNoAnchor : "请选择一个锚点", +DlnLnkMsgInvPopName : "弹出窗口名称必须以字母开头,并且不能含有空格。", + +// Color Dialog +DlgColorTitle : "选择颜色", +DlgColorBtnClear : "清除", +DlgColorHighlight : "预览", +DlgColorSelected : "选择", + +// Smiley Dialog +DlgSmileyTitle : "插入表情图标", + +// Special Character Dialog +DlgSpecialCharTitle : "选择特殊符号", + +// Table Dialog +DlgTableTitle : "表格属性", +DlgTableRows : "行数", +DlgTableColumns : "列数", +DlgTableBorder : "边框", +DlgTableAlign : "对齐", +DlgTableAlignNotSet : "<没有设置>", +DlgTableAlignLeft : "左对齐", +DlgTableAlignCenter : "居中", +DlgTableAlignRight : "右对齐", +DlgTableWidth : "宽度", +DlgTableWidthPx : "像素", +DlgTableWidthPc : "百分比", +DlgTableHeight : "高度", +DlgTableCellSpace : "间距", +DlgTableCellPad : "边距", +DlgTableCaption : "标题", +DlgTableSummary : "摘要", + +// Table Cell Dialog +DlgCellTitle : "单元格属性", +DlgCellWidth : "宽度", +DlgCellWidthPx : "像素", +DlgCellWidthPc : "百分比", +DlgCellHeight : "高度", +DlgCellWordWrap : "自动换行", +DlgCellWordWrapNotSet : "<没有设置>", +DlgCellWordWrapYes : "是", +DlgCellWordWrapNo : "否", +DlgCellHorAlign : "水平对齐", +DlgCellHorAlignNotSet : "<没有设置>", +DlgCellHorAlignLeft : "左对齐", +DlgCellHorAlignCenter : "居中", +DlgCellHorAlignRight: "右对齐", +DlgCellVerAlign : "垂直对齐", +DlgCellVerAlignNotSet : "<没有设置>", +DlgCellVerAlignTop : "顶端", +DlgCellVerAlignMiddle : "居中", +DlgCellVerAlignBottom : "底部", +DlgCellVerAlignBaseline : "基线", +DlgCellRowSpan : "纵跨行数", +DlgCellCollSpan : "横跨列数", +DlgCellBackColor : "背景颜色", +DlgCellBorderColor : "边框颜色", +DlgCellBtnSelect : "选择...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "查找和替换", + +// Find Dialog +DlgFindTitle : "查找", +DlgFindFindBtn : "查找", +DlgFindNotFoundMsg : "指定文本没有找到。", + +// Replace Dialog +DlgReplaceTitle : "替换", +DlgReplaceFindLbl : "查找:", +DlgReplaceReplaceLbl : "替换:", +DlgReplaceCaseChk : "区分大小写", +DlgReplaceReplaceBtn : "替换", +DlgReplaceReplAllBtn : "全部替换", +DlgReplaceWordChk : "全字匹配", + +// Paste Operations / Dialog +PasteErrorCut : "您的浏览器安全设置不允许编辑器自动执行剪切操作,请使用键盘快捷键(Ctrl+X)来完成。", +PasteErrorCopy : "您的浏览器安全设置不允许编辑器自动执行复制操作,请使用键盘快捷键(Ctrl+C)来完成。", + +PasteAsText : "粘贴为无格式文本", +PasteFromWord : "从 MS Word 粘贴", + +DlgPasteMsg2 : "请使用键盘快捷键(Ctrl+V)把内容粘贴到下面的方框里,再按 确定。", +DlgPasteSec : "因为你的浏览器的安全设置原因,本编辑器不能直接访问你的剪贴板内容,你需要在本窗口重新粘贴一次。", +DlgPasteIgnoreFont : "忽略 Font 标签", +DlgPasteRemoveStyles : "清理 CSS 样式", + +// Color Picker +ColorAutomatic : "自动", +ColorMoreColors : "其它颜色...", + +// Document Properties +DocProps : "页面属性", + +// Anchor Dialog +DlgAnchorTitle : "命名锚点", +DlgAnchorName : "锚点名称", +DlgAnchorErrorName : "请输入锚点名称", + +// Speller Pages Dialog +DlgSpellNotInDic : "没有在字典里", +DlgSpellChangeTo : "更改为", +DlgSpellBtnIgnore : "忽略", +DlgSpellBtnIgnoreAll : "全部忽略", +DlgSpellBtnReplace : "替换", +DlgSpellBtnReplaceAll : "全部替换", +DlgSpellBtnUndo : "撤消", +DlgSpellNoSuggestions : "- 没有建议 -", +DlgSpellProgress : "正在进行拼写检查...", +DlgSpellNoMispell : "拼写检查完成:没有发现拼写错误", +DlgSpellNoChanges : "拼写检查完成:没有更改任何单词", +DlgSpellOneChange : "拼写检查完成:更改了一个单词", +DlgSpellManyChanges : "拼写检查完成:更改了 %1 个单词", + +IeSpellDownload : "拼写检查插件还没安装,你是否想现在就下载?", + +// Button Dialog +DlgButtonText : "标签(值)", +DlgButtonType : "类型", +DlgButtonTypeBtn : "按钮", +DlgButtonTypeSbm : "提交", +DlgButtonTypeRst : "重设", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "名称", +DlgCheckboxValue : "选定值", +DlgCheckboxSelected : "已勾选", + +// Form Dialog +DlgFormName : "名称", +DlgFormAction : "动作", +DlgFormMethod : "方法", + +// Select Field Dialog +DlgSelectName : "名称", +DlgSelectValue : "选定", +DlgSelectSize : "高度", +DlgSelectLines : "行", +DlgSelectChkMulti : "允许多选", +DlgSelectOpAvail : "列表值", +DlgSelectOpText : "标签", +DlgSelectOpValue : "值", +DlgSelectBtnAdd : "新增", +DlgSelectBtnModify : "修改", +DlgSelectBtnUp : "上移", +DlgSelectBtnDown : "下移", +DlgSelectBtnSetValue : "设为初始化时选定", +DlgSelectBtnDelete : "删除", + +// Textarea Dialog +DlgTextareaName : "名称", +DlgTextareaCols : "字符宽度", +DlgTextareaRows : "行数", + +// Text Field Dialog +DlgTextName : "名称", +DlgTextValue : "初始值", +DlgTextCharWidth : "字符宽度", +DlgTextMaxChars : "最多字符数", +DlgTextType : "类型", +DlgTextTypeText : "文本", +DlgTextTypePass : "密码", + +// Hidden Field Dialog +DlgHiddenName : "名称", +DlgHiddenValue : "初始值", + +// Bulleted List Dialog +BulletedListProp : "项目列表属性", +NumberedListProp : "编号列表属性", +DlgLstStart : "开始序号", +DlgLstType : "列表类型", +DlgLstTypeCircle : "圆圈", +DlgLstTypeDisc : "圆点", +DlgLstTypeSquare : "方块", +DlgLstTypeNumbers : "数字 (1, 2, 3)", +DlgLstTypeLCase : "小写字母 (a, b, c)", +DlgLstTypeUCase : "大写字母 (A, B, C)", +DlgLstTypeSRoman : "小写罗马数字 (i, ii, iii)", +DlgLstTypeLRoman : "大写罗马数字 (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "常规", +DlgDocBackTab : "背景", +DlgDocColorsTab : "颜色和边距", +DlgDocMetaTab : "Meta 数据", + +DlgDocPageTitle : "页面标题", +DlgDocLangDir : "语言方向", +DlgDocLangDirLTR : "从左到右 (LTR)", +DlgDocLangDirRTL : "从右到左 (RTL)", +DlgDocLangCode : "语言代码", +DlgDocCharSet : "字符编码", +DlgDocCharSetCE : "中欧", +DlgDocCharSetCT : "繁体中文 (Big5)", +DlgDocCharSetCR : "西里尔文", +DlgDocCharSetGR : "希腊文", +DlgDocCharSetJP : "日文", +DlgDocCharSetKR : "韩文", +DlgDocCharSetTR : "土耳其文", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "西欧", +DlgDocCharSetOther : "其它字符编码", + +DlgDocDocType : "文档类型", +DlgDocDocTypeOther : "其它文档类型", +DlgDocIncXHTML : "包含 XHTML 声明", +DlgDocBgColor : "背景颜色", +DlgDocBgImage : "背景图像", +DlgDocBgNoScroll : "不滚动背景图像", +DlgDocCText : "文本", +DlgDocCLink : "超链接", +DlgDocCVisited : "已访问的超链接", +DlgDocCActive : "活动超链接", +DlgDocMargins : "页面边距", +DlgDocMaTop : "上", +DlgDocMaLeft : "左", +DlgDocMaRight : "右", +DlgDocMaBottom : "下", +DlgDocMeIndex : "页面索引关键字 (用半角逗号[,]分隔)", +DlgDocMeDescr : "页面说明", +DlgDocMeAuthor : "作者", +DlgDocMeCopy : "版权", +DlgDocPreview : "预览", + +// Templates Dialog +Templates : "模板", +DlgTemplatesTitle : "内容模板", +DlgTemplatesSelMsg : "请选择编辑器内容模板
    (当前内容将会被清除替换):", +DlgTemplatesLoading : "正在加载模板列表,请稍等...", +DlgTemplatesNoTpl : "(没有模板)", +DlgTemplatesReplace : "替换当前内容", + +// About Dialog +DlgAboutAboutTab : "关于", +DlgAboutBrowserInfoTab : "浏览器信息", +DlgAboutLicenseTab : "许可证", +DlgAboutVersion : "版本", +DlgAboutInfo : "要获得更多信息请访问 " +}; diff --git a/member/editor/fckeditor/editor/lang/zh.js b/member/editor/fckeditor/editor/lang/zh.js new file mode 100644 index 0000000..01058d8 --- /dev/null +++ b/member/editor/fckeditor/editor/lang/zh.js @@ -0,0 +1,504 @@ +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "隱藏面板", +ToolbarExpand : "顯示面板", + +// Toolbar Items and Context Menu +Save : "儲存", +NewPage : "開新檔案", +Preview : "預覽", +Cut : "剪下", +Copy : "複製", +Paste : "貼上", +PasteText : "貼為純文字格式", +PasteWord : "自 Word 貼上", +Print : "列印", +SelectAll : "全選", +RemoveFormat : "清除格式", +InsertLinkLbl : "超連結", +InsertLink : "插入/編輯超連結", +RemoveLink : "移除超連結", +Anchor : "插入/編輯錨點", +AnchorDelete : "移除錨點", +InsertImageLbl : "影像", +InsertImage : "插入/編輯影像", +InsertFlashLbl : "Flash", +InsertFlash : "插入/編輯視頻", +InsertMediaLbl : "多媒體", +InsertMedia : "插入/編輯 多媒體", +InsertAttachLbl : "附件", +InsertAttach : "上傳附件", +InsertTableLbl : "表格", +InsertTable : "插入/編輯表格", +InsertLineLbl : "水平線", +InsertLine : "插入水平線", +InsertSpecialCharLbl: "特殊符號", +InsertSpecialChar : "插入特殊符號", +InsertSmileyLbl : "表情符號", +InsertSmiley : "插入表情符號", +About : "關於 FCKeditor", +Bold : "粗體", +Italic : "斜體", +Underline : "底線", +StrikeThrough : "刪除線", +Subscript : "下標", +Superscript : "上標", +LeftJustify : "靠左對齊", +CenterJustify : "置中", +RightJustify : "靠右對齊", +BlockJustify : "左右對齊", +DecreaseIndent : "減少縮排", +IncreaseIndent : "增加縮排", +Blockquote : "块引用", +Undo : "復原", +Redo : "重複", +NumberedListLbl : "編號清單", +NumberedList : "插入/移除編號清單", +BulletedListLbl : "項目清單", +BulletedList : "插入/移除項目清單", +ShowTableBorders : "顯示表格邊框", +ShowDetails : "顯示詳細資料", +Style : "樣式", +FontFormat : "格式", +Font : "字體", +FontSize : "大小", +TextColor : "文字顏色", +BGColor : "背景顏色", +Source : "原始碼", +Find : "尋找", +Replace : "取代", +SpellCheck : "拼字檢查", +UniversalKeyboard : "萬國鍵盤", +PageBreakLbl : "分頁符號", +PageBreak : "插入分頁符號", + +Form : "表單", +Checkbox : "核取方塊", +RadioButton : "選項按鈕", +TextField : "文字方塊", +Textarea : "文字區域", +HiddenField : "隱藏欄位", +Button : "按鈕", +SelectionField : "清單/選單", +ImageButton : "影像按鈕", + +FitWindow : "編輯器最大化", +ShowBlocks : "顯示區塊", + +// Context Menu +EditLink : "編輯超連結", +CellCM : "儲存格", +RowCM : "列", +ColumnCM : "欄", +InsertRowAfter : "向下插入列", +InsertRowBefore : "向上插入列", +DeleteRows : "刪除列", +InsertColumnAfter : "向右插入欄", +InsertColumnBefore : "向左插入欄", +DeleteColumns : "刪除欄", +InsertCellAfter : "向右插入儲存格", +InsertCellBefore : "向左插入儲存格", +DeleteCells : "刪除儲存格", +MergeCells : "合併儲存格", +MergeRight : "向右合併儲存格", +MergeDown : "向下合併儲存格", +HorizontalSplitCell : "橫向分割儲存格", +VerticalSplitCell : "縱向分割儲存格", +TableDelete : "刪除表格", +CellProperties : "儲存格屬性", +TableProperties : "表格屬性", +ImageProperties : "影像屬性", +FlashProperties : "視頻屬性", +FlashProperties : "多媒體 屬性", + +AnchorProp : "錨點屬性", +ButtonProp : "按鈕屬性", +CheckboxProp : "核取方塊屬性", +HiddenFieldProp : "隱藏欄位屬性", +RadioButtonProp : "選項按鈕屬性", +ImageButtonProp : "影像按鈕屬性", +TextFieldProp : "文字方塊屬性", +SelectionFieldProp : "清單/選單屬性", +TextareaProp : "文字區域屬性", +FormProp : "表單屬性", + +FontFormats : "一般;已格式化;位址;標題 1;標題 2;標題 3;標題 4;標題 5;標題 6;一般 (DIV)", + +// Alerts and Messages +ProcessingXHTML : "處理 XHTML 中,請稍候…", +Done : "完成", +PasteWordConfirm : "您想貼上的文字似乎是自 Word 複製而來,請問您是否要先清除 Word 的格式後再行貼上?", +NotCompatiblePaste : "此指令僅在 Internet Explorer 5.5 或以上的版本有效。請問您是否同意不清除格式即貼上?", +UnknownToolbarItem : "未知工具列項目 \"%1\"", +UnknownCommand : "未知指令名稱 \"%1\"", +NotImplemented : "尚未安裝此指令", +UnknownToolbarSet : "工具列設定 \"%1\" 不存在", +NoActiveX : "瀏覽器的安全性設定限制了本編輯器的某些功能。您必須啟用安全性設定中的「執行ActiveX控制項與外掛程式」項目,否則本編輯器將會出現錯誤並缺少某些功能", +BrowseServerBlocked : "無法開啟資源瀏覽器,請確定所有快顯視窗封鎖程式是否關閉", +DialogBlocked : "無法開啟對話視窗,請確定所有快顯視窗封鎖程式是否關閉", + +// Dialogs +DlgBtnOK : "確定", +DlgBtnCancel : "取消", +DlgBtnClose : "關閉", +DlgBtnBrowseServer : "瀏覽伺服器端", +DlgAdvancedTag : "進階", +DlgOpOther : "<其他>", +DlgInfoTab : "資訊", +DlgAlertUrl : "請插入 URL", + +// General Dialogs Labels +DlgGenNotSet : "<尚未設定>", +DlgGenId : "ID", +DlgGenLangDir : "語言方向", +DlgGenLangDirLtr : "由左而右 (LTR)", +DlgGenLangDirRtl : "由右而左 (RTL)", +DlgGenLangCode : "語言代碼", +DlgGenAccessKey : "存取鍵", +DlgGenName : "名稱", +DlgGenTabIndex : "定位順序", +DlgGenLongDescr : "詳細 URL", +DlgGenClass : "樣式表類別", +DlgGenTitle : "標題", +DlgGenContType : "內容類型", +DlgGenLinkCharset : "連結資源之編碼", +DlgGenStyle : "樣式", + +// Image Dialog +DlgImgTitle : "影像屬性", +DlgImgInfoTab : "影像資訊", +DlgImgBtnUpload : "上傳至伺服器", +DlgImgURL : "URL", +DlgImgUpload : "上傳", +DlgImgAlt : "替代文字(alt)", +DlgImgWidth : "寬度", +DlgImgHeight : "高度", +DlgImgLockRatio : "等比例", +DlgBtnResetSize : "重設為原大小", +DlgImgBorder : "邊框", +DlgImgHSpace : "水平距離", +DlgImgVSpace : "垂直距離", +DlgImgAlign : "對齊", +DlgImgAlignLeft : "靠左對齊", +DlgImgAlignAbsBottom: "絕對下方", +DlgImgAlignAbsMiddle: "絕對中間", +DlgImgAlignBaseline : "基準線", +DlgImgAlignBottom : "靠下對齊", +DlgImgAlignMiddle : "置中對齊", +DlgImgAlignRight : "靠右對齊", +DlgImgAlignTextTop : "文字上方", +DlgImgAlignTop : "靠上對齊", +DlgImgPreview : "預覽", +DlgImgAlertUrl : "請輸入影像 URL", +DlgImgLinkTab : "超連結", +DlgImgWaterMark : "水印", + +// Flash Dialog +DlgFlashTitle : "視頻屬性", +DlgFlashChkPlay : "自動播放", +DlgFlashChkLoop : "重複", +DlgFlashChkMenu : "開啟選單", +DlgFlashScale : "縮放", +DlgFlashScaleAll : "全部顯示", +DlgFlashScaleNoBorder : "無邊框", +DlgFlashScaleFit : "精確符合", + +// Media Dialog +DlgMediaTitle : "多媒體屬性", + +// Attach Dialog +DlgAttachTitle : "上傳附件", + +// Link Dialog +DlgLnkWindowTitle : "超連結", +DlgLnkInfoTab : "超連結資訊", +DlgLnkTargetTab : "目標", + +DlgLnkType : "超連接類型", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "本頁錨點", +DlgLnkTypeEMail : "電子郵件", +DlgLnkProto : "通訊協定", +DlgLnkProtoOther : "<其他>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "請選擇錨點", +DlgLnkAnchorByName : "依錨點名稱", +DlgLnkAnchorById : "依元件 ID", +DlgLnkNoAnchors : "(本文件尚無可用之錨點)", +DlgLnkEMail : "電子郵件", +DlgLnkEMailSubject : "郵件主旨", +DlgLnkEMailBody : "郵件內容", +DlgLnkUpload : "上傳", +DlgLnkBtnUpload : "傳送至伺服器", + +DlgLnkTarget : "目標", +DlgLnkTargetFrame : "<框架>", +DlgLnkTargetPopup : "<快顯視窗>", +DlgLnkTargetBlank : "新視窗 (_blank)", +DlgLnkTargetParent : "父視窗 (_parent)", +DlgLnkTargetSelf : "本視窗 (_self)", +DlgLnkTargetTop : "最上層視窗 (_top)", +DlgLnkTargetFrameName : "目標框架名稱", +DlgLnkPopWinName : "快顯視窗名稱", +DlgLnkPopWinFeat : "快顯視窗屬性", +DlgLnkPopResize : "可調整大小", +DlgLnkPopLocation : "網址列", +DlgLnkPopMenu : "選單列", +DlgLnkPopScroll : "捲軸", +DlgLnkPopStatus : "狀態列", +DlgLnkPopToolbar : "工具列", +DlgLnkPopFullScrn : "全螢幕 (IE)", +DlgLnkPopDependent : "從屬 (NS)", +DlgLnkPopWidth : "寬", +DlgLnkPopHeight : "高", +DlgLnkPopLeft : "左", +DlgLnkPopTop : "右", + +DlnLnkMsgNoUrl : "請輸入欲連結的 URL", +DlnLnkMsgNoEMail : "請輸入電子郵件位址", +DlnLnkMsgNoAnchor : "請選擇錨點", +DlnLnkMsgInvPopName : "快顯名稱必須以「英文字母」為開頭,且不得含有空白", + +// Color Dialog +DlgColorTitle : "請選擇顏色", +DlgColorBtnClear : "清除", +DlgColorHighlight : "預覽", +DlgColorSelected : "選擇", + +// Smiley Dialog +DlgSmileyTitle : "插入表情符號", + +// Special Character Dialog +DlgSpecialCharTitle : "請選擇特殊符號", + +// Table Dialog +DlgTableTitle : "表格屬性", +DlgTableRows : "列數", +DlgTableColumns : "欄數", +DlgTableBorder : "邊框", +DlgTableAlign : "對齊", +DlgTableAlignNotSet : "<未設定>", +DlgTableAlignLeft : "靠左對齊", +DlgTableAlignCenter : "置中", +DlgTableAlignRight : "靠右對齊", +DlgTableWidth : "寬度", +DlgTableWidthPx : "像素", +DlgTableWidthPc : "百分比", +DlgTableHeight : "高度", +DlgTableCellSpace : "間距", +DlgTableCellPad : "內距", +DlgTableCaption : "標題", +DlgTableSummary : "摘要", + +// Table Cell Dialog +DlgCellTitle : "儲存格屬性", +DlgCellWidth : "寬度", +DlgCellWidthPx : "像素", +DlgCellWidthPc : "百分比", +DlgCellHeight : "高度", +DlgCellWordWrap : "自動換行", +DlgCellWordWrapNotSet : "<尚未設定>", +DlgCellWordWrapYes : "是", +DlgCellWordWrapNo : "否", +DlgCellHorAlign : "水平對齊", +DlgCellHorAlignNotSet : "<尚未設定>", +DlgCellHorAlignLeft : "靠左對齊", +DlgCellHorAlignCenter : "置中", +DlgCellHorAlignRight: "靠右對齊", +DlgCellVerAlign : "垂直對齊", +DlgCellVerAlignNotSet : "<尚未設定>", +DlgCellVerAlignTop : "靠上對齊", +DlgCellVerAlignMiddle : "置中", +DlgCellVerAlignBottom : "靠下對齊", +DlgCellVerAlignBaseline : "基準線", +DlgCellRowSpan : "合併列數", +DlgCellCollSpan : "合併欄数", +DlgCellBackColor : "背景顏色", +DlgCellBorderColor : "邊框顏色", +DlgCellBtnSelect : "請選擇…", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "尋找與取代", + +// Find Dialog +DlgFindTitle : "尋找", +DlgFindFindBtn : "尋找", +DlgFindNotFoundMsg : "未找到指定的文字。", + +// Replace Dialog +DlgReplaceTitle : "取代", +DlgReplaceFindLbl : "尋找:", +DlgReplaceReplaceLbl : "取代:", +DlgReplaceCaseChk : "大小寫須相符", +DlgReplaceReplaceBtn : "取代", +DlgReplaceReplAllBtn : "全部取代", +DlgReplaceWordChk : "全字相符", + +// Paste Operations / Dialog +PasteErrorCut : "瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用快捷鍵 (Ctrl+X) 剪下。", +PasteErrorCopy : "瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用快捷鍵 (Ctrl+C) 複製。", + +PasteAsText : "貼為純文字格式", +PasteFromWord : "自 Word 貼上", + +DlgPasteMsg2 : "請使用快捷鍵 (Ctrl+V) 貼到下方區域中並按下 確定", +DlgPasteSec : "因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。", +DlgPasteIgnoreFont : "移除字型設定", +DlgPasteRemoveStyles : "移除樣式設定", + +// Color Picker +ColorAutomatic : "自動", +ColorMoreColors : "更多顏色…", + +// Document Properties +DocProps : "文件屬性", + +// Anchor Dialog +DlgAnchorTitle : "命名錨點", +DlgAnchorName : "錨點名稱", +DlgAnchorErrorName : "請輸入錨點名稱", + +// Speller Pages Dialog +DlgSpellNotInDic : "不在字典中", +DlgSpellChangeTo : "更改為", +DlgSpellBtnIgnore : "忽略", +DlgSpellBtnIgnoreAll : "全部忽略", +DlgSpellBtnReplace : "取代", +DlgSpellBtnReplaceAll : "全部取代", +DlgSpellBtnUndo : "復原", +DlgSpellNoSuggestions : "- 無建議值 -", +DlgSpellProgress : "進行拼字檢查中…", +DlgSpellNoMispell : "拼字檢查完成:未發現拼字錯誤", +DlgSpellNoChanges : "拼字檢查完成:未更改任何單字", +DlgSpellOneChange : "拼字檢查完成:更改了 1 個單字", +DlgSpellManyChanges : "拼字檢查完成:更改了 %1 個單字", + +IeSpellDownload : "尚未安裝拼字檢查元件。您是否想要現在下載?", + +// Button Dialog +DlgButtonText : "顯示文字 (值)", +DlgButtonType : "類型", +DlgButtonTypeBtn : "按鈕 (Button)", +DlgButtonTypeSbm : "送出 (Submit)", +DlgButtonTypeRst : "重設 (Reset)", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "名稱", +DlgCheckboxValue : "選取值", +DlgCheckboxSelected : "已選取", + +// Form Dialog +DlgFormName : "名稱", +DlgFormAction : "動作", +DlgFormMethod : "方法", + +// Select Field Dialog +DlgSelectName : "名稱", +DlgSelectValue : "選取值", +DlgSelectSize : "大小", +DlgSelectLines : "行", +DlgSelectChkMulti : "可多選", +DlgSelectOpAvail : "可用選項", +DlgSelectOpText : "顯示文字", +DlgSelectOpValue : "值", +DlgSelectBtnAdd : "新增", +DlgSelectBtnModify : "修改", +DlgSelectBtnUp : "上移", +DlgSelectBtnDown : "下移", +DlgSelectBtnSetValue : "設為預設值", +DlgSelectBtnDelete : "刪除", + +// Textarea Dialog +DlgTextareaName : "名稱", +DlgTextareaCols : "字元寬度", +DlgTextareaRows : "列數", + +// Text Field Dialog +DlgTextName : "名稱", +DlgTextValue : "值", +DlgTextCharWidth : "字元寬度", +DlgTextMaxChars : "最多字元數", +DlgTextType : "類型", +DlgTextTypeText : "文字", +DlgTextTypePass : "密碼", + +// Hidden Field Dialog +DlgHiddenName : "名稱", +DlgHiddenValue : "值", + +// Bulleted List Dialog +BulletedListProp : "項目清單屬性", +NumberedListProp : "編號清單屬性", +DlgLstStart : "起始編號", +DlgLstType : "清單類型", +DlgLstTypeCircle : "圓圈", +DlgLstTypeDisc : "圓點", +DlgLstTypeSquare : "方塊", +DlgLstTypeNumbers : "數字 (1, 2, 3)", +DlgLstTypeLCase : "小寫字母 (a, b, c)", +DlgLstTypeUCase : "大寫字母 (A, B, C)", +DlgLstTypeSRoman : "小寫羅馬數字 (i, ii, iii)", +DlgLstTypeLRoman : "大寫羅馬數字 (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "一般", +DlgDocBackTab : "背景", +DlgDocColorsTab : "顯色與邊界", +DlgDocMetaTab : "Meta 資料", + +DlgDocPageTitle : "頁面標題", +DlgDocLangDir : "語言方向", +DlgDocLangDirLTR : "由左而右 (LTR)", +DlgDocLangDirRTL : "由右而左 (RTL)", +DlgDocLangCode : "語言代碼", +DlgDocCharSet : "字元編碼", +DlgDocCharSetCE : "中歐語系", +DlgDocCharSetCT : "正體中文 (Big5)", +DlgDocCharSetCR : "斯拉夫文", +DlgDocCharSetGR : "希臘文", +DlgDocCharSetJP : "日文", +DlgDocCharSetKR : "韓文", +DlgDocCharSetTR : "土耳其文", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "西歐語系", +DlgDocCharSetOther : "其他字元編碼", + +DlgDocDocType : "文件類型", +DlgDocDocTypeOther : "其他文件類型", +DlgDocIncXHTML : "包含 XHTML 定義", +DlgDocBgColor : "背景顏色", +DlgDocBgImage : "背景影像", +DlgDocBgNoScroll : "浮水印", +DlgDocCText : "文字", +DlgDocCLink : "超連結", +DlgDocCVisited : "已瀏覽過的超連結", +DlgDocCActive : "作用中的超連結", +DlgDocMargins : "頁面邊界", +DlgDocMaTop : "上", +DlgDocMaLeft : "左", +DlgDocMaRight : "右", +DlgDocMaBottom : "下", +DlgDocMeIndex : "文件索引關鍵字 (用半形逗號[,]分隔)", +DlgDocMeDescr : "文件說明", +DlgDocMeAuthor : "作者", +DlgDocMeCopy : "版權所有", +DlgDocPreview : "預覽", + +// Templates Dialog +Templates : "樣版", +DlgTemplatesTitle : "內容樣版", +DlgTemplatesSelMsg : "請選擇欲開啟的樣版
    (原有的內容將會被清除):", +DlgTemplatesLoading : "讀取樣版清單中,請稍候…", +DlgTemplatesNoTpl : "(無樣版)", +DlgTemplatesReplace : "取代原有內容", + +// About Dialog +DlgAboutAboutTab : "關於", +DlgAboutBrowserInfoTab : "瀏覽器資訊", +DlgAboutLicenseTab : "許可證", +DlgAboutVersion : "版本", +DlgAboutInfo : "想獲得更多資訊請至 " +}; diff --git a/member/editor/fckeditor/editor/skins/_fckviewstrips.html b/member/editor/fckeditor/editor/skins/_fckviewstrips.html new file mode 100644 index 0000000..d7aff50 --- /dev/null +++ b/member/editor/fckeditor/editor/skins/_fckviewstrips.html @@ -0,0 +1,99 @@ + + + + FCKeditor - View Icons Strips + + + + + + + + + + + + + + +
    + Index + Skins
    + default + office2003 + silver
    + + diff --git a/member/editor/fckeditor/editor/skins/default/fck_dialog.css b/member/editor/fckeditor/editor/skins/default/fck_dialog.css new file mode 100644 index 0000000..708217d --- /dev/null +++ b/member/editor/fckeditor/editor/skins/default/fck_dialog.css @@ -0,0 +1 @@ +html, body{background-color:transparent;margin:0px;padding:0px;}body{padding:10px;}body, td, input, select, textarea{font-size:11px;font-family:'Microsoft Sans Serif' , Arial, Helvetica, Verdana;}body, .BackColor{background-color:#f7f8fd;}.PopupBody{height:100%;width:100%;overflow:hidden;background-color:transparent;padding:0px;}#header{cursor:move;}.PopupTitle{font-weight:bold;font-size:14pt;color:#0e3460;background-color:#8cb2fd;padding:3px 10px 3px 10px;}.PopupButtons{position:absolute;right:0px;left:0px;bottom:0px;border-top:#466ca6 1px solid;background-color:#8cb2fd;padding:7px 10px 7px 10px;}.Button{border:#1c3460 1px solid;color:#000a28;background-color:#7096d3;}#btnOk{width:100px;}.DarkBackground{background-color:#eaf2f8;}.LightBackground{background-color:#ffffbe;}.PopupTitleBorder{border-bottom:#d5d59d 1px solid;}.PopupTabArea{color:#0e3460;background-color:#8cb2fd;}.PopupTabEmptyArea{padding-left:10px ;border-bottom:#466ca6 1px solid;}.PopupTab, .PopupTabSelected{border-right:#466ca6 1px solid;border-top:#466ca6 1px solid;border-left:#466ca6 1px solid;padding:3px 5px 3px 5px;color:#0e3460;}.PopupTab{margin-top:1px;border-bottom:#466ca6 1px solid;cursor:pointer;cursor:hand;}.PopupTabSelected{font-weight:bold;cursor:default;padding-top:4px;border-bottom:#f7f8fd 1px solid;background-color:#f7f8fd;}.PopupSelectionBox{border:#1e90ff 1px solid !important;background-color:#add8e6 !important;cursor:pointer;cursor:hand;}#tdBrowse{vertical-align:bottom;}/** * Dialog frame related styles. */.contents{position:absolute;top:2px;left:16px;right:16px;bottom:20px;background-color:#f7f8fD;overflow:hidden;z-index:1;}.tl, .tr, .tc, .bl, .br, .bc{position:absolute;background-image:url(images/sprites.png);background-repeat:no-repeat;}* html .tl, * html .tr, * html .tc, * html .bl, * html .br, * html .bc{background-image:url(images/sprites.gif);}.ml, .mr{position:absolute;background-image:url(images/dialog.sides.png);background-repeat:repeat-y;}* html .ml, * html .mr{background-image:url(images/dialog.sides.gif);}.rtl .ml, .rtl .mr{position:absolute;background-image:url(images/dialog.sides.rtl.png);background-repeat:repeat-y;}* html .rtl .ml, * html .rtl .mr{background-image:url(images/dialog.sides.gif);}.tl{top:0px;left:0px;width:16px;height:16px;background-position:-16px -16px;}.rtl .tl{background-position:-16px -397px;}.tr{top:0px;right:0px;width:16px;height:16px;background-position:-16px -76px;}.rtl .tr{background-position:-16px -457px;}.tc{top:0px;right:16px;left:16px;height:16px;background-position:0px -136px;background-repeat:repeat-x;}.ml{top:16px;left:0px;width:16px;bottom:51px;background-position:0px 0px;}.mr{top:16px;right:0px;width:16px;bottom:51px;background-position:-16px 0px;}.bl{bottom:0px;left:0px;width:30px;height:51px;background-position:-16px -196px;}.rtl .bl{background-position:-16px -517px;}.br{bottom:0px;right:0px;width:30px;height:51px;background-position:-16px -263px;}.rtl .br{background-position:-16px -584px;}.bc{bottom:0px;right:30px;left:30px;height:51px;background-position:0px -330px;background-repeat:repeat-x;}/* For IE6. Do not change it. */* html .blocker{position:absolute;width:100%;height:100%;z-index:12;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);}/* The layer used to cover the dialog when opening a child dialog. */.cover{position:absolute;top:0px;left:14px;right:14px;bottom:18px;z-index:11;}#closeButton{position:absolute;right:0px;top:0px;margin-top:5px;margin-right:10px;width:20px;height:20px;cursor:pointer;background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-16px -651px;}* html #closeButton{cursor:hand;background-image:url(images/sprites.gif);}.rtl #closeButton{right:auto;left:10px;margin-right:0px;}#closeButton:hover{background-position:-16px -687px;}#throbberBlock{z-index:10;}#throbberBlock div{float:left;width:8px;height:9px;margin-left:2px;margin-right:2px;font-size:1px;/* IE6 */}/*Color Gradient Generator:http://www.herethere.net/~samson/php/color_gradient/?cbegin=0E3460&cend=8cb2fd&steps=4*/.throbber_1{background-color:#0E3460;}.throbber_2{background-color:#2D5387;}.throbber_3{background-color:#4D73AE;}.throbber_4{background-color:#6C92D5;}.throbber_5{background-color:#8CB2FD;} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/skins/default/fck_dialog_ie6.js b/member/editor/fckeditor/editor/skins/default/fck_dialog_ie6.js new file mode 100644 index 0000000..34f7bdf --- /dev/null +++ b/member/editor/fckeditor/editor/skins/default/fck_dialog_ie6.js @@ -0,0 +1,57 @@ +(function() { + var fixSizes = window.DoResizeFixes = function() { + var fckDlg = window.document.body; + for (var i = 0; i < fckDlg.childNodes.length; i++) { + var child = fckDlg.childNodes[i]; + switch (child.className) { + case 'contents' : + child.style.width = Math.max(0, fckDlg.offsetWidth - 16 - 16); + child.style.height = Math.max(0, fckDlg.clientHeight - 20 - 2); + break; + case 'blocker' : + case 'cover' : + child.style.width = Math.max(0, fckDlg.offsetWidth - 16 - 16 + 4); + child.style.height = Math.max(0, fckDlg.clientHeight - 20 - 2 + 4); + break; + case 'tr' : + child.style.left = Math.max(0, fckDlg.clientWidth - 16); + break; + case 'tc' : + child.style.width = Math.max(0, fckDlg.clientWidth - 16 - 16); + break; + case 'ml' : + child.style.height = Math.max(0, fckDlg.clientHeight - 16 - 51); + break; + case 'mr' : + child.style.left = Math.max(0, fckDlg.clientWidth - 16); + child.style.height = Math.max(0, fckDlg.clientHeight - 16 - 51); + break; + case 'bl' : + child.style.top = Math.max(0, fckDlg.clientHeight - 51); + break; + case 'br' : + child.style.left = Math.max(0, fckDlg.clientWidth - 30); + child.style.top = Math.max(0, fckDlg.clientHeight - 51); + break; + case 'bc' : + child.style.width = Math.max(0, fckDlg.clientWidth - 30 - 30); + child.style.top = Math.max(0, fckDlg.clientHeight - 51); + break; + } + } + } + var closeButtonOver = function() { this.style.backgroundPosition = '-16px -687px'; }; + var closeButtonOut = function() { this.style.backgroundPosition = '-16px -651px'; }; + var fixCloseButton = function() { + var closeButton = document.getElementById ('closeButton'); + closeButton.onmouseover = closeButtonOver; + closeButton.onmouseout = closeButtonOut; + } + var onLoad = function() { + fixSizes(); + fixCloseButton(); + window.attachEvent('onresize', fixSizes); + window.detachEvent('onload', onLoad); + } + window.attachEvent('onload', onLoad); +})(); \ No newline at end of file diff --git a/member/editor/fckeditor/editor/skins/default/fck_editor.css b/member/editor/fckeditor/editor/skins/default/fck_editor.css new file mode 100644 index 0000000..00f6c87 --- /dev/null +++ b/member/editor/fckeditor/editor/skins/default/fck_editor.css @@ -0,0 +1 @@ +body{padding:1px;margin:0;background-color:#ffffff;}#xEditingArea{ border:#696969 1px solid;}.SourceField{ padding:5px; margin:0px; font-family:Monospace;}/*Toolbar*/.TB_ToolbarSet, .TB_Expand, .TB_Collapse{ cursor:default; background-color:#f7f8fd;}.TB_ToolbarSet{ border-top:#f7f8fd 1px outset; border-bottom:#f7f8fd 1px outset;}.TB_ToolbarSet TD{ font-size:11px; font-family:'Microsoft Sans Serif' , Tahoma, Arial, Verdana, Sans-Serif;}.TB_Toolbar{ background-color:#d6dff7;background-image:url(images/toolbar.bg.gif);background-repeat:repeat-x; display:inline-table;}.TB_Separator{ width:1px; height:16px; margin:2px; background-color:#B2CBFF;}.TB_Start{ background-image:url(images/toolbar.start.gif); background-repeat:no-repeat; background-position:center center; margin:0px; width:7px; height:24px;}.TB_End{ background-image:url(images/toolbar.end.gif); background-repeat:no-repeat; background-position:center left; height:24px; width:4px;}.TB_ExpandImg{ background-image:url(images/toolbar.expand.gif); background-repeat:no-repeat;}.TB_CollapseImg{ background-image:url(images/toolbar.collapse.gif); background-repeat:no-repeat;}.TB_SideBorder{ background-color:#696969;}.TB_Expand, .TB_Collapse{ padding:2px 2px 2px 2px; border:#f7f8fd 1px outset;}.TB_Collapse{ width:5px;}.TB_Break{ height:24px; /* IE needs the height to be set, otherwise no break */}/*Toolbar Button*/.TB_Button_On, .TB_Button_Off, .TB_Button_On_Over, .TB_Button_Off_Over, .TB_Button_Disabled{ margin:1px; height:22px; /* The height is necessary, otherwise IE will not apply the alpha */}.TB_Button_On{ margin:0px; border:#316ac5 1px solid; background-color:#c1d2ee;}.TB_Button_On_Over, .TB_Button_Off_Over{ margin:0px ; border:#316ac5 1px solid; background-color:#dff1ff;}.TB_Button_Off{ filter:alpha(opacity=70); /* IE */ opacity:0.70; /* Safari, Opera and Mozilla */}.TB_Button_Disabled{ filter:gray() alpha(opacity=30); /* IE */ opacity:0.30; /* Safari, Opera and Mozilla */}.TB_Button_Padding{ visibility:hidden; width:3px; height:22px;}.TB_Button_Image{ overflow:hidden; width:16px; height:16px; margin:3px; background-repeat:no-repeat;}.TB_Button_Image img{ position:relative;}.TB_Button_Off .TB_Button_Text{ background-color:#d6dff7; /* Needed because of a bug on ClearType */background-image:url(images/toolbar.bg.gif);background-repeat:repeat-x;}.TB_ConnectionLine{ background-color:#f7f8fd; height:1px; margin-left:1px; /* ltr */ margin-right:1px; /* rtl */}.TB_Button_Off .TB_Text{ background-color:#d6dff7; /* Needed because of a bug on ClearType */background-image:url(images/toolbar.bg.gif);background-repeat:repeat-x;}.TB_Button_On_Over .TB_Text{ background-color:#dff1ff ; /* Needed because of a bug on ClearType */}/*Menu*/.MN_Menu{ border:1px solid #8f8f73; padding:2px; background-color:#f7f8fd; cursor:default;}.MN_Menu, .MN_Menu .MN_Label{ font-size:11px; font-family:'Microsoft Sans Serif' , Tahoma, Arial, Verdana, Sans-Serif;}.MN_Item_Padding{ visibility:hidden; width:3px; height:20px;}.MN_Icon{ background-color:#d6dff7; text-align:center; height:20px;}.MN_Label{ padding-left:3px; padding-right:3px;}.MN_Separator{ height:3px;}.MN_Separator_Line{ border-top:#b9b99d 1px solid;}.MN_Item .MN_Icon IMG{ filter:alpha(opacity=70); opacity:0.70;}.MN_Item_Over{ color:#ffffff; background-color:#7096FA;}.MN_Item_Over .MN_Icon{ background-color:#466ca6;}.MN_Item_Disabled IMG{ filter:gray() alpha(opacity=30); /* IE */ opacity:0.30; /* Safari, Opera and Mozilla */}.MN_Item_Disabled .MN_Label{ color:#b7b7b7;}.MN_Arrow{ padding-right:3px; padding-left:3px;}.MN_ConnectionLine{ background-color:#f7f8fd;}.Menu .TB_Button_On, .Menu .TB_Button_On_Over{ border:#8f8f73 1px solid; background-color:#f7f8fd;}/*### Panel Styles*/.FCK_Panel{ border:#8f8f73 1px solid; padding:2px; background-color:#f7f8fd;}.FCK_Panel, .FCK_Panel TD{ font-family:'Microsoft Sans Serif' , Tahoma, Arial, Verdana, Sans-Serif; font-size:11px;}/*### Special Combos*/.SC_Panel{ overflow:auto; white-space:nowrap; cursor:default; border:1px solid #8f8f73; padding-left:2px; padding-right:2px;}.SC_Panel, .SC_Panel TD{ font-size:11px; font-family:'Microsoft Sans Serif' , Tahoma, Arial, Verdana, Sans-Serif;}.SC_Item, .SC_ItemSelected{ margin-top:2px; margin-bottom:2px; background-position:left center; padding-left:11px; padding-right:3px; padding-top:2px; padding-bottom:2px; text-overflow:ellipsis; overflow:hidden; background-repeat:no-repeat; border:#dddddd 1px solid;}.SC_Item *, .SC_ItemSelected *{ margin-top:0px; margin-bottom:0px;}.SC_ItemSelected{ border:#9a9afb 1px solid; background-image:url(images/toolbar.arrowright.gif);}.SC_ItemOver{ border:#316ac5 1px solid;}.SC_Field{ margin-top:2px ; border:#b7b7a6 1px solid; cursor:default;}.SC_FieldCaption{ overflow:visible; padding-right:5px; padding-left:5px; opacity:0.75; /* Safari, Opera and Mozilla */ filter:alpha(opacity=70); /* IE */ /* -moz-opacity:0.75; Mozilla (Old) */ height:23px; background-color:#d6dff7; /* Needed because of a bug on ClearType */background-image:url(images/toolbar.bg.gif);background-repeat:repeat-x;/* background-color: inherit; Maybe this is needed wait to check */}.SC_FieldLabel{ white-space:nowrap; padding:2px; width:100%; cursor:default; background-color:#ffffff; text-overflow:ellipsis; overflow:hidden;}.SC_FieldButton{ background-position:center center; background-image:url(images/toolbar.buttonarrow.gif); border-left:#b7b7a6 1px solid; width:14px; background-repeat:no-repeat;}.SC_FieldDisabled .SC_FieldButton, .SC_FieldDisabled .SC_FieldCaption, .SC_FieldDisabled .TB_ButtonType_Text{ opacity:0.30; /* Safari, Opera and Mozilla */ filter:gray() alpha(opacity=30); /* IE */ /* -moz-opacity:0.30; Mozilla (Old) */}.SC_FieldOver{ border:#316ac5 1px solid;}.SC_FieldOver .SC_FieldButton{ border-left:#316ac5 1px solid;}/*### Color Selector Panel*/.ColorBoxBorder{ border:#808080 1px solid; position:static;}.ColorBox{ font-size:1px; width:10px; position:static; height:10px;}.ColorDeselected, .ColorSelected{ cursor:default;}.ColorDeselected{ border:#ffffff 1px solid; padding:2px; float:left;}.ColorSelected{ border:#330066 1px solid; padding:2px; float:left; background-color:#c4cdd6;} \ No newline at end of file diff --git a/member/editor/fckeditor/editor/skins/default/fck_strip.gif b/member/editor/fckeditor/editor/skins/default/fck_strip.gif new file mode 100644 index 0000000..c97ff42 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/fck_strip.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/dialog.sides.gif b/member/editor/fckeditor/editor/skins/default/images/dialog.sides.gif new file mode 100644 index 0000000..921fa1a Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/dialog.sides.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/dialog.sides.png b/member/editor/fckeditor/editor/skins/default/images/dialog.sides.png new file mode 100644 index 0000000..be15730 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/dialog.sides.png differ diff --git a/member/editor/fckeditor/editor/skins/default/images/dialog.sides.rtl.png b/member/editor/fckeditor/editor/skins/default/images/dialog.sides.rtl.png new file mode 100644 index 0000000..e18f13d Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/dialog.sides.rtl.png differ diff --git a/member/editor/fckeditor/editor/skins/default/images/sprites.gif b/member/editor/fckeditor/editor/skins/default/images/sprites.gif new file mode 100644 index 0000000..8763e48 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/sprites.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/sprites.png b/member/editor/fckeditor/editor/skins/default/images/sprites.png new file mode 100644 index 0000000..7f4e196 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/sprites.png differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.arrowright.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.arrowright.gif new file mode 100644 index 0000000..6843c8d Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.arrowright.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.bg.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.bg.gif new file mode 100644 index 0000000..b03960b Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.bg.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif new file mode 100644 index 0000000..ea60995 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.collapse.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.collapse.gif new file mode 100644 index 0000000..d549166 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.collapse.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.end.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.end.gif new file mode 100644 index 0000000..7ff599d Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.end.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.expand.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.expand.gif new file mode 100644 index 0000000..c4a7326 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.expand.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.separator.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.separator.gif new file mode 100644 index 0000000..27db9c3 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.separator.gif differ diff --git a/member/editor/fckeditor/editor/skins/default/images/toolbar.start.gif b/member/editor/fckeditor/editor/skins/default/images/toolbar.start.gif new file mode 100644 index 0000000..41f1241 Binary files /dev/null and b/member/editor/fckeditor/editor/skins/default/images/toolbar.start.gif differ diff --git a/member/editor/fckeditor/fckconfig.js b/member/editor/fckeditor/fckconfig.js new file mode 100644 index 0000000..a9d93c4 --- /dev/null +++ b/member/editor/fckeditor/fckconfig.js @@ -0,0 +1,222 @@ +FCKConfig.CustomConfigurationsPath = ''; +FCKConfig.EditorAreaCSS = FCKConfig.BasePath + 'css/fck_editorarea.css'; +FCKConfig.EditorAreaStyles = ''; +FCKConfig.ToolbarComboPreviewCSS = ''; +var IsAdmin = window.parent.DTAdmin ? true : false; +FCKConfig.IsAdmin = IsAdmin; +FCKConfig.ModuleID = window.parent.ModuleID; +FCKConfig.DTPath = window.parent.DTPath; +FCKConfig.UPPath = window.parent.UPPath; +FCKConfig.AJPath = window.parent.AJPath; +FCKConfig.EDPath = window.parent.EDPath; +FCKConfig.ABPath = window.parent.ABPath; +FCKConfig.DocType = ''; +FCKConfig.BaseHref = ''; +FCKConfig.FullPage = false; +FCKConfig.StartupShowBlocks = false; +FCKConfig.Debug = false; +FCKConfig.AllowQueryStringDebug = true; +FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/default/'; +FCKConfig.SkinEditorCSS = ''; +FCKConfig.SkinDialogCSS = ''; +FCKConfig.PreloadImages = [ FCKConfig.SkinPath + 'images/toolbar.start.gif', FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ]; +FCKConfig.PluginsPath = FCKConfig.BasePath + 'extends/'; +FCKConfig.AutoGrowMax = 400; +FCKConfig.AutoDetectLanguage = true; +FCKConfig.DefaultLanguage = 'en'; +FCKConfig.ContentLangDirection = 'ltr'; +FCKConfig.ProcessHTMLEntities = true; +FCKConfig.IncludeLatinEntities = true; +FCKConfig.IncludeGreekEntities = true; +FCKConfig.ProcessNumericEntities = false; +FCKConfig.AdditionalNumericEntities = '' ; +FCKConfig.FillEmptyBlocks = true; +FCKConfig.FormatSource = true; +FCKConfig.FormatOutput = true; +FCKConfig.FormatIndentator = ' '; +FCKConfig.StartupFocus = false; +FCKConfig.ForcePasteAsPlainText = false; +FCKConfig.AutoDetectPasteFromWord = true; +FCKConfig.ShowDropDialog = true; +FCKConfig.ForceSimpleAmpersand = false; +FCKConfig.TabSpaces = 0; +FCKConfig.ShowBorders = true; +FCKConfig.SourcePopup = false; +FCKConfig.ToolbarStartExpanded = true; +FCKConfig.ToolbarCanCollapse = true; +FCKConfig.IgnoreEmptyParagraphValue = true; +FCKConfig.PreserveSessionOnFileBrowser = false; +FCKConfig.FloatingPanelsZIndex = 10000; +FCKConfig.HtmlEncodeOutput = false; +FCKConfig.TemplateReplaceAll = true; +FCKConfig.TemplateReplaceCheckbox = true; +FCKConfig.ToolbarLocation = 'In'; +FCKConfig.ToolbarSets["Default"] = [ + ['Source','-','PasteWord','PasteText','Preview','Print','-','Templates'], + ['Cut','Copy','Paste','PasteText','PasteWord'], + ['Undo','Redo','-','Find','Replace','-','RemoveFormat'], + '/', + ['Link','Unlink','Anchor'], + ['Image','Flash','Table','Rule','Smiley','SpecialChar'], + ['OrderedList','UnorderedList','Outdent','Indent'], + ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'], + '/', + ['Bold','Italic','Underline','StrikeThrough'], + ['TextColor','BGColor','-','FontName','FontSize','Attach','FitWindow'] +]; +if(!IsAdmin) FCKConfig.ToolbarSets["Default"][0].splice(0,2); + +FCKConfig.ToolbarSets["Destoon"] = [ + ['Source','-','PasteWord','PasteText','-','Bold','TextColor','FontSize','Link','Unlink','Image','Flash','Rule','SpecialChar','JustifyLeft','JustifyCenter','JustifyRight','RemoveFormat','Attach','FitWindow'] +]; +if(!IsAdmin) FCKConfig.ToolbarSets["Destoon"][0].splice(0,2); +if(window.parent.ModuleID == 18) FCKConfig.ToolbarSets["Destoon"][0].splice(-1,0,'Smiley'); + + +FCKConfig.ToolbarSets["Simple"] = [ + ['Source','-','Bold','Italic','Underline','TextColor','-','FontSize','Link','Unlink','-','Image','JustifyLeft','JustifyCenter','JustifyRight','-','RemoveFormat','Attach','FitWindow'] +]; +if(!IsAdmin) FCKConfig.ToolbarSets["Simple"][0].splice(0,2); +if(window.parent.ModuleID == 18) FCKConfig.ToolbarSets["Simple"][0].splice(-1,0,'Smiley'); + + +FCKConfig.ToolbarSets["Basic"] = [ + ['Source','-','Bold','TextColor','-','Link','Unlink','-','Image','JustifyLeft','JustifyCenter','JustifyRight','RemoveFormat','FitWindow'] +]; +if(!IsAdmin) FCKConfig.ToolbarSets["Basic"][0].splice(0,2); +if(window.parent.ModuleID == 18) FCKConfig.ToolbarSets["Basic"][0].splice(-1,0,'Smiley'); + +FCKConfig.ToolbarSets["Message"] = [ + ['Bold','Italic','Underline','TextColor','-','FontSize','Link','Unlink','-','Image','Smiley','JustifyLeft','JustifyCenter','JustifyRight','-','RemoveFormat','Attach','FitWindow'] +]; + +FCKConfig.EnterMode = 'br'; +FCKConfig.ShiftEnterMode = 'p'; +FCKConfig.Keystrokes = [ + [ CTRL + 65 /*A*/, true ], + [ CTRL + 67 /*C*/, true ], + [ CTRL + 70 /*F*/, true ], + [ CTRL + 83 /*S*/, true ], + [ CTRL + 84 /*T*/, true ], + [ CTRL + 88 /*X*/, true ], + [ CTRL + 86 /*V*/, 'Paste' ], + [ SHIFT + 45 /*INS*/, 'Paste' ], + [ CTRL + 88 /*X*/, 'Cut' ], + [ SHIFT + 46 /*DEL*/, 'Cut' ], + [ CTRL + 90 /*Z*/, 'Undo' ], + [ CTRL + 89 /*Y*/, 'Redo' ], + [ CTRL + SHIFT + 90 /*Z*/, 'Redo' ], + [ CTRL + 76 /*L*/, 'Link' ], + [ CTRL + 66 /*B*/, 'Bold' ], + [ CTRL + 73 /*I*/, 'Italic' ], + [ CTRL + 85 /*U*/, 'Underline' ], + [ CTRL + SHIFT + 83 /*S*/, 'Save' ], + [ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ] +]; +FCKConfig.ContextMenu = ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','Table','Form']; +FCKConfig.BrowserContextMenuOnCtrl = false; +FCKConfig.EnableMoreFontColors = true; +FCKConfig.FontColors = '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,808080,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF'; +FCKConfig.FontFormats = 'p;h1;h2;h3;h4;h5;h6;pre;address;div'; +FCKConfig.FontNames = '宋体;黑体;微软雅黑;楷体;Arial;Tahoma;Verdana;'; +FCKConfig.FontSizes = '10px;11px;12px;13px;14px;16px;18px;20px;22px;24px;26px;28px;36px;48px;72px'; +FCKConfig.StylesXmlPath = FCKConfig.EditorPath + 'fckstyles.xml'; +FCKConfig.TemplatesXmlPath = FCKConfig.EditorPath + 'fcktemplates.xml'; +FCKConfig.SpellChecker = 'ieSpell'; +FCKConfig.IeSpellDownloadUrl = 'http://www.iespell.com/download.php'; +FCKConfig.SpellerPagesServerScript = 'server-scripts/spellchecker.php'; +FCKConfig.FirefoxSpellChecker = false; +FCKConfig.MaxUndoLevels = 15; +FCKConfig.DisableObjectResizing = false; +FCKConfig.DisableFFTableHandles = true; +FCKConfig.LinkDlgHideTarget = false; +FCKConfig.LinkDlgHideAdvanced = true; +FCKConfig.ImageDlgHideLink = false; +FCKConfig.ImageDlgHideAdvanced = true; +FCKConfig.FlashDlgHideAdvanced = true; +FCKConfig.ProtectedTags = ''; +FCKConfig.BodyId = ''; +FCKConfig.BodyClass = ''; +FCKConfig.DefaultStyleLabel = ''; +FCKConfig.DefaultFontFormatLabel = ''; +FCKConfig.DefaultFontLabel = ''; +FCKConfig.DefaultFontSizeLabel = ''; +FCKConfig.DefaultLinkTarget = ''; +FCKConfig.CleanWordKeepsStructure = false; +FCKConfig.RemoveFormatTags = 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var'; +FCKConfig.RemoveAttributes = 'class,style,lang,width,height,align,hspace,valign'; +FCKConfig.CustomStyles = {'Red Title' : { Element : 'h3', Styles : { 'color' : 'Red' } }}; +FCKConfig.CoreStyles = { + 'Bold' : { Element : 'strong', Overrides : 'b' }, + 'Italic' : { Element : 'em', Overrides : 'i' }, + 'Underline' : { Element : 'u' }, + 'StrikeThrough' : { Element : 'strike' }, + 'Subscript' : { Element : 'sub' }, + 'Superscript' : { Element : 'sup' }, + 'p' : { Element : 'p' }, + 'div' : { Element : 'div' }, + 'pre' : { Element : 'pre' }, + 'address' : { Element : 'address' }, + 'h1' : { Element : 'h1' }, + 'h2' : { Element : 'h2' }, + 'h3' : { Element : 'h3' }, + 'h4' : { Element : 'h4' }, + 'h5' : { Element : 'h5' }, + 'h6' : { Element : 'h6' }, + 'FontFace' : { + Element : 'span', + Styles : { 'font-family' : '#("Font")' }, + Overrides : [ { Element : 'font', Attributes : { 'face' : null } } ] + }, + 'Size' : { + Element : 'span', + Styles : { 'font-size' : '#("Size","fontSize")' }, + Overrides : [ { Element : 'font', Attributes : { 'size' : null } } ] + }, + 'Color' : { + Element : 'span', + Styles : { 'color' : '#("Color","color")' }, + Overrides : [ { Element : 'font', Attributes : { 'color' : null } } ] + }, + 'BackColor' : { Element : 'span', Styles : { 'background-color' : '#("Color","color")' } }, + 'SelectionHighlight' : { Element : 'span', Styles : { 'background-color' : 'navy', 'color' : 'white' } } +}; +FCKConfig.IndentLength = 30; +FCKConfig.IndentUnit = 'px'; +FCKConfig.IndentClasses = []; +FCKConfig.JustifyClasses = []; +var _FileBrowserLanguage = 'php'; +var _QuickUploadLanguage = 'php'; +var _FileBrowserExtension = _FileBrowserLanguage == 'perl' ? 'cgi' : _FileBrowserLanguage; +var _QuickUploadExtension = _QuickUploadLanguage == 'perl' ? 'cgi' : _QuickUploadLanguage; +FCKConfig.LinkBrowser = false; +FCKConfig.LinkBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector=' + encodeURIComponent( FCKConfig.BasePath + 'filemanager/connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ); +FCKConfig.LinkBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7; +FCKConfig.LinkBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7; +FCKConfig.ImageBrowser = false; +FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=' + encodeURIComponent( FCKConfig.BasePath + 'filemanager/connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ); +FCKConfig.ImageBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7; +FCKConfig.ImageBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7; +FCKConfig.FlashBrowser = false; +FCKConfig.FlashBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Flash&Connector=' + encodeURIComponent( FCKConfig.BasePath + 'filemanager/connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ); +FCKConfig.FlashBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7; +FCKConfig.FlashBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7; +FCKConfig.LinkUpload = false; +FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/connectors/' + _QuickUploadLanguage + '/upload.' + _QuickUploadExtension; +FCKConfig.LinkUploadAllowedExtensions = ".(asf|avi|bmp|csv|doc|fla|flv|gif|gz|gzip|jpeg|jpg|mid|mov|mp3|mp4|mpc|mpeg|mpg|pdf|png|ppt|ram|rar|rm|rmi|rmvb|rtf|swf|tar|tgz|tif|tiff|txt|wav|wma|wmv|xls|xml|zip)$"; // empty for all +FCKConfig.LinkUploadDeniedExtensions = ".(php|phtml|php3|php4|jsp|exe|dll|cer|asa|shtml|shtm|asp|aspx|asax|cgi|fcgi|pl)$"; // empty for no one +FCKConfig.ImageUpload = true; +FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/connectors/' + _QuickUploadLanguage + '/upload.' + _QuickUploadExtension + '?Type=Image'; +FCKConfig.ImageUploadAllowedExtensions = ".(jpg|gif|jpeg|png|bmp)$"; +FCKConfig.ImageUploadDeniedExtensions = ""; +FCKConfig.FlashUpload = IsAdmin; +FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/connectors/' + _QuickUploadLanguage + '/upload.' + _QuickUploadExtension + '?Type=Flash'; +FCKConfig.FlashUploadAllowedExtensions = ".(swf|flv)$"; +FCKConfig.FlashUploadDeniedExtensions = ""; +FCKConfig.SmileyPath = FCKConfig.ABPath + 'editor/images/smiley/msn/'; +FCKConfig.SmileyImages = ['001.gif','002.gif','003.gif','004.gif','005.gif','006.gif','007.gif','008.gif','009.gif','010.gif','011.gif','012.gif','013.gif','014.gif','015.gif','016.gif','017.gif','018.gif','019.gif','020.gif','021.gif','022.gif','023.gif','024.gif','025.gif','026.gif','027.gif','028.gif','029.gif','030.gif','031.gif','032.gif','033.gif','034.gif','035.gif','036.gif','037.gif','038.gif','039.gif','040.gif']; +FCKConfig.SmileyColumns = 8; +FCKConfig.SmileyWindowWidth = 320; +FCKConfig.SmileyWindowHeight = 210; +FCKConfig.BackgroundBlockerColor = '#ffffff'; +FCKConfig.BackgroundBlockerOpacity = 0.50; \ No newline at end of file diff --git a/member/editor/fckeditor/fckeditor.js b/member/editor/fckeditor/fckeditor.js new file mode 100644 index 0000000..37fd1f9 --- /dev/null +++ b/member/editor/fckeditor/fckeditor.js @@ -0,0 +1,131 @@ +var FCKeditor = function(instanceName, width, height, toolbarSet, value) { + this.InstanceName = instanceName; + this.Width = width || '100%'; + this.Height = height || '200'; + this.ToolbarSet = toolbarSet || 'Default'; + this.Value = value || ''; + this.BasePath = FCKeditor.BasePath; + this.CheckBrowser = true; + this.DisplayErrors = true; + this.Config = new Object(); + this.OnError = null; +} +FCKeditor.BasePath = '/fckeditor/'; +FCKeditor.MinHeight = 200; +FCKeditor.MinWidth = 750; +FCKeditor.prototype.Version = '2.6'; +FCKeditor.prototype.VersionBuild = '18638'; +FCKeditor.prototype.Create = function() {document.write(this.CreateHtml());} +FCKeditor.prototype.CreateHtml = function() { + if(!this.InstanceName || this.InstanceName.length == 0) { this._ThrowError(701, 'You must specify an instance name.');return '';} + var sHtml = ''; + if(!this.CheckBrowser || this._IsCompatibleBrowser()) { + sHtml += ''; + sHtml += this._GetConfigHtml(); + sHtml += this._GetIFrameHtml(); + } else { + var sWidth = this.Width.toString().indexOf('%') > 0 ? this.Width : this.Width + 'px'; + var sHeight = this.Height.toString().indexOf('%') > 0 ? this.Height : this.Height + 'px'; + sHtml += '').css("width","100%");c.tabIndex=isNaN(parseInt(a.tabIndex,10))?c.srcElement.attr("tabindex"):parseInt(a.tabIndex,10);c.iframe.attr("tabindex",c.tabIndex);c.textarea.attr("tabindex",c.tabIndex);c.width&&c.setWidth(c.width);c.height&&c.setHeight(c.height);c.designMode?c.textarea.hide():c.iframe.hide(); +j&&c.iframe.bind("load",function(){c.iframe.unbind("load");o?b():setTimeout(b,0)});c.div.append(c.iframe);c.div.append(c.textarea);c.srcElement.hide();!j&&b()},setWidth:function(a){this.width=a=s(a);this.div.css("width",a);return this},setHeight:function(a){this.height=a=s(a);this.div.css("height",a);this.iframe.css("height",a);if(o&&A<8||P)a=s(t(a)-2);this.textarea.css("height",a);return this},remove:function(){var a=this.doc;f(a.body).unbind();f(a).unbind();f(this.win).unbind();this._mousedownHandler&& +f(document).unbind("mousedown",this._mousedownHandler);pa(this.srcElement,this.html());this.srcElement.show();a.write("");this.iframe.unbind();this.textarea.unbind();qa.parent.remove.call(this)},html:function(a,b){var c=this.doc;if(this.designMode){c=c.body;if(a===i)return a=b?""+c.parentNode.innerHTML+"":c.innerHTML,this.beforeGetHtml&&(a=this.beforeGetHtml(a)),Y&&a=="
    "&&(a=""),a;this.beforeSetHtml&&(a=this.beforeSetHtml(a));o&&A>=9&&(a=a.replace(/(<.*?checked=")checked(".*>)/ig, +"$1$2"));f(c).html(a);this.afterSetHtml&&this.afterSetHtml();return this}if(a===i)return this.textarea.val();this.textarea.val(a);return this},design:function(a){if(a===i?!this.designMode:a){if(!this.designMode)a=this.html(),this.designMode=!0,this.html(a),this.textarea.hide(),this.iframe.show()}else if(this.designMode)a=this.html(),this.designMode=!1,this.html(a),this.iframe.hide(),this.textarea.show();return this.focus()},focus:function(){this.designMode?this.win.focus():this.textarea[0].focus(); +return this},blur:function(){if(o){var a=f('',this.div);this.div.append(a);a[0].focus();a.remove()}else this.designMode?this.win.blur():this.textarea[0].blur();return this},afterChange:function(a){function b(b){setTimeout(function(){a(b)},1)}var c=this.doc,d=c.body;f(c).keyup(function(b){!b.ctrlKey&&!b.altKey&&db[b.which]&&a(b)});f(c).mouseup(a).contextmenu(a);f(this.win).blur(a);f(d).bind("paste",b);f(d).bind("cut", +b);return this}});f.EditClass=qa;f.edit=Ab;f.iframeDoc=Xa;E(Da,S,{init:function(a){function b(a){a=f(a);if(a.hasClass("ke-outline"))return a;if(a.hasClass("ke-toolbar-icon"))return a.parent()}function c(a,c){var d=b(a.target);if(d&&!d.hasClass("ke-disabled")&&!d.hasClass("ke-selected"))d[c]("ke-on")}var d=this;Da.parent.init.call(d,a);d.disableMode=l(a.disableMode,!1);d.noDisableItemMap=u(l(a.noDisableItems,[]));d._itemMap={};d.div.addClass("ke-toolbar").bind("contextmenu,mousedown,mousemove",function(a){a.preventDefault()}).attr("unselectable", +"on");d.div.mouseover(function(a){c(a,"addClass")}).mouseout(function(a){c(a,"removeClass")}).click(function(a){var c=b(a.target);c&&!c.hasClass("ke-disabled")&&d.options.click.call(this,a,c.attr("data-name"))})},get:function(a){if(this._itemMap[a])return this._itemMap[a];return this._itemMap[a]=f("span.ke-icon-"+a,this.div).parent()},select:function(a){Bb.call(this,a,function(a){a.addClass("ke-selected")});return self},unselect:function(a){Bb.call(this,a,function(a){a.removeClass("ke-selected").removeClass("ke-on")}); +return self},enable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-disabled"),a.opacity(1);return this},disable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-selected").addClass("ke-disabled"),a.opacity(0.5);return this},disableAll:function(a,b){var c=this,d=c.noDisableItemMap;b&&(d=u(b));(a===i?!c.disableMode:a)?(f("span.ke-outline",c.div).each(function(){var a=f(this),b=a[0].getAttribute("data-name",2);d[b]||c.disable(a)}),c.disableMode=!0):(f("span.ke-outline",c.div).each(function(){var a= +f(this),b=a[0].getAttribute("data-name",2);d[b]||c.enable(a)}),c.disableMode=!1);return c}});f.ToolbarClass=Da;f.toolbar=Cb;E(ra,S,{init:function(a){a.z=a.z||811213;ra.parent.init.call(this,a);this.centerLineMode=l(a.centerLineMode,!0);this.div.addClass("ke-menu").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on")},addItem:function(a){if(a.title==="-")this.div.append(f('
    '));else{var b=f('
    '), +c=f('
    '),d=f('
    '),e=s(a.height),g=l(a.iconClass,"");this.div.append(b);e&&(b.css("height",e),d.css("line-height",e));var h;this.centerLineMode&&(h=f('
    '),e&&h.css("height",e));b.mouseover(function(){f(this).addClass("ke-menu-item-on");h&&h.addClass("ke-menu-item-center-on")}).mouseout(function(){f(this).removeClass("ke-menu-item-on");h&&h.removeClass("ke-menu-item-center-on")}).click(function(b){a.click.call(f(this)); +b.stopPropagation()}).append(c);h&&b.append(h);b.append(d);a.checked&&(g="ke-icon-checked");g!==""&&c.html('');d.html(a.title);return this}},remove:function(){this.options.beforeRemove&&this.options.beforeRemove.call(this);f(".ke-menu-item",this.div[0]).unbind();ra.parent.remove.call(this);return this}});f.MenuClass=ra;f.menu=$a;E(sa,S,{init:function(a){a.z=a.z||811213;sa.parent.init.call(this,a);var b=a.colors||[["#E53333", +"#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]];this.selectedColor=(a.selectedColor||"").toLowerCase();this._cells=[];this.div.addClass("ke-colorpicker").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on");a=this.doc.createElement("table");this.div.append(a);a.className="ke-colorpicker-table"; +a.cellPadding=0;a.cellSpacing=0;a.border=0;var c=a.insertRow(0),d=c.insertCell(0);d.colSpan=b[0].length;this._addAttr(d,"","ke-colorpicker-cell-top");for(var e=0;e').css("background-color",b)):a.html(d.options.noColor);f(a).attr("unselectable","on");d._cells.push(a)},remove:function(){m(this._cells,function(){this.unbind()});sa.parent.remove.call(this);return this}});f.ColorPickerClass=sa;f.colorpicker=Db;E(ab,{init:function(a){var b=f(a.button),c=a.fieldName|| +"file",d=a.url||"",e=b.val(),g=a.extraParams||{},h=b[0].className||"",j=a.target||"kindeditor_upload_iframe_"+(new Date).getTime();a.afterError=a.afterError||function(a){alert(a)};var k=[],i;for(i in g)k.push('');c=['
    ',a.target?"":'',a.form?'
    ':'
    ','',k.join(""),'',"",'',a.form?"
    ":"","
    "].join("");c=f(c,b.doc);b.hide();b.before(c);this.div=c;this.button=b;this.iframe=a.target?f('iframe[name="'+j+'"]'):f("iframe",c);this.form=a.form?f(a.form):f("form",c);this.fileBox=f(".ke-upload-file",c);b=a.width||f(".ke-button-common",c).width(); +f(".ke-upload-area",c).width(b);this.options=a},submit:function(){var a=this,b=a.iframe;b.bind("load",function(){b.unbind();var c=document.createElement("form");a.fileBox.before(c);f(c).append(a.fileBox);c.reset();f(c).remove(!0);var c=f.iframeDoc(b),d=c.getElementsByTagName("pre")[0],e="",g,e=d?d.innerHTML:c.body.innerHTML,e=fa(e);b[0].src="javascript:false";try{g=f.json(e)}catch(h){a.options.afterError.call(a,""+c.body.parentNode.innerHTML+"")}g&&a.options.afterUpload.call(a, +g)});a.form[0].submit();return a},remove:function(){this.fileBox&&this.fileBox.unbind();this.iframe.remove();this.div.remove();this.button.show();return this}});f.UploadButtonClass=ab;f.uploadbutton=function(a){return new ab(a)};E(ta,S,{init:function(a){var b=l(a.shadowMode,!0);a.z=a.z||811213;a.shadowMode=!1;a.autoScroll=l(a.autoScroll,!0);ta.parent.init.call(this,a);var c=a.title,d=f(a.body,this.doc),e=a.previewBtn,g=a.yesBtn,h=a.noBtn,j=a.closeBtn,k=l(a.showMask,!0);this.div.addClass("ke-dialog").bind("click,mousedown", +function(a){a.stopPropagation()});var i=f('
    ').appendTo(this.div);o&&A<7?this.iframeMask=f('').appendTo(this.div):b&&f('
    ').appendTo(this.div);b=f('
    ');i.append(b);b.html(c);this.closeIcon=f('').click(j.click);b.append(this.closeIcon);this.draggable({clickEl:b,beforeDrag:a.beforeDrag}); +a=f('
    ');i.append(a);a.append(d);var q=f('');(e||g||h)&&i.append(q);m([{btn:e,name:"preview"},{btn:g,name:"yes"},{btn:h,name:"no"}],function(){if(this.btn){var a=this.btn,a=a||{},b=a.name||"",c=f(''),b=f('');a.click&&b.click(a.click);c.append(b);c.addClass("ke-dialog-"+this.name);q.append(c)}}); +this.height&&a.height(t(this.height)-b.height()-q.height());this.div.width(this.div.width());this.div.height(this.div.height());this.mask=null;if(k)d=G(this.doc),this.mask=Ya({x:0,y:0,z:this.z-1,cls:"ke-dialog-mask",width:Math.max(d.scrollWidth,d.clientWidth),height:Math.max(d.scrollHeight,d.clientHeight)});this.autoPos(this.div.width(),this.div.height());this.footerDiv=q;this.bodyDiv=a;this.headerDiv=b;this.isLoading=!1},setMaskIndex:function(a){this.mask.div.css("z-index",a)},showLoading:function(a){var a= +l(a,""),b=this.bodyDiv;this.loading=f('
    '+a+"
    ").width(b.width()).height(b.height()).css("top",this.headerDiv.height()+"px");b.css("visibility","hidden").after(this.loading);this.isLoading=!0;return this},hideLoading:function(){this.loading&&this.loading.remove();this.bodyDiv.css("visibility","visible");this.isLoading=!1;return this},remove:function(){this.options.beforeRemove&& +this.options.beforeRemove.call(this);this.mask&&this.mask.remove();this.iframeMask&&this.iframeMask.remove();this.closeIcon.unbind();f("input",this.div).unbind();f("button",this.div).unbind();this.footerDiv.unbind();this.bodyDiv.unbind();this.headerDiv.unbind();f("iframe",this.div).each(function(){f(this).remove()});ta.parent.remove.call(this);return this}});f.DialogClass=ta;f.dialog=Eb;f.tabs=function(a){var b=Ya(a),c=b.remove,d=a.afterSelect,a=b.div,e=[];a.addClass("ke-tabs").bind("contextmenu,mousedown,mousemove", +function(a){a.preventDefault()});var g=f('
      ');a.append(g);b.add=function(a){var b=f('
    • '+a.title+"
    • ");b.data("tab",a);e.push(b);g.append(b)};b.selectedIndex=0;b.select=function(a){b.selectedIndex=a;m(e,function(c,d){d.unbind();c===a?(d.addClass("ke-tabs-li-selected"),f(d.data("tab").panel).show("")):(d.removeClass("ke-tabs-li-selected").removeClass("ke-tabs-li-on").mouseover(function(){f(this).addClass("ke-tabs-li-on")}).mouseout(function(){f(this).removeClass("ke-tabs-li-on")}).click(function(){b.select(c)}), +f(d.data("tab").panel).hide())});d&&d.call(b,a)};b.remove=function(){m(e,function(){this.remove()});g.remove();c.call(b)};return b};f.loadScript=bb;f.loadStyle=cb;f.ajax=function(a,b,c,d,e){var c=c||"GET",e=e||"json",g=w.XMLHttpRequest?new w.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");g.open(c,a,!0);g.onreadystatechange=function(){if(g.readyState==4&&g.status==200&&b){var a=B(g.responseText);e=="json"&&(a=eb(a));b(a)}};if(c=="POST"){var f=[];m(d,function(a,b){f.push(encodeURIComponent(a)+ +"="+encodeURIComponent(b))});try{g.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(j){}g.send(f.join("&"))}else g.send(null)};var N={},O={};ua.prototype={lang:function(a){return Ib(a,this.langType)},loadPlugin:function(a,b){var c=this;if(N[a]){if(!wa(N[a]))return setTimeout(function(){c.loadPlugin(a,b)},100),c;N[a].call(c,KindEditor);b&&b.call(c);return c}N[a]="loading";bb(c.pluginsPath+a+"/"+a+".js?ver="+encodeURIComponent(f.DEBUG?Ga:Ha),function(){setTimeout(function(){N[a]&& +c.loadPlugin(a,b)},0)});return c},handler:function(a,b){var c=this;c._handlers[a]||(c._handlers[a]=[]);if(wa(b))return c._handlers[a].push(b),c;m(c._handlers[a],function(){b=this.call(c,b)});return b},clickToolbar:function(a,b){var c=this,d="clickToolbar"+a;if(b===i){if(c._handlers[d])return c.handler(d);c.loadPlugin(a,function(){c.handler(d)});return c}return c.handler(d,b)},updateState:function(){var a=this;m("justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,subscript,superscript,bold,italic,underline,strikethrough".split(","), +function(b,c){a.cmd.state(c)?a.toolbar.select(c):a.toolbar.unselect(c)});return a},addContextmenu:function(a){this._contextmenus.push(a);return this},afterCreate:function(a){return this.handler("afterCreate",a)},beforeRemove:function(a){return this.handler("beforeRemove",a)},beforeGetHtml:function(a){return this.handler("beforeGetHtml",a)},beforeSetHtml:function(a){return this.handler("beforeSetHtml",a)},afterSetHtml:function(a){return this.handler("afterSetHtml",a)},create:function(){function a(){k.height()=== +0?setTimeout(a,100):b.resize(d,e,!1)}var b=this,c=b.fullscreenMode;if(b.isCreated)return b;if(b.srcElement.data("kindeditor"))return b;b.srcElement.data("kindeditor","true");c?G().style.overflow="hidden":G().style.overflow="";var d=c?G().clientWidth+"px":b.width,e=c?G().clientHeight+"px":b.height;if(o&&A<8||P)e=s(t(e)+2);var g=b.container=f(b.layout);c?f(document.body).append(g):b.srcElement.before(g);var h=f(".toolbar",g),j=f(".edit",g),k=b.statusbar=f(".statusbar",g);g.removeClass("container").addClass("ke-container ke-container-"+ +b.themeType).css("width",d);if(c){g.css({position:"absolute",left:0,top:0,"z-index":811211});if(!Y)b._scrollPos=ca();w.scrollTo(0,0);f(document.body).css({height:"1px",overflow:"hidden"});f(document.body.parentNode).css("overflow","hidden");b._fullscreenExecuted=!0}else b._fullscreenExecuted&&(f(document.body).css({height:"",overflow:""}),f(document.body.parentNode).css("overflow","")),b._scrollPos&&w.scrollTo(b._scrollPos.x,b._scrollPos.y);var i=[];f.each(b.items,function(a,c){c=="|"?i.push(''): +c=="/"?i.push('
      '):(i.push(''),i.push(''))});var h=b.toolbar=Cb({src:h,html:i.join(""),noDisableItems:b.noDisableItems,click:function(a,c){a.stop();if(b.menu){var d=b.menu.name;b.hideMenu();if(d===c)return}b.clickToolbar(c)}}),l=t(e)-h.div.height(),m=b.edit=Ab({height:l>0&&t(e)>b.minHeight?l:b.minHeight, +src:j,srcElement:b.srcElement,designMode:b.designMode,themesPath:b.themesPath,bodyClass:b.bodyClass,cssPath:b.cssPath,cssData:b.cssData,beforeGetHtml:function(a){a=b.beforeGetHtml(a);a=T(Fa(a));return U(a,b.filterMode?b.htmlTags:null,b.urlType,b.wellFormatMode,b.indentChar)},beforeSetHtml:function(a){a=U(a,b.filterMode?b.htmlTags:null,"",!1);return b.beforeSetHtml(a)},afterSetHtml:function(){b.edit=m=this;b.afterSetHtml()},afterCreate:function(){b.edit=m=this;b.cmd=m.cmd;b._docMousedownFn=function(){b.menu&& +b.hideMenu()};f(m.doc,document).mousedown(b._docMousedownFn);ac.call(b);bc.call(b);cc.call(b);dc.call(b);m.afterChange(function(){m.designMode&&(b.updateState(),b.addBookmark(),b.options.afterChange&&b.options.afterChange.call(b))});m.textarea.keyup(function(a){!a.ctrlKey&&!a.altKey&&Ob[a.which]&&b.options.afterChange&&b.options.afterChange.call(b)});b.readonlyMode&&b.readonly();b.isCreated=!0;if(b.initContent==="")b.initContent=b.html();if(b._undoStack.length>0){var a=b._undoStack.pop();a.start&& +(b.html(a.html),m.cmd.range.moveToBookmark(a),b.select())}b.afterCreate();b.options.afterCreate&&b.options.afterCreate.call(b)}});k.removeClass("statusbar").addClass("ke-statusbar").append('').append('');if(b._fullscreenResizeHandler)f(w).unbind("resize",b._fullscreenResizeHandler),b._fullscreenResizeHandler=null;a();c?(b._fullscreenResizeHandler=function(){b.isCreated&&b.resize(G().clientWidth, +G().clientHeight,!1)},f(w).bind("resize",b._fullscreenResizeHandler),h.select("fullscreen"),k.first().css("visibility","hidden"),k.last().css("visibility","hidden")):(Y&&f(w).bind("scroll",function(){b._scrollPos=ca()}),b.resizeType>0?Wa({moveEl:g,clickEl:k,moveFn:function(a,c,d,e,g,f){e+=f;b.resize(null,e)}}):k.first().css("visibility","hidden"),b.resizeType===2?Wa({moveEl:g,clickEl:k.last(),moveFn:function(a,c,d,e,g,f){d+=g;e+=f;b.resize(d,e)}}):k.last().css("visibility","hidden"));return b},remove:function(){var a= +this;if(!a.isCreated)return a;a.beforeRemove();a.srcElement.data("kindeditor","");a.menu&&a.hideMenu();m(a.dialogs,function(){a.hideDialog()});f(document).unbind("mousedown",a._docMousedownFn);a.toolbar.remove();a.edit.remove();a.statusbar.last().unbind();a.statusbar.unbind();a.container.remove();a.container=a.toolbar=a.edit=a.menu=null;a.dialogs=[];a.isCreated=!1;return a},resize:function(a,b,c){c=l(c,!0);if(a&&(/%/.test(a)||(a=t(a),a=a/ig,"").replace(/ /ig," ")):this.html(C(a))},isEmpty:function(){return B(this.text().replace(/\r\n|\n|\r/,""))===""},isDirty:function(){return B(this.initContent.replace(/\r\n|\n|\r|t/g,""))!==B(this.html().replace(/\r\n|\n|\r|t/g,""))},selectedHtml:function(){var a=this.isCreated?this.cmd.range.html():"";return a=T(Fa(a))},count:function(a){a=(a||"html").toLowerCase();if(a==="html")return this.html().length; +if(a==="text")return this.text().replace(/<(?:img|embed).*?>/ig,"K").replace(/\r\n|\n|\r/g,"").length;return 0},exec:function(a){var a=a.toLowerCase(),b=this.cmd,c=J(a,"selectall,copy,paste,print".split(","))<0;c&&this.addBookmark(!1);b[a].apply(b,Ja(arguments,1));c&&(this.updateState(),this.addBookmark(!1),this.options.afterChange&&this.options.afterChange.call(this));return this},insertHtml:function(a,b){if(!this.isCreated)return this;a=this.beforeSetHtml(a);this.exec("inserthtml",a,b);return this}, +appendHtml:function(a){this.html(this.html()+a);if(this.isCreated)a=this.cmd,a.range.selectNodeContents(a.doc.body).collapse(!1),a.select();return this},sync:function(){pa(this.srcElement,this.html());return this},focus:function(){this.isCreated?this.edit.focus():this.srcElement[0].focus();return this},blur:function(){this.isCreated?this.edit.blur():this.srcElement[0].blur();return this},addBookmark:function(a){var a=l(a,!0),b=this.edit,c=b.doc.body,d=Fa(c.innerHTML);if(a&&this._undoStack.length> +0&&Math.abs(d.length-T(this._undoStack[this._undoStack.length-1].html).length)0){var c=b.dialogs[b.dialogs.length-1];b.dialogs[0].setMaskIndex(c.z+2);a.z=c.z+3;a.showMask=!1}a=Eb(a);b.dialogs.push(a);return a},hideDialog:function(){this.dialogs.length>0&&this.dialogs.pop().remove();this.dialogs.length>0&&this.dialogs[0].setMaskIndex(this.dialogs[this.dialogs.length- +1].z-1);return this},errorDialog:function(a){var b=this.createDialog({width:750,title:this.lang("uploadError"),body:'
      '}),b=f("iframe",b.div),c=f.iframeDoc(b);c.open();c.write(a);c.close();f(c.body).css("background-color","#FFF");b[0].contentWindow.focus();return this}};_instances=[];f.remove=function(a){va(a,function(a){this.remove();_instances.splice(a,1)})};f.sync=function(a){va(a,function(){this.sync()})}; +f.html=function(a,b){va(a,function(){this.html(b)})};f.insertHtml=function(a,b){va(a,function(){this.insertHtml(b)})};f.appendHtml=function(a,b){va(a,function(){this.appendHtml(b)})};o&&A<7&&Q(document,"BackgroundImageCache",!0);f.EditorClass=ua;f.editor=function(a){return new ua(a)};f.create=Lb;f.instances=_instances;f.plugin=Gb;f.lang=Ib;Gb("core",function(a){var b=this,c={undo:"Z",redo:"Y",bold:"B",italic:"I",underline:"U",print:"P",selectall:"A"};b.afterSetHtml(function(){b.options.afterChange&& +b.options.afterChange.call(b)});b.afterCreate(function(){if(b.syncType=="form"){for(var c=a(b.srcElement),d=!1;c=c.parent();)if(c.name=="form"){d=!0;break}if(d){c.bind("submit",function(){b.sync();a(w).bind("unload",function(){b.edit.textarea.remove()})});var f=a('[type="reset"]',c);f.click(function(){b.html(b.initContent);b.cmd.selection()});b.beforeRemove(function(){c.unbind();f.unbind()})}}});b.clickToolbar("source",function(){b.edit.designMode?(b.toolbar.disableAll(!0),b.edit.design(!1),b.toolbar.select("source")): +(b.toolbar.disableAll(!1),b.edit.design(!0),b.toolbar.unselect("source"),Y?setTimeout(function(){b.cmd.selection()},0):b.cmd.selection());b.designMode=b.edit.designMode});b.afterCreate(function(){b.designMode||b.toolbar.disableAll(!0).select("source")});b.clickToolbar("fullscreen",function(){b.fullscreen()});if(b.fullscreenShortcut){var d=!1;b.afterCreate(function(){a(b.edit.doc,b.edit.textarea).keyup(function(a){a.which==27&&setTimeout(function(){b.fullscreen()},0)});if(d){if(o&&!b.designMode)return; +b.focus()}d||(d=!0)})}m("undo,redo".split(","),function(a,d){c[d]&&b.afterCreate(function(){Ka(this.edit.doc,c[d],function(){b.clickToolbar(d)})});b.clickToolbar(d,function(){b[d]()})});b.clickToolbar("formatblock",function(){var a=b.lang("formatblock.formatBlock"),c={h1:28,h2:24,h3:18,H4:14,p:12},d=b.cmd.val("formatblock"),f=b.createMenu({name:"formatblock",width:b.langType=="en"?200:150});m(a,function(a,e){var i="font-size:"+c[a]+"px;";a.charAt(0)==="h"&&(i+="font-weight:bold;");f.addItem({title:''+e+"",height:c[a]+12,checked:d===a||d===e,click:function(){b.select().exec("formatblock","<"+a+">").hideMenu()}})})});b.clickToolbar("fontname",function(){var a=b.cmd.val("fontname"),c=b.createMenu({name:"fontname",width:150});m(b.lang("fontname.fontName"),function(d,f){c.addItem({title:''+f+"",checked:a===d.toLowerCase()||a===f.toLowerCase(),click:function(){b.exec("fontname",d).hideMenu()}})})});b.clickToolbar("fontsize", +function(){var a=b.cmd.val("fontsize"),c=b.createMenu({name:"fontsize",width:150});m(b.fontSizeTable,function(d,f){c.addItem({title:''+f+"",height:t(f)+12,checked:a===f,click:function(){b.exec("fontsize",f).hideMenu()}})})});m("forecolor,hilitecolor".split(","),function(a,c){b.clickToolbar(c,function(){b.createMenu({name:c,selectedColor:b.cmd.val(c)||"default",colors:b.colorTable,click:function(a){b.exec(c,a).hideMenu()}})})});m("cut,copy,paste".split(","), +function(a,c){b.clickToolbar(c,function(){b.focus();try{b.exec(c,null)}catch(a){alert(b.lang(c+"Error"))}})});b.clickToolbar("about",function(){var a='
      KindEditor '+Ha+'
      Copyright © kindsoft.net All rights reserved.
      ';b.createDialog({name:"about",width:350,title:b.lang("about"),body:a})});b.plugin.getSelectedLink=function(){return b.cmd.commonAncestor("a")};b.plugin.getSelectedImage=function(){return Ea(b.edit.cmd.range, +function(a){return!/^ke-\w+$/i.test(a[0].className)})};b.plugin.getSelectedFlash=function(){return Ea(b.edit.cmd.range,function(a){return a[0].className=="ke-flash"})};b.plugin.getSelectedMedia=function(){return Ea(b.edit.cmd.range,function(a){return a[0].className=="ke-media"||a[0].className=="ke-rm"})};b.plugin.getSelectedAnchor=function(){return Ea(b.edit.cmd.range,function(a){return a[0].className=="ke-anchor"})};m("link,image,flash,media,anchor".split(","),function(a,c){var d=c.charAt(0).toUpperCase()+ +c.substr(1);m("edit,delete".split(","),function(a,e){b.addContextmenu({title:b.lang(e+d),click:function(){b.loadPlugin(c,function(){b.plugin[c][e]();b.hideMenu()})},cond:b.plugin["getSelected"+d],width:150,iconClass:e=="edit"?"ke-icon-"+c:i})});b.addContextmenu({title:"-"})});b.plugin.getSelectedTable=function(){return b.cmd.commonAncestor("table")};b.plugin.getSelectedRow=function(){return b.cmd.commonAncestor("tr")};b.plugin.getSelectedCell=function(){return b.cmd.commonAncestor("td")};m("prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,rowsplit,colsplit,coldelete,rowdelete,insert,delete".split(","), +function(a,c){var d=J(c,["prop","delete"])<0?b.plugin.getSelectedCell:b.plugin.getSelectedTable;b.addContextmenu({title:b.lang("table"+c),click:function(){b.loadPlugin("table",function(){b.plugin.table[c]();b.hideMenu()})},cond:d,width:170,iconClass:"ke-icon-table"+c})});b.addContextmenu({title:"-"});m("selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript,hr,print,bold,italic,underline,strikethrough,removeformat,unlink".split(","), +function(a,d){c[d]&&b.afterCreate(function(){Ka(this.edit.doc,c[d],function(){b.cmd.selection();b.clickToolbar(d)})});b.clickToolbar(d,function(){b.focus().exec(d,null)})});b.afterCreate(function(){function c(){f.range.moveToBookmark(j);f.select();X&&(a("div."+l,i).each(function(){a(this).after("
      ").remove(!0)}),a("span.Apple-style-span",i).remove(!0),a("span.Apple-tab-span",i).remove(!0),a("span[style]",i).each(function(){a(this).css("white-space")=="nowrap"&&a(this).remove(!0)}),a("meta",i).remove()); +var d=i[0].innerHTML;i.remove();d!==""&&(X&&(d=d.replace(/(
      )\1/ig,"$1")),b.pasteType===2&&(d=d.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig,""),/schemas-microsoft-com|worddocument|mso-\w+/i.test(d)?d=nb(d,b.filterMode?b.htmlTags:a.options.htmlTags):(d=U(d,b.filterMode?b.htmlTags:null),d=b.beforeSetHtml(d))),b.pasteType===1&&(d=d.replace(/ /ig," "),d=d.replace(/\n\s*\n/g,"\n"),d=d.replace(/]*>/ig,"\n"),d=d.replace(/<\/p>]*>/ig,"\n"),d=d.replace(/<[^>]+>/g,""),d=d.replace(/ {2}/g,"  "), +b.newlineTag=="p"?/\n/.test(d)&&(d=d.replace(/^/,"

      ").replace(/$/,"

      ").replace(/\n/g,"

      ")):d=d.replace(/\n/g,"
      $&")),b.insertHtml(d,!0))}var d=b.edit.doc,f,j,i,l="__kindeditor_paste__",m=!1;a(d.body).bind("paste",function(p){if(b.pasteType===0)p.stop();else if(!m){m=!0;a("div."+l,d).remove();f=b.cmd.selection();j=f.range.createBookmark();i=a('

      ',d).css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",left:"-1981px",top:a(j.start).pos().y+ +"px","white-space":"nowrap"});a(d.body).append(i);if(o){var s=f.range.get(!0);s.moveToElementText(i[0]);s.select();s.execCommand("paste");p.preventDefault()}else f.range.selectNodeContents(i[0]),f.select();setTimeout(function(){c();m=!1},0)}})});b.beforeGetHtml(function(a){o&&A<=8&&(a=a.replace(/]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b){return unescape(b)}),a=a.replace(/(]*)?>)/ig,function(a,b,c){if(!/\s+type="[^"]+"/i.test(a))return b+' type="text"'+ +c;return a}));return a.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig,function(a,b,c,d){return b+fa(c).replace(/\s+/g," ")+d}).replace(/]*class="?ke-(flash|rm|media)"?[^>]*>/ig,function(a){var a=I(a),b=ba(a.style||""),c=pb(a["data-ke-tag"]),d=l(b.width,""),b=l(b.height,"");/px/i.test(d)&&(d=t(d));/px/i.test(b)&&(b=t(b));c.width=l(a.width,d);c.height=l(a.height,b);return Ma(c)}).replace(/]*class="?ke-anchor"?[^>]*>/ig,function(a){a=I(a);return''}).replace(/]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return""+unescape(c)+"<\/script>"}).replace(/]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return""+unescape(c)+""}).replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig,function(a,b,c){a=a.replace(/(\s+(?:href|src)=")[^"]*(")/i,function(a,b,d){return b+fa(c)+d});return a=a.replace(/\s+data-ke-src="[^"]*"/i, +"")}).replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+c})});b.beforeSetHtml(function(a){o&&A<=8&&(a=a.replace(/]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig,function(a){var b=I(a);if(ba(b.style||"").display=="none")return'
      ';return a}));return a.replace(/]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig,function(a){a=I(a);a.src=l(a.src,"");a.width=l(a.width,0);a.height=l(a.height,0);return qb(b.themesPath+ +"common/blank.gif",a)}).replace(/]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig,function(a){var c=I(a);if(c.href!==i)return a;return''}).replace(/]*)>([\s\S]*?)<\/script>/ig,function(a,b,c){return'
      '+escape(c)+"
      "}).replace(/]*)>([\s\S]*?)<\/noscript>/ig,function(a,b,c){return'
      '+escape(c)+"
      "}).replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig,function(a,b,c,d,e){if(a.match(/\sdata-ke-src="[^"]*"/i))return a;return a=b+c+'="'+d+'" data-ke-src="'+C(d)+'"'+e}).replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+"data-ke-"+c}).replace(/]*\s+border="0"[^>]*>/ig,function(a){if(a.indexOf("ke-zeroborder")>=0)return a;return Sb(a,"ke-zeroborder")})})})}})(window); diff --git a/member/editor/kindeditor/lang/en.js b/member/editor/kindeditor/lang/en.js new file mode 100644 index 0000000..39ce909 --- /dev/null +++ b/member/editor/kindeditor/lang/en.js @@ -0,0 +1,232 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.lang({ + source : 'Source', + preview : 'Preview', + undo : 'Undo(Ctrl+Z)', + redo : 'Redo(Ctrl+Y)', + cut : 'Cut(Ctrl+X)', + copy : 'Copy(Ctrl+C)', + paste : 'Paste(Ctrl+V)', + plainpaste : 'Paste as plain text', + wordpaste : 'Paste from Word', + selectall : 'Select all', + justifyleft : 'Align left', + justifycenter : 'Align center', + justifyright : 'Align right', + justifyfull : 'Align full', + insertorderedlist : 'Ordered list', + insertunorderedlist : 'Unordered list', + indent : 'Increase indent', + outdent : 'Decrease indent', + subscript : 'Subscript', + superscript : 'Superscript', + formatblock : 'Paragraph format', + fontname : 'Font family', + fontsize : 'Font size', + forecolor : 'Text color', + hilitecolor : 'Highlight color', + bold : 'Bold(Ctrl+B)', + italic : 'Italic(Ctrl+I)', + underline : 'Underline(Ctrl+U)', + strikethrough : 'Strikethrough', + removeformat : 'Remove format', + image : 'Image', + multiimage : 'Multi image', + flash : 'Flash', + media : 'Embeded media', + table : 'Table', + tablecell : 'Cell', + hr : 'Insert horizontal line', + emoticons : 'Insert emoticon', + link : 'Link', + unlink : 'Unlink', + fullscreen : 'Toggle fullscreen mode', + about : 'About', + print : 'Print', + filemanager : 'File Manager', + code : 'Insert code', + map : 'Google Maps', + baidumap : 'Baidu Maps', + lineheight : 'Line height', + clearhtml : 'Clear HTML code', + pagebreak : 'Insert Page Break', + quickformat : 'Quick Format', + insertfile : 'Insert file', + template : 'Insert Template', + anchor : 'Anchor', + yes : 'OK', + no : 'Cancel', + close : 'Close', + editImage : 'Image properties', + deleteImage : 'Delete image', + editFlash : 'Flash properties', + deleteFlash : 'Delete flash', + editMedia : 'Media properties', + deleteMedia : 'Delete media', + editLink : 'Link properties', + deleteLink : 'Unlink', + tableprop : 'Table properties', + tablecellprop : 'Cell properties', + tableinsert : 'Insert table', + tabledelete : 'Delete table', + tablecolinsertleft : 'Insert column left', + tablecolinsertright : 'Insert column right', + tablerowinsertabove : 'Insert row above', + tablerowinsertbelow : 'Insert row below', + tablerowmerge : 'Merge down', + tablecolmerge : 'Merge right', + tablerowsplit : 'Split row', + tablecolsplit : 'Split column', + tablecoldelete : 'Delete column', + tablerowdelete : 'Delete row', + noColor : 'Default', + pleaseSelectFile : 'Please select file.', + invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png", + invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb", + invalidWidth : "The width must be number.", + invalidHeight : "The height must be number.", + invalidBorder : "The border must be number.", + invalidUrl : "Please type valid URL.", + invalidRows : 'Invalid rows.', + invalidCols : 'Invalid columns.', + invalidPadding : 'The padding must be number.', + invalidSpacing : 'The spacing must be number.', + invalidJson : 'Invalid JSON string.', + uploadSuccess : 'Upload success.', + cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.', + copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.', + pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.', + ajaxLoading : 'Loading ...', + uploadLoading : 'Uploading ...', + uploadError : 'Upload Error', + 'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.', + 'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.', + 'code.pleaseInput' : 'Please input code.', + 'link.url' : 'URL', + 'link.linkType' : 'Target', + 'link.newWindow' : 'New window', + 'link.selfWindow' : 'Same window', + 'flash.url' : 'URL', + 'flash.width' : 'Width', + 'flash.height' : 'Height', + 'flash.upload' : 'Upload', + 'flash.viewServer' : 'Browse', + 'media.url' : 'URL', + 'media.width' : 'Width', + 'media.height' : 'Height', + 'media.autostart' : 'Auto start', + 'media.upload' : 'Upload', + 'media.viewServer' : 'Browse', + 'image.remoteImage' : 'Insert URL', + 'image.localImage' : 'Upload', + 'image.remoteUrl' : 'URL', + 'image.localUrl' : 'File', + 'image.size' : 'Size', + 'image.width' : 'Width', + 'image.height' : 'Height', + 'image.resetSize' : 'Reset dimensions', + 'image.align' : 'Align', + 'image.defaultAlign' : 'Default', + 'image.leftAlign' : 'Left', + 'image.rightAlign' : 'Right', + 'image.imgTitle' : 'Title', + 'image.upload' : 'Browse', + 'image.viewServer' : 'Browse', + 'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>', + 'multiimage.startUpload' : 'Start upload', + 'multiimage.clearAll' : 'Clear all', + 'multiimage.insertAll' : 'Insert all', + 'multiimage.queueLimitExceeded' : 'Queue limit exceeded.', + 'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.', + 'multiimage.zeroByteFile' : 'Zero byte file.', + 'multiimage.invalidFiletype' : 'Invalid file type.', + 'multiimage.unknownError' : 'Unknown upload error.', + 'multiimage.pending' : 'Pending ...', + 'multiimage.uploadError' : 'Upload error', + 'filemanager.emptyFolder' : 'Blank', + 'filemanager.moveup' : 'Parent folder', + 'filemanager.viewType' : 'Display: ', + 'filemanager.viewImage' : 'Thumbnails', + 'filemanager.listImage' : 'List', + 'filemanager.orderType' : 'Sorting: ', + 'filemanager.fileName' : 'By name', + 'filemanager.fileSize' : 'By size', + 'filemanager.fileType' : 'By type', + 'insertfile.url' : 'URL', + 'insertfile.title' : 'Title', + 'insertfile.upload' : 'Upload', + 'insertfile.viewServer' : 'Browse', + 'table.cells' : 'Cells', + 'table.rows' : 'Rows', + 'table.cols' : 'Columns', + 'table.size' : 'Dimensions', + 'table.width' : 'Width', + 'table.height' : 'Height', + 'table.percent' : '%', + 'table.px' : 'px', + 'table.space' : 'Space', + 'table.padding' : 'Padding', + 'table.spacing' : 'Spacing', + 'table.align' : 'Align', + 'table.textAlign' : 'Horizontal', + 'table.verticalAlign' : 'Vertical', + 'table.alignDefault' : 'Default', + 'table.alignLeft' : 'Left', + 'table.alignCenter' : 'Center', + 'table.alignRight' : 'Right', + 'table.alignTop' : 'Top', + 'table.alignMiddle' : 'Middle', + 'table.alignBottom' : 'Bottom', + 'table.alignBaseline' : 'Baseline', + 'table.border' : 'Border', + 'table.borderWidth' : 'Width', + 'table.borderColor' : 'Color', + 'table.backgroundColor' : 'Background', + 'map.address' : 'Address: ', + 'map.search' : 'Search', + 'baidumap.address' : 'Address: ', + 'baidumap.search' : 'Search', + 'baidumap.insertDynamicMap' : 'Dynamic Map', + 'anchor.name' : 'Anchor name', + 'formatblock.formatBlock' : { + h1 : 'Heading 1', + h2 : 'Heading 2', + h3 : 'Heading 3', + h4 : 'Heading 4', + p : 'Normal' + }, + 'fontname.fontName' : { + 'Arial' : 'Arial', + 'Arial Black' : 'Arial Black', + 'Comic Sans MS' : 'Comic Sans MS', + 'Courier New' : 'Courier New', + 'Garamond' : 'Garamond', + 'Georgia' : 'Georgia', + 'Tahoma' : 'Tahoma', + 'Times New Roman' : 'Times New Roman', + 'Trebuchet MS' : 'Trebuchet MS', + 'Verdana' : 'Verdana' + }, + 'lineheight.lineHeight' : [ + {'1' : 'Line height 1'}, + {'1.5' : 'Line height 1.5'}, + {'2' : 'Line height 2'}, + {'2.5' : 'Line height 2.5'}, + {'3' : 'Line height 3'} + ], + 'template.selectTemplate' : 'Template', + 'template.replaceContent' : 'Replace current content', + 'template.fileList' : { + '1.html' : 'Image and Text', + '2.html' : 'Table', + '3.html' : 'List' + } +}, 'en'); diff --git a/member/editor/kindeditor/lang/zh_CN.js b/member/editor/kindeditor/lang/zh_CN.js new file mode 100644 index 0000000..c8506f3 --- /dev/null +++ b/member/editor/kindeditor/lang/zh_CN.js @@ -0,0 +1,236 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.lang({ + source : 'HTML代码', + preview : '预览', + undo : '后退(Ctrl+Z)', + redo : '前进(Ctrl+Y)', + cut : '剪切(Ctrl+X)', + copy : '复制(Ctrl+C)', + paste : '粘贴(Ctrl+V)', + plainpaste : '粘贴为无格式文本', + wordpaste : '从Word粘贴', + selectall : '全选(Ctrl+A)', + justifyleft : '左对齐', + justifycenter : '居中', + justifyright : '右对齐', + justifyfull : '两端对齐', + insertorderedlist : '编号', + insertunorderedlist : '项目符号', + indent : '增加缩进', + outdent : '减少缩进', + subscript : '下标', + superscript : '上标', + formatblock : '段落', + fontname : '字体', + fontsize : '文字大小', + forecolor : '文字颜色', + hilitecolor : '文字背景', + bold : '粗体(Ctrl+B)', + italic : '斜体(Ctrl+I)', + underline : '下划线(Ctrl+U)', + strikethrough : '删除线', + removeformat : '删除格式', + image : '图片', + multiimage : '批量图片上传', + flash : 'Flash', + media : '视音频', + table : '表格', + tablecell : '单元格', + hr : '插入横线', + emoticons : '插入表情', + link : '超级链接', + unlink : '取消超级链接', + fullscreen : '全屏显示', + about : '关于', + print : '打印(Ctrl+P)', + filemanager : '文件空间', + code : '插入程序代码', + map : 'Google地图', + baidumap : '百度地图', + lineheight : '行距', + clearhtml : '清理HTML代码', + pagebreak : '插入分页符', + quickformat : '一键排版', + insertfile : '插入文件', + template : '插入模板', + anchor : '锚点', + yes : '确定', + no : '取消', + close : '关闭', + editImage : '图片属性', + deleteImage : '删除图片', + editFlash : 'Flash属性', + deleteFlash : '删除Flash', + editMedia : '视音频属性', + deleteMedia : '删除视音频', + editLink : '超级链接属性', + deleteLink : '取消超级链接', + editAnchor : '锚点属性', + deleteAnchor : '删除锚点', + tableprop : '表格属性', + tablecellprop : '单元格属性', + tableinsert : '插入表格', + tabledelete : '删除表格', + tablecolinsertleft : '左侧插入列', + tablecolinsertright : '右侧插入列', + tablerowinsertabove : '上方插入行', + tablerowinsertbelow : '下方插入行', + tablerowmerge : '向下合并单元格', + tablecolmerge : '向右合并单元格', + tablerowsplit : '拆分行', + tablecolsplit : '拆分列', + tablecoldelete : '删除列', + tablerowdelete : '删除行', + noColor : '无颜色', + pleaseSelectFile : '请选择文件。', + invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。", + invalidMedia : "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。", + invalidWidth : "宽度必须为数字。", + invalidHeight : "高度必须为数字。", + invalidBorder : "边框必须为数字。", + invalidUrl : "请输入有效的URL地址。", + invalidRows : '行数为必选项,只允许输入大于0的数字。', + invalidCols : '列数为必选项,只允许输入大于0的数字。', + invalidPadding : '边距必须为数字。', + invalidSpacing : '间距必须为数字。', + invalidJson : '服务器发生故障。', + uploadSuccess : '上传成功。', + cutError : '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。', + copyError : '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。', + pasteError : '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。', + ajaxLoading : '加载中,请稍候 ...', + uploadLoading : '上传中,请稍候 ...', + uploadError : '上传错误', + 'plainpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。', + 'wordpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。', + 'code.pleaseInput' : '请输入程序代码。', + 'link.url' : 'URL', + 'link.linkType' : '打开类型', + 'link.newWindow' : '新窗口', + 'link.selfWindow' : '当前窗口', + 'flash.url' : 'URL', + 'flash.width' : '宽度', + 'flash.height' : '高度', + 'flash.upload' : '上传', + 'flash.viewServer' : '文件空间', + 'media.url' : 'URL', + 'media.width' : '宽度', + 'media.height' : '高度', + 'media.autostart' : '自动播放', + 'media.upload' : '上传', + 'media.viewServer' : '文件空间', + 'image.remoteImage' : '网络图片', + 'image.localImage' : '本地上传', + 'image.remoteUrl' : '图片地址', + 'image.localUrl' : '上传文件', + 'image.size' : '图片大小', + 'image.width' : '宽', + 'image.height' : '高', + 'image.resetSize' : '重置大小', + 'image.align' : '对齐方式', + 'image.defaultAlign' : '默认方式', + 'image.leftAlign' : '左对齐', + 'image.rightAlign' : '右对齐', + 'image.imgTitle' : '图片说明', + 'image.upload' : '浏览...', + 'image.viewServer' : '图片空间', + 'multiimage.uploadDesc' : '允许用户同时上传<%=uploadLimit%>张图片,单张图片容量不超过<%=sizeLimit%>', + 'multiimage.startUpload' : '开始上传', + 'multiimage.clearAll' : '全部清空', + 'multiimage.insertAll' : '全部插入', + 'multiimage.queueLimitExceeded' : '文件数量超过限制。', + 'multiimage.fileExceedsSizeLimit' : '文件大小超过限制。', + 'multiimage.zeroByteFile' : '无法上传空文件。', + 'multiimage.invalidFiletype' : '文件类型不正确。', + 'multiimage.unknownError' : '发生异常,无法上传。', + 'multiimage.pending' : '等待上传', + 'multiimage.uploadError' : '上传失败', + 'filemanager.emptyFolder' : '空文件夹', + 'filemanager.moveup' : '移到上一级文件夹', + 'filemanager.viewType' : '显示方式:', + 'filemanager.viewImage' : '缩略图', + 'filemanager.listImage' : '详细信息', + 'filemanager.orderType' : '排序方式:', + 'filemanager.fileName' : '名称', + 'filemanager.fileSize' : '大小', + 'filemanager.fileType' : '类型', + 'insertfile.url' : 'URL', + 'insertfile.title' : '文件说明', + 'insertfile.upload' : '上传', + 'insertfile.viewServer' : '文件空间', + 'table.cells' : '单元格数', + 'table.rows' : '行数', + 'table.cols' : '列数', + 'table.size' : '大小', + 'table.width' : '宽度', + 'table.height' : '高度', + 'table.percent' : '%', + 'table.px' : 'px', + 'table.space' : '边距间距', + 'table.padding' : '边距', + 'table.spacing' : '间距', + 'table.align' : '对齐方式', + 'table.textAlign' : '水平对齐', + 'table.verticalAlign' : '垂直对齐', + 'table.alignDefault' : '默认', + 'table.alignLeft' : '左对齐', + 'table.alignCenter' : '居中', + 'table.alignRight' : '右对齐', + 'table.alignTop' : '顶部', + 'table.alignMiddle' : '中部', + 'table.alignBottom' : '底部', + 'table.alignBaseline' : '基线', + 'table.border' : '边框', + 'table.borderWidth' : '边框', + 'table.borderColor' : '颜色', + 'table.backgroundColor' : '背景颜色', + 'map.address' : '地址: ', + 'map.search' : '搜索', + 'baidumap.address' : '地址: ', + 'baidumap.search' : '搜索', + 'baidumap.insertDynamicMap' : '插入动态地图', + 'anchor.name' : '锚点名称', + 'formatblock.formatBlock' : { + h1 : '标题 1', + h2 : '标题 2', + h3 : '标题 3', + h4 : '标题 4', + p : '正 文' + }, + 'fontname.fontName' : { + 'SimSun' : '宋体', + 'NSimSun' : '新宋体', + 'FangSong_GB2312' : '仿宋_GB2312', + 'KaiTi_GB2312' : '楷体_GB2312', + 'SimHei' : '黑体', + 'Microsoft YaHei' : '微软雅黑', + 'Arial' : 'Arial', + 'Arial Black' : 'Arial Black', + 'Times New Roman' : 'Times New Roman', + 'Courier New' : 'Courier New', + 'Tahoma' : 'Tahoma', + 'Verdana' : 'Verdana' + }, + 'lineheight.lineHeight' : [ + {'1' : '单倍行距'}, + {'1.5' : '1.5倍行距'}, + {'2' : '2倍行距'}, + {'2.5' : '2.5倍行距'}, + {'3' : '3倍行距'} + ], + 'template.selectTemplate' : '可选模板', + 'template.replaceContent' : '替换当前内容', + 'template.fileList' : { + '1.html' : '图片和文字', + '2.html' : '表格', + '3.html' : '项目编号' + } +}, 'zh_CN'); diff --git a/member/editor/kindeditor/lang/zh_TW.js b/member/editor/kindeditor/lang/zh_TW.js new file mode 100644 index 0000000..ceac2af --- /dev/null +++ b/member/editor/kindeditor/lang/zh_TW.js @@ -0,0 +1,235 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.lang({ + source : '原始碼', + preview : '預覽', + undo : '復原(Ctrl+Z)', + redo : '重複(Ctrl+Y)', + cut : '剪下(Ctrl+X)', + copy : '複製(Ctrl+C)', + paste : '貼上(Ctrl+V)', + plainpaste : '貼為純文字格式', + wordpaste : '自Word貼上', + selectall : '全選(Ctrl+A)', + justifyleft : '靠左對齊', + justifycenter : '置中', + justifyright : '靠右對齊', + justifyfull : '左右對齊', + insertorderedlist : '編號清單', + insertunorderedlist : '項目清單', + indent : '增加縮排', + outdent : '減少縮排', + subscript : '下標', + superscript : '上標', + formatblock : '標題', + fontname : '字體', + fontsize : '文字大小', + forecolor : '文字顏色', + hilitecolor : '背景顏色', + bold : '粗體(Ctrl+B)', + italic : '斜體(Ctrl+I)', + underline : '底線(Ctrl+U)', + strikethrough : '刪除線', + removeformat : '清除格式', + image : '影像', + multiimage : '批量影像上傳', + flash : 'Flash', + media : '多媒體', + table : '表格', + hr : '插入水平線', + emoticons : '插入表情', + link : '超連結', + unlink : '移除超連結', + fullscreen : '最大化', + about : '關於', + print : '列印(Ctrl+P)', + fileManager : '瀏覽伺服器', + code : '插入程式代碼', + map : 'Google地圖', + baidumap : 'Baidu地圖', + lineheight : '行距', + clearhtml : '清理HTML代碼', + pagebreak : '插入分頁符號', + quickformat : '快速排版', + insertfile : '插入文件', + template : '插入樣板', + anchor : '錨點', + yes : '確定', + no : '取消', + close : '關閉', + editImage : '影像屬性', + deleteImage : '刪除影像', + editFlash : 'Flash屬性', + deleteFlash : '删除Flash', + editMedia : '多媒體屬性', + deleteMedia : '删除多媒體', + editLink : '超連結屬性', + deleteLink : '移除超連結', + tableprop : '表格屬性', + tablecellprop : '儲存格屬性', + tableinsert : '插入表格', + tabledelete : '刪除表格', + tablecolinsertleft : '向左插入列', + tablecolinsertright : '向右插入列', + tablerowinsertabove : '向上插入欄', + tablerowinsertbelow : '下方插入欄', + tablerowmerge : '向下合併單元格', + tablecolmerge : '向右合併單元格', + tablerowsplit : '分割欄', + tablecolsplit : '分割列', + tablecoldelete : '删除列', + tablerowdelete : '删除欄', + noColor : '自動', + pleaseSelectFile : '請選擇文件。', + invalidImg : "請輸入有效的URL。\n只允許jpg,gif,bmp,png格式。", + invalidMedia : "請輸入有效的URL。\n只允許swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。", + invalidWidth : "寬度必須是數字。", + invalidHeight : "高度必須是數字。", + invalidBorder : "邊框必須是數字。", + invalidUrl : "請輸入有效的URL。", + invalidRows : '欄數是必須輸入項目,只允許輸入大於0的數字。', + invalidCols : '列數是必須輸入項目,只允許輸入大於0的數字。', + invalidPadding : '內距必須是數字。', + invalidSpacing : '間距必須是數字。', + invalidBorder : '边框必须为数字。', + pleaseInput : "請輸入內容。", + invalidJson : '伺服器發生故障。', + uploadSuccess : '上傳成功。', + cutError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+X)完成。', + copyError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+C)完成。', + pasteError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+V)完成。', + ajaxLoading : '加載中,請稍候 ...', + uploadLoading : '上傳中,請稍候 ...', + uploadError : '上傳錯誤', + 'plainpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。', + 'wordpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。', + 'code.pleaseInput' : 'Please input code.', + 'link.url' : 'URL', + 'link.linkType' : '打開類型', + 'link.newWindow' : '新窗口', + 'link.selfWindow' : '本頁窗口', + 'flash.url' : 'URL', + 'flash.width' : '寬度', + 'flash.height' : '高度', + 'flash.upload' : '上傳', + 'flash.viewServer' : '瀏覽', + 'media.url' : 'URL', + 'media.width' : '寬度', + 'media.height' : '高度', + 'media.autostart' : '自動播放', + 'media.upload' : '上傳', + 'media.viewServer' : '瀏覽', + 'image.remoteImage' : '網絡影像', + 'image.localImage' : '上傳影像', + 'image.remoteUrl' : '影像URL', + 'image.localUrl' : '影像URL', + 'image.size' : '影像大小', + 'image.width' : '寬度', + 'image.height' : '高度', + 'image.resetSize' : '原始大小', + 'image.align' : '對齊方式', + 'image.defaultAlign' : '未設定', + 'image.leftAlign' : '向左對齊', + 'image.rightAlign' : '向右對齊', + 'image.imgTitle' : '影像說明', + 'image.upload' : '瀏覽...', + 'image.viewServer' : '瀏覽...', + 'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>', + 'multiimage.startUpload' : 'Start upload', + 'multiimage.clearAll' : 'Clear all', + 'multiimage.insertAll' : 'Insert all', + 'multiimage.queueLimitExceeded' : 'Queue limit exceeded.', + 'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.', + 'multiimage.zeroByteFile' : 'Zero byte file.', + 'multiimage.invalidFiletype' : 'Invalid file type.', + 'multiimage.unknownError' : 'Unknown upload error.', + 'multiimage.pending' : 'Pending ...', + 'multiimage.uploadError' : 'Upload error', + 'filemanager.emptyFolder' : '空文件夾', + 'filemanager.moveup' : '至上一級文件夾', + 'filemanager.viewType' : '顯示方式:', + 'filemanager.viewImage' : '縮略圖', + 'filemanager.listImage' : '詳細信息', + 'filemanager.orderType' : '排序方式:', + 'filemanager.fileName' : '名稱', + 'filemanager.fileSize' : '大小', + 'filemanager.fileType' : '類型', + 'insertfile.url' : 'URL', + 'insertfile.title' : '文件說明', + 'insertfile.upload' : '上傳', + 'insertfile.viewServer' : '瀏覽', + 'table.cells' : '儲存格數', + 'table.rows' : '欄數', + 'table.cols' : '列數', + 'table.size' : '表格大小', + 'table.width' : '寬度', + 'table.height' : '高度', + 'table.percent' : '%', + 'table.px' : 'px', + 'table.space' : '內距間距', + 'table.padding' : '內距', + 'table.spacing' : '間距', + 'table.align' : '對齊方式', + 'table.textAlign' : '水平對齊', + 'table.verticalAlign' : '垂直對齊', + 'table.alignDefault' : '未設定', + 'table.alignLeft' : '向左對齊', + 'table.alignCenter' : '置中', + 'table.alignRight' : '向右對齊', + 'table.alignTop' : '靠上', + 'table.alignMiddle' : '置中', + 'table.alignBottom' : '靠下', + 'table.alignBaseline' : '基線', + 'table.border' : '表格邊框', + 'table.borderWidth' : '邊框', + 'table.borderColor' : '顏色', + 'table.backgroundColor' : '背景顏色', + 'map.address' : '住所: ', + 'map.search' : '尋找', + 'baidumap.address' : '住所: ', + 'baidumap.search' : '尋找', + 'baidumap.insertDynamicMap' : '插入動態地圖', + 'anchor.name' : '錨點名稱', + 'formatblock.formatBlock' : { + h1 : '標題 1', + h2 : '標題 2', + h3 : '標題 3', + h4 : '標題 4', + p : '一般' + }, + 'fontname.fontName' : { + 'MingLiU' : '細明體', + 'PMingLiU' : '新細明體', + 'DFKai-SB' : '標楷體', + 'SimSun' : '宋體', + 'NSimSun' : '新宋體', + 'FangSong' : '仿宋體', + 'Arial' : 'Arial', + 'Arial Black' : 'Arial Black', + 'Times New Roman' : 'Times New Roman', + 'Courier New' : 'Courier New', + 'Tahoma' : 'Tahoma', + 'Verdana' : 'Verdana' + }, + 'lineheight.lineHeight' : [ + {'1' : '单倍行距'}, + {'1.5' : '1.5倍行距'}, + {'2' : '2倍行距'}, + {'2.5' : '2.5倍行距'}, + {'3' : '3倍行距'} + ], + 'template.selectTemplate' : '可選樣板', + 'template.replaceContent' : '取代當前內容', + 'template.fileList' : { + '1.html' : '影像和文字', + '2.html' : '表格', + '3.html' : '项目清單' + } +}, 'zh_TW'); diff --git a/member/editor/kindeditor/license.txt b/member/editor/kindeditor/license.txt new file mode 100644 index 0000000..4362b49 --- /dev/null +++ b/member/editor/kindeditor/license.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/member/editor/kindeditor/plugins/anchor/anchor.js b/member/editor/kindeditor/plugins/anchor/anchor.js new file mode 100644 index 0000000..55ab894 --- /dev/null +++ b/member/editor/kindeditor/plugins/anchor/anchor.js @@ -0,0 +1,46 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('anchor', function(K) { + var self = this, name = 'anchor', lang = self.lang(name + '.'); + self.plugin.anchor = { + edit : function() { + var html = ['
      ', + '
      ', + '', + '', + '
      ', + '
      '].join(''); + var dialog = self.createDialog({ + name : name, + width : 300, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + self.insertHtml('').hideDialog().focus(); + } + } + }); + var div = dialog.div, + nameBox = K('input[name="name"]', div); + var img = self.plugin.getSelectedAnchor(); + if (img) { + nameBox.val(unescape(img.attr('data-ke-name'))); + } + nameBox[0].focus(); + nameBox[0].select(); + }, + 'delete' : function() { + self.plugin.getSelectedAnchor().remove(); + } + }; + self.clickToolbar(name, self.plugin.anchor.edit); +}); diff --git a/member/editor/kindeditor/plugins/autoheight/autoheight.js b/member/editor/kindeditor/plugins/autoheight/autoheight.js new file mode 100644 index 0000000..546578b --- /dev/null +++ b/member/editor/kindeditor/plugins/autoheight/autoheight.js @@ -0,0 +1,54 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('autoheight', function(K) { + var self = this; + + if (!self.autoHeightMode) { + return; + } + + var minHeight; + + function hideScroll() { + var edit = self.edit; + var body = edit.doc.body; + edit.iframe[0].scroll = 'no'; + body.style.overflowY = 'hidden'; + } + + function resetHeight() { + var edit = self.edit; + var body = edit.doc.body; + edit.iframe.height(minHeight); + self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight)); + } + + function init() { + minHeight = K.removeUnit(self.height); + + self.edit.afterChange(resetHeight); + hideScroll(); + resetHeight(); + } + + if (self.isCreated) { + init(); + } else { + self.afterCreate(init); + } +}); + +/* +* 如何实现真正的自动高度? +* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。 +* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。 +* 由此就实现了真正的自动高度 +* 测试:chrome、firefox、IE9、IE8 +* */ diff --git a/member/editor/kindeditor/plugins/baidumap/baidumap.js b/member/editor/kindeditor/plugins/baidumap/baidumap.js new file mode 100644 index 0000000..12751c4 --- /dev/null +++ b/member/editor/kindeditor/plugins/baidumap/baidumap.js @@ -0,0 +1,93 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5 + +KindEditor.plugin('baidumap', function(K) { + var self = this, name = 'baidumap', lang = self.lang(name + '.'); + var mapWidth = K.undef(self.mapWidth, 558); + var mapHeight = K.undef(self.mapHeight, 360); + self.clickToolbar(name, function() { + var html = ['
      ', + '
      ', + // left start + '
      ', + lang.address + ' ', + '', + '', + '', + '
      ', + // right start + '
      ', + ' ', + '
      ', + '
      ', + '
      ', + '
      ', + '
      '].join(''); + var dialog = self.createDialog({ + name : name, + width : mapWidth + 42, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var map = win.map; + var centerObj = map.getCenter(); + var center = centerObj.lng + ',' + centerObj.lat; + var zoom = map.getZoom(); + var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'http://api.map.baidu.com/staticimage', + '?center=' + encodeURIComponent(center), + '&zoom=' + encodeURIComponent(zoom), + '&width=' + mapWidth, + '&height=' + mapHeight, + '&markers=' + encodeURIComponent(center), + '&markerStyles=' + encodeURIComponent('l,A')].join(''); + if (checkbox[0].checked) { + self.insertHtml(''); + } else { + self.exec('insertimage', url); + } + self.hideDialog().focus(); + } + }, + beforeRemove : function() { + searchBtn.remove(); + if (doc) { + doc.write(''); + } + iframe.remove(); + } + }); + var div = dialog.div, + addressBox = K('[name="address"]', div), + searchBtn = K('[name="searchBtn"]', div), + checkbox = K('[name="insertDynamicMap"]', dialog.div), + win, doc; + var iframe = K(''); + function ready() { + win = iframe[0].contentWindow; + doc = K.iframeDoc(iframe); + } + iframe.bind('load', function() { + iframe.unbind('load'); + if (K.IE) { + ready(); + } else { + setTimeout(ready, 0); + } + }); + K('.ke-map', div).replaceWith(iframe); + // search map + searchBtn.click(function() { + win.search(addressBox.val()); + }); + }); +}); diff --git a/member/editor/kindeditor/plugins/baidumap/index.html b/member/editor/kindeditor/plugins/baidumap/index.html new file mode 100644 index 0000000..e106d1a --- /dev/null +++ b/member/editor/kindeditor/plugins/baidumap/index.html @@ -0,0 +1,83 @@ + + + + + + +百度地图API自定义地图 + + + + + + + +
      + + + \ No newline at end of file diff --git a/member/editor/kindeditor/plugins/baidumap/map.html b/member/editor/kindeditor/plugins/baidumap/map.html new file mode 100644 index 0000000..b65ea1d --- /dev/null +++ b/member/editor/kindeditor/plugins/baidumap/map.html @@ -0,0 +1,43 @@ + + + + + Baidu Maps + + + + + +
      + + diff --git a/member/editor/kindeditor/plugins/clearhtml/clearhtml.js b/member/editor/kindeditor/plugins/clearhtml/clearhtml.js new file mode 100644 index 0000000..1bf0e5d --- /dev/null +++ b/member/editor/kindeditor/plugins/clearhtml/clearhtml.js @@ -0,0 +1,29 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('clearhtml', function(K) { + var self = this, name = 'clearhtml'; + self.clickToolbar(name, function() { + self.focus(); + var html = self.html(); + html = html.replace(/(]*>)([\s\S]*?)(<\/script>)/ig, ''); + html = html.replace(/(]*>)([\s\S]*?)(<\/style>)/ig, ''); + html = K.formatHtml(html, { + a : ['href', 'target'], + embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'], + img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'], + table : ['border'], + 'td,th' : ['rowspan', 'colspan'], + 'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [] + }); + self.html(html); + self.cmd.selection(true); + self.addBookmark(); + }); +}); diff --git a/member/editor/kindeditor/plugins/code/code.js b/member/editor/kindeditor/plugins/code/code.js new file mode 100644 index 0000000..85e4225 --- /dev/null +++ b/member/editor/kindeditor/plugins/code/code.js @@ -0,0 +1,62 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +// google code prettify: http://google-code-prettify.googlecode.com/ +// http://google-code-prettify.googlecode.com/ + +KindEditor.plugin('code', function(K) { + var self = this, name = 'code'; + self.clickToolbar(name, function() { + var lang = self.lang(name + '.'), + html = ['
      ', + '
      ', + '', + '
      ', + '', + '
      '].join(''), + dialog = self.createDialog({ + name : name, + width : 450, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var type = K('.ke-code-type', dialog.div).val(), + code = textarea.val(), + cls = type === '' ? '' : ' lang-' + type, + html = '
      \n' + K.escape(code) + '
      '; + if (K.trim(code) === '') { + alert(lang.pleaseInput); + textarea[0].focus(); + return; + } + self.insertHtml(html).hideDialog().focus(); + } + } + }), + textarea = K('textarea', dialog.div); + textarea[0].focus(); + }); +}); diff --git a/member/editor/kindeditor/plugins/code/prettify.css b/member/editor/kindeditor/plugins/code/prettify.css new file mode 100644 index 0000000..b8287e5 --- /dev/null +++ b/member/editor/kindeditor/plugins/code/prettify.css @@ -0,0 +1,13 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} + +pre.prettyprint { + border: 0; + border-left: 3px solid rgb(204, 204, 204); + margin-left: 2em; + padding: 0.5em; + font-size: 110%; + display: block; + font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; + margin: 1em 0px; + white-space: pre; +} diff --git a/member/editor/kindeditor/plugins/code/prettify.js b/member/editor/kindeditor/plugins/code/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/member/editor/kindeditor/plugins/code/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('emoticons', function(K) { + var self = this, name = 'emoticons', + path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'), + allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons, + currentPageNum = 1; + self.clickToolbar(name, function() { + var rows = 5, cols = 9, total = 135, startNum = 0, + cells = rows * cols, pages = Math.ceil(total / cells), + colsHalf = Math.floor(cols / 2), + wrapperDiv = K('
      '), + elements = [], + menu = self.createMenu({ + name : name, + beforeRemove : function() { + removeEvent(); + } + }); + menu.div.append(wrapperDiv); + var previewDiv, previewImg; + if (allowPreview) { + previewDiv = K('
      ').css('right', 0); + previewImg = K(''); + wrapperDiv.append(previewDiv); + previewDiv.append(previewImg); + } + function bindCellEvent(cell, j, num) { + if (previewDiv) { + cell.mouseover(function() { + if (j > colsHalf) { + previewDiv.css('left', 0); + previewDiv.css('right', ''); + } else { + previewDiv.css('left', ''); + previewDiv.css('right', 0); + } + previewImg.attr('src', path + num + '.gif'); + K(this).addClass('ke-on'); + }); + } else { + cell.mouseover(function() { + K(this).addClass('ke-on'); + }); + } + cell.mouseout(function() { + K(this).removeClass('ke-on'); + }); + cell.click(function(e) { + self.insertHtml('').hideMenu().focus(); + e.stop(); + }); + } + function createEmoticonsTable(pageNum, parentDiv) { + var table = document.createElement('table'); + parentDiv.append(table); + if (previewDiv) { + K(table).mouseover(function() { + previewDiv.show('block'); + }); + K(table).mouseout(function() { + previewDiv.hide(); + }); + elements.push(K(table)); + } + table.className = 'ke-table'; + table.cellPadding = 0; + table.cellSpacing = 0; + table.border = 0; + var num = (pageNum - 1) * cells + startNum; + for (var i = 0; i < rows; i++) { + var row = table.insertRow(i); + for (var j = 0; j < cols; j++) { + var cell = K(row.insertCell(j)); + cell.addClass('ke-cell'); + bindCellEvent(cell, j, num); + var span = K('') + .css('background-position', '-' + (24 * num) + 'px 0px') + .css('background-image', 'url(' + path + 'static.gif)'); + cell.append(span); + elements.push(cell); + num++; + } + } + return table; + } + var table = createEmoticonsTable(currentPageNum, wrapperDiv); + function removeEvent() { + K.each(elements, function() { + this.unbind(); + }); + } + var pageDiv; + function bindPageEvent(el, pageNum) { + el.click(function(e) { + removeEvent(); + table.parentNode.removeChild(table); + pageDiv.remove(); + table = createEmoticonsTable(pageNum, wrapperDiv); + createPageTable(pageNum); + currentPageNum = pageNum; + e.stop(); + }); + } + function createPageTable(currentPageNum) { + pageDiv = K('
      '); + wrapperDiv.append(pageDiv); + for (var pageNum = 1; pageNum <= pages; pageNum++) { + if (currentPageNum !== pageNum) { + var a = K('
      [' + pageNum + ']'); + bindPageEvent(a, pageNum); + pageDiv.append(a); + elements.push(a); + } else { + pageDiv.append(K('@[' + pageNum + ']')); + } + pageDiv.append(K('@ ')); + } + } + createPageTable(currentPageNum); + }); +}); diff --git a/member/editor/kindeditor/plugins/emoticons/images/0.gif b/member/editor/kindeditor/plugins/emoticons/images/0.gif new file mode 100644 index 0000000..5be27cb Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/0.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/1.gif b/member/editor/kindeditor/plugins/emoticons/images/1.gif new file mode 100644 index 0000000..a2644a9 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/1.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/10.gif b/member/editor/kindeditor/plugins/emoticons/images/10.gif new file mode 100644 index 0000000..905c15b Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/10.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/100.gif b/member/editor/kindeditor/plugins/emoticons/images/100.gif new file mode 100644 index 0000000..92ad35d Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/100.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/101.gif b/member/editor/kindeditor/plugins/emoticons/images/101.gif new file mode 100644 index 0000000..1f27663 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/101.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/102.gif b/member/editor/kindeditor/plugins/emoticons/images/102.gif new file mode 100644 index 0000000..748ded1 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/102.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/103.gif b/member/editor/kindeditor/plugins/emoticons/images/103.gif new file mode 100644 index 0000000..be9eaa0 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/103.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/104.gif b/member/editor/kindeditor/plugins/emoticons/images/104.gif new file mode 100644 index 0000000..d7c2066 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/104.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/105.gif b/member/editor/kindeditor/plugins/emoticons/images/105.gif new file mode 100644 index 0000000..2f353ca Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/105.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/106.gif b/member/editor/kindeditor/plugins/emoticons/images/106.gif new file mode 100644 index 0000000..5193534 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/106.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/107.gif b/member/editor/kindeditor/plugins/emoticons/images/107.gif new file mode 100644 index 0000000..70d38d3 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/107.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/108.gif b/member/editor/kindeditor/plugins/emoticons/images/108.gif new file mode 100644 index 0000000..749d500 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/108.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/109.gif b/member/editor/kindeditor/plugins/emoticons/images/109.gif new file mode 100644 index 0000000..6f57d56 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/109.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/11.gif b/member/editor/kindeditor/plugins/emoticons/images/11.gif new file mode 100644 index 0000000..b512dd5 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/11.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/110.gif b/member/editor/kindeditor/plugins/emoticons/images/110.gif new file mode 100644 index 0000000..e253abc Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/110.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/111.gif b/member/editor/kindeditor/plugins/emoticons/images/111.gif new file mode 100644 index 0000000..0c56723 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/111.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/112.gif b/member/editor/kindeditor/plugins/emoticons/images/112.gif new file mode 100644 index 0000000..c8ddce8 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/112.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/113.gif b/member/editor/kindeditor/plugins/emoticons/images/113.gif new file mode 100644 index 0000000..2727104 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/113.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/114.gif b/member/editor/kindeditor/plugins/emoticons/images/114.gif new file mode 100644 index 0000000..53918e2 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/114.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/115.gif b/member/editor/kindeditor/plugins/emoticons/images/115.gif new file mode 100644 index 0000000..4db3369 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/115.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/116.gif b/member/editor/kindeditor/plugins/emoticons/images/116.gif new file mode 100644 index 0000000..57326bd Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/116.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/117.gif b/member/editor/kindeditor/plugins/emoticons/images/117.gif new file mode 100644 index 0000000..14611b6 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/117.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/118.gif b/member/editor/kindeditor/plugins/emoticons/images/118.gif new file mode 100644 index 0000000..8c25500 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/118.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/119.gif b/member/editor/kindeditor/plugins/emoticons/images/119.gif new file mode 100644 index 0000000..65bb468 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/119.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/12.gif b/member/editor/kindeditor/plugins/emoticons/images/12.gif new file mode 100644 index 0000000..547529c Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/12.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/120.gif b/member/editor/kindeditor/plugins/emoticons/images/120.gif new file mode 100644 index 0000000..5ce77c0 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/120.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/121.gif b/member/editor/kindeditor/plugins/emoticons/images/121.gif new file mode 100644 index 0000000..a021aba Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/121.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/122.gif b/member/editor/kindeditor/plugins/emoticons/images/122.gif new file mode 100644 index 0000000..9a79e11 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/122.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/123.gif b/member/editor/kindeditor/plugins/emoticons/images/123.gif new file mode 100644 index 0000000..b9480be Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/123.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/124.gif b/member/editor/kindeditor/plugins/emoticons/images/124.gif new file mode 100644 index 0000000..7fed477 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/124.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/125.gif b/member/editor/kindeditor/plugins/emoticons/images/125.gif new file mode 100644 index 0000000..e2c3c11 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/125.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/126.gif b/member/editor/kindeditor/plugins/emoticons/images/126.gif new file mode 100644 index 0000000..24105c9 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/126.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/127.gif b/member/editor/kindeditor/plugins/emoticons/images/127.gif new file mode 100644 index 0000000..0cead36 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/127.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/128.gif b/member/editor/kindeditor/plugins/emoticons/images/128.gif new file mode 100644 index 0000000..3185861 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/128.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/129.gif b/member/editor/kindeditor/plugins/emoticons/images/129.gif new file mode 100644 index 0000000..ffd7c6b Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/129.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/13.gif b/member/editor/kindeditor/plugins/emoticons/images/13.gif new file mode 100644 index 0000000..3475300 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/13.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/130.gif b/member/editor/kindeditor/plugins/emoticons/images/130.gif new file mode 100644 index 0000000..d828e3d Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/130.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/131.gif b/member/editor/kindeditor/plugins/emoticons/images/131.gif new file mode 100644 index 0000000..dcb096f Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/131.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/132.gif b/member/editor/kindeditor/plugins/emoticons/images/132.gif new file mode 100644 index 0000000..1b272a6 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/132.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/133.gif b/member/editor/kindeditor/plugins/emoticons/images/133.gif new file mode 100644 index 0000000..0d0e864 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/133.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/134.gif b/member/editor/kindeditor/plugins/emoticons/images/134.gif new file mode 100644 index 0000000..cf48356 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/134.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/14.gif b/member/editor/kindeditor/plugins/emoticons/images/14.gif new file mode 100644 index 0000000..6a788f8 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/14.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/15.gif b/member/editor/kindeditor/plugins/emoticons/images/15.gif new file mode 100644 index 0000000..debab8e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/15.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/16.gif b/member/editor/kindeditor/plugins/emoticons/images/16.gif new file mode 100644 index 0000000..ed5d29f Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/16.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/17.gif b/member/editor/kindeditor/plugins/emoticons/images/17.gif new file mode 100644 index 0000000..85886fe Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/17.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/18.gif b/member/editor/kindeditor/plugins/emoticons/images/18.gif new file mode 100644 index 0000000..b6af218 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/18.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/19.gif b/member/editor/kindeditor/plugins/emoticons/images/19.gif new file mode 100644 index 0000000..e045ff2 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/19.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/2.gif b/member/editor/kindeditor/plugins/emoticons/images/2.gif new file mode 100644 index 0000000..40cfda4 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/2.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/20.gif b/member/editor/kindeditor/plugins/emoticons/images/20.gif new file mode 100644 index 0000000..efd650f Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/20.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/21.gif b/member/editor/kindeditor/plugins/emoticons/images/21.gif new file mode 100644 index 0000000..cb8cf6d Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/21.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/22.gif b/member/editor/kindeditor/plugins/emoticons/images/22.gif new file mode 100644 index 0000000..96b04df Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/22.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/23.gif b/member/editor/kindeditor/plugins/emoticons/images/23.gif new file mode 100644 index 0000000..96516b8 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/23.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/24.gif b/member/editor/kindeditor/plugins/emoticons/images/24.gif new file mode 100644 index 0000000..5f925c7 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/24.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/25.gif b/member/editor/kindeditor/plugins/emoticons/images/25.gif new file mode 100644 index 0000000..97f8b1a Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/25.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/26.gif b/member/editor/kindeditor/plugins/emoticons/images/26.gif new file mode 100644 index 0000000..a7cded7 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/26.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/27.gif b/member/editor/kindeditor/plugins/emoticons/images/27.gif new file mode 100644 index 0000000..bb46890 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/27.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/28.gif b/member/editor/kindeditor/plugins/emoticons/images/28.gif new file mode 100644 index 0000000..f59dd58 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/28.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/29.gif b/member/editor/kindeditor/plugins/emoticons/images/29.gif new file mode 100644 index 0000000..3c5227e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/29.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/3.gif b/member/editor/kindeditor/plugins/emoticons/images/3.gif new file mode 100644 index 0000000..6d6f762 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/3.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/30.gif b/member/editor/kindeditor/plugins/emoticons/images/30.gif new file mode 100644 index 0000000..e24a180 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/30.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/31.gif b/member/editor/kindeditor/plugins/emoticons/images/31.gif new file mode 100644 index 0000000..073e743 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/31.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/32.gif b/member/editor/kindeditor/plugins/emoticons/images/32.gif new file mode 100644 index 0000000..772eff2 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/32.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/33.gif b/member/editor/kindeditor/plugins/emoticons/images/33.gif new file mode 100644 index 0000000..217c1c5 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/33.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/34.gif b/member/editor/kindeditor/plugins/emoticons/images/34.gif new file mode 100644 index 0000000..e9d4213 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/34.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/35.gif b/member/editor/kindeditor/plugins/emoticons/images/35.gif new file mode 100644 index 0000000..d6da2c3 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/35.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/36.gif b/member/editor/kindeditor/plugins/emoticons/images/36.gif new file mode 100644 index 0000000..c1e6ac9 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/36.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/37.gif b/member/editor/kindeditor/plugins/emoticons/images/37.gif new file mode 100644 index 0000000..92efec6 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/37.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/38.gif b/member/editor/kindeditor/plugins/emoticons/images/38.gif new file mode 100644 index 0000000..489f0f9 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/38.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/39.gif b/member/editor/kindeditor/plugins/emoticons/images/39.gif new file mode 100644 index 0000000..734f6d8 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/39.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/4.gif b/member/editor/kindeditor/plugins/emoticons/images/4.gif new file mode 100644 index 0000000..6ccdaa2 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/4.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/40.gif b/member/editor/kindeditor/plugins/emoticons/images/40.gif new file mode 100644 index 0000000..24a8eb6 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/40.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/41.gif b/member/editor/kindeditor/plugins/emoticons/images/41.gif new file mode 100644 index 0000000..99139e1 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/41.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/42.gif b/member/editor/kindeditor/plugins/emoticons/images/42.gif new file mode 100644 index 0000000..f60897e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/42.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/43.gif b/member/editor/kindeditor/plugins/emoticons/images/43.gif new file mode 100644 index 0000000..4350491 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/43.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/44.gif b/member/editor/kindeditor/plugins/emoticons/images/44.gif new file mode 100644 index 0000000..650d3dd Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/44.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/45.gif b/member/editor/kindeditor/plugins/emoticons/images/45.gif new file mode 100644 index 0000000..5c8e071 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/45.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/46.gif b/member/editor/kindeditor/plugins/emoticons/images/46.gif new file mode 100644 index 0000000..f3cb074 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/46.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/47.gif b/member/editor/kindeditor/plugins/emoticons/images/47.gif new file mode 100644 index 0000000..5b3057a Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/47.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/48.gif b/member/editor/kindeditor/plugins/emoticons/images/48.gif new file mode 100644 index 0000000..27a30c1 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/48.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/49.gif b/member/editor/kindeditor/plugins/emoticons/images/49.gif new file mode 100644 index 0000000..dcfa48a Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/49.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/5.gif b/member/editor/kindeditor/plugins/emoticons/images/5.gif new file mode 100644 index 0000000..ab0b81b Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/5.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/50.gif b/member/editor/kindeditor/plugins/emoticons/images/50.gif new file mode 100644 index 0000000..029cf0f Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/50.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/51.gif b/member/editor/kindeditor/plugins/emoticons/images/51.gif new file mode 100644 index 0000000..69f183f Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/51.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/52.gif b/member/editor/kindeditor/plugins/emoticons/images/52.gif new file mode 100644 index 0000000..d41e8aa Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/52.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/53.gif b/member/editor/kindeditor/plugins/emoticons/images/53.gif new file mode 100644 index 0000000..56352dd Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/53.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/54.gif b/member/editor/kindeditor/plugins/emoticons/images/54.gif new file mode 100644 index 0000000..b28d848 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/54.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/55.gif b/member/editor/kindeditor/plugins/emoticons/images/55.gif new file mode 100644 index 0000000..e18da84 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/55.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/56.gif b/member/editor/kindeditor/plugins/emoticons/images/56.gif new file mode 100644 index 0000000..edf96f0 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/56.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/57.gif b/member/editor/kindeditor/plugins/emoticons/images/57.gif new file mode 100644 index 0000000..3f0e2b9 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/57.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/58.gif b/member/editor/kindeditor/plugins/emoticons/images/58.gif new file mode 100644 index 0000000..47b1aaa Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/58.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/59.gif b/member/editor/kindeditor/plugins/emoticons/images/59.gif new file mode 100644 index 0000000..918288b Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/59.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/6.gif b/member/editor/kindeditor/plugins/emoticons/images/6.gif new file mode 100644 index 0000000..ceab122 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/6.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/60.gif b/member/editor/kindeditor/plugins/emoticons/images/60.gif new file mode 100644 index 0000000..66d2113 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/60.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/61.gif b/member/editor/kindeditor/plugins/emoticons/images/61.gif new file mode 100644 index 0000000..034933e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/61.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/62.gif b/member/editor/kindeditor/plugins/emoticons/images/62.gif new file mode 100644 index 0000000..8d5c4fd Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/62.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/63.gif b/member/editor/kindeditor/plugins/emoticons/images/63.gif new file mode 100644 index 0000000..d58fcf6 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/63.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/64.gif b/member/editor/kindeditor/plugins/emoticons/images/64.gif new file mode 100644 index 0000000..c4e00bd Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/64.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/65.gif b/member/editor/kindeditor/plugins/emoticons/images/65.gif new file mode 100644 index 0000000..da23bfa Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/65.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/66.gif b/member/editor/kindeditor/plugins/emoticons/images/66.gif new file mode 100644 index 0000000..310ec65 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/66.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/67.gif b/member/editor/kindeditor/plugins/emoticons/images/67.gif new file mode 100644 index 0000000..51761ba Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/67.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/68.gif b/member/editor/kindeditor/plugins/emoticons/images/68.gif new file mode 100644 index 0000000..345cb43 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/68.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/69.gif b/member/editor/kindeditor/plugins/emoticons/images/69.gif new file mode 100644 index 0000000..e0f28a0 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/69.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/7.gif b/member/editor/kindeditor/plugins/emoticons/images/7.gif new file mode 100644 index 0000000..2f45399 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/7.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/70.gif b/member/editor/kindeditor/plugins/emoticons/images/70.gif new file mode 100644 index 0000000..24284cf Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/70.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/71.gif b/member/editor/kindeditor/plugins/emoticons/images/71.gif new file mode 100644 index 0000000..a0ccf2e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/71.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/72.gif b/member/editor/kindeditor/plugins/emoticons/images/72.gif new file mode 100644 index 0000000..7e113ee Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/72.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/73.gif b/member/editor/kindeditor/plugins/emoticons/images/73.gif new file mode 100644 index 0000000..c0293c3 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/73.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/74.gif b/member/editor/kindeditor/plugins/emoticons/images/74.gif new file mode 100644 index 0000000..1c52bde Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/74.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/75.gif b/member/editor/kindeditor/plugins/emoticons/images/75.gif new file mode 100644 index 0000000..9cb9aa7 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/75.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/76.gif b/member/editor/kindeditor/plugins/emoticons/images/76.gif new file mode 100644 index 0000000..27019f8 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/76.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/77.gif b/member/editor/kindeditor/plugins/emoticons/images/77.gif new file mode 100644 index 0000000..8f882f5 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/77.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/78.gif b/member/editor/kindeditor/plugins/emoticons/images/78.gif new file mode 100644 index 0000000..d0d0856 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/78.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/79.gif b/member/editor/kindeditor/plugins/emoticons/images/79.gif new file mode 100644 index 0000000..61652a7 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/79.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/8.gif b/member/editor/kindeditor/plugins/emoticons/images/8.gif new file mode 100644 index 0000000..f6c8834 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/8.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/80.gif b/member/editor/kindeditor/plugins/emoticons/images/80.gif new file mode 100644 index 0000000..9a77936 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/80.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/81.gif b/member/editor/kindeditor/plugins/emoticons/images/81.gif new file mode 100644 index 0000000..2329101 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/81.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/82.gif b/member/editor/kindeditor/plugins/emoticons/images/82.gif new file mode 100644 index 0000000..644748a Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/82.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/83.gif b/member/editor/kindeditor/plugins/emoticons/images/83.gif new file mode 100644 index 0000000..fbf275b Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/83.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/84.gif b/member/editor/kindeditor/plugins/emoticons/images/84.gif new file mode 100644 index 0000000..076f0c6 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/84.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/85.gif b/member/editor/kindeditor/plugins/emoticons/images/85.gif new file mode 100644 index 0000000..d254af4 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/85.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/86.gif b/member/editor/kindeditor/plugins/emoticons/images/86.gif new file mode 100644 index 0000000..8f09d33 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/86.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/87.gif b/member/editor/kindeditor/plugins/emoticons/images/87.gif new file mode 100644 index 0000000..df70756 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/87.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/88.gif b/member/editor/kindeditor/plugins/emoticons/images/88.gif new file mode 100644 index 0000000..4d8b15e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/88.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/89.gif b/member/editor/kindeditor/plugins/emoticons/images/89.gif new file mode 100644 index 0000000..05726dc Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/89.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/9.gif b/member/editor/kindeditor/plugins/emoticons/images/9.gif new file mode 100644 index 0000000..c2d8450 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/9.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/90.gif b/member/editor/kindeditor/plugins/emoticons/images/90.gif new file mode 100644 index 0000000..adaf20e Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/90.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/91.gif b/member/editor/kindeditor/plugins/emoticons/images/91.gif new file mode 100644 index 0000000..608d0ad Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/91.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/92.gif b/member/editor/kindeditor/plugins/emoticons/images/92.gif new file mode 100644 index 0000000..b909e16 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/92.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/93.gif b/member/editor/kindeditor/plugins/emoticons/images/93.gif new file mode 100644 index 0000000..7f71a8c Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/93.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/94.gif b/member/editor/kindeditor/plugins/emoticons/images/94.gif new file mode 100644 index 0000000..4f26d7d Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/94.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/95.gif b/member/editor/kindeditor/plugins/emoticons/images/95.gif new file mode 100644 index 0000000..5ef6d38 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/95.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/96.gif b/member/editor/kindeditor/plugins/emoticons/images/96.gif new file mode 100644 index 0000000..2b709e1 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/96.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/97.gif b/member/editor/kindeditor/plugins/emoticons/images/97.gif new file mode 100644 index 0000000..cf29be8 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/97.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/98.gif b/member/editor/kindeditor/plugins/emoticons/images/98.gif new file mode 100644 index 0000000..c70e7d3 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/98.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/99.gif b/member/editor/kindeditor/plugins/emoticons/images/99.gif new file mode 100644 index 0000000..05c1863 Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/99.gif differ diff --git a/member/editor/kindeditor/plugins/emoticons/images/static.gif b/member/editor/kindeditor/plugins/emoticons/images/static.gif new file mode 100644 index 0000000..b8c444b Binary files /dev/null and b/member/editor/kindeditor/plugins/emoticons/images/static.gif differ diff --git a/member/editor/kindeditor/plugins/filemanager/filemanager.js b/member/editor/kindeditor/plugins/filemanager/filemanager.js new file mode 100644 index 0000000..fd899af --- /dev/null +++ b/member/editor/kindeditor/plugins/filemanager/filemanager.js @@ -0,0 +1,189 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('filemanager', function(K) { + var self = this, name = 'filemanager', + fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'), + imgPath = self.pluginsPath + name + '/images/', + lang = self.lang(name + '.'); + function makeFileTitle(filename, filesize, datetime) { + return filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')'; + } + function bindTitle(el, data) { + if (data.is_dir) { + el.attr('title', data.filename); + } else { + el.attr('title', makeFileTitle(data.filename, data.filesize, data.datetime)); + } + } + self.plugin.filemanagerDialog = function(options) { + var width = K.undef(options.width, 650), + height = K.undef(options.height, 510), + dirName = K.undef(options.dirName, ''), + viewType = K.undef(options.viewType, 'VIEW').toUpperCase(), // "LIST" or "VIEW" + clickFn = options.clickFn; + var html = [ + '
      ', + // header start + '
      ', + // left start + '
      ', + ' ', + '' + lang.moveup + '', + '
      ', + // right start + '
      ', + lang.viewType + ' ', + lang.orderType + ' ', + '
      ', + '
      ', + '
      ', + // body start + '
      ', + '
      ' + ].join(''); + var dialog = self.createDialog({ + name : name, + width : width, + height : height, + title : self.lang(name), + body : html + }), + div = dialog.div, + bodyDiv = K('.ke-plugin-filemanager-body', div), + moveupImg = K('[name="moveupImg"]', div), + moveupLink = K('[name="moveupLink"]', div), + viewServerBtn = K('[name="viewServer"]', div), + viewTypeBox = K('[name="viewType"]', div), + orderTypeBox = K('[name="orderType"]', div); + function reloadPage(path, order, func) { + var param = 'path=' + path + '&order=' + order + '&dir=' + dirName; + dialog.showLoading(self.lang('ajaxLoading')); + K.ajax(K.addParam(fileManagerJson, param + '&' + new Date().getTime()), function(data) { + dialog.hideLoading(); + func(data); + }); + } + var elList = []; + function bindEvent(el, result, data, createFunc) { + var fileUrl = K.formatUrl(result.current_url + data.filename, 'absolute'), + dirPath = encodeURIComponent(result.current_dir_path + data.filename + '/'); + if (data.is_dir) { + el.click(function(e) { + reloadPage(dirPath, orderTypeBox.val(), createFunc); + }); + } else if (data.is_photo) { + el.click(function(e) { + clickFn.call(this, fileUrl, data.filename); + }); + } else { + el.click(function(e) { + clickFn.call(this, fileUrl, data.filename); + }); + } + elList.push(el); + } + function createCommon(result, createFunc) { + // remove events + K.each(elList, function() { + this.unbind(); + }); + moveupLink.unbind(); + viewTypeBox.unbind(); + orderTypeBox.unbind(); + // add events + if (result.current_dir_path) { + moveupLink.click(function(e) { + reloadPage(result.moveup_dir_path, orderTypeBox.val(), createFunc); + }); + } + function changeFunc() { + if (viewTypeBox.val() == 'VIEW') { + reloadPage(result.current_dir_path, orderTypeBox.val(), createView); + } else { + reloadPage(result.current_dir_path, orderTypeBox.val(), createList); + } + } + viewTypeBox.change(changeFunc); + orderTypeBox.change(changeFunc); + bodyDiv.html(''); + } + function createList(result) { + createCommon(result, createList); + var table = document.createElement('table'); + table.className = 'ke-table'; + table.cellPadding = 0; + table.cellSpacing = 0; + table.border = 0; + bodyDiv.append(table); + var fileList = result.file_list; + for (var i = 0, len = fileList.length; i < len; i++) { + var data = fileList[i], row = K(table.insertRow(i)); + row.mouseover(function(e) { + K(this).addClass('ke-on'); + }) + .mouseout(function(e) { + K(this).removeClass('ke-on'); + }); + var iconUrl = imgPath + (data.is_dir ? 'folder-16.gif' : 'file-16.gif'), + img = K('' + data.filename + ''), + cell0 = K(row[0].insertCell(0)).addClass('ke-cell ke-name').append(img).append(document.createTextNode(' ' + data.filename)); + if (!data.is_dir || data.has_file) { + row.css('cursor', 'pointer'); + cell0.attr('title', data.filename); + bindEvent(cell0, result, data, createList); + } else { + cell0.attr('title', lang.emptyFolder); + } + K(row[0].insertCell(1)).addClass('ke-cell ke-size').html(data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB'); + K(row[0].insertCell(2)).addClass('ke-cell ke-datetime').html(data.datetime); + } + } + function createView(result) { + createCommon(result, createView); + var fileList = result.file_list; + for (var i = 0, len = fileList.length; i < len; i++) { + var data = fileList[i], + div = K('
      '); + bodyDiv.append(div); + var photoDiv = K('
      ') + .mouseover(function(e) { + K(this).addClass('ke-on'); + }) + .mouseout(function(e) { + K(this).removeClass('ke-on'); + }); + div.append(photoDiv); + var fileUrl = result.current_url + data.filename, + iconUrl = data.is_dir ? imgPath + 'folder-64.gif' : (data.is_photo ? fileUrl : imgPath + 'file-64.gif'); + var img = K('' + data.filename + ''); + if (!data.is_dir || data.has_file) { + photoDiv.css('cursor', 'pointer'); + bindTitle(photoDiv, data); + bindEvent(photoDiv, result, data, createView); + } else { + photoDiv.attr('title', lang.emptyFolder); + } + photoDiv.append(img); + div.append('
      ' + data.filename + '
      '); + } + } + viewTypeBox.val(viewType); + reloadPage('', orderTypeBox.val(), viewType == 'VIEW' ? createView : createList); + return dialog; + } + +}); diff --git a/member/editor/kindeditor/plugins/filemanager/images/file-16.gif b/member/editor/kindeditor/plugins/filemanager/images/file-16.gif new file mode 100644 index 0000000..2cf6e47 Binary files /dev/null and b/member/editor/kindeditor/plugins/filemanager/images/file-16.gif differ diff --git a/member/editor/kindeditor/plugins/filemanager/images/file-64.gif b/member/editor/kindeditor/plugins/filemanager/images/file-64.gif new file mode 100644 index 0000000..2e211da Binary files /dev/null and b/member/editor/kindeditor/plugins/filemanager/images/file-64.gif differ diff --git a/member/editor/kindeditor/plugins/filemanager/images/folder-16.gif b/member/editor/kindeditor/plugins/filemanager/images/folder-16.gif new file mode 100644 index 0000000..850b5a3 Binary files /dev/null and b/member/editor/kindeditor/plugins/filemanager/images/folder-16.gif differ diff --git a/member/editor/kindeditor/plugins/filemanager/images/folder-64.gif b/member/editor/kindeditor/plugins/filemanager/images/folder-64.gif new file mode 100644 index 0000000..e8a1b09 Binary files /dev/null and b/member/editor/kindeditor/plugins/filemanager/images/folder-64.gif differ diff --git a/member/editor/kindeditor/plugins/filemanager/images/go-up.gif b/member/editor/kindeditor/plugins/filemanager/images/go-up.gif new file mode 100644 index 0000000..92ae23d Binary files /dev/null and b/member/editor/kindeditor/plugins/filemanager/images/go-up.gif differ diff --git a/member/editor/kindeditor/plugins/flash/flash.js b/member/editor/kindeditor/plugins/flash/flash.js new file mode 100644 index 0000000..d5d465e --- /dev/null +++ b/member/editor/kindeditor/plugins/flash/flash.js @@ -0,0 +1,161 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('flash', function(K) { + var self = this, name = 'flash', lang = self.lang(name + '.'), + allowFlashUpload = K.undef(self.allowFlashUpload, true), + allowFileManager = K.undef(self.allowFileManager, false), + formatUploadUrl = K.undef(self.formatUploadUrl, true), + extraParams = K.undef(self.extraFileUploadParams, {}), + filePostName = K.undef(self.filePostName, 'imgFile'), + uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'); + self.plugin.flash = { + edit : function() { + var html = [ + '
      ', + //url + '
      ', + '', + '  ', + '  ', + '', + '', + '', + '
      ', + //width + '
      ', + '', + ' ', + '
      ', + //height + '
      ', + '', + ' ', + '
      ', + '
      ' + ].join(''); + var dialog = self.createDialog({ + name : name, + width : 450, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var url = K.trim(urlBox.val()), + width = widthBox.val(), + height = heightBox.val(); + if (url == 'http://' || K.invalidUrl(url)) { + alert(self.lang('invalidUrl')); + urlBox[0].focus(); + return; + } + if (!/^\d*$/.test(width)) { + alert(self.lang('invalidWidth')); + widthBox[0].focus(); + return; + } + if (!/^\d*$/.test(height)) { + alert(self.lang('invalidHeight')); + heightBox[0].focus(); + return; + } + var html = K.mediaImg(self.themesPath + 'common/blank.gif', { + src : url, + type : K.mediaType('.swf'), + width : width, + height : height, + quality : 'high' + }); + self.insertHtml(html).hideDialog().focus(); + } + } + }), + div = dialog.div, + urlBox = K('[name="url"]', div), + viewServerBtn = K('[name="viewServer"]', div), + widthBox = K('[name="width"]', div), + heightBox = K('[name="height"]', div); + urlBox.val('http://'); + + if (allowFlashUpload) { + var uploadbutton = K.uploadbutton({ + button : K('.ke-upload-button', div)[0], + fieldName : filePostName, + extraParams : extraParams, + url : K.addParam(uploadJson, 'dir=flash'), + afterUpload : function(data) { + dialog.hideLoading(); + if (data.error === 0) { + var url = data.url; + if (formatUploadUrl) { + url = K.formatUrl(url, 'absolute'); + } + urlBox.val(url); + if (self.afterUpload) { + self.afterUpload.call(self, url, data, name); + } + alert(self.lang('uploadSuccess')); + } else { + alert(data.message); + } + }, + afterError : function(html) { + dialog.hideLoading(); + self.errorDialog(html); + } + }); + uploadbutton.fileBox.change(function(e) { + dialog.showLoading(self.lang('uploadLoading')); + uploadbutton.submit(); + }); + } else { + K('.ke-upload-button', div).hide(); + } + + if (allowFileManager) { + viewServerBtn.click(function(e) { + self.loadPlugin('filemanager', function() { + self.plugin.filemanagerDialog({ + viewType : 'LIST', + dirName : 'flash', + clickFn : function(url, title) { + if (self.dialogs.length > 1) { + K('[name="url"]', div).val(url); + if (self.afterSelectFile) { + self.afterSelectFile.call(self, url); + } + self.hideDialog(); + } + } + }); + }); + }); + } else { + viewServerBtn.hide(); + } + + var img = self.plugin.getSelectedFlash(); + if (img) { + var attrs = K.mediaAttrs(img.attr('data-ke-tag')); + urlBox.val(attrs.src); + widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0); + heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0); + } + urlBox[0].focus(); + urlBox[0].select(); + }, + 'delete' : function() { + self.plugin.getSelectedFlash().remove(); + // [IE] 删除图片后立即点击图片按钮出错 + self.addBookmark(); + } + }; + self.clickToolbar(name, self.plugin.flash.edit); +}); diff --git a/member/editor/kindeditor/plugins/image/image.js b/member/editor/kindeditor/plugins/image/image.js new file mode 100644 index 0000000..69029ed --- /dev/null +++ b/member/editor/kindeditor/plugins/image/image.js @@ -0,0 +1,328 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('image', function(K) { + var self = this, name = 'image', + allowImageUpload = K.undef(self.allowImageUpload, true), + allowImageRemote = K.undef(self.allowImageRemote, true), + formatUploadUrl = K.undef(self.formatUploadUrl, true), + allowFileManager = K.undef(self.allowFileManager, false), + uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'), + imageTabIndex = K.undef(self.imageTabIndex, 0), + imgPath = self.pluginsPath + 'image/images/', + extraParams = K.undef(self.extraFileUploadParams, {}), + filePostName = K.undef(self.filePostName, 'imgFile'), + fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false), + lang = self.lang(name + '.'); + + self.plugin.imageDialog = function(options) { + var imageUrl = options.imageUrl, + imageWidth = K.undef(options.imageWidth, ''), + imageHeight = K.undef(options.imageHeight, ''), + imageTitle = K.undef(options.imageTitle, ''), + imageAlign = K.undef(options.imageAlign, ''), + showRemote = K.undef(options.showRemote, true), + showLocal = K.undef(options.showLocal, true), + tabIndex = K.undef(options.tabIndex, 0), + clickFn = options.clickFn; + var target = 'kindeditor_upload_iframe_' + new Date().getTime(); + var hiddenElements = []; + for(var k in extraParams){ + hiddenElements.push(''); + } + var html = [ + '
      ', + //tabs + '
      ', + //remote image - start + '', + //remote image - end + //local upload - start + '', + //local upload - end + '
      ' + ].join(''); + var dialogWidth = showLocal || allowFileManager ? 450 : 400, + dialogHeight = showLocal && showRemote ? 300 : 250; + var dialog = self.createDialog({ + name : name, + width : dialogWidth, + height : dialogHeight, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + // Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319 + if (dialog.isLoading) { + return; + } + // insert local image + if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) { + if (uploadbutton.fileBox.val() == '') { + alert(self.lang('pleaseSelectFile')); + return; + } + dialog.showLoading(self.lang('uploadLoading')); + uploadbutton.submit(); + localUrlBox.val(''); + return; + } + // insert remote image + var url = K.trim(urlBox.val()), + width = widthBox.val(), + height = heightBox.val(), + title = titleBox.val(), + align = ''; + alignBox.each(function() { + if (this.checked) { + align = this.value; + return false; + } + }); + if (url == 'http://' || K.invalidUrl(url)) { + alert(self.lang('invalidUrl')); + urlBox[0].focus(); + return; + } + if (!/^\d*$/.test(width)) { + alert(self.lang('invalidWidth')); + widthBox[0].focus(); + return; + } + if (!/^\d*$/.test(height)) { + alert(self.lang('invalidHeight')); + heightBox[0].focus(); + return; + } + clickFn.call(self, url, title, width, height, 0, align); + } + }, + beforeRemove : function() { + viewServerBtn.unbind(); + widthBox.unbind(); + heightBox.unbind(); + refreshBtn.unbind(); + } + }), + div = dialog.div; + + var urlBox = K('[name="url"]', div), + localUrlBox = K('[name="localUrl"]', div), + viewServerBtn = K('[name="viewServer"]', div), + widthBox = K('.tab1 [name="width"]', div), + heightBox = K('.tab1 [name="height"]', div), + refreshBtn = K('.ke-refresh-btn', div), + titleBox = K('.tab1 [name="title"]', div), + alignBox = K('.tab1 [name="align"]', div); + + var tabs; + if (showRemote && showLocal) { + tabs = K.tabs({ + src : K('.tabs', div), + afterSelect : function(i) {} + }); + tabs.add({ + title : lang.remoteImage, + panel : K('.tab1', div) + }); + tabs.add({ + title : lang.localImage, + panel : K('.tab2', div) + }); + tabs.select(tabIndex); + } else if (showRemote) { + K('.tab1', div).show(); + } else if (showLocal) { + K('.tab2', div).show(); + } + + var uploadbutton = K.uploadbutton({ + button : K('.ke-upload-button', div)[0], + fieldName : filePostName, + form : K('.ke-form', div), + target : target, + width: 60, + afterUpload : function(data) { + dialog.hideLoading(); + if (data.error === 0) { + var url = data.url; + if (formatUploadUrl) { + url = K.formatUrl(url, 'absolute'); + } + if (self.afterUpload) { + self.afterUpload.call(self, url, data, name); + } + if (!fillDescAfterUploadImage) { + clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align); + } else { + K(".ke-dialog-row #remoteUrl", div).val(url); + K(".ke-tabs-li", div)[0].click(); + K(".ke-refresh-btn", div).click(); + } + } else { + alert(data.message); + } + }, + afterError : function(html) { + dialog.hideLoading(); + self.errorDialog(html); + } + }); + uploadbutton.fileBox.change(function(e) { + localUrlBox.val(uploadbutton.fileBox.val()); + }); + if (allowFileManager) { + viewServerBtn.click(function(e) { + self.loadPlugin('filemanager', function() { + self.plugin.filemanagerDialog({ + viewType : 'VIEW', + dirName : 'image', + clickFn : function(url, title) { + if (self.dialogs.length > 1) { + K('[name="url"]', div).val(url); + if (self.afterSelectFile) { + self.afterSelectFile.call(self, url); + } + self.hideDialog(); + } + } + }); + }); + }); + } else { + viewServerBtn.hide(); + } + var originalWidth = 0, originalHeight = 0; + function setSize(width, height) { + widthBox.val(width); + heightBox.val(height); + originalWidth = width; + originalHeight = height; + } + refreshBtn.click(function(e) { + var tempImg = K('', document).css({ + position : 'absolute', + visibility : 'hidden', + top : 0, + left : '-1000px' + }); + tempImg.bind('load', function() { + setSize(tempImg.width(), tempImg.height()); + tempImg.remove(); + }); + K(document.body).append(tempImg); + }); + widthBox.change(function(e) { + if (originalWidth > 0) { + heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10))); + } + }); + heightBox.change(function(e) { + if (originalHeight > 0) { + widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10))); + } + }); + urlBox.val(options.imageUrl); + setSize(options.imageWidth, options.imageHeight); + titleBox.val(options.imageTitle); + alignBox.each(function() { + if (this.value === options.imageAlign) { + this.checked = true; + return false; + } + }); + if (showRemote && tabIndex === 0) { + urlBox[0].focus(); + urlBox[0].select(); + } + return dialog; + }; + self.plugin.image = { + edit : function() { + var img = self.plugin.getSelectedImage(); + self.plugin.imageDialog({ + imageUrl : img ? img.attr('data-ke-src') : 'http://', + imageWidth : img ? img.width() : '', + imageHeight : img ? img.height() : '', + imageTitle : img ? img.attr('title') : '', + imageAlign : img ? img.attr('align') : '', + showRemote : allowImageRemote, + showLocal : allowImageUpload, + tabIndex: img ? 0 : imageTabIndex, + clickFn : function(url, title, width, height, border, align) { + if (img) { + img.attr('src', url); + img.attr('data-ke-src', url); + img.attr('width', width); + img.attr('height', height); + img.attr('title', title); + img.attr('align', align); + img.attr('alt', title); + } else { + self.exec('insertimage', url, title, width, height, border, align); + } + // Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog + setTimeout(function() { + self.hideDialog().focus(); + }, 0); + } + }); + }, + 'delete' : function() { + var target = self.plugin.getSelectedImage(); + if (target.parent().name == 'a') { + target = target.parent(); + } + target.remove(); + // [IE] 删除图片后立即点击图片按钮出错 + self.addBookmark(); + } + }; + self.clickToolbar(name, self.plugin.image.edit); +}); diff --git a/member/editor/kindeditor/plugins/image/images/align_left.gif b/member/editor/kindeditor/plugins/image/images/align_left.gif new file mode 100644 index 0000000..ab17f56 Binary files /dev/null and b/member/editor/kindeditor/plugins/image/images/align_left.gif differ diff --git a/member/editor/kindeditor/plugins/image/images/align_right.gif b/member/editor/kindeditor/plugins/image/images/align_right.gif new file mode 100644 index 0000000..e8ebe6a Binary files /dev/null and b/member/editor/kindeditor/plugins/image/images/align_right.gif differ diff --git a/member/editor/kindeditor/plugins/image/images/align_top.gif b/member/editor/kindeditor/plugins/image/images/align_top.gif new file mode 100644 index 0000000..d8826a5 Binary files /dev/null and b/member/editor/kindeditor/plugins/image/images/align_top.gif differ diff --git a/member/editor/kindeditor/plugins/image/images/refresh.png b/member/editor/kindeditor/plugins/image/images/refresh.png new file mode 100644 index 0000000..77e12d1 Binary files /dev/null and b/member/editor/kindeditor/plugins/image/images/refresh.png differ diff --git a/member/editor/kindeditor/plugins/insertfile/insertfile.js b/member/editor/kindeditor/plugins/insertfile/insertfile.js new file mode 100644 index 0000000..b8c523e --- /dev/null +++ b/member/editor/kindeditor/plugins/insertfile/insertfile.js @@ -0,0 +1,138 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('insertfile', function(K) { + var self = this, name = 'insertfile', + allowFileUpload = K.undef(self.allowFileUpload, true), + allowFileManager = K.undef(self.allowFileManager, false), + formatUploadUrl = K.undef(self.formatUploadUrl, true), + uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'), + extraParams = K.undef(self.extraFileUploadParams, {}), + filePostName = K.undef(self.filePostName, 'imgFile'), + lang = self.lang(name + '.'); + self.plugin.fileDialog = function(options) { + var fileUrl = K.undef(options.fileUrl, 'http://'), + fileTitle = K.undef(options.fileTitle, ''), + clickFn = options.clickFn; + var html = [ + '
      ', + '
      ', + '', + '  ', + '  ', + '', + '', + '', + '
      ', + //title + '
      ', + '', + '
      ', + '
      ', + //form end + '', + '' + ].join(''); + var dialog = self.createDialog({ + name : name, + width : 450, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var url = K.trim(urlBox.val()), + title = titleBox.val(); + if (url == 'http://' || K.invalidUrl(url)) { + alert(self.lang('invalidUrl')); + urlBox[0].focus(); + return; + } + if (K.trim(title) === '') { + title = url; + } + clickFn.call(self, url, title); + } + } + }), + div = dialog.div; + + var urlBox = K('[name="url"]', div), + viewServerBtn = K('[name="viewServer"]', div), + titleBox = K('[name="title"]', div); + + if (allowFileUpload) { + var uploadbutton = K.uploadbutton({ + button : K('.ke-upload-button', div)[0], + fieldName : filePostName, + url : K.addParam(uploadJson, 'dir=file'), + extraParams : extraParams, + afterUpload : function(data) { + dialog.hideLoading(); + if (data.error === 0) { + var url = data.url; + if (formatUploadUrl) { + url = K.formatUrl(url, 'absolute'); + } + urlBox.val(url); + if (self.afterUpload) { + self.afterUpload.call(self, url, data, name); + } + alert(self.lang('uploadSuccess')); + } else { + alert(data.message); + } + }, + afterError : function(html) { + dialog.hideLoading(); + self.errorDialog(html); + } + }); + uploadbutton.fileBox.change(function(e) { + dialog.showLoading(self.lang('uploadLoading')); + uploadbutton.submit(); + }); + } else { + K('.ke-upload-button', div).hide(); + } + if (allowFileManager) { + viewServerBtn.click(function(e) { + self.loadPlugin('filemanager', function() { + self.plugin.filemanagerDialog({ + viewType : 'LIST', + dirName : 'file', + clickFn : function(url, title) { + if (self.dialogs.length > 1) { + K('[name="url"]', div).val(url); + if (self.afterSelectFile) { + self.afterSelectFile.call(self, url); + } + self.hideDialog(); + } + } + }); + }); + }); + } else { + viewServerBtn.hide(); + } + urlBox.val(fileUrl); + titleBox.val(fileTitle); + urlBox[0].focus(); + urlBox[0].select(); + }; + self.clickToolbar(name, function() { + self.plugin.fileDialog({ + clickFn : function(url, title) { + var html = '' + title + ''; + self.insertHtml(html).hideDialog().focus(); + } + }); + }); +}); diff --git a/member/editor/kindeditor/plugins/lineheight/lineheight.js b/member/editor/kindeditor/plugins/lineheight/lineheight.js new file mode 100644 index 0000000..ae679d7 --- /dev/null +++ b/member/editor/kindeditor/plugins/lineheight/lineheight.js @@ -0,0 +1,38 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('lineheight', function(K) { + var self = this, name = 'lineheight', lang = self.lang(name + '.'); + self.clickToolbar(name, function() { + var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'}); + if (commonNode) { + curVal = commonNode.css('line-height'); + } + var menu = self.createMenu({ + name : name, + width : 150 + }); + K.each(lang.lineHeight, function(i, row) { + K.each(row, function(key, val) { + menu.addItem({ + title : val, + checked : curVal === key, + click : function() { + self.cmd.toggle('', { + span : '.line-height=' + key + }); + self.updateState(); + self.addBookmark(); + self.hideMenu(); + } + }); + }); + }); + }); +}); diff --git a/member/editor/kindeditor/plugins/link/link.js b/member/editor/kindeditor/plugins/link/link.js new file mode 100644 index 0000000..352fa3c --- /dev/null +++ b/member/editor/kindeditor/plugins/link/link.js @@ -0,0 +1,66 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('link', function(K) { + var self = this, name = 'link'; + self.plugin.link = { + edit : function() { + var lang = self.lang(name + '.'), + html = '
      ' + + //url + '
      ' + + '' + + '
      ' + + //type + '
      ' + + '' + + '' + + '
      ' + + '
      ', + dialog = self.createDialog({ + name : name, + width : 450, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var url = K.trim(urlBox.val()); + if (url == 'http://' || K.invalidUrl(url)) { + alert(self.lang('invalidUrl')); + urlBox[0].focus(); + return; + } + self.exec('createlink', url, typeBox.val()).hideDialog().focus(); + } + } + }), + div = dialog.div, + urlBox = K('input[name="url"]', div), + typeBox = K('select[name="type"]', div); + urlBox.val('http://'); + typeBox[0].options[0] = new Option(lang.newWindow, '_blank'); + typeBox[0].options[1] = new Option(lang.selfWindow, ''); + self.cmd.selection(); + var a = self.plugin.getSelectedLink(); + if (a) { + self.cmd.range.selectNode(a[0]); + self.cmd.select(); + urlBox.val(a.attr('data-ke-src')); + typeBox.val(a.attr('target')); + } + urlBox[0].focus(); + urlBox[0].select(); + }, + 'delete' : function() { + self.exec('unlink', null); + } + }; + self.clickToolbar(name, self.plugin.link.edit); +}); diff --git a/member/editor/kindeditor/plugins/map/map.html b/member/editor/kindeditor/plugins/map/map.html new file mode 100644 index 0000000..1a9ad7d --- /dev/null +++ b/member/editor/kindeditor/plugins/map/map.html @@ -0,0 +1,57 @@ + + + + + + + + + +
      + + \ No newline at end of file diff --git a/member/editor/kindeditor/plugins/map/map.js b/member/editor/kindeditor/plugins/map/map.js new file mode 100644 index 0000000..5290875 --- /dev/null +++ b/member/editor/kindeditor/plugins/map/map.js @@ -0,0 +1,137 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +// Google Maps: http://code.google.com/apis/maps/index.html + +KindEditor.plugin('map', function(K) { + var self = this, name = 'map', lang = self.lang(name + '.'); + self.clickToolbar(name, function() { + var html = ['
      ', + '
      ', + lang.address + ' ', + '', + '', + '', + '
      ', + '
      ', + '
      '].join(''); + var dialog = self.createDialog({ + name : name, + width : 600, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var geocoder = win.geocoder, + map = win.map, + center = map.getCenter().lat() + ',' + map.getCenter().lng(), + zoom = map.getZoom(), + maptype = map.getMapTypeId(), + url = 'http://maps.googleapis.com/maps/api/staticmap'; + url += '?center=' + encodeURIComponent(center); + url += '&zoom=' + encodeURIComponent(zoom); + url += '&size=558x360'; + url += '&maptype=' + encodeURIComponent(maptype); + url += '&markers=' + encodeURIComponent(center); + url += '&language=' + self.langType; + url += '&sensor=false'; + self.exec('insertimage', url).hideDialog().focus(); + } + }, + beforeRemove : function() { + searchBtn.remove(); + if (doc) { + doc.write(''); + } + iframe.remove(); + } + }); + var div = dialog.div, + addressBox = K('[name="address"]', div), + searchBtn = K('[name="searchBtn"]', div), + win, doc; + var iframeHtml = ['', + '', + '', + '', + '', + '', + '', + '
      ', + ''].join('\n'); + // TODO:用doc.write(iframeHtml)方式加载时,在IE6上第一次加载报错,暂时使用src方式 + var iframe = K(''); + function ready() { + win = iframe[0].contentWindow; + doc = K.iframeDoc(iframe); + //doc.open(); + //doc.write(iframeHtml); + //doc.close(); + } + iframe.bind('load', function() { + iframe.unbind('load'); + if (K.IE) { + ready(); + } else { + setTimeout(ready, 0); + } + }); + K('.ke-map', div).replaceWith(iframe); + // search map + searchBtn.click(function() { + win.search(addressBox.val()); + }); + }); +}); diff --git a/member/editor/kindeditor/plugins/media/media.js b/member/editor/kindeditor/plugins/media/media.js new file mode 100644 index 0000000..b4b73e2 --- /dev/null +++ b/member/editor/kindeditor/plugins/media/media.js @@ -0,0 +1,234 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ +/*DESTOON*/ +function _cutstr(str, mark1, mark2) { + var p1 = str.indexOf(mark1); + if(p1 == -1) return ''; + str = str.substr(p1 + mark1.length); + var p2 = str.indexOf(mark2); + if(p2 == -1) return str; + return str.substr(0, p2); +} +function url2video(u) { + var p,p1,p2; + var d = _cutstr(u, '://', '/'); + switch(d) { + case 'v.youku.com': + p = _cutstr(u, 'id_', '.html'); + if(p) return 'http://player.youku.com/embed/'+p; + break; + case 'player.youku.com': + p = _cutstr(u, 'sid/', '/'); + if(p) return 'http://player.youku.com/embed/'+p; + p = _cutstr(u, 'embed/', u.indexOf("'") != -1 ? "'" : '"'); + if(p) return 'http://player.youku.com/embed/'+p; + break; + case 'imgcache.qq.com': + case 'static.v.qq.com': + case 'v.qq.com': + p = _cutstr(u, 'vid=', '&'); + if(p) return 'https://v.qq.com/iframe/player.html?vid='+p+'&tiny=0&auto=0'; + p = _cutstr(u, 'cover/', '.html'); + if(p) p = _cutstr(p, '/', '/'); + if(p) return 'https://v.qq.com/iframe/player.html?vid='+p+'&tiny=0&auto=0'; + break; + case 'open.iqiyi.com': + p1 = _cutstr(u, 'vid=', '&'); + p2 = _cutstr(u, 'tvId=', '&'); + if(p1 && p2) return 'http://m.iqiyi.com/shareplay.html?vid='+p1+'&tvid='+p2; + break; + case 'player.video.qiyi.com': + p1 = _cutstr(u, 'player.video.qiyi.com/', '/'); + p2 = _cutstr(u, 'tvId=', '-'); + if(p1 && p2) return 'http://m.iqiyi.com/shareplay.html?vid='+p1+'&tvid='+p2; + break; + case 'www.huya.com': + p = _cutstr(u, 'www.huya.com/', '/'); + if(p) return 'http://liveshare.huya.com/iframe/'+p; + break; + case 'www.douyu.com': + p = _cutstr(u, 'www.douyu.com/', '/'); + if(p) return 'https://staticlive.douyucdn.cn/common/share/play.swf?room_id='+p; + break; + case 'www.youtube.com': + p = _cutstr(u, 'v=', '&'); + if(p) return 'http://www.youtube.com/v/'+p; + break; + default: + break; + } + return u; +} + +KindEditor.plugin('media', function(K) { + var self = this, name = 'media', lang = self.lang(name + '.'), + allowMediaUpload = K.undef(self.allowMediaUpload, true), + allowFileManager = K.undef(self.allowFileManager, false), + formatUploadUrl = K.undef(self.formatUploadUrl, true), + extraParams = K.undef(self.extraFileUploadParams, {}), + filePostName = K.undef(self.filePostName, 'imgFile'), + uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'); + self.plugin.media = { + edit : function() { + var html = [ + '
      ', + //url + '
      ', + '', + '  ', + '  ', + '', + '', + '', + '
      ', + //width + '
      ', + '', + '', + '
      ', + //height + '
      ', + '', + '', + '
      ', + //autostart + '
      ', + '', + ' ', + '
      ', + '
      ' + ].join(''); + var dialog = self.createDialog({ + name : name, + width : 450, + height : 230, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var url = K.trim(urlBox.val()), + width = widthBox.val(), + height = heightBox.val(); + if (url == 'http://' || K.invalidUrl(url)) { + alert(self.lang('invalidUrl')); + urlBox[0].focus(); + return; + } + + /*DESTOON*/ + var vurl = url2video(url); + if(vurl && vurl != url) url = vurl; + + if (!/^\d*$/.test(width)) { + alert(self.lang('invalidWidth')); + widthBox[0].focus(); + return; + } + if (!/^\d*$/.test(height)) { + alert(self.lang('invalidHeight')); + heightBox[0].focus(); + return; + } + var html = K.mediaImg(self.themesPath + 'common/blank.gif', { + src : url, + type : K.mediaType(url), + width : width, + height : height, + autostart : autostartBox[0].checked ? 'true' : 'false', + loop : 'true' + }); + self.insertHtml(html).hideDialog().focus(); + } + } + }), + div = dialog.div, + urlBox = K('[name="url"]', div), + viewServerBtn = K('[name="viewServer"]', div), + widthBox = K('[name="width"]', div), + heightBox = K('[name="height"]', div), + autostartBox = K('[name="autostart"]', div); + urlBox.val('http://'); + + if (allowMediaUpload) { + var uploadbutton = K.uploadbutton({ + button : K('.ke-upload-button', div)[0], + fieldName : filePostName, + extraParams : extraParams, + url : K.addParam(uploadJson, 'dir=media'), + afterUpload : function(data) { + dialog.hideLoading(); + if (data.error === 0) { + var url = data.url; + if (formatUploadUrl) { + url = K.formatUrl(url, 'absolute'); + } + urlBox.val(url); + if (self.afterUpload) { + self.afterUpload.call(self, url, data, name); + } + alert(self.lang('uploadSuccess')); + } else { + alert(data.message); + } + }, + afterError : function(html) { + dialog.hideLoading(); + self.errorDialog(html); + } + }); + uploadbutton.fileBox.change(function(e) { + dialog.showLoading(self.lang('uploadLoading')); + uploadbutton.submit(); + }); + } else { + K('.ke-upload-button', div).hide(); + } + + if (allowFileManager) { + viewServerBtn.click(function(e) { + self.loadPlugin('filemanager', function() { + self.plugin.filemanagerDialog({ + viewType : 'LIST', + dirName : 'media', + clickFn : function(url, title) { + if (self.dialogs.length > 1) { + K('[name="url"]', div).val(url); + if (self.afterSelectFile) { + self.afterSelectFile.call(self, url); + } + self.hideDialog(); + } + } + }); + }); + }); + } else { + viewServerBtn.hide(); + } + + var img = self.plugin.getSelectedMedia(); + if (img) { + var attrs = K.mediaAttrs(img.attr('data-ke-tag')); + urlBox.val(attrs.src); + widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0); + heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0); + autostartBox[0].checked = (attrs.autostart === 'true'); + } + urlBox[0].focus(); + urlBox[0].select(); + }, + 'delete' : function() { + self.plugin.getSelectedMedia().remove(); + // [IE] 删除图片后立即点击图片按钮出错 + self.addBookmark(); + } + }; + self.clickToolbar(name, self.plugin.media.edit); +}); diff --git a/member/editor/kindeditor/plugins/multiimage/images/image.png b/member/editor/kindeditor/plugins/multiimage/images/image.png new file mode 100644 index 0000000..fe79cf0 Binary files /dev/null and b/member/editor/kindeditor/plugins/multiimage/images/image.png differ diff --git a/member/editor/kindeditor/plugins/multiimage/images/select-files-en.png b/member/editor/kindeditor/plugins/multiimage/images/select-files-en.png new file mode 100644 index 0000000..a926a6e Binary files /dev/null and b/member/editor/kindeditor/plugins/multiimage/images/select-files-en.png differ diff --git a/member/editor/kindeditor/plugins/multiimage/images/select-files-zh_CN.png b/member/editor/kindeditor/plugins/multiimage/images/select-files-zh_CN.png new file mode 100644 index 0000000..5a31d36 Binary files /dev/null and b/member/editor/kindeditor/plugins/multiimage/images/select-files-zh_CN.png differ diff --git a/member/editor/kindeditor/plugins/multiimage/images/swfupload.swf b/member/editor/kindeditor/plugins/multiimage/images/swfupload.swf new file mode 100644 index 0000000..e3f7670 Binary files /dev/null and b/member/editor/kindeditor/plugins/multiimage/images/swfupload.swf differ diff --git a/member/editor/kindeditor/plugins/multiimage/multiimage.js b/member/editor/kindeditor/plugins/multiimage/multiimage.js new file mode 100644 index 0000000..c3b4284 --- /dev/null +++ b/member/editor/kindeditor/plugins/multiimage/multiimage.js @@ -0,0 +1,1385 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + + +(function(K) { + +function KSWFUpload(options) { + this.init(options); +} +K.extend(KSWFUpload, { + init : function(options) { + var self = this; + options.afterError = options.afterError || function(str) { + alert(str); + }; + self.options = options; + self.progressbars = {}; + // template + self.div = K(options.container).html([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + options.uploadDesc + '
      ', + '', + '', + '', + '
      ', + '
      ', + '
      ' + ].join('')); + self.bodyDiv = K('.ke-swfupload-body', self.div); + + function showError(itemDiv, msg) { + K('.ke-status > div', itemDiv).hide(); + K('.ke-message', itemDiv).addClass('ke-error').show().html(K.escape(msg)); + } + + var settings = { + debug : false, + upload_url : options.uploadUrl, + flash_url : options.flashUrl, + file_post_name : options.filePostName, + button_placeholder : K('.ke-swfupload-button > input', self.div)[0], + button_image_url: options.buttonImageUrl, + button_width: options.buttonWidth, + button_height: options.buttonHeight, + button_cursor : SWFUpload.CURSOR.HAND, + file_types : options.fileTypes, + file_types_description : options.fileTypesDesc, + file_upload_limit : options.fileUploadLimit, + file_size_limit : options.fileSizeLimit, + post_params : options.postParams, + file_queued_handler : function(file) { + file.url = self.options.fileIconUrl; + self.appendFile(file); + }, + file_queue_error_handler : function(file, errorCode, message) { + var errorName = ''; + switch (errorCode) { + case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED: + errorName = options.queueLimitExceeded; + break; + case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT: + errorName = options.fileExceedsSizeLimit; + break; + case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE: + errorName = options.zeroByteFile; + break; + case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE: + errorName = options.invalidFiletype; + break; + default: + errorName = options.unknownError; + break; + } + K.DEBUG && alert(errorName); + }, + upload_start_handler : function(file) { + var self = this; + var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv); + K('.ke-status > div', itemDiv).hide(); + K('.ke-progressbar', itemDiv).show(); + }, + upload_progress_handler : function(file, bytesLoaded, bytesTotal) { + var percent = Math.round(bytesLoaded * 100 / bytesTotal); + var progressbar = self.progressbars[file.id]; + progressbar.bar.css('width', Math.round(percent * 80 / 100) + 'px'); + progressbar.percent.html(percent + '%'); + }, + upload_error_handler : function(file, errorCode, message) { + if (file && file.filestatus == SWFUpload.FILE_STATUS.ERROR) { + var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0); + showError(itemDiv, self.options.errorMessage); + } + }, + upload_success_handler : function(file, serverData) { + var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0); + var data = {}; + try { + data = K.json(serverData); + } catch (e) { + self.options.afterError.call(this, '' + serverData + ''); + } + if (data.error !== 0) { + showError(itemDiv, K.DEBUG ? data.message : self.options.errorMessage); + return; + } + file.url = data.url; + K('.ke-img', itemDiv).attr('src', file.url).attr('data-status', file.filestatus).data('data', data); + K('.ke-status > div', itemDiv).hide(); + } + }; + self.swfu = new SWFUpload(settings); + + K('.ke-swfupload-startupload input', self.div).click(function() { + self.swfu.startUpload(); + }); + }, + getUrlList : function() { + var list = []; + K('.ke-img', self.bodyDiv).each(function() { + var img = K(this); + var status = img.attr('data-status'); + if (status == SWFUpload.FILE_STATUS.COMPLETE) { + list.push(img.data('data')); + } + }); + return list; + }, + removeFile : function(fileId) { + var self = this; + self.swfu.cancelUpload(fileId); + var itemDiv = K('div[data-id="' + fileId + '"]', self.bodyDiv); + K('.ke-photo', itemDiv).unbind(); + K('.ke-delete', itemDiv).unbind(); + itemDiv.remove(); + }, + removeFiles : function() { + var self = this; + K('.ke-item', self.bodyDiv).each(function() { + self.removeFile(K(this).attr('data-id')); + }); + }, + appendFile : function(file) { + var self = this; + var itemDiv = K('
      '); + self.bodyDiv.append(itemDiv); + var photoDiv = K('
      ') + .mouseover(function(e) { + K(this).addClass('ke-on'); + }) + .mouseout(function(e) { + K(this).removeClass('ke-on'); + }); + itemDiv.append(photoDiv); + + var img = K('' + file.name + ''); + photoDiv.append(img); + K('').appendTo(photoDiv).click(function() { + self.removeFile(file.id); + }); + var statusDiv = K('
      ').appendTo(photoDiv); + // progressbar + K(['
      ', + '
      ', + '
      0%
      '].join('')).hide().appendTo(statusDiv); + // message + K('
      ' + self.options.pendingMessage + '
      ').appendTo(statusDiv); + + itemDiv.append('
      ' + file.name + '
      '); + + self.progressbars[file.id] = { + bar : K('.ke-progressbar-bar-inner', photoDiv), + percent : K('.ke-progressbar-percent', photoDiv) + }; + }, + remove : function() { + this.removeFiles(); + this.swfu.destroy(); + this.div.html(''); + } +}); + +K.swfupload = function(element, options) { + return new KSWFUpload(element, options); +}; + +})(KindEditor); + +KindEditor.plugin('multiimage', function(K) { + var self = this, name = 'multiimage', + formatUploadUrl = K.undef(self.formatUploadUrl, true), + uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'), + imgPath = self.pluginsPath + 'multiimage/images/', + imageSizeLimit = K.undef(self.imageSizeLimit, '1MB'), + imageFileTypes = K.undef(self.imageFileTypes, '*.jpg;*.gif;*.png'), + imageUploadLimit = K.undef(self.imageUploadLimit, 20), + filePostName = K.undef(self.filePostName, 'imgFile'), + lang = self.lang(name + '.'); + + self.plugin.multiImageDialog = function(options) { + var clickFn = options.clickFn, + uploadDesc = K.tmpl(lang.uploadDesc, {uploadLimit : imageUploadLimit, sizeLimit : imageSizeLimit}); + var html = [ + '
      ', + '
      ', + '
      ', + '
      ' + ].join(''); + var dialog = self.createDialog({ + name : name, + width : 650, + height : 510, + title : self.lang(name), + body : html, + previewBtn : { + name : lang.insertAll, + click : function(e) { + clickFn.call(self, swfupload.getUrlList()); + } + }, + yesBtn : { + name : lang.clearAll, + click : function(e) { + swfupload.removeFiles(); + } + }, + beforeRemove : function() { + // IE9 bugfix: https://github.com/kindsoft/kindeditor/issues/72 + if (!K.IE || K.V <= 8) { + swfupload.remove(); + } + } + }), + div = dialog.div; + + var swfupload = K.swfupload({ + container : K('.swfupload', div), + buttonImageUrl : imgPath + (self.langType == 'zh_CN' ? 'select-files-zh_CN.png' : 'select-files-en.png'), + buttonWidth : self.langType == 'zh_CN' ? 72 : 88, + buttonHeight : 23, + fileIconUrl : imgPath + 'image.png', + uploadDesc : uploadDesc, + startButtonValue : lang.startUpload, + uploadUrl : K.addParam(uploadJson, 'dir=image'), + flashUrl : imgPath + 'swfupload.swf', + filePostName : filePostName, + fileTypes : '*.jpg;*.jpeg;*.gif;*.png;*.bmp', + fileTypesDesc : 'Image Files', + fileUploadLimit : imageUploadLimit, + fileSizeLimit : imageSizeLimit, + postParams : K.undef(self.extraFileUploadParams, {}), + queueLimitExceeded : lang.queueLimitExceeded, + fileExceedsSizeLimit : lang.fileExceedsSizeLimit, + zeroByteFile : lang.zeroByteFile, + invalidFiletype : lang.invalidFiletype, + unknownError : lang.unknownError, + pendingMessage : lang.pending, + errorMessage : lang.uploadError, + afterError : function(html) { + self.errorDialog(html); + } + }); + + return dialog; + }; + self.clickToolbar(name, function() { + self.plugin.multiImageDialog({ + clickFn : function (urlList) { + if (urlList.length === 0) { + return; + } + K.each(urlList, function(i, data) { + if (self.afterUpload) { + self.afterUpload.call(self, data.url, data, 'multiimage'); + } + self.exec('insertimage', data.url, data.title, data.width, data.height, data.border, data.align); + self.exec('inserthtml', '
      ');/*DESTOON*/ + }); + // Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog + setTimeout(function() { + self.hideDialog().focus(); + }, 0); + } + }); + }); +}); + + +/** + * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com + * + * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/ + * + * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz閚 and Mammon Media and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + */ + + +/* ******************* */ +/* Constructor & Init */ +/* ******************* */ + +(function() { + +window.SWFUpload = function (settings) { + this.initSWFUpload(settings); +}; + +SWFUpload.prototype.initSWFUpload = function (settings) { + try { + this.customSettings = {}; // A container where developers can place their own settings associated with this instance. + this.settings = settings; + this.eventQueue = []; + this.movieName = "KindEditor_SWFUpload_" + SWFUpload.movieCount++; + this.movieElement = null; + + + // Setup global control tracking + SWFUpload.instances[this.movieName] = this; + + // Load the settings. Load the Flash movie. + this.initSettings(); + this.loadFlash(); + this.displayDebugInfo(); + } catch (ex) { + delete SWFUpload.instances[this.movieName]; + throw ex; + } +}; + +/* *************** */ +/* Static Members */ +/* *************** */ +SWFUpload.instances = {}; +SWFUpload.movieCount = 0; +SWFUpload.version = "2.2.0 2009-03-25"; +SWFUpload.QUEUE_ERROR = { + QUEUE_LIMIT_EXCEEDED : -100, + FILE_EXCEEDS_SIZE_LIMIT : -110, + ZERO_BYTE_FILE : -120, + INVALID_FILETYPE : -130 +}; +SWFUpload.UPLOAD_ERROR = { + HTTP_ERROR : -200, + MISSING_UPLOAD_URL : -210, + IO_ERROR : -220, + SECURITY_ERROR : -230, + UPLOAD_LIMIT_EXCEEDED : -240, + UPLOAD_FAILED : -250, + SPECIFIED_FILE_ID_NOT_FOUND : -260, + FILE_VALIDATION_FAILED : -270, + FILE_CANCELLED : -280, + UPLOAD_STOPPED : -290 +}; +SWFUpload.FILE_STATUS = { + QUEUED : -1, + IN_PROGRESS : -2, + ERROR : -3, + COMPLETE : -4, + CANCELLED : -5 +}; +SWFUpload.BUTTON_ACTION = { + SELECT_FILE : -100, + SELECT_FILES : -110, + START_UPLOAD : -120 +}; +SWFUpload.CURSOR = { + ARROW : -1, + HAND : -2 +}; +SWFUpload.WINDOW_MODE = { + WINDOW : "window", + TRANSPARENT : "transparent", + OPAQUE : "opaque" +}; + +// Private: takes a URL, determines if it is relative and converts to an absolute URL +// using the current site. Only processes the URL if it can, otherwise returns the URL untouched +SWFUpload.completeURL = function(url) { + if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) { + return url; + } + + var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : ""); + + var indexSlash = window.location.pathname.lastIndexOf("/"); + if (indexSlash <= 0) { + path = "/"; + } else { + path = window.location.pathname.substr(0, indexSlash) + "/"; + } + + return /*currentURL +*/ path + url; + +}; + + +/* ******************** */ +/* Instance Members */ +/* ******************** */ + +// Private: initSettings ensures that all the +// settings are set, getting a default value if one was not assigned. +SWFUpload.prototype.initSettings = function () { + this.ensureDefault = function (settingName, defaultValue) { + this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; + }; + + // Upload backend settings + this.ensureDefault("upload_url", ""); + this.ensureDefault("preserve_relative_urls", false); + this.ensureDefault("file_post_name", "Filedata"); + this.ensureDefault("post_params", {}); + this.ensureDefault("use_query_string", false); + this.ensureDefault("requeue_on_error", false); + this.ensureDefault("http_success", []); + this.ensureDefault("assume_success_timeout", 0); + + // File Settings + this.ensureDefault("file_types", "*.*"); + this.ensureDefault("file_types_description", "All Files"); + this.ensureDefault("file_size_limit", 0); // Default zero means "unlimited" + this.ensureDefault("file_upload_limit", 0); + this.ensureDefault("file_queue_limit", 0); + + // Flash Settings + this.ensureDefault("flash_url", "swfupload.swf"); + this.ensureDefault("prevent_swf_caching", true); + + // Button Settings + this.ensureDefault("button_image_url", ""); + this.ensureDefault("button_width", 1); + this.ensureDefault("button_height", 1); + this.ensureDefault("button_text", ""); + this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;"); + this.ensureDefault("button_text_top_padding", 0); + this.ensureDefault("button_text_left_padding", 0); + this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES); + this.ensureDefault("button_disabled", false); + this.ensureDefault("button_placeholder_id", ""); + this.ensureDefault("button_placeholder", null); + this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW); + this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW); + + // Debug Settings + this.ensureDefault("debug", false); + this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API + + // Event Handlers + this.settings.return_upload_start_handler = this.returnUploadStart; + this.ensureDefault("swfupload_loaded_handler", null); + this.ensureDefault("file_dialog_start_handler", null); + this.ensureDefault("file_queued_handler", null); + this.ensureDefault("file_queue_error_handler", null); + this.ensureDefault("file_dialog_complete_handler", null); + + this.ensureDefault("upload_start_handler", null); + this.ensureDefault("upload_progress_handler", null); + this.ensureDefault("upload_error_handler", null); + this.ensureDefault("upload_success_handler", null); + this.ensureDefault("upload_complete_handler", null); + + this.ensureDefault("debug_handler", this.debugMessage); + + this.ensureDefault("custom_settings", {}); + + // Other settings + this.customSettings = this.settings.custom_settings; + + // Update the flash url if needed + if (!!this.settings.prevent_swf_caching) { + this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime(); + } + + if (!this.settings.preserve_relative_urls) { + //this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it + this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url); + this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url); + } + + delete this.ensureDefault; +}; + +// Private: loadFlash replaces the button_placeholder element with the flash movie. +SWFUpload.prototype.loadFlash = function () { + var targetElement, tempParent; + + // Make sure an element with the ID we are going to use doesn't already exist + if (document.getElementById(this.movieName) !== null) { + throw "ID " + this.movieName + " is already in use. The Flash Object could not be added"; + } + + // Get the element where we will be placing the flash movie + targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder; + + if (targetElement == undefined) { + throw "Could not find the placeholder element: " + this.settings.button_placeholder_id; + } + + // Append the container and load the flash + tempParent = document.createElement("div"); + tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers) + targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement); + + // Fix IE Flash/Form bug + if (window[this.movieName] == undefined) { + window[this.movieName] = this.getMovieElement(); + } + +}; + +// Private: getFlashHTML generates the object tag needed to embed the flash in to the document +SWFUpload.prototype.getFlashHTML = function () { + // Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay + // Fix bug for IE9 + // http://www.kindsoft.net/view.php?bbsid=7&postid=5825&pagenum=1 + var classid = ''; + if (KindEditor.IE && KindEditor.V > 8) { + classid = ' classid = "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"'; + } + return ['', + '', + '', + '', + '', + '', + '', + ''].join(""); +}; + +// Private: getFlashVars builds the parameter string that will be passed +// to flash in the flashvars param. +SWFUpload.prototype.getFlashVars = function () { + // Build a string from the post param object + var paramString = this.buildParamString(); + var httpSuccessString = this.settings.http_success.join(","); + + // Build the parameter string + return ["movieName=", encodeURIComponent(this.movieName), + "&uploadURL=", encodeURIComponent(this.settings.upload_url), + "&useQueryString=", encodeURIComponent(this.settings.use_query_string), + "&requeueOnError=", encodeURIComponent(this.settings.requeue_on_error), + "&httpSuccess=", encodeURIComponent(httpSuccessString), + "&assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout), + "&params=", encodeURIComponent(paramString), + "&filePostName=", encodeURIComponent(this.settings.file_post_name), + "&fileTypes=", encodeURIComponent(this.settings.file_types), + "&fileTypesDescription=", encodeURIComponent(this.settings.file_types_description), + "&fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit), + "&fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit), + "&fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit), + "&debugEnabled=", encodeURIComponent(this.settings.debug_enabled), + "&buttonImageURL=", encodeURIComponent(this.settings.button_image_url), + "&buttonWidth=", encodeURIComponent(this.settings.button_width), + "&buttonHeight=", encodeURIComponent(this.settings.button_height), + "&buttonText=", encodeURIComponent(this.settings.button_text), + "&buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding), + "&buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding), + "&buttonTextStyle=", encodeURIComponent(this.settings.button_text_style), + "&buttonAction=", encodeURIComponent(this.settings.button_action), + "&buttonDisabled=", encodeURIComponent(this.settings.button_disabled), + "&buttonCursor=", encodeURIComponent(this.settings.button_cursor) + ].join(""); +}; + +// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload +// The element is cached after the first lookup +SWFUpload.prototype.getMovieElement = function () { + if (this.movieElement == undefined) { + this.movieElement = document.getElementById(this.movieName); + } + + if (this.movieElement === null) { + throw "Could not find Flash element"; + } + + return this.movieElement; +}; + +// Private: buildParamString takes the name/value pairs in the post_params setting object +// and joins them up in to a string formatted "name=value&name=value" +SWFUpload.prototype.buildParamString = function () { + var postParams = this.settings.post_params; + var paramStringPairs = []; + + if (typeof(postParams) === "object") { + for (var name in postParams) { + if (postParams.hasOwnProperty(name)) { + paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString())); + } + } + } + + return paramStringPairs.join("&"); +}; + +// Public: Used to remove a SWFUpload instance from the page. This method strives to remove +// all references to the SWF, and other objects so memory is properly freed. +// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state. +// Credits: Major improvements provided by steffen +SWFUpload.prototype.destroy = function () { + try { + // Make sure Flash is done before we try to remove it + this.cancelUpload(null, false); + + + // Remove the SWFUpload DOM nodes + var movieElement = null; + movieElement = this.getMovieElement(); + + if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE + // Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround) + for (var i in movieElement) { + try { + if (typeof(movieElement[i]) === "function") { + movieElement[i] = null; + } + } catch (ex1) {} + } + + // Remove the Movie Element from the page + try { + movieElement.parentNode.removeChild(movieElement); + } catch (ex) {} + } + + // Remove IE form fix reference + window[this.movieName] = null; + + // Destroy other references + SWFUpload.instances[this.movieName] = null; + delete SWFUpload.instances[this.movieName]; + + this.movieElement = null; + this.settings = null; + this.customSettings = null; + this.eventQueue = null; + this.movieName = null; + + + return true; + } catch (ex2) { + return false; + } +}; + + +// Public: displayDebugInfo prints out settings and configuration +// information about this SWFUpload instance. +// This function (and any references to it) can be deleted when placing +// SWFUpload in production. +SWFUpload.prototype.displayDebugInfo = function () { + this.debug( + [ + "---SWFUpload Instance Info---\n", + "Version: ", SWFUpload.version, "\n", + "Movie Name: ", this.movieName, "\n", + "Settings:\n", + "\t", "upload_url: ", this.settings.upload_url, "\n", + "\t", "flash_url: ", this.settings.flash_url, "\n", + "\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n", + "\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n", + "\t", "http_success: ", this.settings.http_success.join(", "), "\n", + "\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n", + "\t", "file_post_name: ", this.settings.file_post_name, "\n", + "\t", "post_params: ", this.settings.post_params.toString(), "\n", + "\t", "file_types: ", this.settings.file_types, "\n", + "\t", "file_types_description: ", this.settings.file_types_description, "\n", + "\t", "file_size_limit: ", this.settings.file_size_limit, "\n", + "\t", "file_upload_limit: ", this.settings.file_upload_limit, "\n", + "\t", "file_queue_limit: ", this.settings.file_queue_limit, "\n", + "\t", "debug: ", this.settings.debug.toString(), "\n", + + "\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n", + + "\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n", + "\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n", + "\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n", + "\t", "button_width: ", this.settings.button_width.toString(), "\n", + "\t", "button_height: ", this.settings.button_height.toString(), "\n", + "\t", "button_text: ", this.settings.button_text.toString(), "\n", + "\t", "button_text_style: ", this.settings.button_text_style.toString(), "\n", + "\t", "button_text_top_padding: ", this.settings.button_text_top_padding.toString(), "\n", + "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n", + "\t", "button_action: ", this.settings.button_action.toString(), "\n", + "\t", "button_disabled: ", this.settings.button_disabled.toString(), "\n", + + "\t", "custom_settings: ", this.settings.custom_settings.toString(), "\n", + "Event Handlers:\n", + "\t", "swfupload_loaded_handler assigned: ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n", + "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n", + "\t", "file_queued_handler assigned: ", (typeof this.settings.file_queued_handler === "function").toString(), "\n", + "\t", "file_queue_error_handler assigned: ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n", + "\t", "upload_start_handler assigned: ", (typeof this.settings.upload_start_handler === "function").toString(), "\n", + "\t", "upload_progress_handler assigned: ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n", + "\t", "upload_error_handler assigned: ", (typeof this.settings.upload_error_handler === "function").toString(), "\n", + "\t", "upload_success_handler assigned: ", (typeof this.settings.upload_success_handler === "function").toString(), "\n", + "\t", "upload_complete_handler assigned: ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n", + "\t", "debug_handler assigned: ", (typeof this.settings.debug_handler === "function").toString(), "\n" + ].join("") + ); +}; + +/* Note: addSetting and getSetting are no longer used by SWFUpload but are included + the maintain v2 API compatibility +*/ +// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used. +SWFUpload.prototype.addSetting = function (name, value, default_value) { + if (value == undefined) { + return (this.settings[name] = default_value); + } else { + return (this.settings[name] = value); + } +}; + +// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found. +SWFUpload.prototype.getSetting = function (name) { + if (this.settings[name] != undefined) { + return this.settings[name]; + } + + return ""; +}; + + + +// Private: callFlash handles function calls made to the Flash element. +// Calls are made with a setTimeout for some functions to work around +// bugs in the ExternalInterface library. +SWFUpload.prototype.callFlash = function (functionName, argumentArray) { + argumentArray = argumentArray || []; + + var movieElement = this.getMovieElement(); + var returnValue, returnString; + + // Flash's method if calling ExternalInterface methods (code adapted from MooTools). + try { + returnString = movieElement.CallFunction('' + __flash__argumentsToXML(argumentArray, 0) + ''); + returnValue = eval(returnString); + } catch (ex) { + throw "Call to " + functionName + " failed"; + } + + // Unescape file post param values + if (returnValue != undefined && typeof returnValue.post === "object") { + returnValue = this.unescapeFilePostParams(returnValue); + } + + return returnValue; +}; + +/* ***************************** + -- Flash control methods -- + Your UI should use these + to operate SWFUpload + ***************************** */ + +// WARNING: this function does not work in Flash Player 10 +// Public: selectFile causes a File Selection Dialog window to appear. This +// dialog only allows 1 file to be selected. +SWFUpload.prototype.selectFile = function () { + this.callFlash("SelectFile"); +}; + +// WARNING: this function does not work in Flash Player 10 +// Public: selectFiles causes a File Selection Dialog window to appear/ This +// dialog allows the user to select any number of files +// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names. +// If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around +// for this bug. +SWFUpload.prototype.selectFiles = function () { + this.callFlash("SelectFiles"); +}; + + +// Public: startUpload starts uploading the first file in the queue unless +// the optional parameter 'fileID' specifies the ID +SWFUpload.prototype.startUpload = function (fileID) { + this.callFlash("StartUpload", [fileID]); +}; + +// Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index. +// If you do not specify a fileID the current uploading file or first file in the queue is cancelled. +// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter. +SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) { + if (triggerErrorEvent !== false) { + triggerErrorEvent = true; + } + this.callFlash("CancelUpload", [fileID, triggerErrorEvent]); +}; + +// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue. +// If nothing is currently uploading then nothing happens. +SWFUpload.prototype.stopUpload = function () { + this.callFlash("StopUpload"); +}; + +/* ************************ + * Settings methods + * These methods change the SWFUpload settings. + * SWFUpload settings should not be changed directly on the settings object + * since many of the settings need to be passed to Flash in order to take + * effect. + * *********************** */ + +// Public: getStats gets the file statistics object. +SWFUpload.prototype.getStats = function () { + return this.callFlash("GetStats"); +}; + +// Public: setStats changes the SWFUpload statistics. You shouldn't need to +// change the statistics but you can. Changing the statistics does not +// affect SWFUpload accept for the successful_uploads count which is used +// by the upload_limit setting to determine how many files the user may upload. +SWFUpload.prototype.setStats = function (statsObject) { + this.callFlash("SetStats", [statsObject]); +}; + +// Public: getFile retrieves a File object by ID or Index. If the file is +// not found then 'null' is returned. +SWFUpload.prototype.getFile = function (fileID) { + if (typeof(fileID) === "number") { + return this.callFlash("GetFileByIndex", [fileID]); + } else { + return this.callFlash("GetFile", [fileID]); + } +}; + +// Public: addFileParam sets a name/value pair that will be posted with the +// file specified by the Files ID. If the name already exists then the +// exiting value will be overwritten. +SWFUpload.prototype.addFileParam = function (fileID, name, value) { + return this.callFlash("AddFileParam", [fileID, name, value]); +}; + +// Public: removeFileParam removes a previously set (by addFileParam) name/value +// pair from the specified file. +SWFUpload.prototype.removeFileParam = function (fileID, name) { + this.callFlash("RemoveFileParam", [fileID, name]); +}; + +// Public: setUploadUrl changes the upload_url setting. +SWFUpload.prototype.setUploadURL = function (url) { + this.settings.upload_url = url.toString(); + this.callFlash("SetUploadURL", [url]); +}; + +// Public: setPostParams changes the post_params setting +SWFUpload.prototype.setPostParams = function (paramsObject) { + this.settings.post_params = paramsObject; + this.callFlash("SetPostParams", [paramsObject]); +}; + +// Public: addPostParam adds post name/value pair. Each name can have only one value. +SWFUpload.prototype.addPostParam = function (name, value) { + this.settings.post_params[name] = value; + this.callFlash("SetPostParams", [this.settings.post_params]); +}; + +// Public: removePostParam deletes post name/value pair. +SWFUpload.prototype.removePostParam = function (name) { + delete this.settings.post_params[name]; + this.callFlash("SetPostParams", [this.settings.post_params]); +}; + +// Public: setFileTypes changes the file_types setting and the file_types_description setting +SWFUpload.prototype.setFileTypes = function (types, description) { + this.settings.file_types = types; + this.settings.file_types_description = description; + this.callFlash("SetFileTypes", [types, description]); +}; + +// Public: setFileSizeLimit changes the file_size_limit setting +SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) { + this.settings.file_size_limit = fileSizeLimit; + this.callFlash("SetFileSizeLimit", [fileSizeLimit]); +}; + +// Public: setFileUploadLimit changes the file_upload_limit setting +SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) { + this.settings.file_upload_limit = fileUploadLimit; + this.callFlash("SetFileUploadLimit", [fileUploadLimit]); +}; + +// Public: setFileQueueLimit changes the file_queue_limit setting +SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) { + this.settings.file_queue_limit = fileQueueLimit; + this.callFlash("SetFileQueueLimit", [fileQueueLimit]); +}; + +// Public: setFilePostName changes the file_post_name setting +SWFUpload.prototype.setFilePostName = function (filePostName) { + this.settings.file_post_name = filePostName; + this.callFlash("SetFilePostName", [filePostName]); +}; + +// Public: setUseQueryString changes the use_query_string setting +SWFUpload.prototype.setUseQueryString = function (useQueryString) { + this.settings.use_query_string = useQueryString; + this.callFlash("SetUseQueryString", [useQueryString]); +}; + +// Public: setRequeueOnError changes the requeue_on_error setting +SWFUpload.prototype.setRequeueOnError = function (requeueOnError) { + this.settings.requeue_on_error = requeueOnError; + this.callFlash("SetRequeueOnError", [requeueOnError]); +}; + +// Public: setHTTPSuccess changes the http_success setting +SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) { + if (typeof http_status_codes === "string") { + http_status_codes = http_status_codes.replace(" ", "").split(","); + } + + this.settings.http_success = http_status_codes; + this.callFlash("SetHTTPSuccess", [http_status_codes]); +}; + +// Public: setHTTPSuccess changes the http_success setting +SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) { + this.settings.assume_success_timeout = timeout_seconds; + this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]); +}; + +// Public: setDebugEnabled changes the debug_enabled setting +SWFUpload.prototype.setDebugEnabled = function (debugEnabled) { + this.settings.debug_enabled = debugEnabled; + this.callFlash("SetDebugEnabled", [debugEnabled]); +}; + +// Public: setButtonImageURL loads a button image sprite +SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) { + if (buttonImageURL == undefined) { + buttonImageURL = ""; + } + + this.settings.button_image_url = buttonImageURL; + this.callFlash("SetButtonImageURL", [buttonImageURL]); +}; + +// Public: setButtonDimensions resizes the Flash Movie and button +SWFUpload.prototype.setButtonDimensions = function (width, height) { + this.settings.button_width = width; + this.settings.button_height = height; + + var movie = this.getMovieElement(); + if (movie != undefined) { + movie.style.width = width + "px"; + movie.style.height = height + "px"; + } + + this.callFlash("SetButtonDimensions", [width, height]); +}; +// Public: setButtonText Changes the text overlaid on the button +SWFUpload.prototype.setButtonText = function (html) { + this.settings.button_text = html; + this.callFlash("SetButtonText", [html]); +}; +// Public: setButtonTextPadding changes the top and left padding of the text overlay +SWFUpload.prototype.setButtonTextPadding = function (left, top) { + this.settings.button_text_top_padding = top; + this.settings.button_text_left_padding = left; + this.callFlash("SetButtonTextPadding", [left, top]); +}; + +// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button +SWFUpload.prototype.setButtonTextStyle = function (css) { + this.settings.button_text_style = css; + this.callFlash("SetButtonTextStyle", [css]); +}; +// Public: setButtonDisabled disables/enables the button +SWFUpload.prototype.setButtonDisabled = function (isDisabled) { + this.settings.button_disabled = isDisabled; + this.callFlash("SetButtonDisabled", [isDisabled]); +}; +// Public: setButtonAction sets the action that occurs when the button is clicked +SWFUpload.prototype.setButtonAction = function (buttonAction) { + this.settings.button_action = buttonAction; + this.callFlash("SetButtonAction", [buttonAction]); +}; + +// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button +SWFUpload.prototype.setButtonCursor = function (cursor) { + this.settings.button_cursor = cursor; + this.callFlash("SetButtonCursor", [cursor]); +}; + +/* ******************************* + Flash Event Interfaces + These functions are used by Flash to trigger the various + events. + + All these functions a Private. + + Because the ExternalInterface library is buggy the event calls + are added to a queue and the queue then executed by a setTimeout. + This ensures that events are executed in a determinate order and that + the ExternalInterface bugs are avoided. +******************************* */ + +SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) { + // Warning: Don't call this.debug inside here or you'll create an infinite loop + + if (argumentArray == undefined) { + argumentArray = []; + } else if (!(argumentArray instanceof Array)) { + argumentArray = [argumentArray]; + } + + var self = this; + if (typeof this.settings[handlerName] === "function") { + // Queue the event + this.eventQueue.push(function () { + this.settings[handlerName].apply(this, argumentArray); + }); + + // Execute the next queued event + setTimeout(function () { + self.executeNextEvent(); + }, 0); + + } else if (this.settings[handlerName] !== null) { + throw "Event handler " + handlerName + " is unknown or is not a function"; + } +}; + +// Private: Causes the next event in the queue to be executed. Since events are queued using a setTimeout +// we must queue them in order to garentee that they are executed in order. +SWFUpload.prototype.executeNextEvent = function () { + // Warning: Don't call this.debug inside here or you'll create an infinite loop + + var f = this.eventQueue ? this.eventQueue.shift() : null; + if (typeof(f) === "function") { + f.apply(this); + } +}; + +// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have +// properties that contain characters that are not valid for JavaScript identifiers. To work around this +// the Flash Component escapes the parameter names and we must unescape again before passing them along. +SWFUpload.prototype.unescapeFilePostParams = function (file) { + var reg = /[$]([0-9a-f]{4})/i; + var unescapedPost = {}; + var uk; + + if (file != undefined) { + for (var k in file.post) { + if (file.post.hasOwnProperty(k)) { + uk = k; + var match; + while ((match = reg.exec(uk)) !== null) { + uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16))); + } + unescapedPost[uk] = file.post[k]; + } + } + + file.post = unescapedPost; + } + + return file; +}; + +// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working) +SWFUpload.prototype.testExternalInterface = function () { + try { + return this.callFlash("TestExternalInterface"); + } catch (ex) { + return false; + } +}; + +// Private: This event is called by Flash when it has finished loading. Don't modify this. +// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded. +SWFUpload.prototype.flashReady = function () { + // Check that the movie element is loaded correctly with its ExternalInterface methods defined + var movieElement = this.getMovieElement(); + + if (!movieElement) { + this.debug("Flash called back ready but the flash movie can't be found."); + return; + } + + this.cleanUp(movieElement); + + this.queueEvent("swfupload_loaded_handler"); +}; + +// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE. +// This function is called by Flash each time the ExternalInterface functions are created. +SWFUpload.prototype.cleanUp = function (movieElement) { + // Pro-actively unhook all the Flash functions + try { + if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE + this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)"); + for (var key in movieElement) { + try { + if (typeof(movieElement[key]) === "function") { + movieElement[key] = null; + } + } catch (ex) { + } + } + } + } catch (ex1) { + + } + + // Fix Flashes own cleanup code so if the SWFMovie was removed from the page + // it doesn't display errors. + window["__flash__removeCallback"] = function (instance, name) { + try { + if (instance) { + instance[name] = null; + } + } catch (flashEx) { + + } + }; + +}; + + +/* This is a chance to do something before the browse window opens */ +SWFUpload.prototype.fileDialogStart = function () { + this.queueEvent("file_dialog_start_handler"); +}; + + +/* Called when a file is successfully added to the queue. */ +SWFUpload.prototype.fileQueued = function (file) { + file = this.unescapeFilePostParams(file); + this.queueEvent("file_queued_handler", file); +}; + + +/* Handle errors that occur when an attempt to queue a file fails. */ +SWFUpload.prototype.fileQueueError = function (file, errorCode, message) { + file = this.unescapeFilePostParams(file); + this.queueEvent("file_queue_error_handler", [file, errorCode, message]); +}; + +/* Called after the file dialog has closed and the selected files have been queued. + You could call startUpload here if you want the queued files to begin uploading immediately. */ +SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) { + this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]); +}; + +SWFUpload.prototype.uploadStart = function (file) { + file = this.unescapeFilePostParams(file); + this.queueEvent("return_upload_start_handler", file); +}; + +SWFUpload.prototype.returnUploadStart = function (file) { + var returnValue; + if (typeof this.settings.upload_start_handler === "function") { + file = this.unescapeFilePostParams(file); + returnValue = this.settings.upload_start_handler.call(this, file); + } else if (this.settings.upload_start_handler != undefined) { + throw "upload_start_handler must be a function"; + } + + // Convert undefined to true so if nothing is returned from the upload_start_handler it is + // interpretted as 'true'. + if (returnValue === undefined) { + returnValue = true; + } + + returnValue = !!returnValue; + + this.callFlash("ReturnUploadStart", [returnValue]); +}; + + + +SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]); +}; + +SWFUpload.prototype.uploadError = function (file, errorCode, message) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_error_handler", [file, errorCode, message]); +}; + +SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_success_handler", [file, serverData, responseReceived]); +}; + +SWFUpload.prototype.uploadComplete = function (file) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_complete_handler", file); +}; + +/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the + internal debug console. You can override this event and have messages written where you want. */ +SWFUpload.prototype.debug = function (message) { + this.queueEvent("debug_handler", message); +}; + + +/* ********************************** + Debug Console + The debug console is a self contained, in page location + for debug message to be sent. The Debug Console adds + itself to the body if necessary. + + The console is automatically scrolled as messages appear. + + If you are using your own debug handler or when you deploy to production and + have debug disabled you can remove these functions to reduce the file size + and complexity. +********************************** */ + +// Private: debugMessage is the default debug_handler. If you want to print debug messages +// call the debug() function. When overriding the function your own function should +// check to see if the debug setting is true before outputting debug information. +SWFUpload.prototype.debugMessage = function (message) { + if (this.settings.debug) { + var exceptionMessage, exceptionValues = []; + + // Check for an exception object and print it nicely + if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") { + for (var key in message) { + if (message.hasOwnProperty(key)) { + exceptionValues.push(key + ": " + message[key]); + } + } + exceptionMessage = exceptionValues.join("\n") || ""; + exceptionValues = exceptionMessage.split("\n"); + exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: "); + SWFUpload.Console.writeLine(exceptionMessage); + } else { + SWFUpload.Console.writeLine(message); + } + } +}; + +SWFUpload.Console = {}; +SWFUpload.Console.writeLine = function (message) { + var console, documentForm; + + try { + console = document.getElementById("SWFUpload_Console"); + + if (!console) { + documentForm = document.createElement("form"); + document.getElementsByTagName("body")[0].appendChild(documentForm); + + console = document.createElement("textarea"); + console.id = "SWFUpload_Console"; + console.style.fontFamily = "monospace"; + console.setAttribute("wrap", "off"); + console.wrap = "off"; + console.style.overflow = "auto"; + console.style.width = "700px"; + console.style.height = "350px"; + console.style.margin = "5px"; + documentForm.appendChild(console); + } + + console.value += message + "\n"; + + console.scrollTop = console.scrollHeight - console.clientHeight; + } catch (ex) { + alert("Exception: " + ex.name + " Message: " + ex.message); + } +}; + +})(); + +(function() { +/* + Queue Plug-in + + Features: + *Adds a cancelQueue() method for cancelling the entire queue. + *All queued files are uploaded when startUpload() is called. + *If false is returned from uploadComplete then the queue upload is stopped. + If false is not returned (strict comparison) then the queue upload is continued. + *Adds a QueueComplete event that is fired when all the queued files have finished uploading. + Set the event handler with the queue_complete_handler setting. + + */ + +if (typeof(SWFUpload) === "function") { + SWFUpload.queue = {}; + + SWFUpload.prototype.initSettings = (function (oldInitSettings) { + return function () { + if (typeof(oldInitSettings) === "function") { + oldInitSettings.call(this); + } + + this.queueSettings = {}; + + this.queueSettings.queue_cancelled_flag = false; + this.queueSettings.queue_upload_count = 0; + + this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler; + this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler; + this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler; + this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler; + + this.settings.queue_complete_handler = this.settings.queue_complete_handler || null; + }; + })(SWFUpload.prototype.initSettings); + + SWFUpload.prototype.startUpload = function (fileID) { + this.queueSettings.queue_cancelled_flag = false; + this.callFlash("StartUpload", [fileID]); + }; + + SWFUpload.prototype.cancelQueue = function () { + this.queueSettings.queue_cancelled_flag = true; + this.stopUpload(); + + var stats = this.getStats(); + while (stats.files_queued > 0) { + this.cancelUpload(); + stats = this.getStats(); + } + }; + + SWFUpload.queue.uploadStartHandler = function (file) { + var returnValue; + if (typeof(this.queueSettings.user_upload_start_handler) === "function") { + returnValue = this.queueSettings.user_upload_start_handler.call(this, file); + } + + // To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value. + returnValue = (returnValue === false) ? false : true; + + this.queueSettings.queue_cancelled_flag = !returnValue; + + return returnValue; + }; + + SWFUpload.queue.uploadCompleteHandler = function (file) { + var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler; + var continueUpload; + + if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) { + this.queueSettings.queue_upload_count++; + } + + if (typeof(user_upload_complete_handler) === "function") { + continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true; + } else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) { + // If the file was stopped and re-queued don't restart the upload + continueUpload = false; + } else { + continueUpload = true; + } + + if (continueUpload) { + var stats = this.getStats(); + if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) { + this.startUpload(); + } else if (this.queueSettings.queue_cancelled_flag === false) { + this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]); + this.queueSettings.queue_upload_count = 0; + } else { + this.queueSettings.queue_cancelled_flag = false; + this.queueSettings.queue_upload_count = 0; + } + } + }; +} + +})(); diff --git a/member/editor/kindeditor/plugins/pagebreak/pagebreak.js b/member/editor/kindeditor/plugins/pagebreak/pagebreak.js new file mode 100644 index 0000000..dfa883a --- /dev/null +++ b/member/editor/kindeditor/plugins/pagebreak/pagebreak.js @@ -0,0 +1,27 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('pagebreak', function(K) { + var self = this; + var name = 'pagebreak'; + var pagebreakHtml = K.undef(self.pagebreakHtml, '
      '); + + self.clickToolbar(name, function() { + var cmd = self.cmd, range = cmd.range; + self.focus(); + var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : ''; + self.insertHtml(pagebreakHtml + tail); + if (tail !== '') { + var p = K('#__kindeditor_tail_tag__', self.edit.doc); + range.selectNodeContents(p[0]); + p.removeAttr('id'); + cmd.select(); + } + }); +}); diff --git a/member/editor/kindeditor/plugins/plainpaste/plainpaste.js b/member/editor/kindeditor/plugins/plainpaste/plainpaste.js new file mode 100644 index 0000000..8f7bed8 --- /dev/null +++ b/member/editor/kindeditor/plugins/plainpaste/plainpaste.js @@ -0,0 +1,41 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('plainpaste', function(K) { + var self = this, name = 'plainpaste'; + self.clickToolbar(name, function() { + var lang = self.lang(name + '.'), + html = '
      ' + + '
      ' + lang.comment + '
      ' + + '' + + '
      ', + dialog = self.createDialog({ + name : name, + width : 450, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var html = textarea.val(); + html = K.escape(html); + html = html.replace(/ {2}/g, '  '); + if (self.newlineTag == 'p') { + html = html.replace(/^/, '

      ').replace(/$/, '

      ').replace(/\n/g, '

      '); + } else { + html = html.replace(/\n/g, '
      $&'); + } + self.insertHtml(html).hideDialog().focus(); + } + } + }), + textarea = K('textarea', dialog.div); + textarea[0].focus(); + }); +}); diff --git a/member/editor/kindeditor/plugins/preview/preview.js b/member/editor/kindeditor/plugins/preview/preview.js new file mode 100644 index 0000000..ef6e2cf --- /dev/null +++ b/member/editor/kindeditor/plugins/preview/preview.js @@ -0,0 +1,31 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('preview', function(K) { + var self = this, name = 'preview', undefined; + self.clickToolbar(name, function() { + var lang = self.lang(name + '.'), + html = '

      ' + + '' + + '
      ', + dialog = self.createDialog({ + name : name, + width : 750, + title : self.lang(name), + body : html + }), + iframe = K('iframe', dialog.div), + doc = K.iframeDoc(iframe); + doc.open(); + doc.write(self.fullHtml()); + doc.close(); + K(doc.body).css('background-color', '#FFF'); + iframe[0].contentWindow.focus(); + }); +}); diff --git a/member/editor/kindeditor/plugins/quickformat/quickformat.js b/member/editor/kindeditor/plugins/quickformat/quickformat.js new file mode 100644 index 0000000..5b98c72 --- /dev/null +++ b/member/editor/kindeditor/plugins/quickformat/quickformat.js @@ -0,0 +1,81 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('quickformat', function(K) { + var self = this, name = 'quickformat', + blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p'); + function getFirstChild(knode) { + var child = knode.first(); + while (child && child.first()) { + child = child.first(); + } + return child; + } + self.clickToolbar(name, function() { + self.focus(); + var doc = self.edit.doc, + range = self.cmd.range, + child = K(doc.body).first(), next, + nodeList = [], subList = [], + bookmark = range.createBookmark(true); + while(child) { + next = child.next(); + var firstChild = getFirstChild(child); + if (!firstChild || firstChild.name != 'img') { + if (blockMap[child.name]) { + child.html(child.html().replace(/^(\s| | )+/ig, '')); + child.css('text-indent', '2em'); + } else { + subList.push(child); + } + if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) { + if (subList.length > 0) { + nodeList.push(subList); + } + subList = []; + } + } + child = next; + } + K.each(nodeList, function(i, subList) { + var wrapper = K('

      ', doc); + subList[0].before(wrapper); + K.each(subList, function(i, knode) { + wrapper.append(knode); + }); + }); + range.moveToBookmark(bookmark); + self.addBookmark(); + }); +}); + +/** +-------------------------- +abcd
      +1234
      + +to + +

      + abcd
      + 1234
      +

      + +-------------------------- + +  abcd1233 +

      1234

      + +to + +

      abcd1233

      +

      1234

      + +-------------------------- +*/ \ No newline at end of file diff --git a/member/editor/kindeditor/plugins/table/table.js b/member/editor/kindeditor/plugins/table/table.js new file mode 100644 index 0000000..4033b6a --- /dev/null +++ b/member/editor/kindeditor/plugins/table/table.js @@ -0,0 +1,712 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('table', function(K) { + var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder'; + // 设置颜色 + function _setColor(box, color) { + color = color.toUpperCase(); + box.css('background-color', color); + box.css('color', color === '#000000' ? '#FFFFFF' : '#000000'); + box.html(color); + } + // 初始化取色器 + var pickerList = []; + function _initColorPicker(dialogDiv, colorBox) { + colorBox.bind('click,mousedown', function(e){ + e.stopPropagation(); + }); + function removePicker() { + K.each(pickerList, function() { + this.remove(); + }); + pickerList = []; + K(document).unbind('click,mousedown', removePicker); + dialogDiv.unbind('click,mousedown', removePicker); + } + colorBox.click(function(e) { + removePicker(); + var box = K(this), + pos = box.pos(); + var picker = K.colorpicker({ + x : pos.x, + y : pos.y + box.height(), + z : 811214, + selectedColor : K(this).html(), + colors : self.colorTable, + noColor : self.lang('noColor'), + shadowMode : self.shadowMode, + click : function(color) { + _setColor(box, color); + removePicker(); + } + }); + pickerList.push(picker); + K(document).bind('click,mousedown', removePicker); + dialogDiv.bind('click,mousedown', removePicker); + }); + } + // 取得下一行cell的index + function _getCellIndex(table, row, cell) { + var rowSpanCount = 0; + for (var i = 0, len = row.cells.length; i < len; i++) { + if (row.cells[i] == cell) { + break; + } + rowSpanCount += row.cells[i].rowSpan - 1; + } + return cell.cellIndex - rowSpanCount; + } + self.plugin.table = { + //insert or modify table + prop : function(isInsert) { + var html = [ + '
      ', + //rows, cols + '
      ', + '', + lang.rows + '   ', + lang.cols + ' ', + '
      ', + //width, height + '
      ', + '', + lang.width + '   ', + '   ', + lang.height + '   ', + '', + '
      ', + //space, padding + '
      ', + '', + lang.padding + '   ', + lang.spacing + ' ', + '
      ', + //align + '
      ', + '', + '', + '
      ', + //border + '
      ', + '', + lang.borderWidth + '   ', + lang.borderColor + ' ', + '
      ', + //background color + '
      ', + '', + '', + '
      ', + '
      ' + ].join(''); + var bookmark = self.cmd.range.createBookmark(); + var dialog = self.createDialog({ + name : name, + width : 500, + title : self.lang(name), + body : html, + beforeRemove : function() { + colorBox.unbind(); + }, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var rows = rowsBox.val(), + cols = colsBox.val(), + width = widthBox.val(), + height = heightBox.val(), + widthType = widthTypeBox.val(), + heightType = heightTypeBox.val(), + padding = paddingBox.val(), + spacing = spacingBox.val(), + align = alignBox.val(), + border = borderBox.val(), + borderColor = K(colorBox[0]).html() || '', + bgColor = K(colorBox[1]).html() || ''; + if (rows == 0 || !/^\d+$/.test(rows)) { + alert(self.lang('invalidRows')); + rowsBox[0].focus(); + return; + } + if (cols == 0 || !/^\d+$/.test(cols)) { + alert(self.lang('invalidRows')); + colsBox[0].focus(); + return; + } + if (!/^\d*$/.test(width)) { + alert(self.lang('invalidWidth')); + widthBox[0].focus(); + return; + } + if (!/^\d*$/.test(height)) { + alert(self.lang('invalidHeight')); + heightBox[0].focus(); + return; + } + if (!/^\d*$/.test(padding)) { + alert(self.lang('invalidPadding')); + paddingBox[0].focus(); + return; + } + if (!/^\d*$/.test(spacing)) { + alert(self.lang('invalidSpacing')); + spacingBox[0].focus(); + return; + } + if (!/^\d*$/.test(border)) { + alert(self.lang('invalidBorder')); + borderBox[0].focus(); + return; + } + //modify table + if (table) { + if (width !== '') { + table.width(width + widthType); + } else { + table.css('width', ''); + } + if (table[0].width !== undefined) { + table.removeAttr('width'); + } + if (height !== '') { + table.height(height + heightType); + } else { + table.css('height', ''); + } + if (table[0].height !== undefined) { + table.removeAttr('height'); + } + table.css('background-color', bgColor); + if (table[0].bgColor !== undefined) { + table.removeAttr('bgColor'); + } + if (padding !== '') { + table[0].cellPadding = padding; + } else { + table.removeAttr('cellPadding'); + } + if (spacing !== '') { + table[0].cellSpacing = spacing; + } else { + table.removeAttr('cellSpacing'); + } + if (align !== '') { + table[0].align = align; + } else { + table.removeAttr('align'); + } + if (border !== '') { + table.attr('border', border); + } else { + table.removeAttr('border'); + } + if (border === '' || border === '0') { + table.addClass(zeroborder); + } else { + table.removeClass(zeroborder); + } + if (borderColor !== '') { + table.attr('borderColor', borderColor); + } else { + table.removeAttr('borderColor'); + } + self.hideDialog().focus(); + self.cmd.range.moveToBookmark(bookmark); + self.cmd.select(); + self.addBookmark(); + return; + } + //insert new table + var style = ''; + if (width !== '') { + style += 'width:' + width + widthType + ';'; + } + if (height !== '') { + style += 'height:' + height + heightType + ';'; + } + if (bgColor !== '') { + style += 'background-color:' + bgColor + ';'; + } + var html = '') + ''; + } + html += ''; + } + html += ''; + if (!K.IE) { + html += '
      '; + } + self.insertHtml(html); + self.select().hideDialog().focus(); + self.addBookmark(); + } + } + }), + div = dialog.div, + rowsBox = K('[name="rows"]', div).val(3), + colsBox = K('[name="cols"]', div).val(2), + widthBox = K('[name="width"]', div).val(100), + heightBox = K('[name="height"]', div), + widthTypeBox = K('[name="widthType"]', div), + heightTypeBox = K('[name="heightType"]', div), + paddingBox = K('[name="padding"]', div).val(2), + spacingBox = K('[name="spacing"]', div).val(0), + alignBox = K('[name="align"]', div), + borderBox = K('[name="border"]', div).val(1), + colorBox = K('.ke-input-color', div); + _initColorPicker(div, colorBox.eq(0)); + _initColorPicker(div, colorBox.eq(1)); + _setColor(colorBox.eq(0), '#000000'); + _setColor(colorBox.eq(1), ''); + // foucs and select + rowsBox[0].focus(); + rowsBox[0].select(); + var table; + if (isInsert) { + return; + } + //get selected table node + table = self.plugin.getSelectedTable(); + if (table) { + rowsBox.val(table[0].rows.length); + colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0); + rowsBox.attr('disabled', true); + colsBox.attr('disabled', true); + var match, + tableWidth = table[0].style.width || table[0].width, + tableHeight = table[0].style.height || table[0].height; + if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) { + widthBox.val(match[1]); + widthTypeBox.val(match[2]); + } else { + widthBox.val(''); + } + if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) { + heightBox.val(match[1]); + heightTypeBox.val(match[2]); + } + paddingBox.val(table[0].cellPadding || ''); + spacingBox.val(table[0].cellSpacing || ''); + alignBox.val(table[0].align || ''); + borderBox.val(table[0].border === undefined ? '' : table[0].border); + _setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || '')); + _setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || '')); + widthBox[0].focus(); + widthBox[0].select(); + } + }, + //modify cell + cellprop : function() { + var html = [ + '
      ', + //width, height + '
      ', + '', + lang.width + '   ', + '   ', + lang.height + '   ', + '', + '
      ', + //align + '
      ', + '', + lang.textAlign + ' ', + lang.verticalAlign + ' ', + '
      ', + //border + '
      ', + '', + lang.borderWidth + '   ', + lang.borderColor + ' ', + '
      ', + //background color + '
      ', + '', + '', + '
      ', + '
      ' + ].join(''); + var bookmark = self.cmd.range.createBookmark(); + var dialog = self.createDialog({ + name : name, + width : 500, + title : self.lang('tablecell'), + body : html, + beforeRemove : function() { + colorBox.unbind(); + }, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var width = widthBox.val(), + height = heightBox.val(), + widthType = widthTypeBox.val(), + heightType = heightTypeBox.val(), + padding = paddingBox.val(), + spacing = spacingBox.val(), + textAlign = textAlignBox.val(), + verticalAlign = verticalAlignBox.val(), + border = borderBox.val(), + borderColor = K(colorBox[0]).html() || '', + bgColor = K(colorBox[1]).html() || ''; + if (!/^\d*$/.test(width)) { + alert(self.lang('invalidWidth')); + widthBox[0].focus(); + return; + } + if (!/^\d*$/.test(height)) { + alert(self.lang('invalidHeight')); + heightBox[0].focus(); + return; + } + if (!/^\d*$/.test(border)) { + alert(self.lang('invalidBorder')); + borderBox[0].focus(); + return; + } + cell.css({ + width : width !== '' ? (width + widthType) : '', + height : height !== '' ? (height + heightType) : '', + 'background-color' : bgColor, + 'text-align' : textAlign, + 'vertical-align' : verticalAlign, + 'border-width' : border, + 'border-style' : border !== '' ? 'solid' : '', + 'border-color' : borderColor + }); + self.hideDialog().focus(); + self.cmd.range.moveToBookmark(bookmark); + self.cmd.select(); + self.addBookmark(); + } + } + }), + div = dialog.div, + widthBox = K('[name="width"]', div).val(100), + heightBox = K('[name="height"]', div), + widthTypeBox = K('[name="widthType"]', div), + heightTypeBox = K('[name="heightType"]', div), + paddingBox = K('[name="padding"]', div).val(2), + spacingBox = K('[name="spacing"]', div).val(0), + textAlignBox = K('[name="textAlign"]', div), + verticalAlignBox = K('[name="verticalAlign"]', div), + borderBox = K('[name="border"]', div).val(1), + colorBox = K('.ke-input-color', div); + _initColorPicker(div, colorBox.eq(0)); + _initColorPicker(div, colorBox.eq(1)); + _setColor(colorBox.eq(0), '#000000'); + _setColor(colorBox.eq(1), ''); + // foucs and select + widthBox[0].focus(); + widthBox[0].select(); + // get selected cell + var cell = self.plugin.getSelectedCell(); + var match, + cellWidth = cell[0].style.width || cell[0].width || '', + cellHeight = cell[0].style.height || cell[0].height || ''; + if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) { + widthBox.val(match[1]); + widthTypeBox.val(match[2]); + } else { + widthBox.val(''); + } + if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) { + heightBox.val(match[1]); + heightTypeBox.val(match[2]); + } + textAlignBox.val(cell[0].style.textAlign || ''); + verticalAlignBox.val(cell[0].style.verticalAlign || ''); + var border = cell[0].style.borderWidth || ''; + if (border) { + border = parseInt(border); + } + borderBox.val(border); + _setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || '')); + _setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || '')); + widthBox[0].focus(); + widthBox[0].select(); + }, + insert : function() { + this.prop(true); + }, + 'delete' : function() { + var table = self.plugin.getSelectedTable(); + self.cmd.range.setStartBefore(table[0]).collapse(true); + self.cmd.select(); + table.remove(); + self.addBookmark(); + }, + colinsert : function(offset) { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + index = cell.cellIndex + offset; + // 取得第一行的index + index += table.rows[0].cells.length - row.cells.length; + + for (var i = 0, len = table.rows.length; i < len; i++) { + var newRow = table.rows[i], + newCell = newRow.insertCell(index); + newCell.innerHTML = K.IE ? '' : '
      '; + // 调整下一行的单元格index + index = _getCellIndex(table, newRow, newCell); + } + self.cmd.range.selectNodeContents(cell).collapse(true); + self.cmd.select(); + self.addBookmark(); + }, + colinsertleft : function() { + this.colinsert(0); + }, + colinsertright : function() { + this.colinsert(1); + }, + rowinsert : function(offset) { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0]; + var rowIndex = row.rowIndex; + if (offset === 1) { + rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset; + } + var newRow = table.insertRow(rowIndex); + + for (var i = 0, len = row.cells.length; i < len; i++) { + // 调整cell个数 + if (row.cells[i].rowSpan > 1) { + len -= row.cells[i].rowSpan - 1; + } + var newCell = newRow.insertCell(i); + // copy colspan + if (offset === 1 && row.cells[i].colSpan > 1) { + newCell.colSpan = row.cells[i].colSpan; + } + newCell.innerHTML = K.IE ? '' : '
      '; + } + // 调整rowspan + for (var j = rowIndex; j >= 0; j--) { + var cells = table.rows[j].cells; + if (cells.length > i) { + for (var k = cell.cellIndex; k >= 0; k--) { + if (cells[k].rowSpan > 1) { + cells[k].rowSpan += 1; + } + } + break; + } + } + self.cmd.range.selectNodeContents(cell).collapse(true); + self.cmd.select(); + self.addBookmark(); + }, + rowinsertabove : function() { + this.rowinsert(0); + }, + rowinsertbelow : function() { + this.rowinsert(1); + }, + rowmerge : function() { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + rowIndex = row.rowIndex, // 当前行的index + nextRowIndex = rowIndex + cell.rowSpan, // 下一行的index + nextRow = table.rows[nextRowIndex]; // 下一行 + // 最后一行不能合并 + if (table.rows.length <= nextRowIndex) { + return; + } + var cellIndex = cell.cellIndex; // 下一行单元格的index + if (nextRow.cells.length <= cellIndex) { + return; + } + var nextCell = nextRow.cells[cellIndex]; // 下一行单元格 + // 上下行的colspan不一致时不能合并 + if (cell.colSpan !== nextCell.colSpan) { + return; + } + cell.rowSpan += nextCell.rowSpan; + nextRow.deleteCell(cellIndex); + self.cmd.range.selectNodeContents(cell).collapse(true); + self.cmd.select(); + self.addBookmark(); + }, + colmerge : function() { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + rowIndex = row.rowIndex, // 当前行的index + cellIndex = cell.cellIndex, + nextCellIndex = cellIndex + 1; + // 最后一列不能合并 + if (row.cells.length <= nextCellIndex) { + return; + } + var nextCell = row.cells[nextCellIndex]; + // 左右列的rowspan不一致时不能合并 + if (cell.rowSpan !== nextCell.rowSpan) { + return; + } + cell.colSpan += nextCell.colSpan; + row.deleteCell(nextCellIndex); + self.cmd.range.selectNodeContents(cell).collapse(true); + self.cmd.select(); + self.addBookmark(); + }, + rowsplit : function() { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + rowIndex = row.rowIndex; + // 不是可分割单元格 + if (cell.rowSpan === 1) { + return; + } + var cellIndex = _getCellIndex(table, row, cell); + for (var i = 1, len = cell.rowSpan; i < len; i++) { + var newRow = table.rows[rowIndex + i], + newCell = newRow.insertCell(cellIndex); + if (cell.colSpan > 1) { + newCell.colSpan = cell.colSpan; + } + newCell.innerHTML = K.IE ? '' : '
      '; + // 调整下一行的单元格index + cellIndex = _getCellIndex(table, newRow, newCell); + } + K(cell).removeAttr('rowSpan'); + self.cmd.range.selectNodeContents(cell).collapse(true); + self.cmd.select(); + self.addBookmark(); + }, + colsplit : function() { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + cellIndex = cell.cellIndex; + // 不是可分割单元格 + if (cell.colSpan === 1) { + return; + } + for (var i = 1, len = cell.colSpan; i < len; i++) { + var newCell = row.insertCell(cellIndex + i); + if (cell.rowSpan > 1) { + newCell.rowSpan = cell.rowSpan; + } + newCell.innerHTML = K.IE ? '' : '
      '; + } + K(cell).removeAttr('colSpan'); + self.cmd.range.selectNodeContents(cell).collapse(true); + self.cmd.select(); + self.addBookmark(); + }, + coldelete : function() { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + index = cell.cellIndex; + for (var i = 0, len = table.rows.length; i < len; i++) { + var newRow = table.rows[i], + newCell = newRow.cells[index]; + if (newCell.colSpan > 1) { + newCell.colSpan -= 1; + if (newCell.colSpan === 1) { + K(newCell).removeAttr('colSpan'); + } + } else { + newRow.deleteCell(index); + } + // 跳过不需要删除的行 + if (newCell.rowSpan > 1) { + i += newCell.rowSpan - 1; + } + } + if (row.cells.length === 0) { + self.cmd.range.setStartBefore(table).collapse(true); + self.cmd.select(); + K(table).remove(); + } else { + self.cmd.selection(true); + } + self.addBookmark(); + }, + rowdelete : function() { + var table = self.plugin.getSelectedTable()[0], + row = self.plugin.getSelectedRow()[0], + cell = self.plugin.getSelectedCell()[0], + rowIndex = row.rowIndex; + // 从下到上删除 + for (var i = cell.rowSpan - 1; i >= 0; i--) { + table.deleteRow(rowIndex + i); + } + if (table.rows.length === 0) { + self.cmd.range.setStartBefore(table).collapse(true); + self.cmd.select(); + K(table).remove(); + } else { + self.cmd.selection(true); + } + self.addBookmark(); + } + }; + self.clickToolbar(name, self.plugin.table.prop); +}); diff --git a/member/editor/kindeditor/plugins/template/html/1.html b/member/editor/kindeditor/plugins/template/html/1.html new file mode 100644 index 0000000..034126b --- /dev/null +++ b/member/editor/kindeditor/plugins/template/html/1.html @@ -0,0 +1,14 @@ + + + + + + +

      + 在此处输入标题 +

      +

      + 在此处输入内容 +

      + + \ No newline at end of file diff --git a/member/editor/kindeditor/plugins/template/html/2.html b/member/editor/kindeditor/plugins/template/html/2.html new file mode 100644 index 0000000..dc2584a --- /dev/null +++ b/member/editor/kindeditor/plugins/template/html/2.html @@ -0,0 +1,42 @@ + + + + + + +

      + 标题 +

      + + + + + + + + + + + + + + + +
      +

      标题1

      +
      +

      标题1

      +
      + 内容1 + + 内容2 +
      + 内容3 + + 内容4 +
      +

      + 表格说明 +

      + + \ No newline at end of file diff --git a/member/editor/kindeditor/plugins/template/html/3.html b/member/editor/kindeditor/plugins/template/html/3.html new file mode 100644 index 0000000..873f0c6 --- /dev/null +++ b/member/editor/kindeditor/plugins/template/html/3.html @@ -0,0 +1,36 @@ + + + + + + +

      + 在此处输入内容 +

      +
        +
      1. + 描述1 +
      2. +
      3. + 描述2 +
      4. +
      5. + 描述3 +
      6. +
      +

      + 在此处输入内容 +

      +
        +
      • + 描述1 +
      • +
      • + 描述2 +
      • +
      • + 描述3 +
      • +
      + + \ No newline at end of file diff --git a/member/editor/kindeditor/plugins/template/template.js b/member/editor/kindeditor/plugins/template/template.js new file mode 100644 index 0000000..4029e87 --- /dev/null +++ b/member/editor/kindeditor/plugins/template/template.js @@ -0,0 +1,58 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('template', function(K) { + var self = this, name = 'template', lang = self.lang(name + '.'), + htmlPath = self.pluginsPath + name + '/html/'; + function getFilePath(fileName) { + return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION); + } + self.clickToolbar(name, function() { + var lang = self.lang(name + '.'), + arr = ['
      ', + '
      ', + // left start + '
      ', + lang. selectTemplate + '
      ', + // right start + '
      ', + ' ', + '
      ', + '
      ', + '
      ', + '', + '
      '].join(''); + var dialog = self.createDialog({ + name : name, + width : 500, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var doc = K.iframeDoc(iframe); + self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus(); + } + } + }); + var selectBox = K('select', dialog.div), + checkbox = K('[name="replaceFlag"]', dialog.div), + iframe = K('iframe', dialog.div); + checkbox[0].checked = true; + iframe.attr('src', getFilePath(selectBox.val())); + selectBox.change(function() { + iframe.attr('src', getFilePath(this.value)); + }); + }); +}); diff --git a/member/editor/kindeditor/plugins/wordpaste/wordpaste.js b/member/editor/kindeditor/plugins/wordpaste/wordpaste.js new file mode 100644 index 0000000..22061e1 --- /dev/null +++ b/member/editor/kindeditor/plugins/wordpaste/wordpaste.js @@ -0,0 +1,51 @@ +/******************************************************************************* +* KindEditor - WYSIWYG HTML Editor for Internet +* Copyright (C) 2006-2011 kindsoft.net +* +* @author Roddy +* @site http://www.kindsoft.net/ +* @licence http://www.kindsoft.net/license.php +*******************************************************************************/ + +KindEditor.plugin('wordpaste', function(K) { + var self = this, name = 'wordpaste'; + self.clickToolbar(name, function() { + var lang = self.lang(name + '.'), + html = '
      ' + + '
      ' + lang.comment + '
      ' + + '' + + '
      ', + dialog = self.createDialog({ + name : name, + width : 450, + title : self.lang(name), + body : html, + yesBtn : { + name : self.lang('yes'), + click : function(e) { + var str = doc.body.innerHTML; + str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags); + self.insertHtml(str).hideDialog().focus(); + } + } + }), + div = dialog.div, + iframe = K('iframe', div), + doc = K.iframeDoc(iframe); + if (!K.IE) { + doc.designMode = 'on'; + } + doc.open(); + doc.write('WordPaste'); + doc.write(''); + if (!K.IE) { + doc.write('
      '); + } + doc.write(''); + doc.close(); + if (K.IE) { + doc.body.contentEditable = 'true'; + } + iframe[0].contentWindow.focus(); + }); +}); diff --git a/member/editor/kindeditor/themes/common/anchor.gif b/member/editor/kindeditor/themes/common/anchor.gif new file mode 100644 index 0000000..61145ea Binary files /dev/null and b/member/editor/kindeditor/themes/common/anchor.gif differ diff --git a/member/editor/kindeditor/themes/common/blank.gif b/member/editor/kindeditor/themes/common/blank.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/member/editor/kindeditor/themes/common/blank.gif differ diff --git a/member/editor/kindeditor/themes/common/flash.gif b/member/editor/kindeditor/themes/common/flash.gif new file mode 100644 index 0000000..2cb12b2 Binary files /dev/null and b/member/editor/kindeditor/themes/common/flash.gif differ diff --git a/member/editor/kindeditor/themes/common/loading.gif b/member/editor/kindeditor/themes/common/loading.gif new file mode 100644 index 0000000..c69e937 Binary files /dev/null and b/member/editor/kindeditor/themes/common/loading.gif differ diff --git a/member/editor/kindeditor/themes/common/media.gif b/member/editor/kindeditor/themes/common/media.gif new file mode 100644 index 0000000..e1c0e30 Binary files /dev/null and b/member/editor/kindeditor/themes/common/media.gif differ diff --git a/member/editor/kindeditor/themes/common/rm.gif b/member/editor/kindeditor/themes/common/rm.gif new file mode 100644 index 0000000..d013d55 Binary files /dev/null and b/member/editor/kindeditor/themes/common/rm.gif differ diff --git a/member/editor/kindeditor/themes/default/background.png b/member/editor/kindeditor/themes/default/background.png new file mode 100644 index 0000000..bbfb056 Binary files /dev/null and b/member/editor/kindeditor/themes/default/background.png differ diff --git a/member/editor/kindeditor/themes/default/default.css b/member/editor/kindeditor/themes/default/default.css new file mode 100644 index 0000000..5b31e59 --- /dev/null +++ b/member/editor/kindeditor/themes/default/default.css @@ -0,0 +1,1148 @@ +/* common */ +.ke-inline-block { + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} +.ke-clearfix { + zoom: 1; +} +.ke-clearfix:after { + content: "."; + display: block; + clear: both; + font-size: 0; + height: 0; + line-height: 0; + visibility: hidden; +} +.ke-shadow { + box-shadow: 1px 1px 3px #A0A0A0; + -moz-box-shadow: 1px 1px 3px #A0A0A0; + -webkit-box-shadow: 1px 1px 3px #A0A0A0; + filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3); + background-color: #F0F0EE; +} +.ke-menu a, +.ke-menu a:hover, +.ke-dialog a, +.ke-dialog a:hover { + color: #337FE5; + text-decoration: none; +} +/* icons */ +.ke-icon-source { + background-position: 0px 0px; + width: 16px; + height: 16px; +} +.ke-icon-preview { + background-position: 0px -16px; + width: 16px; + height: 16px; +} +.ke-icon-print { + background-position: 0px -32px; + width: 16px; + height: 16px; +} +.ke-icon-undo { + background-position: 0px -48px; + width: 16px; + height: 16px; +} +.ke-icon-redo { + background-position: 0px -64px; + width: 16px; + height: 16px; +} +.ke-icon-cut { + background-position: 0px -80px; + width: 16px; + height: 16px; +} +.ke-icon-copy { + background-position: 0px -96px; + width: 16px; + height: 16px; +} +.ke-icon-paste { + background-position: 0px -112px; + width: 16px; + height: 16px; +} +.ke-icon-selectall { + background-position: 0px -128px; + width: 16px; + height: 16px; +} +.ke-icon-justifyleft { + background-position: 0px -144px; + width: 16px; + height: 16px; +} +.ke-icon-justifycenter { + background-position: 0px -160px; + width: 16px; + height: 16px; +} +.ke-icon-justifyright { + background-position: 0px -176px; + width: 16px; + height: 16px; +} +.ke-icon-justifyfull { + background-position: 0px -192px; + width: 16px; + height: 16px; +} +.ke-icon-insertorderedlist { + background-position: 0px -208px; + width: 16px; + height: 16px; +} +.ke-icon-insertunorderedlist { + background-position: 0px -224px; + width: 16px; + height: 16px; +} +.ke-icon-indent { + background-position: 0px -240px; + width: 16px; + height: 16px; +} +.ke-icon-outdent { + background-position: 0px -256px; + width: 16px; + height: 16px; +} +.ke-icon-subscript { + background-position: 0px -272px; + width: 16px; + height: 16px; +} +.ke-icon-superscript { + background-position: 0px -288px; + width: 16px; + height: 16px; +} +.ke-icon-date { + background-position: 0px -304px; + width: 25px; + height: 16px; +} +.ke-icon-time { + background-position: 0px -320px; + width: 25px; + height: 16px; +} +.ke-icon-formatblock { + background-position: 0px -336px; + width: 25px; + height: 16px; +} +.ke-icon-fontname { + background-position: 0px -352px; + width: 21px; + height: 16px; +} +.ke-icon-fontsize { + background-position: 0px -368px; + width: 23px; + height: 16px; +} +.ke-icon-forecolor { + background-position: 0px -384px; + width: 20px; + height: 16px; +} +.ke-icon-hilitecolor { + background-position: 0px -400px; + width: 23px; + height: 16px; +} +.ke-icon-bold { + background-position: 0px -416px; + width: 16px; + height: 16px; +} +.ke-icon-italic { + background-position: 0px -432px; + width: 16px; + height: 16px; +} +.ke-icon-underline { + background-position: 0px -448px; + width: 16px; + height: 16px; +} +.ke-icon-strikethrough { + background-position: 0px -464px; + width: 16px; + height: 16px; +} +.ke-icon-removeformat { + background-position: 0px -480px; + width: 16px; + height: 16px; +} +.ke-icon-image { + background-position: 0px -496px; + width: 16px; + height: 16px; +} +.ke-icon-flash { + background-position: 0px -512px; + width: 16px; + height: 16px; +} +.ke-icon-media { + background-position: 0px -528px; + width: 16px; + height: 16px; +} +.ke-icon-div { + background-position: 0px -544px; + width: 16px; + height: 16px; +} +.ke-icon-formula { + background-position: 0px -576px; + width: 16px; + height: 16px; +} +.ke-icon-hr { + background-position: 0px -592px; + width: 16px; + height: 16px; +} +.ke-icon-emoticons { + background-position: 0px -608px; + width: 16px; + height: 16px; +} +.ke-icon-link { + background-position: 0px -624px; + width: 16px; + height: 16px; +} +.ke-icon-unlink { + background-position: 0px -640px; + width: 16px; + height: 16px; +} +.ke-icon-fullscreen { + background-position: 0px -656px; + width: 16px; + height: 16px; +} +.ke-icon-about { + background-position: 0px -672px; + width: 16px; + height: 16px; +} +.ke-icon-plainpaste { + background-position: 0px -704px; + width: 16px; + height: 16px; +} +.ke-icon-wordpaste { + background-position: 0px -720px; + width: 16px; + height: 16px; +} +.ke-icon-table { + background-position: 0px -784px; + width: 16px; + height: 16px; +} +.ke-icon-tablemenu { + background-position: 0px -768px; + width: 16px; + height: 16px; +} +.ke-icon-tableinsert { + background-position: 0px -784px; + width: 16px; + height: 16px; +} +.ke-icon-tabledelete { + background-position: 0px -800px; + width: 16px; + height: 16px; +} +.ke-icon-tablecolinsertleft { + background-position: 0px -816px; + width: 16px; + height: 16px; +} +.ke-icon-tablecolinsertright { + background-position: 0px -832px; + width: 16px; + height: 16px; +} +.ke-icon-tablerowinsertabove { + background-position: 0px -848px; + width: 16px; + height: 16px; +} +.ke-icon-tablerowinsertbelow { + background-position: 0px -864px; + width: 16px; + height: 16px; +} +.ke-icon-tablecoldelete { + background-position: 0px -880px; + width: 16px; + height: 16px; +} +.ke-icon-tablerowdelete { + background-position: 0px -896px; + width: 16px; + height: 16px; +} +.ke-icon-tablecellprop { + background-position: 0px -912px; + width: 16px; + height: 16px; +} +.ke-icon-tableprop { + background-position: 0px -928px; + width: 16px; + height: 16px; +} +.ke-icon-checked { + background-position: 0px -944px; + width: 16px; + height: 16px; +} +.ke-icon-code { + background-position: 0px -960px; + width: 16px; + height: 16px; +} +.ke-icon-map { + background-position: 0px -976px; + width: 16px; + height: 16px; +} +.ke-icon-baidumap { + background-position: 0px -976px; + width: 16px; + height: 16px; +} +.ke-icon-lineheight { + background-position: 0px -992px; + width: 16px; + height: 16px; +} +.ke-icon-clearhtml { + background-position: 0px -1008px; + width: 16px; + height: 16px; +} +.ke-icon-pagebreak { + background-position: 0px -1024px; + width: 16px; + height: 16px; +} +.ke-icon-insertfile { + background-position: 0px -1040px; + width: 16px; + height: 16px; +} +.ke-icon-quickformat { + background-position: 0px -1056px; + width: 16px; + height: 16px; +} +.ke-icon-template { + background-position: 0px -1072px; + width: 16px; + height: 16px; +} +.ke-icon-tablecellsplit { + background-position: 0px -1088px; + width: 16px; + height: 16px; +} +.ke-icon-tablerowmerge { + background-position: 0px -1104px; + width: 16px; + height: 16px; +} +.ke-icon-tablerowsplit { + background-position: 0px -1120px; + width: 16px; + height: 16px; +} +.ke-icon-tablecolmerge { + background-position: 0px -1136px; + width: 16px; + height: 16px; +} +.ke-icon-tablecolsplit { + background-position: 0px -1152px; + width: 16px; + height: 16px; +} +.ke-icon-anchor { + background-position: 0px -1168px; + width: 16px; + height: 16px; +} +.ke-icon-search { + background-position: 0px -1184px; + width: 16px; + height: 16px; +} +.ke-icon-new { + background-position: 0px -1200px; + width: 16px; + height: 16px; +} +.ke-icon-specialchar { + background-position: 0px -1216px; + width: 16px; + height: 16px; +} +.ke-icon-multiimage { + background-position: 0px -1232px; + width: 16px; + height: 16px; +} +/* container */ +.ke-container { + display: block; + border: 1px solid #CCCCCC; + background-color: #FFF; + overflow: hidden; + margin: 0; + padding: 0; +} +/* toolbar */ +.ke-toolbar { + border-bottom: 1px solid #CCC; + background-color: #F0F0EE; + padding: 2px 5px; + text-align: left; + overflow: hidden; + zoom: 1; +} +.ke-toolbar-icon { + background-repeat: no-repeat; + font-size: 0; + line-height: 0; + overflow: hidden; + display: block; +} +.ke-toolbar-icon-url { + background-image: url(default.png); +} +.ke-toolbar .ke-outline { + border: 1px solid #F0F0EE; + margin: 1px; + padding: 1px 2px; + font-size: 0; + line-height: 0; + overflow: hidden; + cursor: pointer; + display: block; + float: left; +} +.ke-toolbar .ke-on { + border: 1px solid #5690D2; +} +.ke-toolbar .ke-selected { + border: 1px solid #5690D2; + background-color: #E9EFF6; +} +.ke-toolbar .ke-disabled { + cursor: default; +} +.ke-toolbar .ke-separator { + height: 16px; + margin: 2px 3px; + border-left: 1px solid #A0A0A0; + border-right: 1px solid #FFFFFF; + border-top:0; + border-bottom:0; + width: 0; + font-size: 0; + line-height: 0; + overflow: hidden; + display: block; + float: left; +} +.ke-toolbar .ke-hr { + overflow: hidden; + height: 1px; + clear: both; +} +/* edit */ +.ke-edit { + padding: 0; +} +.ke-edit-iframe, +.ke-edit-textarea { + border: 0; + margin: 0; + padding: 0; + overflow: auto; +} +.ke-edit-textarea { + font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; + color: #000; + overflow: auto; + resize: none; +} +.ke-edit-textarea:focus { + outline: none; +} +/* statusbar */ +.ke-statusbar { + position: relative; + background-color: #F0F0EE; + border-top: 1px solid #CCCCCC; + font-size: 0; + line-height: 0; + *height: 12px; + overflow: hidden; + text-align: center; + cursor: s-resize; +} +.ke-statusbar-center-icon { + background-position: -0px -754px; + width: 15px; + height: 11px; + background-image: url(default.png); +} +.ke-statusbar-right-icon { + position: absolute; + right: 0; + bottom: 0; + cursor: se-resize; + background-position: -5px -741px; + width: 11px; + height: 11px; + background-image: url(default.png); +} +/* menu */ +.ke-menu { + border: 1px solid #A0A0A0; + background-color: #F1F1F1; + color: #222222; + padding: 2px; + font-family: "sans serif",tahoma,verdana,helvetica; + font-size: 12px; + text-align: left; + overflow: hidden; +} +.ke-menu-item { + border: 1px solid #F1F1F1; + background-color: #F1F1F1; + color: #222222; + height: 24px; + overflow: hidden; + cursor: pointer; +} +.ke-menu-item-on { + border: 1px solid #5690D2; + background-color: #E9EFF6; +} +.ke-menu-item-left { + width: 27px; + text-align: center; + overflow: hidden; +} +.ke-menu-item-center { + width: 0; + height: 24px; + border-left: 1px solid #E3E3E3; + border-right: 1px solid #FFFFFF; + border-top: 0; + border-bottom: 0; +} +.ke-menu-item-center-on { + border-left: 1px solid #E9EFF6; + border-right: 1px solid #E9EFF6; +} +.ke-menu-item-right { + border: 0; + padding: 0 0 0 5px; + line-height: 24px; + text-align: left; + overflow: hidden; +} +.ke-menu-separator { + margin: 2px 0; + height: 0; + overflow: hidden; + border-top: 1px solid #CCCCCC; + border-bottom: 1px solid #FFFFFF; + border-left: 0; + border-right: 0; +} +/* colorpicker */ +.ke-colorpicker { + border: 1px solid #A0A0A0; + background-color: #F1F1F1; + color: #222222; + padding: 2px; +} +.ke-colorpicker-table { + border:0; + margin:0; + padding:0; + border-collapse: separate; +} +.ke-colorpicker-cell { + font-size: 0; + line-height: 0; + border: 1px solid #F0F0EE; + cursor: pointer; + margin:3px; + padding:0; +} +.ke-colorpicker-cell-top { + font-family: "sans serif",tahoma,verdana,helvetica; + font-size: 12px; + line-height: 24px; + border: 1px solid #F0F0EE; + cursor: pointer; + margin:0; + padding:0; + text-align: center; +} +.ke-colorpicker-cell-on { + border: 1px solid #5690D2; +} +.ke-colorpicker-cell-selected { + border: 1px solid #2446AB; +} +.ke-colorpicker-cell-color { + width: 14px; + height: 14px; + margin: 3px; + padding: 0; + border: 0; +} +/* dialog */ +.ke-dialog { + position: absolute; + margin: 0; + padding: 0; +} +.ke-dialog .ke-header { + width: 100%; + margin-bottom: 10px; +} +.ke-dialog .ke-header .ke-left { + float: left; +} +.ke-dialog .ke-header .ke-right { + float: right; +} +.ke-dialog .ke-header label { + margin-right: 0; + cursor: pointer; + font-weight: normal; + display: inline; + vertical-align: top; +} +.ke-dialog-content { + background-color: #FFF; + width: 100%; + height: 100%; + color: #333; + border: 1px solid #A0A0A0; +} +.ke-dialog-shadow { + position: absolute; + z-index: -1; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 3px 3px 7px #999; + -moz-box-shadow: 3px 3px 7px #999; + -webkit-box-shadow: 3px 3px 7px #999; + filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='3', MakeShadow='true', ShadowOpacity='0.4'); + background-color: #F0F0EE; +} +.ke-dialog-header { + border:0; + margin:0; + padding: 0 10px; + background: url(background.png) repeat scroll 0 0 #F0F0EE; + border-bottom: 1px solid #CFCFCF; + height: 24px; + font: 12px/24px "sans serif",tahoma,verdana,helvetica; + text-align: left; + color: #222; + cursor: move; +} +.ke-dialog-icon-close { + display: block; + background: url(default.png) no-repeat scroll 0px -688px; + width: 16px; + height: 16px; + position: absolute; + right: 6px; + top: 6px; + cursor: pointer; +} +.ke-dialog-body { + font: 12px/1.5 "sans serif",tahoma,verdana,helvetica; + text-align: left; + overflow: hidden; + width: 100%; +} +.ke-dialog-body textarea { + display: block; + overflow: auto; + padding: 0; + resize: none; +} +.ke-dialog-body textarea:focus, +.ke-dialog-body input:focus, +.ke-dialog-body select:focus { + outline: none; +} +.ke-dialog-body label { + margin-right: 10px; + cursor: pointer; + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} +.ke-dialog-body img { + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} +.ke-dialog-body select { + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; + width: auto; +} +.ke-dialog-body .ke-textarea { + display: block; + width: 408px; + height: 260px; + font-family: "sans serif",tahoma,verdana,helvetica; + font-size: 12px; + border-color: #848484 #E0E0E0 #E0E0E0 #848484; + border-style: solid; + border-width: 1px; +} +.ke-dialog-body .ke-form { + margin: 0; + padding: 0; +} +.ke-dialog-loading { + position: absolute; + top: 0; + left: 1px; + z-index: 1; + text-align: center; +} +.ke-dialog-loading-content { + background: url("../common/loading.gif") no-repeat; + color: #666; + font-size: 14px; + font-weight: bold; + height: 31px; + line-height: 31px; + padding-left: 36px; +} +.ke-dialog-row { + margin-bottom: 10px; +} +.ke-dialog-footer { + font: 12px/1 "sans serif",tahoma,verdana,helvetica; + text-align: right; + padding:0 0 5px 0; + background-color: #FFF; + width: 100%; +} +.ke-dialog-preview, +.ke-dialog-yes { + margin: 5px; +} +.ke-dialog-no { + margin: 5px 10px 5px 5px; +} +.ke-dialog-mask { + background-color:#FFF; + filter:alpha(opacity=50); + opacity:0.5; +} +.ke-button-common { + background: url(background.png) no-repeat scroll 0 -25px transparent; + cursor: pointer; + height: 23px; + line-height: 23px; + overflow: visible; + display: inline-block; + vertical-align: top; + cursor: pointer; +} +.ke-button-outer { + background-position: 0 -25px; + padding: 0; + position: relative; + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} +.ke-button { + background-position: right -25px; + padding: 0 12px; + margin: 0; + font-family: "sans serif",tahoma,verdana,helvetica; + border: 0 none; + color: #333; + font-size: 12px; + left: 2px; + text-decoration: none; +} +/* inputbox */ +.ke-input-text { + background-color:#FFFFFF; + font-family: "sans serif",tahoma,verdana,helvetica; + font-size: 12px; + line-height: 17px; + height: 17px; + padding: 2px 4px; + border-color: #848484 #E0E0E0 #E0E0E0 #848484; + border-style: solid; + border-width: 1px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} +.ke-input-number { + width: 50px; +} +.ke-input-color { + border: 1px solid #A0A0A0; + background-color: #FFFFFF; + font-size: 12px; + width: 60px; + height: 20px; + line-height: 20px; + padding-left: 5px; + overflow: hidden; + cursor: pointer; + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; +} +.ke-upload-button { + position: relative; +} +.ke-upload-area { + position: relative; + overflow: hidden; + margin: 0; + padding: 0; + *height: 25px; +} +.ke-upload-area .ke-upload-file { + position: absolute; + font-size: 60px; + top: 0; + right: 0; + padding: 0; + margin: 0; + z-index: 811212; + border: 0 none; + opacity: 0; + filter: alpha(opacity=0); +} +/* tabs */ +.ke-tabs { + font: 12px/1 "sans serif",tahoma,verdana,helvetica; + border-bottom:1px solid #A0A0A0; + padding-left:5px; + margin-bottom:20px; +} +.ke-tabs-ul { + list-style-image:none; + list-style-position:outside; + list-style-type:none; + margin:0; + padding:0; +} +.ke-tabs-li { + position: relative; + border: 1px solid #A0A0A0; + background-color: #F0F0EE; + margin: 0 2px -1px 0; + padding: 0 20px; + float: left; + line-height: 25px; + text-align: center; + color: #555555; + cursor: pointer; +} +.ke-tabs-li-selected { + background-color: #FFF; + border-bottom: 1px solid #FFF; + color: #000; + cursor: default; +} +.ke-tabs-li-on { + background-color: #FFF; + color: #000; +} +/* progressbar */ +.ke-progressbar { + position: relative; + margin: 0; + padding: 0; +} +.ke-progressbar-bar { + border: 1px solid #6FA5DB; + width: 80px; + height: 5px; + margin: 10px 10px 0 10px; + padding: 0; +} +.ke-progressbar-bar-inner { + width: 0; + height: 5px; + background-color: #6FA5DB; + overflow: hidden; + margin: 0; + padding: 0; +} +.ke-progressbar-percent { + position: absolute; + top: 0; + left: 40%; + display: none; +} +/* swfupload */ +.ke-swfupload-top { + position: relative; + margin-bottom: 10px; + _width: 608px; +} +.ke-swfupload-button { + height: 23px; + line-height: 23px; +} +.ke-swfupload-desc { + padding: 0 10px; + height: 23px; + line-height: 23px; +} +.ke-swfupload-startupload { + position: absolute; + top: 0; + right: 0; +} +.ke-swfupload-body { + overflow: scroll; + background-color:#FFFFFF; + border-color: #848484 #E0E0E0 #E0E0E0 #848484; + border-style: solid; + border-width: 1px; + width: auto; + height: 370px; + padding: 5px; +} +.ke-swfupload-body .ke-item { + width: 100px; + margin: 5px; +} +.ke-swfupload-body .ke-photo { + position: relative; + border: 1px solid #DDDDDD; + background-color:#FFFFFF; + padding: 10px; +} +.ke-swfupload-body .ke-delete { + display: block; + background: url(default.png) no-repeat scroll 0px -688px; + width: 16px; + height: 16px; + position: absolute; + right: 0; + top: 0; + cursor: pointer; +} +.ke-swfupload-body .ke-status { + position: absolute; + left: 0; + bottom: 5px; + width: 100px; + height: 17px; +} +.ke-swfupload-body .ke-message { + width: 100px; + text-align: center; + overflow: hidden; + height:17px; +} +.ke-swfupload-body .ke-error { + color: red; +} +.ke-swfupload-body .ke-name { + width: 100px; + text-align: center; + overflow: hidden; + height:16px; +} +.ke-swfupload-body .ke-on { + border: 1px solid #5690D2; + background-color: #E9EFF6; +} + +/* emoticons */ +.ke-plugin-emoticons { + position: relative; +} +.ke-plugin-emoticons .ke-preview { + position: absolute; + text-align: center; + margin: 2px; + padding: 10px; + top: 0; + border: 1px solid #A0A0A0; + background-color: #FFFFFF; + display: none; +} +.ke-plugin-emoticons .ke-preview-img { + border:0; + margin:0; + padding:0; +} +.ke-plugin-emoticons .ke-table { + border:0; + margin:0; + padding:0; + border-collapse:separate; +} +.ke-plugin-emoticons .ke-cell { + margin:0; + padding:1px; + border:1px solid #F0F0EE; + cursor:pointer; +} +.ke-plugin-emoticons .ke-on { + border: 1px solid #5690D2; + background-color: #E9EFF6; +} +.ke-plugin-emoticons .ke-img { + display:block; + background-repeat:no-repeat; + overflow:hidden; + margin:2px; + width:24px; + height:24px; + margin: 0; + padding: 0; + border: 0; +} +.ke-plugin-emoticons .ke-page { + text-align: right; + margin: 5px; + padding: 0; + border: 0; + font: 12px/1 "sans serif",tahoma,verdana,helvetica; + color: #333; + text-decoration: none; +} +.ke-plugin-plainpaste-textarea, +.ke-plugin-wordpaste-iframe { + display: block; + width: 408px; + height: 260px; + font-family: "sans serif",tahoma,verdana,helvetica; + font-size: 12px; + border-color: #848484 #E0E0E0 #E0E0E0 #848484; + border-style: solid; + border-width: 1px; +} +/* filemanager */ +.ke-plugin-filemanager-header { + width: 100%; + margin-bottom: 10px; +} +.ke-plugin-filemanager-header .ke-left { + float: left; +} +.ke-plugin-filemanager-header .ke-right { + float: right; +} +.ke-plugin-filemanager-body { + overflow: scroll; + background-color:#FFFFFF; + border-color: #848484 #E0E0E0 #E0E0E0 #848484; + border-style: solid; + border-width: 1px; + width: auto; + height: 370px; + padding: 5px; +} +.ke-plugin-filemanager-body .ke-item { + width: 100px; + margin: 5px; +} +.ke-plugin-filemanager-body .ke-photo { + border: 1px solid #DDDDDD; + background-color:#FFFFFF; + padding: 10px; +} +.ke-plugin-filemanager-body .ke-name { + width: 100px; + text-align: center; + overflow: hidden; + height:16px; +} +.ke-plugin-filemanager-body .ke-on { + border: 1px solid #5690D2; + background-color: #E9EFF6; +} +.ke-plugin-filemanager-body .ke-table { + width: 95%; + border: 0; + margin: 0; + padding: 0; + border-collapse: separate; +} +.ke-plugin-filemanager-body .ke-table .ke-cell { + margin: 0; + padding: 0; + border: 0; +} +.ke-plugin-filemanager-body .ke-table .ke-name { + width: 55%; + text-align: left; +} +.ke-plugin-filemanager-body .ke-table .ke-size { + width: 15%; + text-align: left; +} +.ke-plugin-filemanager-body .ke-table .ke-datetime { + width: 30%; + text-align: center; +} \ No newline at end of file diff --git a/member/editor/kindeditor/themes/default/default.png b/member/editor/kindeditor/themes/default/default.png new file mode 100644 index 0000000..cc9e72d Binary files /dev/null and b/member/editor/kindeditor/themes/default/default.png differ diff --git a/member/editor/these.name.php b/member/editor/these.name.php new file mode 100644 index 0000000..7f34570 --- /dev/null +++ b/member/editor/these.name.php @@ -0,0 +1,8 @@ + 'FCKeditor', + 'kindeditor' => 'Kindeditor', + 'ueditor' => 'UEditor', + 'umeditor' => 'UMEditor', +); +?> \ No newline at end of file diff --git a/member/editor/ueditor/change.log b/member/editor/ueditor/change.log new file mode 100644 index 0000000..111400b --- /dev/null +++ b/member/editor/ueditor/change.log @@ -0,0 +1,10 @@ +޸ƵԶ +ueditor.all.min.js + +޸ƵԤ +dialogs/video/player.js +dialogs/video/video.js + +޸ܱ +dialogs/attachment/attachment.html +dialogs/attachment/attachment.js \ No newline at end of file diff --git a/member/editor/ueditor/config.json b/member/editor/ueditor/config.json new file mode 100644 index 0000000..dd5bc17 --- /dev/null +++ b/member/editor/ueditor/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "/ueditor/php/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "/ueditor/php/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/ueditor/php/upload/image/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/php/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/anchor/anchor.html b/member/editor/ueditor/dialogs/anchor/anchor.html new file mode 100644 index 0000000..f277847 --- /dev/null +++ b/member/editor/ueditor/dialogs/anchor/anchor.html @@ -0,0 +1,40 @@ + + + + + + + + +
      + +
      + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/attachment/attachment.css b/member/editor/ueditor/dialogs/attachment/attachment.css new file mode 100644 index 0000000..548b428 --- /dev/null +++ b/member/editor/ueditor/dialogs/attachment/attachment.css @@ -0,0 +1,681 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 上传附件 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#online #fileList{ + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; +} +#online li div.file-wrapper { + cursor: pointer; + position: absolute; + display: block; + width: 111px; + height: 111px; + border: 1px solid #eee; + background: url("./images/bg.png") repeat; +} +#online li div span.file-title{ + display: block; + padding: 0 3px; + margin: 3px 0 0 0; + font-size: 12px; + height: 13px; + color: #555555; + text-align: center; + width: 107px; + white-space: nowrap; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; +} +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif) \9; + background-position: 75px 75px; +} +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + + +/* 在线文件的文件预览图标 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} +i.file-preview.file-type-dir{ + background-position: 0 center; +} +i.file-preview.file-type-file{ + background-position: -140px center; +} +i.file-preview.file-type-filelist{ + background-position: -210px center; +} +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2{ + background-position: -280px center; +} +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx{ + background-position: -350px center; +} +i.file-preview.file-type-doc, +i.file-preview.file-type-docx{ + background-position: -420px center; +} +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx{ + background-position: -490px center; +} +i.file-preview.file-type-vsd{ + background-position: -560px center; +} +i.file-preview.file-type-pdf{ + background-position: -630px center; +} +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp{ + background-position: -700px center; +} +i.file-preview.file-type-apk{ + background-position: -770px center; +} +i.file-preview.file-type-exe{ + background-position: -840px center; +} +i.file-preview.file-type-ipa{ + background-position: -910px center; +} +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb{ + background-position: -980px center; +} +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3{ + background-position: -1050px center; +} +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd{ + background-position: -140px center; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/attachment/attachment.html b/member/editor/ueditor/dialogs/attachment/attachment.html new file mode 100644 index 0000000..625df4a --- /dev/null +++ b/member/editor/ueditor/dialogs/attachment/attachment.html @@ -0,0 +1,61 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + + +
      +
      + + +
      +
      + +
      +
      +
      +
      + 0% + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
        +
      • +
      +
      +
      + + +
      +
      +
      + +
      +
      + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/attachment/attachment.js b/member/editor/ueditor/dialogs/attachment/attachment.js new file mode 100644 index 0000000..f634ed1 --- /dev/null +++ b/member/editor/ueditor/dialogs/attachment/attachment.js @@ -0,0 +1,758 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var uploadFile, + onlineFile; + + window.onload = function () { + initTabs(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + setTabFocus('upload'); + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id') + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'upload': + uploadFile = uploadFile || new UploadFile('queueList'); + break; + case 'online': + onlineFile = onlineFile || new OnlineFile('fileList'); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'upload': + list = uploadFile.getInsertList(); + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineFile.getInsertList(); + break; + } + + editor.execCommand('insertfile', list); + }; + } + + + /* 上传附件 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')), + fileMaxSize = editor.getOpt('fileMaxSize'), + acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
      ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('fileActionName')) { + $('#filePickerReady').after($('
      ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('fileFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
    • ' + + '

      ' + file.name + '

      ' + + '

      ' + + '

      ' + + '
    • '), + + $btns = $('
      ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
      ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

      ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.fileList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + getInsertList: function () { + var i, link, data, list = [], + prefix = editor.getOpt('fileUrlPrefix'); + //DT 2022/7/8 + $('.filelist li').each(function(i) { + if($(this).attr('class') == 'state-complete' && $(this).html().indexOf('class="success" alt="') != -1) { + var fid = $(this).attr('id'); + var nm = $('#'+fid+' .title').html(); + list.push({ + title: nm, + target: '_blank', + url: DTPath+'api/attach.php?url='+$('#'+fid+' .success').attr('alt')+'&name='+encodeURIComponent(nm) + }); + } + }); + return list; + } + }; + + + /* 在线附件 */ + function OnlineFile(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineFile.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + this.initData(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('fileList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getFileData(); + } + }); + /* 选中图片 */ + domUtils.on(this.list, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('fileManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getFileData(); + }, + /* 向后台拉取图片列表数据 */ + getFileData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), { + timeout: 100000, + data: utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + method: 'get', + onsuccess: function (r) { + try { + var json = eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + onerror: function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, filetype, preview, icon, _this = this, + urlPrefix = editor.getOpt('fileManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + icon = document.createElement('span'); + filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1); + + if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) { + preview = document.createElement('img'); + domUtils.on(preview, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + }; + })(preview)); + preview.width = 113; + preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + } else { + var ic = document.createElement('i'), + textSpan = document.createElement('span'); + textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); + preview = document.createElement('div'); + preview.appendChild(ic); + preview.appendChild(textSpan); + domUtils.addClass(preview, 'file-wrapper'); + domUtils.addClass(textSpan, 'file-title'); + domUtils.addClass(ic, 'file-type-' + filetype); + domUtils.addClass(ic, 'file-preview'); + } + domUtils.addClass(icon, 'icon'); + item.setAttribute('data-url', urlPrefix + list[i].url); + if (list[i].original) { + item.setAttribute('data-title', list[i].original); + } + + item.appendChild(preview); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = []; + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var url = lis[i].getAttribute('data-url'); + var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); + list.push({ + title: title, + url: url + }); + } + } + return list; + } + }; + + +})(); \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif new file mode 100644 index 0000000..9ca4fb6 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_default.png b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_default.png new file mode 100644 index 0000000..50ac1cb Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_default.png differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif new file mode 100644 index 0000000..206fede Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif new file mode 100644 index 0000000..2e3b7a2 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif new file mode 100644 index 0000000..5d5dec0 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif new file mode 100644 index 0000000..b351a1f Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif new file mode 100644 index 0000000..26019b0 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif new file mode 100644 index 0000000..bbb65c8 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif new file mode 100644 index 0000000..ccb26fb Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif new file mode 100644 index 0000000..2e8743a Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif new file mode 100644 index 0000000..5359e46 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif new file mode 100644 index 0000000..e7b8dd2 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif new file mode 100644 index 0000000..e86c1c6 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/images/alignicon.gif b/member/editor/ueditor/dialogs/attachment/images/alignicon.gif new file mode 100644 index 0000000..005a5ac Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/alignicon.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/images/alignicon.png b/member/editor/ueditor/dialogs/attachment/images/alignicon.png new file mode 100644 index 0000000..4b6c444 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/alignicon.png differ diff --git a/member/editor/ueditor/dialogs/attachment/images/bg.png b/member/editor/ueditor/dialogs/attachment/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/bg.png differ diff --git a/member/editor/ueditor/dialogs/attachment/images/file-icons.gif b/member/editor/ueditor/dialogs/attachment/images/file-icons.gif new file mode 100644 index 0000000..d8c02c2 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/file-icons.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/images/file-icons.png b/member/editor/ueditor/dialogs/attachment/images/file-icons.png new file mode 100644 index 0000000..3ff82c8 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/file-icons.png differ diff --git a/member/editor/ueditor/dialogs/attachment/images/icons.gif b/member/editor/ueditor/dialogs/attachment/images/icons.gif new file mode 100644 index 0000000..78459de Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/icons.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/images/icons.png b/member/editor/ueditor/dialogs/attachment/images/icons.png new file mode 100644 index 0000000..12e4700 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/icons.png differ diff --git a/member/editor/ueditor/dialogs/attachment/images/image.png b/member/editor/ueditor/dialogs/attachment/images/image.png new file mode 100644 index 0000000..19699f6 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/image.png differ diff --git a/member/editor/ueditor/dialogs/attachment/images/progress.png b/member/editor/ueditor/dialogs/attachment/images/progress.png new file mode 100644 index 0000000..717c486 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/progress.png differ diff --git a/member/editor/ueditor/dialogs/attachment/images/success.gif b/member/editor/ueditor/dialogs/attachment/images/success.gif new file mode 100644 index 0000000..8d4f311 Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/success.gif differ diff --git a/member/editor/ueditor/dialogs/attachment/images/success.png b/member/editor/ueditor/dialogs/attachment/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/member/editor/ueditor/dialogs/attachment/images/success.png differ diff --git a/member/editor/ueditor/dialogs/background/background.css b/member/editor/ueditor/dialogs/background/background.css new file mode 100644 index 0000000..5c41fe9 --- /dev/null +++ b/member/editor/ueditor/dialogs/background/background.css @@ -0,0 +1,94 @@ +.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative} +.tabbody{height:225px;} +.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;} +.tabbody .focus { display: block;} + +body{font-size: 12px;color: #888;overflow: hidden;} +input,label{vertical-align:middle} +.clear{clear: both;} +.pl{padding-left: 18px;padding-left: 23px\9;} + +#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;} +#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;} +#imageList img {cursor: pointer;border: 2px solid white;} + +.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;} +.content div{margin: 10px 0 10px 5px;} +.content .iptradio{margin: 0px 5px 5px 0px;} +.txt{width:280px;} + +.wrapcolor{height: 19px;} +div.color{float: left;margin: 0;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;} +div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;} +#custom input{height: 15px;min-height: 15px;width:20px;} +#repeatType{width:100px;} + + +/* 图片管理样式 */ +#imgManager { + width: 100%; + height: 225px; +} +#imgManager #imageList{ + width: 100%; + overflow-x: hidden; + overflow-y: auto; +} +#imgManager ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#imgManager li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 9px 0 0 19px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#imgManager li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#imgManager li img { + cursor: pointer; +} +#imgManager li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#imgManager li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#imgManager li.selected .icon { + background-image: url(images/success.png); + background-position: 75px 75px; +} +#imgManager li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/background/background.html b/member/editor/ueditor/dialogs/background/background.html new file mode 100644 index 0000000..3cc2ac1 --- /dev/null +++ b/member/editor/ueditor/dialogs/background/background.html @@ -0,0 +1,56 @@ + + + + + + + + +
      +
      + + +
      +
      +
      +
      + +
      +
      + + +
      +
      +
      + : +
      +
      +
      +
      +
      + +
      +
      + : +
      +
      + :x:px  y:px +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + + diff --git a/member/editor/ueditor/dialogs/background/background.js b/member/editor/ueditor/dialogs/background/background.js new file mode 100644 index 0000000..9a4a131 --- /dev/null +++ b/member/editor/ueditor/dialogs/background/background.js @@ -0,0 +1,376 @@ +(function () { + + var onlineImage, + backupStyle = editor.queryCommandValue('background'); + + window.onload = function () { + initTabs(); + initColorSelector(); + }; + + /* 初始化tab标签 */ + function initTabs(){ + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + for (var j = 0; j < tabs.length; j++) { + if(tabs[j] == target){ + tabs[j].className = "focus"; + var contentId = tabs[j].getAttribute('data-content-id'); + $G(contentId).style.display = "block"; + if(contentId == 'imgManager') { + initImagePanel(); + } + }else { + tabs[j].className = ""; + $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; + } + } + }); + } + } + + /* 初始化颜色设置 */ + function initColorSelector () { + var obj = editor.queryCommandValue('background'); + if (obj) { + var color = obj['background-color'], + repeat = obj['background-repeat'] || 'repeat', + image = obj['background-image'] || '', + position = obj['background-position'] || 'center center', + pos = position.split(' '), + x = parseInt(pos[0]) || 0, + y = parseInt(pos[1]) || 0; + + if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; + + image = image.match(/url[\s]*\(([^\)]*)\)/); + image = image ? image[1]:''; + updateFormState('colored', color, image, repeat, x, y); + } else { + updateFormState(); + } + + var updateHandler = function () { + updateFormState(); + updateBackground(); + } + domUtils.on($G('nocolorRadio'), 'click', updateBackground); + domUtils.on($G('coloredRadio'), 'click', updateHandler); + domUtils.on($G('url'), 'keyup', function(){ + if($G('url').value && $G('alignment').style.display == "none") { + utils.each($G('repeatType').children, function(item){ + item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false); + }); + } + updateHandler(); + }); + domUtils.on($G('repeatType'), 'change', updateHandler); + domUtils.on($G('x'), 'keyup', updateBackground); + domUtils.on($G('y'), 'keyup', updateBackground); + + initColorPicker(); + } + + /* 初始化颜色选择器 */ + function initColorPicker() { + var me = editor, + cp = $G("colorPicker"); + + /* 生成颜色选择器ui对象 */ + var popup = new UE.ui.Popup({ + content: new UE.ui.ColorPicker({ + noColorText: me.getLang("clearColor"), + editor: me, + onpickcolor: function (t, color) { + updateFormState('colored', color); + updateBackground(); + UE.ui.Popup.postHide(); + }, + onpicknocolor: function (t, color) { + updateFormState('colored', 'transparent'); + updateBackground(); + UE.ui.Popup.postHide(); + } + }), + editor: me, + onhide: function () { + } + }); + + /* 设置颜色选择器 */ + domUtils.on(cp, "click", function () { + popup.showAnchor(this); + }); + domUtils.on(document, 'mousedown', function (evt) { + var el = evt.target || evt.srcElement; + UE.ui.Popup.postHide(el); + }); + domUtils.on(window, 'scroll', function () { + UE.ui.Popup.postHide(); + }); + } + + /* 初始化在线图片列表 */ + function initImagePanel() { + onlineImage = onlineImage || new OnlineImage('imageList'); + } + + /* 更新背景色设置面板 */ + function updateFormState (radio, color, url, align, x, y) { + var nocolorRadio = $G('nocolorRadio'), + coloredRadio = $G('coloredRadio'); + + if(radio) { + nocolorRadio.checked = (radio == 'colored' ? false:'checked'); + coloredRadio.checked = (radio == 'colored' ? 'checked':false); + } + if(color) { + domUtils.setStyle($G("colorPicker"), "background-color", color); + } + + if(url && /^\//.test(url)) { + var a = document.createElement('a'); + a.href = url; + browser.ie && (a.href = a.href); + url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash); + } + + if(url || url === '') { + $G('url').value = url; + } + if(align) { + utils.each($G('repeatType').children, function(item){ + item.selected = (align == item.getAttribute('value') ? 'selected':false); + }); + } + if(x || y) { + $G('x').value = parseInt(x) || 0; + $G('y').value = parseInt(y) || 0; + } + + $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none'; + $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none'; + } + + /* 更新背景颜色 */ + function updateBackground () { + if ($G('coloredRadio').checked) { + var color = domUtils.getStyle($G("colorPicker"), "background-color"), + bgimg = $G("url").value, + align = $G("repeatType").value, + backgroundObj = { + "background-repeat": "no-repeat", + "background-position": "center center" + }; + + if (color) backgroundObj["background-color"] = color; + if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; + if (align == 'self') { + backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; + } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { + backgroundObj["background-repeat"] = align; + } + + editor.execCommand('background', backgroundObj); + } else { + editor.execCommand('background', null); + } + } + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.id = 'imageListUl'; + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode, + nodes = $G('imageListUl').childNodes; + + if (li.tagName.toLowerCase() == 'li') { + updateFormState('nocolor', null, ''); + for (var i = 0, node; node = nodes[i++];) { + if (node == li && !domUtils.hasClass(node, 'selected')) { + domUtils.addClass(node, 'selected'); + updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); + } else { + domUtils.removeClasses(node, 'selected'); + } + } + updateBackground(); + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r:eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + floatStyle: align + }); + } + + } + return list; + } + }; + + dialog.onok = function () { + updateBackground(); + editor.fireEvent('saveScene'); + }; + dialog.oncancel = function () { + editor.execCommand('background', backupStyle); + }; + +})(); \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/background/images/bg.png b/member/editor/ueditor/dialogs/background/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/member/editor/ueditor/dialogs/background/images/bg.png differ diff --git a/member/editor/ueditor/dialogs/background/images/success.png b/member/editor/ueditor/dialogs/background/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/member/editor/ueditor/dialogs/background/images/success.png differ diff --git a/member/editor/ueditor/dialogs/charts/chart.config.js b/member/editor/ueditor/dialogs/charts/chart.config.js new file mode 100644 index 0000000..678b00d --- /dev/null +++ b/member/editor/ueditor/dialogs/charts/chart.config.js @@ -0,0 +1,65 @@ +/* + * 图表配置文件 + * */ + + +//不同类型的配置 +var typeConfig = [ + { + chart: { + type: 'line' + }, + plotOptions: { + line: { + dataLabels: { + enabled: false + }, + enableMouseTracking: true + } + } + }, { + chart: { + type: 'line' + }, + plotOptions: { + line: { + dataLabels: { + enabled: true + }, + enableMouseTracking: false + } + } + }, { + chart: { + type: 'area' + } + }, { + chart: { + type: 'bar' + } + }, { + chart: { + type: 'column' + } + }, { + chart: { + plotBackgroundColor: null, + plotBorderWidth: null, + plotShadow: false + }, + plotOptions: { + pie: { + allowPointSelect: true, + cursor: 'pointer', + dataLabels: { + enabled: true, + color: '#000000', + connectorColor: '#000000', + formatter: function() { + return ''+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; + } + } + } + } + } +]; diff --git a/member/editor/ueditor/dialogs/charts/charts.css b/member/editor/ueditor/dialogs/charts/charts.css new file mode 100644 index 0000000..ac3c764 --- /dev/null +++ b/member/editor/ueditor/dialogs/charts/charts.css @@ -0,0 +1,165 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow-x: hidden; +} + +.main { + width: 100%; + overflow: hidden; +} + +.table-view { + height: 100%; + float: left; + margin: 20px; + width: 40%; +} + +.table-view .table-container { + width: 100%; + margin-bottom: 50px; + overflow: scroll; +} + +.table-view th { + padding: 5px 10px; + background-color: #F7F7F7; +} + +.table-view td { + width: 50px; + text-align: center; + padding:0; +} + +.table-container input { + width: 40px; + padding: 5px; + border: none; + outline: none; +} + +.table-view caption { + font-size: 18px; + text-align: left; +} + +.charts-view { + /*margin-left: 49%!important;*/ + width: 50%; + margin-left: 49%; + height: 400px; +} + +.charts-container { + border-left: 1px solid #c3c3c3; +} + +.charts-format fieldset { + padding-left: 20px; + margin-bottom: 50px; +} + +.charts-format legend { + padding-left: 10px; + padding-right: 10px; +} + +.format-item-container { + padding: 20px; +} + +.format-item-container label { + display: block; + margin: 10px 0; +} + +.charts-format .data-item { + border: 1px solid black; + outline: none; + padding: 2px 3px; +} + +/* 图表类型 */ + +.charts-type { + margin-top: 50px; + height: 300px; +} + +.scroll-view { + border: 1px solid #c3c3c3; + border-left: none; + border-right: none; + overflow: hidden; +} + +.scroll-container { + margin: 20px; + width: 100%; + overflow: hidden; +} + +.scroll-bed { + width: 10000px; + _margin-top: 20px; + -webkit-transition: margin-left .5s ease; + -moz-transition: margin-left .5s ease; + transition: margin-left .5s ease; +} + +.view-box { + display: inline-block; + *display: inline; + *zoom: 1; + margin-right: 20px; + border: 2px solid white; + line-height: 0; + overflow: hidden; + cursor: pointer; +} + +.view-box img { + border: 1px solid #cecece; +} + +.view-box.selected { + border-color: #7274A7; +} + +.button-container { + margin-bottom: 20px; + text-align: center; +} + +.button-container a { + display: inline-block; + width: 100px; + height: 25px; + line-height: 25px; + border: 1px solid #c2ccd1; + margin-right: 30px; + text-decoration: none; + color: black; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.button-container a:HOVER { + background: #fcfcfc; +} + +.button-container a:ACTIVE { + border-top-color: #c2ccd1; + box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); +} + +.edui-charts-not-data { + height: 100px; + line-height: 100px; + text-align: center; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/charts/charts.html b/member/editor/ueditor/dialogs/charts/charts.html new file mode 100644 index 0000000..70e2314 --- /dev/null +++ b/member/editor/ueditor/dialogs/charts/charts.html @@ -0,0 +1,89 @@ + + + + chart + + + + + +
      +
      +

      +
      +

      +
      +
      +
      + +
      + + +
      +
      +
      +
      + +
      + + + + +
      +
      +
      + +
      + +

      +
      +
      +
      + +
      + +

      +
      +
      +
      +
      +
      +
      +
      +
      +

      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + + + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/charts/charts.js b/member/editor/ueditor/dialogs/charts/charts.js new file mode 100644 index 0000000..37344fd --- /dev/null +++ b/member/editor/ueditor/dialogs/charts/charts.js @@ -0,0 +1,519 @@ +/* + * 图片转换对话框脚本 + **/ + +var tableData = [], + //编辑器页面table + editorTable = null, + chartsConfig = window.typeConfig, + resizeTimer = null, + //初始默认图表类型 + currentChartType = 0; + +window.onload = function () { + + editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true); + + //未找到表格, 显示错误页面 + if ( !editorTable ) { + document.body.innerHTML = "
      未找到数据
      "; + return; + } + + //初始化图表类型选择 + initChartsTypeView(); + renderTable( editorTable ); + initEvent(); + initUserConfig( editorTable.getAttribute( "data-chart" ) ); + $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" ); + updateViewType( currentChartType ); + + dialog.addListener( "resize", function () { + + if ( resizeTimer != null ) { + window.clearTimeout( resizeTimer ); + } + + resizeTimer = window.setTimeout( function () { + + resizeTimer = null; + + renderCharts(); + + }, 500 ); + + } ); + +}; + +function initChartsTypeView () { + + var contents = []; + + for ( var i = 0, len = chartsConfig.length; i
      ' ); + + } + + $( "#scrollBed" ).html( contents.join( "" ) ); + +} + +//渲染table, 以便用户修改数据 +function renderTable ( table ) { + + var tableHtml = []; + + //构造数据 + for ( var i = 0, row; row = table.rows[ i ]; i++ ) { + + tableData[ i ] = []; + tableHtml[ i ] = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = getCellValue( cell ); + + if ( i > 0 && j > 0 ) { + value = +value; + } + + if ( i === 0 || j === 0 ) { + tableHtml[ i ].push( ''+ value +'' ); + } else { + tableHtml[ i ].push( '' ); + } + + tableData[ i ][ j ] = value; + + } + + tableHtml[ i ] = tableHtml[ i ].join( "" ); + + } + + //draw 表格 + $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
      ' ); + +} + +/* + * 根据表格已有的图表属性初始化当前图表属性 + */ +function initUserConfig ( config ) { + + var parsedConfig = {}; + + if ( !config ) { + return; + } + + config = config.split( ";" ); + + $.each( config, function ( index, item ) { + + item = item.split( ":" ); + parsedConfig[ item[ 0 ] ] = item[ 1 ]; + + } ); + + setUserConfig( parsedConfig ); + +} + +function initEvent () { + + var cacheValue = null, + //图表类型数 + typeViewCount = chartsConfig.length- 1, + $chartsTypeViewBox = $( '#scrollBed .view-box' ); + + $( ".charts-format" ).delegate( ".format-ctrl", "change", function () { + + renderCharts(); + + } ) + + $( ".table-view" ).delegate( ".data-item", "focus", function () { + + cacheValue = this.value; + + } ).delegate( ".data-item", "blur", function () { + + if ( this.value !== cacheValue ) { + renderCharts(); + } + + cacheValue = null; + + } ); + + $( "#buttonContainer" ).delegate( "a", "click", function (e) { + + e.preventDefault(); + + if ( this.getAttribute( "data-title" ) === 'prev' ) { + + if ( currentChartType > 0 ) { + currentChartType--; + updateViewType( currentChartType ); + } + + } else { + + if ( currentChartType < typeViewCount ) { + currentChartType++; + updateViewType( currentChartType ); + } + + } + + } ); + + //图表类型变化 + $( '#scrollBed' ).delegate( ".view-box", "click", function (e) { + + var index = $( this ).attr( "data-chart-type" ); + $chartsTypeViewBox.removeClass( "selected" ); + $( $chartsTypeViewBox[ index ] ).addClass( "selected" ); + + currentChartType = index | 0; + + //饼图, 禁用部分配置 + if ( currentChartType === chartsConfig.length - 1 ) { + + disableNotPieConfig(); + + //启用完整配置 + } else { + + enableNotPieConfig(); + + } + + renderCharts(); + + } ); + +} + +function renderCharts () { + + var data = collectData(); + + $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: data.title, + x: -20 //center + }, + subtitle: { + text: data.subTitle, + x: -20 + }, + xAxis: { + title: { + text: data.xTitle + }, + categories: data.categories + }, + yAxis: { + title: { + text: data.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: data.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: data.series + + } )); + +} + +function updateViewType ( index ) { + + $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' ); + +} + +function collectData () { + + var form = document.forms[ 'data-form' ], + data = null; + + if ( currentChartType !== chartsConfig.length - 1 ) { + + data = getSeriesAndCategories(); + $.extend( data, getUserConfig() ); + + //饼图数据格式 + } else { + data = getSeriesForPieChart(); + data.title = form[ 'title' ].value; + data.suffix = form[ 'unit' ].value; + } + + return data; + +} + +/** + * 获取用户配置信息 + */ +function getUserConfig () { + + var form = document.forms[ 'data-form' ], + info = { + title: form[ 'title' ].value, + subTitle: form[ 'sub-title' ].value, + xTitle: form[ 'x-title' ].value, + yTitle: form[ 'y-title' ].value, + suffix: form[ 'unit' ].value, + //数据对齐方式 + tableDataFormat: getTableDataFormat (), + //饼图提示文字 + tip: $( "#tipInput" ).val() + }; + + return info; + +} + +function setUserConfig ( config ) { + + var form = document.forms[ 'data-form' ]; + + config.title && ( form[ 'title' ].value = config.title ); + config.subTitle && ( form[ 'sub-title' ].value = config.subTitle ); + config.xTitle && ( form[ 'x-title' ].value = config.xTitle ); + config.yTitle && ( form[ 'y-title' ].value = config.yTitle ); + config.suffix && ( form[ 'unit' ].value = config.suffix ); + config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true ); + config.tip && ( form[ 'tip' ].value = config.tip ); + currentChartType = config.chartType || 0; + +} + +function getSeriesAndCategories () { + + var form = document.forms[ 'data-form' ], + series = [], + categories = [], + tmp = [], + tableData = getTableData(); + + //反转数据 + if ( getTableDataFormat() === "-1" ) { + + for ( var i = 0, len = tableData.length; i < len; i++ ) { + + for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) { + + if ( !tmp[ j ] ) { + tmp[ j ] = []; + } + + tmp[ j ][ i ] = tableData[ i ][ j ]; + + } + + } + + tableData = tmp; + + } + + categories = tableData[0].slice( 1 ); + + for ( var i = 1, data; data = tableData[ i ]; i++ ) { + + series.push( { + name: data[ 0 ], + data: data.slice( 1 ) + } ); + + } + + return { + series: series, + categories: categories + }; + +} + +/* + * 获取数据源数据对齐方式 + */ +function getTableDataFormat () { + + var form = document.forms[ 'data-form' ], + items = form['charts-format']; + + return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value; + +} + +/* + * 禁用非饼图类型的配置项 + */ +function disableNotPieConfig() { + + updateConfigItem( 'disable' ); + +} + +/* + * 启用非饼图类型的配置项 + */ +function enableNotPieConfig() { + + updateConfigItem( 'enable' ); + +} + +function updateConfigItem ( value ) { + + var table = $( "#showTable" )[ 0 ], + isDisable = value === 'disable' ? true : false; + + //table中的input处理 + for ( var i = 2 , row; row = table.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + $( "input", cell ).attr( "disabled", isDisable ); + + } + + } + + //其他项处理 + $( "input.not-pie-item" ).attr( "disabled", isDisable ); + $( "#tipInput" ).attr( "disabled", !isDisable ) + +} + +/* + * 获取饼图数据 + * 饼图的数据只取第一行的 + **/ +function getSeriesForPieChart () { + + var series = { + type: 'pie', + name: $("#tipInput").val(), + data: [] + }, + tableData = getTableData(); + + + for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) { + + var title = tableData[ 0 ][ j ], + val = tableData[ 1 ][ j ]; + + series.data.push( [ title, val ] ); + + } + + return { + series: [ series ] + }; + +} + +function getTableData () { + + var table = document.getElementById( "showTable" ), + xCount = table.rows[0].cells.length - 1, + values = getTableInputValue(); + + for ( var i = 0, value; value = values[ i ]; i++ ) { + + tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ]; + + } + + return tableData; + +} + +function getTableInputValue () { + + var table = document.getElementById( "showTable" ), + inputs = table.getElementsByTagName( "input" ), + values = []; + + for ( var i = 0, input; input = inputs[ i ]; i++ ) { + values.push( input.value | 0 ); + } + + return values; + +} + +function getCellValue ( cell ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + +} + + +//dialog确认事件 +dialog.onok = function () { + + //收集信息 + var form = document.forms[ 'data-form' ], + info = getUserConfig(); + + //添加图表类型 + info.chartType = currentChartType; + + //同步表格数据到编辑器 + syncTableData(); + + //执行图表命令 + editor.execCommand( 'charts', info ); + +}; + +/* + * 同步图表编辑视图的表格数据到编辑器里的原始表格 + */ +function syncTableData () { + + var tableData = getTableData(); + + for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + cell.innerHTML = tableData[ i ] [ j ]; + + } + + } + +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/charts/images/charts0.png b/member/editor/ueditor/dialogs/charts/images/charts0.png new file mode 100644 index 0000000..9485e5e Binary files /dev/null and b/member/editor/ueditor/dialogs/charts/images/charts0.png differ diff --git a/member/editor/ueditor/dialogs/charts/images/charts1.png b/member/editor/ueditor/dialogs/charts/images/charts1.png new file mode 100644 index 0000000..b5a0039 Binary files /dev/null and b/member/editor/ueditor/dialogs/charts/images/charts1.png differ diff --git a/member/editor/ueditor/dialogs/charts/images/charts2.png b/member/editor/ueditor/dialogs/charts/images/charts2.png new file mode 100644 index 0000000..7c91a39 Binary files /dev/null and b/member/editor/ueditor/dialogs/charts/images/charts2.png differ diff --git a/member/editor/ueditor/dialogs/charts/images/charts3.png b/member/editor/ueditor/dialogs/charts/images/charts3.png new file mode 100644 index 0000000..a6bc29b Binary files /dev/null and b/member/editor/ueditor/dialogs/charts/images/charts3.png differ diff --git a/member/editor/ueditor/dialogs/charts/images/charts4.png b/member/editor/ueditor/dialogs/charts/images/charts4.png new file mode 100644 index 0000000..742006a Binary files /dev/null and b/member/editor/ueditor/dialogs/charts/images/charts4.png differ diff --git a/member/editor/ueditor/dialogs/charts/images/charts5.png b/member/editor/ueditor/dialogs/charts/images/charts5.png new file mode 100644 index 0000000..c49a296 Binary files /dev/null and b/member/editor/ueditor/dialogs/charts/images/charts5.png differ diff --git a/member/editor/ueditor/dialogs/emotion/emotion.css b/member/editor/ueditor/dialogs/emotion/emotion.css new file mode 100644 index 0000000..f801105 --- /dev/null +++ b/member/editor/ueditor/dialogs/emotion/emotion.css @@ -0,0 +1,43 @@ +.jd img{ + background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.pp img{ + background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:25px;height:25px;display:block; +} +.ldw img{ + background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.tsj img{ + background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.cat img{ + background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.bb img{ + background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.youa img{ + background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} + +.smileytable td {height: 37px;} +#tabPanel{margin-left:5px;overflow: hidden;} +#tabContent {float:left;background:#FFFFFF;} +#tabContent div{display: none;width:480px;overflow:hidden;} +#tabIconReview.show{left:17px;display:block;} +.menuFocus{background:#ACCD3C;} +.menuDefault{background:#FFFFFF;} +#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;} +img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;} + +.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;} +.tabbody table{width: 100%;} +.tabbody td{border:1px solid #BAC498;} +.tabbody td span{display: block;zoom:1;padding:0 4px;} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/emotion/emotion.html b/member/editor/ueditor/dialogs/emotion/emotion.html new file mode 100644 index 0000000..fca0850 --- /dev/null +++ b/member/editor/ueditor/dialogs/emotion/emotion.html @@ -0,0 +1,54 @@ + + + + + + + + + + +
      +
      + + + + + + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/emotion/emotion.js b/member/editor/ueditor/dialogs/emotion/emotion.js new file mode 100644 index 0000000..6e158a9 --- /dev/null +++ b/member/editor/ueditor/dialogs/emotion/emotion.js @@ -0,0 +1,186 @@ +window.onload = function () { + editor.setOpt({ + emotionLocalization:false + }); + + emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; + emotion.SmileyBox = createTabList( emotion.tabNum ); + emotion.tabExist = createArr( emotion.tabNum ); + + initImgName(); + initEvtHandler( "tabHeads" ); +}; + +function initImgName() { + for ( var pro in emotion.SmilmgName ) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if ( tempBox.length ) return; + for ( var i = 1; i <= tempName[1]; i++ ) { + tempStr = tempName[0]; + if ( i < 10 ) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push( tempStr ); + } + } +} + +function initEvtHandler( conId ) { + var tabHeads = $G( conId ); + for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { + var tabObj = tabHeads.childNodes[i]; + if ( tabObj.nodeType == 1 ) { + domUtils.on( tabObj, "click", (function ( index ) { + return function () { + switchTab( index ); + }; + })( j ) ); + j++; + } + } + switchTab( 0 ); + $G( "tabIconReview" ).style.display = 'none'; +} + +function InsertSmiley( url, evt ) { + var obj = { + src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url + }; + obj._src = obj.src; + editor.execCommand( 'insertimage', obj ); + if ( !evt.ctrlKey ) { + dialog.popup.hide(); + } +} + +function switchTab( index ) { + + autoHeight( index ); + if ( emotion.tabExist[index] == 0 ) { + emotion.tabExist[index] = 1; + createTab( 'tab' + index ); + } + //获取呈现元素句柄数组 + var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), + tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), + i = 0, L = tabHeads.length; + //隐藏所有呈现元素 + for ( ; i < L; i++ ) { + tabHeads[i].className = ""; + tabBodys[i].style.display = "none"; + } + //显示对应呈现元素 + tabHeads[index].className = "focus"; + tabBodys[index].style.display = "block"; +} + +function autoHeight( index ) { + var iframe = dialog.getDom( "iframe" ), + parent = iframe.parentNode.parentNode; + switch ( index ) { + case 0: + iframe.style.height = "380px"; + parent.style.height = "392px"; + break; + case 1: + iframe.style.height = "220px"; + parent.style.height = "232px"; + break; + case 2: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 3: + iframe.style.height = "300px"; + parent.style.height = "312px"; + break; + case 4: + iframe.style.height = "140px"; + parent.style.height = "152px"; + break; + case 5: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 6: + iframe.style.height = "230px"; + parent.style.height = "242px"; + break; + default: + + } +} + + +function createTab( tabName ) { + var faceVersion = "?v=1.1", //版本号 + tab = $G( tabName ), //获取将要生成的Div句柄 + imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 + positionLine = 11 / 2, //中间数 + iWidth = iHeight = 35, //图片长宽 + iColWidth = 3, //表格剩余空间的显示比例 + tableCss = emotion.imageCss[tabName], + cssOffset = emotion.imageCssOffset[tabName], + textHTML = [''], + i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; + + for ( ; i < imgNum; ) { + textHTML.push( '' ); + for ( var j = 0; j < imgColNum; j++, i++ ) { + faceImage = emotion.SmileyBox[tabName][i]; + if ( faceImage ) { + sUrl = imagePath + faceImage + faceVersion; + realUrl = imagePath + faceImage; + posflag = j < positionLine ? 0 : 1; + offset = cssOffset * i * (-1) - 1; + infor = emotion.SmileyInfor[tabName][i]; + + textHTML.push( '' ); + } + textHTML.push( '' ); + } + textHTML.push( '
      ' ); + textHTML.push( '' ); + textHTML.push( '' ); + textHTML.push( '' ); + } else { + textHTML.push( '' ); + } + textHTML.push( '
      ' ); + textHTML = textHTML.join( "" ); + tab.innerHTML = textHTML; +} + +function over( td, srcPath, posFlag ) { + td.style.backgroundColor = "#ACCD3C"; + $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; + if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; + $G( "tabIconReview" ).style.display = 'block'; +} + +function out( td ) { + td.style.backgroundColor = "transparent"; + var tabIconRevew = $G( "tabIconReview" ); + tabIconRevew.className = ""; + tabIconRevew.style.display = 'none'; +} + +function createTabList( tabNum ) { + var obj = {}; + for ( var i = 0; i < tabNum; i++ ) { + obj["tab" + i] = []; + } + return obj; +} + +function createArr( tabNum ) { + var arr = []; + for ( var i = 0; i < tabNum; i++ ) { + arr[i] = 0; + } + return arr; +} + diff --git a/member/editor/ueditor/dialogs/emotion/images/0.gif b/member/editor/ueditor/dialogs/emotion/images/0.gif new file mode 100644 index 0000000..6964168 Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/0.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/bface.gif b/member/editor/ueditor/dialogs/emotion/images/bface.gif new file mode 100644 index 0000000..14fe618 Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/bface.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/cface.gif b/member/editor/ueditor/dialogs/emotion/images/cface.gif new file mode 100644 index 0000000..bff947f Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/cface.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/fface.gif b/member/editor/ueditor/dialogs/emotion/images/fface.gif new file mode 100644 index 0000000..0d8a6af Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/fface.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/jxface2.gif b/member/editor/ueditor/dialogs/emotion/images/jxface2.gif new file mode 100644 index 0000000..a959c90 Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/jxface2.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/neweditor-tab-bg.png b/member/editor/ueditor/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 0000000..8f398b0 Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/neweditor-tab-bg.png differ diff --git a/member/editor/ueditor/dialogs/emotion/images/tface.gif b/member/editor/ueditor/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000..1354f54 Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/tface.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/wface.gif b/member/editor/ueditor/dialogs/emotion/images/wface.gif new file mode 100644 index 0000000..5667160 Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/wface.gif differ diff --git a/member/editor/ueditor/dialogs/emotion/images/yface.gif b/member/editor/ueditor/dialogs/emotion/images/yface.gif new file mode 100644 index 0000000..51608be Binary files /dev/null and b/member/editor/ueditor/dialogs/emotion/images/yface.gif differ diff --git a/member/editor/ueditor/dialogs/gmap/gmap.html b/member/editor/ueditor/dialogs/gmap/gmap.html new file mode 100644 index 0000000..c4cbfe6 --- /dev/null +++ b/member/editor/ueditor/dialogs/gmap/gmap.html @@ -0,0 +1,89 @@ + + + + + + + + + + +
      + + + + + + +
      +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/help/help.css b/member/editor/ueditor/dialogs/help/help.css new file mode 100644 index 0000000..4478475 --- /dev/null +++ b/member/editor/ueditor/dialogs/help/help.css @@ -0,0 +1,7 @@ +.wrapper{width: 370px;margin: 10px auto;zoom: 1;} +.tabbody{height: 360px;} +.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} +.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} +.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} +.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} +.tabbody table thead{font-weight: bold;line-height: 25px;} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/help/help.html b/member/editor/ueditor/dialogs/help/help.html new file mode 100644 index 0000000..9e50060 --- /dev/null +++ b/member/editor/ueditor/dialogs/help/help.html @@ -0,0 +1,82 @@ + + + + 帮助 + + + + + +
      +
      + + +
      +
      +
      +

      UEditor

      +

      +

      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ctrl+b
      ctrl+c
      ctrl+x
      ctrl+v
      ctrl+y
      ctrl+z
      ctrl+i
      ctrl+u
      ctrl+a
      shift+enter
      alt+z
      +
      +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/help/help.js b/member/editor/ueditor/dialogs/help/help.js new file mode 100644 index 0000000..9a2272e --- /dev/null +++ b/member/editor/ueditor/dialogs/help/help.js @@ -0,0 +1,56 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:06 + * To change this template use File | Settings | File Templates. + */ +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head样式更改 + for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body显隐 + var tabSrc = obj.getAttribute( "tabSrc" ); + for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var body = tabBodys[j], + id = body.getAttribute( "id" ); + body.onclick = function(){ + this.style.zoom = 1; + }; + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +function switchTab( tabParentId ) { + var tabElements = $G( tabParentId ).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +switchTab("helptab"); + +document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/image/image.css b/member/editor/ueditor/dialogs/image/image.css new file mode 100644 index 0000000..52c2295 --- /dev/null +++ b/member/editor/ueditor/dialogs/image/image.css @@ -0,0 +1,894 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 图片对齐方式 */ +.alignBar{ + float:right; + margin-top: 5px; + position: relative; +} + +.alignBar .algnLabel{ + float:left; + height: 20px; + line-height: 20px; +} + +.alignBar #alignIcon{ + zoom:1; + _display: inline; + display: inline-block; + position: relative; +} +.alignBar #alignIcon span{ + float: left; + cursor: pointer; + display: block; + width: 19px; + height: 17px; + margin-right: 3px; + margin-left: 3px; + background-image: url(./images/alignicon.jpg); +} +.alignBar #alignIcon .none-align{ + background-position: 0 -18px; +} +.alignBar #alignIcon .left-align{ + background-position: -20px -18px; +} +.alignBar #alignIcon .right-align{ + background-position: -40px -18px; +} +.alignBar #alignIcon .center-align{ + background-position: -60px -18px; +} +.alignBar #alignIcon .none-align.focus{ + background-position: 0 0; +} +.alignBar #alignIcon .left-align.focus{ + background-position: -20px 0; +} +.alignBar #alignIcon .right-align.focus{ + background-position: -40px 0; +} +.alignBar #alignIcon .center-align.focus{ + background-position: -60px 0; +} + + + + +/* 远程图片样式 */ +#remote { + z-index: 200; +} + +#remote .top{ + width: 100%; + margin-top: 25px; +} +#remote .left{ + display: block; + float: left; + width: 300px; + height:10px; +} +#remote .right{ + display: block; + float: right; + width: 300px; + height:10px; +} +#remote .row{ + margin-left: 20px; + clear: both; + height: 40px; +} + +#remote .row label{ + text-align: center; + width: 50px; + zoom:1; + _display: inline; + display:inline-block; + vertical-align: middle; +} +#remote .row label.algnLabel{ + float: left; + +} + +#remote input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +#remote input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#remote #url{ + width: 500px; + margin-bottom: 2px; +} +#remote #width, +#remote #height{ + width: 20px; + margin-left: 2px; + margin-right: 2px; +} +#remote #border, +#remote #vhSpace, +#remote #title{ + width: 180px; + margin-right: 5px; +} +#remote #lock{ +} +#remote #lockicon{ + zoom: 1; + _display:inline; + display: inline-block; + width: 20px; + height: 20px; + background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; + vertical-align: middle; +} +#remote #preview{ + clear: both; + width: 260px; + height: 240px; + z-index: 9999; + margin-top: 10px; + background-color: #eee; + overflow: hidden; +} + +/* 上传图片 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; + position: relative; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background: url(./images/success.gif) no-repeat right bottom \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#online #imageList{ + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; +} +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif)\9; + background-position: 75px 75px; +} +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + + +/* 图片搜索样式 */ +#search .searchBar { + width: 100%; + height: 30px; + margin: 10px 0 5px 0; + padding: 0; +} + +#search input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +#search input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#search input.searchTxt { + margin-left:5px; + padding-left: 5px; + background: #FFF; + width: 300px; + *width: 260px; + height: 21px; + line-height: 21px; + float: left; + dislay: block; +} + +#search .searchType { + width: 65px; + height: 28px; + padding:0; + line-height: 28px; + border: 1px solid #d7d7d7; + border-radius: 0; + vertical-align: top; + margin-left: 5px; + float: left; + dislay: block; +} + +#search #searchBtn, +#search #searchReset { + display: inline-block; + margin-bottom: 0; + margin-right: 5px; + padding: 4px 10px; + font-weight: 400; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + font-size: 14px; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: top; + float: right; +} + +#search #searchBtn { + color: white; + border-color: #285e8e; + background-color: #3b97d7; +} +#search #searchReset { + color: #333; + border-color: #ccc; + background-color: #fff; +} +#search #searchBtn:hover { + background-color: #3276b1; +} +#search #searchReset:hover { + background-color: #eee; +} + +#search .msg { + margin-left: 5px; +} + +#search .searchList{ + width: 100%; + height: 300px; + overflow: hidden; + clear: both; +} +#search .searchList ul{ + margin:0; + padding:0; + list-style:none; + clear: both; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + zoom: 1; + position: relative; +} + +#search .searchList li { + list-style:none; + float: left; + display: block; + width: 115px; + margin: 5px 10px 5px 20px; + *margin: 5px 10px 5px 15px; + padding:0; + font-size: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + position: relative; + vertical-align: top; + text-align: center; + overflow: hidden; + cursor: pointer; + filter: alpha(Opacity=100); + -moz-opacity: 1; + opacity: 1; + border: 2px solid #eee; +} + +#search .searchList li.selected { + filter: alpha(Opacity=40); + -moz-opacity: 0.4; + opacity: 0.4; + border: 2px solid #00a0e9; +} + +#search .searchList li p { + background-color: #eee; + margin: 0; + padding: 0; + position: relative; + width:100%; + height:115px; + overflow: hidden; +} + +#search .searchList li p img { + cursor: pointer; + border: 0; +} + +#search .searchList li a { + color: #999; + border-top: 1px solid #F2F2F2; + background: #FAFAFA; + text-align: center; + display: block; + padding: 0 5px; + width: 105px; + height:32px; + line-height:32px; + white-space:nowrap; + text-overflow:ellipsis; + text-decoration: none; + overflow: hidden; + word-break: break-all; +} + +#search .searchList a:hover { + text-decoration: underline; + color: #333; +} +#search .searchList .clearFloat{ + clear: both; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/image/image.html b/member/editor/ueditor/dialogs/image/image.html new file mode 100644 index 0000000..8286d07 --- /dev/null +++ b/member/editor/ueditor/dialogs/image/image.html @@ -0,0 +1,120 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + +
      +
      + + + + +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      + + +
      +
      +
      +
      + +   px +   px + +
      +
      + + px +
      +
      + + px +
      +
      + + +
      +
      +
      +
      + + +
      +
      +
      +
      + 0% + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
        +
      • +
      +
      +
      + + +
      +
      +
      + + + + +
      +
      + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/image/image.js b/member/editor/ueditor/dialogs/image/image.js new file mode 100644 index 0000000..dee16bb --- /dev/null +++ b/member/editor/ueditor/dialogs/image/image.js @@ -0,0 +1,1142 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var remoteImage, + uploadImage, + onlineImage, + searchImage; + + window.onload = function () { + initTabs(); + initAlign(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + var img = editor.selection.getRange().getClosedNode(); + if (img && img.tagName && img.tagName.toLowerCase() == 'img') { + setTabFocus('remote'); + } else { + setTabFocus('upload'); + } + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id'); + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'remote': + remoteImage = remoteImage || new RemoteImage(); + break; + case 'upload': + setAlign(editor.getOpt('imageInsertAlign')); + uploadImage = uploadImage || new UploadImage('queueList'); + break; + case 'online': + setAlign(editor.getOpt('imageManagerInsertAlign')); + onlineImage = onlineImage || new OnlineImage('imageList'); + onlineImage.reset(); + break; + case 'search': + setAlign(editor.getOpt('imageManagerInsertAlign')); + searchImage = searchImage || new SearchImage(); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var remote = false, list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'remote': + list = remoteImage.getInsertList(); + break; + case 'upload': + list = uploadImage.getInsertList(); + var count = uploadImage.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineImage.getInsertList(); + break; + case 'search': + list = searchImage.getInsertList(); + remote = true; + break; + } + + if(list) { + editor.execCommand('insertimage', list); + remote && editor.fireEvent("catchRemoteImage"); + } + }; + } + + + /* 初始化对其方式的点击事件 */ + function initAlign(){ + /* 点击align图标 */ + domUtils.on($G("alignIcon"), 'click', function(e){ + var target = e.target || e.srcElement; + if(target.className && target.className.indexOf('-align') != -1) { + setAlign(target.getAttribute('data-align')); + } + }); + } + + /* 设置对齐方式 */ + function setAlign(align){ + align = align || 'none'; + var aligns = $G("alignIcon").children; + for(i = 0; i < aligns.length; i++){ + if(aligns[i].getAttribute('data-align') == align) { + domUtils.addClass(aligns[i], 'focus'); + $G("align").value = aligns[i].getAttribute('data-align'); + } else { + domUtils.removeClasses(aligns[i], 'focus'); + } + } + } + /* 获取对齐方式 */ + function getAlign(){ + var align = $G("align").value || 'none'; + return align == 'none' ? '':align; + } + + + /* 在线图片 */ + function RemoteImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + RemoteImage.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + }, + initContainer: function () { + this.dom = { + 'url': $G('url'), + 'width': $G('width'), + 'height': $G('height'), + 'border': $G('border'), + 'vhSpace': $G('vhSpace'), + 'title': $G('title'), + 'align': $G('align') + }; + var img = editor.selection.getRange().getClosedNode(); + if (img) { + this.setImage(img); + } + }, + initEvents: function () { + var _this = this, + locker = $G('lock'); + + /* 改变url */ + domUtils.on($G("url"), 'keyup', updatePreview); + domUtils.on($G("border"), 'keyup', updatePreview); + domUtils.on($G("title"), 'keyup', updatePreview); + + domUtils.on($G("width"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('height').value = Math.round(this.value / proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("height"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('width').value = Math.round(this.value * proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("lock"), 'change', function(){ + var proportion = parseInt($G("width").value) /parseInt($G("height").value); + locker.setAttribute('data-proportion', proportion); + }); + + function updatePreview(){ + _this.setPreview(); + } + }, + updateLocker: function(){ + var width = $G('width').value, + height = $G('height').value, + locker = $G('lock'); + if(width && height && width == parseInt(width) && height == parseInt(height)) { + locker.disabled = false; + locker.title = ''; + } else { + locker.checked = false; + locker.disabled = 'disabled'; + locker.title = lang.remoteLockError; + } + }, + setImage: function(img){ + /* 不是正常的图片 */ + if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; + + var wordImgFlag = img.getAttribute("word_img"), + src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), + align = editor.queryCommandValue("imageFloat"); + + /* 防止onchange事件循环调用 */ + if (src !== $G("url").value) $G("url").value = src; + if(src) { + /* 设置表单内容 */ + $G("width").value = img.width || ''; + $G("height").value = img.height || ''; + $G("border").value = img.getAttribute("border") || '0'; + $G("vhSpace").value = img.getAttribute("vspace") || '0'; + $G("title").value = img.title || img.alt || ''; + setAlign(align); + this.setPreview(); + this.updateLocker(); + } + }, + getData: function(){ + var data = {}; + for(var k in this.dom){ + data[k] = this.dom[k].value; + } + return data; + }, + setPreview: function(){ + var url = $G('url').value, + ow = parseInt($G('width').value, 10) || 0, + oh = parseInt($G('height').value, 10) || 0, + border = parseInt($G('border').value, 10) || 0, + title = $G('title').value, + preview = $G('preview'), + width, + height; + + url = utils.unhtmlForUrl(url); + title = utils.unhtml(title); + + width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth)); + width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2)); + height = (!ow || !oh) ? '':width*oh/ow; + + if(url) { + preview.innerHTML = ''; + } + }, + getInsertList: function () { + var data = this.getData(); + if(data['url']) { + return [{ + src: data['url'], + _src: data['url'], + width: data['width'] || '', + height: data['height'] || '', + border: data['border'] || '', + floatStyle: data['align'] || '', + vspace: data['vhSpace'] || '', + title: data['title'] || '', + alt: data['title'] || '', + style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" + }]; + } else { + return []; + } + } + }; + + + + /* 上传图片 */ + function UploadImage(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadImage.prototype = { + init: function () { + this.imageList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), + acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), + imageMaxSize = editor.getOpt('imageMaxSize'), + imageCompressBorder = editor.getOpt('imageCompressBorder'); + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
      ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('imageActionName')) { + $('#filePickerReady').after($('
      ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + accept: { + title: 'Images', + extensions: acceptExtensions, + mimeTypes: 'image/*' + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('imageFieldName'), + duplicate: true, + fileSingleSizeLimit: imageMaxSize, // 默认 2 M + compress: editor.getOpt('imageCompressEnable') ? { + width: imageCompressBorder, + height: imageCompressBorder, + // 图片质量,只有type为`image/jpeg`的时候才有效。 + quality: 90, + // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. + allowMagnify: false, + // 是否允许裁剪。 + crop: false, + // 是否保留头部meta信息。 + preserveHeaders: true + }:false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
    • ' + + '

      ' + file.name + '

      ' + + '

      ' + + '

      ' + + '
    • '), + + $btns = $('
      ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
      ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

      ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.imageList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + destroy: function () { + this.$wrap.remove(); + }, + getInsertList: function () { + var i, data, list = [], + align = getAlign(), + prefix = editor.getOpt('imageUrlPrefix'); + for (i = 0; i < this.imageList.length; i++) { + data = this.imageList[i]; + list.push({ + src: prefix + data.url, + _src: prefix + data.url, + title: data.title, + alt: data.original, + floatStyle: align + }); + } + return list; + } + }; + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r:eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + + } + return list; + } + }; + + /*搜索图片 */ + function SearchImage() { + this.init(); + } + SearchImage.prototype = { + init: function () { + this.initEvents(); + }, + initEvents: function(){ + var _this = this; + + /* 点击搜索按钮 */ + domUtils.on($G('searchBtn'), 'click', function(){ + var key = $G('searchTxt').value; + if(key && key != lang.searchRemind) { + _this.getImageData(); + } + }); + /* 点击清除妞 */ + domUtils.on($G('searchReset'), 'click', function(){ + $G('searchTxt').value = lang.searchRemind; + $G('searchListUl').innerHTML = ''; + $G('searchType').selectedIndex = 0; + }); + /* 搜索框聚焦 */ + domUtils.on($G('searchTxt'), 'focus', function(){ + var key = $G('searchTxt').value; + if(key && key == lang.searchRemind) { + $G('searchTxt').value = ''; + } + }); + /* 搜索框回车键搜索 */ + domUtils.on($G('searchTxt'), 'keydown', function(e){ + var keyCode = e.keyCode || e.which; + if (keyCode == 13) { + $G('searchBtn').click(); + } + }); + + /* 选中图片 */ + domUtils.on($G('searchList'), 'click', function(e){ + var target = e.target || e.srcElement, + li = target.parentNode.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + encodeToGb2312:function (str){ + if(!str) return ''; + var strOut = "", + z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9'; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i), + code = str.charCodeAt(i); + if (c == " ") strOut += "+"; + else if (code >= 19968 && code <= 40869) { + var index = code - 19968; + strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2); + } else { + strOut += "%" + str.charCodeAt(i).toString(16); + } + } + return strOut; + }, + /* 改变图片大小 */ + scale: function (img, w, h) { + var ow = img.width, + oh = img.height; + + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + }, + getImageData: function(){ + var _this = this, + key = $G('searchTxt').value, + type = $G('searchType').value, + keepOriginName = editor.options.keepOriginName ? "1" : "0", + url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date; + + $G('searchListUl').innerHTML = lang.searchLoading; + ajax.request(url, { + 'dataType': 'jsonp', + 'charset': 'GB18030', + 'onsuccess':function(json){ + var list = []; + if(json && json.data) { + for(var i = 0; i < json.data.length; i++) { + if(json.data[i].objURL) { + list.push({ + title: json.data[i].fromPageTitleEnc, + src: json.data[i].objURL, + url: json.data[i].fromURL + }); + } + } + } + _this.setList(list); + }, + 'onerror':function(){ + $G('searchListUl').innerHTML = lang.searchRetry; + } + }); + }, + /* 添加图片到列表界面上 */ + setList: function (list) { + var i, item, p, img, link, _this = this, + listUl = $G('searchListUl'); + + listUl.innerHTML = ''; + if(list.length) { + for (i = 0; i < list.length; i++) { + item = document.createElement('li'); + p = document.createElement('p'); + img = document.createElement('img'); + link = document.createElement('a'); + + img.onload = function () { + _this.scale(this, 113, 113); + }; + img.width = 113; + img.setAttribute('src', list[i].src); + + link.href = list[i].url; + link.target = '_blank'; + link.title = list[i].title; + link.innerHTML = list[i].title; + + p.appendChild(img); + item.appendChild(p); + item.appendChild(link); + listUl.appendChild(item); + } + } else { + listUl.innerHTML = lang.searchRetry; + } + }, + getInsertList: function () { + var child, + src, + align = getAlign(), + list = [], + items = $G('searchListUl').children; + for(var i = 0; i < items.length; i++) { + child = items[i].firstChild && items[i].firstChild.firstChild; + if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { + src = child.src; + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + } + return list; + } + }; + +})(); diff --git a/member/editor/ueditor/dialogs/image/images/alignicon.jpg b/member/editor/ueditor/dialogs/image/images/alignicon.jpg new file mode 100644 index 0000000..754755b Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/alignicon.jpg differ diff --git a/member/editor/ueditor/dialogs/image/images/bg.png b/member/editor/ueditor/dialogs/image/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/bg.png differ diff --git a/member/editor/ueditor/dialogs/image/images/icons.gif b/member/editor/ueditor/dialogs/image/images/icons.gif new file mode 100644 index 0000000..78459de Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/icons.gif differ diff --git a/member/editor/ueditor/dialogs/image/images/icons.png b/member/editor/ueditor/dialogs/image/images/icons.png new file mode 100644 index 0000000..12e4700 Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/icons.png differ diff --git a/member/editor/ueditor/dialogs/image/images/image.png b/member/editor/ueditor/dialogs/image/images/image.png new file mode 100644 index 0000000..19699f6 Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/image.png differ diff --git a/member/editor/ueditor/dialogs/image/images/progress.png b/member/editor/ueditor/dialogs/image/images/progress.png new file mode 100644 index 0000000..717c486 Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/progress.png differ diff --git a/member/editor/ueditor/dialogs/image/images/success.gif b/member/editor/ueditor/dialogs/image/images/success.gif new file mode 100644 index 0000000..8d4f311 Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/success.gif differ diff --git a/member/editor/ueditor/dialogs/image/images/success.png b/member/editor/ueditor/dialogs/image/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/member/editor/ueditor/dialogs/image/images/success.png differ diff --git a/member/editor/ueditor/dialogs/insertframe/insertframe.html b/member/editor/ueditor/dialogs/insertframe/insertframe.html new file mode 100644 index 0000000..7f1f3e9 --- /dev/null +++ b/member/editor/ueditor/dialogs/insertframe/insertframe.html @@ -0,0 +1,98 @@ + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + +
      + + +
      px
      px
      + +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/internal.js b/member/editor/ueditor/dialogs/internal.js new file mode 100644 index 0000000..44dc17f --- /dev/null +++ b/member/editor/ueditor/dialogs/internal.js @@ -0,0 +1,81 @@ +(function () { + var parent = window.parent; + //dialog对象 + dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; + //当前打开dialog的编辑器实例 + editor = dialog.editor; + + UE = parent.UE; + + domUtils = UE.dom.domUtils; + + utils = UE.utils; + + browser = UE.browser; + + ajax = UE.ajax; + + $G = function ( id ) { + return document.getElementById( id ) + }; + //focus元素 + $focus = function ( node ) { + setTimeout( function () { + if ( browser.ie ) { + var r = node.createTextRange(); + r.collapse( false ); + r.select(); + } else { + node.focus() + } + }, 0 ) + }; + utils.loadFile(document,{ + href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(), + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + lang = editor.getLang(dialog.className.split( "-" )[2]); + if(lang){ + domUtils.on(window,'load',function () { + + var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; + //针对静态资源 + for ( var i in lang["static"] ) { + var dom = $G( i ); + if(!dom) continue; + var tagName = dom.tagName, + content = lang["static"][i]; + if(content.src){ + //clone + content = utils.extend({},content,false); + content.src = langImgPath + content.src; + } + if(content.style){ + content = utils.extend({},content,false); + content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath) + } + switch ( tagName.toLowerCase() ) { + case "var": + dom.parentNode.replaceChild( document.createTextNode( content ), dom ); + break; + case "select": + var ops = dom.options; + for ( var j = 0, oj; oj = ops[j]; ) { + oj.innerHTML = content.options[j++]; + } + for ( var p in content ) { + p != "options" && dom.setAttribute( p, content[p] ); + } + break; + default : + domUtils.setAttributes( dom, content); + } + } + } ); + } + + +})(); + diff --git a/member/editor/ueditor/dialogs/link/link.html b/member/editor/ueditor/dialogs/link/link.html new file mode 100644 index 0000000..55ab4d1 --- /dev/null +++ b/member/editor/ueditor/dialogs/link/link.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + +
      + + + diff --git a/member/editor/ueditor/dialogs/map/map.html b/member/editor/ueditor/dialogs/map/map.html new file mode 100644 index 0000000..c9ceae3 --- /dev/null +++ b/member/editor/ueditor/dialogs/map/map.html @@ -0,0 +1,137 @@ + + + + + + + + + + +
      + + + + + + + + + +
      ::
      +
      + +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/map/show.html b/member/editor/ueditor/dialogs/map/show.html new file mode 100644 index 0000000..b221e8c --- /dev/null +++ b/member/editor/ueditor/dialogs/map/show.html @@ -0,0 +1,118 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/music/music.css b/member/editor/ueditor/dialogs/music/music.css new file mode 100644 index 0000000..8fb7a94 --- /dev/null +++ b/member/editor/ueditor/dialogs/music/music.css @@ -0,0 +1,30 @@ +.wrapper{margin: 5px 10px;} + +.searchBar{height:30px;padding:7px 0 3px;text-align:center;} +.searchBtn{font-size:13px;height:24px;} + +.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} + +.listPanel{overflow: hidden;} +.panelon{display:block;} +.paneloff{display:none} + +.page{width:220px;margin:20px auto;overflow: hidden;} +.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center} +.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; + border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;} + +.m-box{width:460px;} +.m-m{float: left;line-height: 20px;height: 20px;} +.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;} +.m-l{float:left;width:40px; } +.m-t{float:left;width:140px;} +.m-s{float:left;width:110px;} +.m-z{float:left;width:100px;} +.m-try-t{float: left;width: 60px;;} + +.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;} +.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;} + +.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat} +.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/music/music.html b/member/editor/ueditor/dialogs/music/music.html new file mode 100644 index 0000000..e7ef04f --- /dev/null +++ b/member/editor/ueditor/dialogs/music/music.html @@ -0,0 +1,32 @@ + + + + + 插入音乐 + + + + +
      + +
      + +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/music/music.js b/member/editor/ueditor/dialogs/music/music.js new file mode 100644 index 0000000..1c538bf --- /dev/null +++ b/member/editor/ueditor/dialogs/music/music.js @@ -0,0 +1,192 @@ +function Music() { + this.init(); +} +(function () { + var pages = [], + panels = [], + selectedItem = null; + Music.prototype = { + total:70, + pageSize:10, + dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common", + playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf", + + init:function () { + var me = this; + domUtils.on($G("J_searchName"), "keyup", function (event) { + var e = window.event || event; + if (e.keyCode == 13) { + me.dosearch(); + } + }); + domUtils.on($G("J_searchBtn"), "click", function () { + me.dosearch(); + }); + }, + callback:function (data) { + var me = this; + me.data = data.song_list; + setTimeout(function () { + $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); + }, 300); + }, + dosearch:function () { + var me = this; + selectedItem = null; + var key = $G('J_searchName').value; + if (utils.trim(key) == "")return false; + key = encodeURIComponent(key); + me._sent(key); + }, + doselect:function (i) { + var me = this; + if (typeof i == 'object') { + selectedItem = i; + } else if (typeof i == 'number') { + selectedItem = me.data[i]; + } + }, + onpageclick:function (id) { + var me = this; + for (var i = 0; i < pages.length; i++) { + $G(pages[i]).className = 'pageoff'; + $G(panels[i]).className = 'paneloff'; + } + $G('page' + id).className = 'pageon'; + $G('panel' + id).className = 'panelon'; + }, + listenTest:function (elem) { + var me = this, + view = $G('J_preview'), + is_play_action = (elem.className == 'm-try'), + old_trying = me._getTryingElem(); + + if (old_trying) { + old_trying.className = 'm-try'; + view.innerHTML = ''; + } + if (is_play_action) { + elem.className = 'm-trying'; + view.innerHTML = me._buildMusicHtml(me._getUrl(true)); + } + }, + _sent:function (param) { + var me = this; + $G('J_resultBar').innerHTML = '
      '; + + utils.loadFile(document, { + src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), + tag:"script", + type:"text/javascript", + defer:"defer" + }); + }, + _removeHtml:function (str) { + var reg = /<\s*\/?\s*[^>]*\s*>/gi; + return str.replace(reg, ""); + }, + _getUrl:function (isTryListen) { + var me = this; + var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' + + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' + + encodeURIComponent(me._removeHtml(selectedItem.album_title)) + + '&autoPlay='+isTryListen+'' + '&loop=true'; + return me.playerUrl + "?" + param; + }, + _getTryingElem:function () { + var s = $G('J_listPanel').getElementsByTagName('span'); + + for (var i = 0; i < s.length; i++) { + if (s[i].className == 'm-trying') + return s[i]; + } + return null; + }, + _buildMusicHtml:function (playerUrl) { + var html = ' 12) + return s.substring(0, 5) + '...'; + if (!s) s = " "; + return s; + }, + _rebuildData:function (data) { + var me = this, + newData = [], + d = me.pageSize, + itembox; + for (var i = 0; i < data.length; i++) { + if ((i + d) % d == 0) { + itembox = []; + newData.push(itembox) + } + itembox.push(data[i]); + } + return newData; + }, + _renderTemplate:function (data) { + var me = this; + if (data.length == 0)return '
      ' + lang.emptyTxt + '
      '; + data = me._rebuildData(data); + var s = [], p = [], t = []; + s.push('
      '); + p.push('
      '); + for (var i = 0, tmpList; tmpList = data[i++];) { + panels.push('panel' + i); + pages.push('page' + i); + if (i == 1) { + s.push('
      '); + if (data.length != 1) { + t.push('
      ' + (i ) + '
      '); + } + } else { + s.push('
      '); + t.push('
      ' + (i ) + '
      '); + } + s.push('
      '); + s.push('
      ' + lang.chapter + '' + lang.singer + + '' + lang.special + '' + lang.listenTest + '
      '); + for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { + s.push(''); + } + s.push('
      '); + s.push('
      '); + } + t.reverse(); + p.push(t.join('')); + s.push('
      '); + p.push('
      '); + return s.join('') + p.join(''); + }, + exec:function () { + var me = this; + if (selectedItem == null) return; + $G('J_preview').innerHTML = ""; + editor.execCommand('music', { + url:me._getUrl(false), + width:400, + height:95 + }); + } + }; +})(); + + + diff --git a/member/editor/ueditor/dialogs/preview/preview.html b/member/editor/ueditor/dialogs/preview/preview.html new file mode 100644 index 0000000..f6b433b --- /dev/null +++ b/member/editor/ueditor/dialogs/preview/preview.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
      + +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/scrawl/images/addimg.png b/member/editor/ueditor/dialogs/scrawl/images/addimg.png new file mode 100644 index 0000000..03a8713 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/addimg.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/brush.png b/member/editor/ueditor/dialogs/scrawl/images/brush.png new file mode 100644 index 0000000..efa6fdb Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/brush.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/delimg.png b/member/editor/ueditor/dialogs/scrawl/images/delimg.png new file mode 100644 index 0000000..5a892e4 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/delimg.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/delimgH.png b/member/editor/ueditor/dialogs/scrawl/images/delimgH.png new file mode 100644 index 0000000..2f0c5c9 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/delimgH.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/empty.png b/member/editor/ueditor/dialogs/scrawl/images/empty.png new file mode 100644 index 0000000..0375196 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/empty.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/emptyH.png b/member/editor/ueditor/dialogs/scrawl/images/emptyH.png new file mode 100644 index 0000000..838ca72 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/emptyH.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/eraser.png b/member/editor/ueditor/dialogs/scrawl/images/eraser.png new file mode 100644 index 0000000..63e87ce Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/eraser.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/redo.png b/member/editor/ueditor/dialogs/scrawl/images/redo.png new file mode 100644 index 0000000..12cd9bb Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/redo.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/redoH.png b/member/editor/ueditor/dialogs/scrawl/images/redoH.png new file mode 100644 index 0000000..d9f33d3 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/redoH.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/scale.png b/member/editor/ueditor/dialogs/scrawl/images/scale.png new file mode 100644 index 0000000..935a3f3 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/scale.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/scaleH.png b/member/editor/ueditor/dialogs/scrawl/images/scaleH.png new file mode 100644 index 0000000..72e64a9 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/scaleH.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/size.png b/member/editor/ueditor/dialogs/scrawl/images/size.png new file mode 100644 index 0000000..8366845 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/size.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/undo.png b/member/editor/ueditor/dialogs/scrawl/images/undo.png new file mode 100644 index 0000000..084c7cc Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/undo.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/images/undoH.png b/member/editor/ueditor/dialogs/scrawl/images/undoH.png new file mode 100644 index 0000000..fde7eb3 Binary files /dev/null and b/member/editor/ueditor/dialogs/scrawl/images/undoH.png differ diff --git a/member/editor/ueditor/dialogs/scrawl/scrawl.css b/member/editor/ueditor/dialogs/scrawl/scrawl.css new file mode 100644 index 0000000..b18430d --- /dev/null +++ b/member/editor/ueditor/dialogs/scrawl/scrawl.css @@ -0,0 +1,72 @@ +/*common +*/ +body{margin: 0;} +table{width:100%;} +table td{padding:2px 4px;vertical-align: middle;} +a{text-decoration: none;} +em{font-style: normal;} +.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +/*module +*/ +.main{margin: 8px;overflow: hidden;} + +.hot{float:left;height:335px;} +.drawBoard{position: relative; cursor: crosshair;} +.brushBorad{position: absolute;left:0;top:0;z-index: 998;} +.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;} +.operateBar{margin-top:10px;font-size:12px;text-align: center;} +.operateBar span{margin-left: 10px;} + +.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;} +.colorBar{margin-top:10px;font-size: 12px;text-align: center;} +.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3} +.sectionBar{margin-top:15px;font-size: 12px;text-align: center;} +.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3} +.size1{background: url('images/size.png') 1px center no-repeat ;} +.size2{background: url('images/size.png') -10px center no-repeat;} +.size3{background: url('images/size.png') -22px center no-repeat;} +.size4{background: url('images/size.png') -35px center no-repeat;} + +.addImgH{position: relative;} +.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;} +.addImgH_form input{width: 100%;} +/*scrawl遮罩层 +*/ +.maskLayerNull{display: none;} +.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7; + background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;} +/*btn state +*/ +.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;} +.previousStepH .text{color:#888;cursor:pointer;} +.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;} +.previousStep .text{color:#ccc;cursor:default;} + +.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;} +.nextStepH .text{color:#888;cursor:pointer;} +.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;} +.nextStep .text{color:#ccc;cursor:default;} + +.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;} +.clearBoardH .text{color:#888;cursor:pointer;} +.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;} +.clearBoard .text{color:#ccc;cursor:default;} + +.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;} +.scaleBoardH .text{color:#888;cursor:pointer;} +.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;} +.scaleBoard .text{color:#ccc;cursor:default;} + +.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;} +.removeImgH .text{color:#888;cursor:pointer;} +.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;} +.removeImg .text{color:#ccc;cursor:default;} + +.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')} +.addImgH .text{color:#888;cursor:pointer;} +/*icon +*/ +.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')} +.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')} + + diff --git a/member/editor/ueditor/dialogs/scrawl/scrawl.html b/member/editor/ueditor/dialogs/scrawl/scrawl.html new file mode 100644 index 0000000..9371abd --- /dev/null +++ b/member/editor/ueditor/dialogs/scrawl/scrawl.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
      +
      +
      + +
      +
      +
      + + + + + + + + + + + + + + + + +
      +
      +
      +
      +
      + + 1 + 3 + 5 + 7 +
      +
      + + 1 + 3 + 5 + 7 +
      +
      +
      + + +
      + +
      + +
      +
      +
      + + + + +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/scrawl/scrawl.js b/member/editor/ueditor/dialogs/scrawl/scrawl.js new file mode 100644 index 0000000..e0c005e --- /dev/null +++ b/member/editor/ueditor/dialogs/scrawl/scrawl.js @@ -0,0 +1,671 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-5-22 + * Time: 上午11:38 + * To change this template use File | Settings | File Templates. + */ +var scrawl = function (options) { + options && this.initOptions(options); +}; +(function () { + var canvas = $G("J_brushBoard"), + context = canvas.getContext('2d'), + drawStep = [], //undo redo存储 + drawStepIndex = 0; //undo redo指针 + + scrawl.prototype = { + isScrawl:false, //是否涂鸦 + brushWidth:-1, //画笔粗细 + brushColor:"", //画笔颜色 + + initOptions:function (options) { + var me = this; + me.originalState(options);//初始页面状态 + me._buildToolbarColor(options.colorList);//动态生成颜色选择集合 + + me._addBoardListener(options.saveNum);//添加画板处理 + me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理 + me._addColorBarListener();//添加颜色选择处理 + me._addBrushBarListener();//添加画笔大小处理 + me._addEraserBarListener();//添加橡皮大小处理 + me._addAddImgListener();//添加增添背景图片处理 + me._addRemoveImgListenter();//删除背景图片处理 + me._addScalePicListenter();//添加缩放处理 + me._addClearSelectionListenter();//添加清楚选中状态处理 + + me._originalColorSelect(options.drawBrushColor);//初始化颜色选中 + me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中 + me._clearSelection();//清楚选中状态 + }, + + originalState:function (options) { + var me = this; + + me.brushWidth = options.drawBrushSize;//同步画笔粗细 + me.brushColor = options.drawBrushColor;//同步画笔颜色 + + context.lineWidth = me.brushWidth;//初始画笔大小 + context.strokeStyle = me.brushColor;//初始画笔颜色 + context.fillStyle = "transparent";//初始画布背景颜色 + context.lineCap = "round";//去除锯齿 + context.fill(); + }, + _buildToolbarColor:function (colorList) { + var tmp = null, arr = []; + arr.push(""); + for (var i = 0, color; color = colorList[i++];) { + if ((i - 1) % 5 == 0) { + if (i != 1) { + arr.push(""); + } + arr.push(""); + } + tmp = '#' + color; + arr.push(""); + } + arr.push("
      "); + $G("J_colorBar").innerHTML = arr.join(""); + }, + + _addBoardListener:function (saveNum) { + var me = this, + margin = 0, + startX = -1, + startY = -1, + isMouseDown = false, + isMouseMove = false, + isMouseUp = false, + buttonPress = 0, button, flag = ''; + + margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex += 1; + + domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { + button = browser.webkit ? e.which : buttonPress; + switch (e.type) { + case 'mousedown': + buttonPress = 1; + flag = 1; + isMouseDown = true; + isMouseUp = false; + isMouseMove = false; + me.isScrawl = true; + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + break; + case 'mousemove' : + if (!flag && button == 0) { + return; + } + if (!flag && button) { + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + flag = 1; + } + if (isMouseUp || !isMouseDown) { + return; + } + var endX = e.clientX - margin, + endY = e.clientY - margin; + + context.moveTo(startX, startY); + context.lineTo(endX, endY); + context.stroke(); + startX = endX; + startY = endY; + isMouseMove = true; + break; + case 'mouseup': + buttonPress = 0; + if (!isMouseDown)return; + if (!isMouseMove) { + context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); + context.fillStyle = context.strokeStyle; + context.fill(); + } + context.closePath(); + me._saveOPerate(saveNum); + isMouseDown = false; + isMouseMove = false; + isMouseUp = true; + startX = -1; + startY = -1; + break; + case 'mouseout': + flag = ''; + buttonPress = 0; + if (button == 1) return; + context.closePath(); + break; + } + }); + }, + _addOPerateListener:function (saveNum) { + var me = this; + domUtils.on($G("J_previousStep"), "click", function () { + if (drawStepIndex > 1) { + drawStepIndex -= 1; + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex - 1], 0, 0); + me.btn2Highlight("J_nextStep"); + drawStepIndex == 1 && me.btn2disable("J_previousStep"); + } + }); + domUtils.on($G("J_nextStep"), "click", function () { + if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex], 0, 0); + drawStepIndex += 1; + me.btn2Highlight("J_previousStep"); + drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); + } + }); + domUtils.on($G("J_clearBoard"), "click", function () { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + drawStep = []; + me._saveOPerate(saveNum); + drawStepIndex = 1; + me.isScrawl = false; + me.btn2disable("J_previousStep"); + me.btn2disable("J_nextStep"); + me.btn2disable("J_clearBoard"); + }); + }, + _addColorBarListener:function () { + var me = this; + domUtils.on($G("J_colorBar"), "click", function (e) { + var target = me.getTarget(e), + color = target.title; + if (!!color) { + me._addColorSelect(target); + + me.brushColor = color; + context.globalCompositeOperation = "source-over"; + context.lineWidth = me.brushWidth; + context.strokeStyle = color; + } + }); + }, + _addBrushBarListener:function () { + var me = this; + domUtils.on($G("J_brushBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.globalCompositeOperation = "source-over"; + context.lineWidth = parseInt(size); + context.strokeStyle = me.brushColor; + me.brushWidth = context.lineWidth; + } + }); + }, + _addEraserBarListener:function () { + var me = this; + domUtils.on($G("J_eraserBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.lineWidth = parseInt(size); + context.globalCompositeOperation = "destination-out"; + context.strokeStyle = "#FFF"; + } + }); + }, + _addAddImgListener:function () { + var file = $G("J_imgTxt"); + if (!window.FileReader) { + $G("J_addImg").style.display = 'none'; + $G("J_removeImg").style.display = 'none'; + $G("J_sacleBoard").style.display = 'none'; + } + domUtils.on(file, "change", function (e) { + var frm = file.parentNode; + addMaskLayer(lang.backgroundUploading); + + var target = e.target || e.srcElement, + reader = new FileReader(); + reader.onload = function(evt){ + var target = evt.target || evt.srcElement; + ue_callback(target.result, 'SUCCESS'); + }; + reader.readAsDataURL(target.files[0]); + frm.reset(); + }); + }, + _addRemoveImgListenter:function () { + var me = this; + domUtils.on($G("J_removeImg"), "click", function () { + $G("J_picBoard").innerHTML = ""; + me.btn2disable("J_removeImg"); + me.btn2disable("J_sacleBoard"); + }); + }, + _addScalePicListenter:function () { + domUtils.on($G("J_sacleBoard"), "click", function () { + var picBoard = $G("J_picBoard"), + scaleCon = $G("J_scaleCon"), + img = picBoard.children[0]; + + if (img) { + if (!scaleCon) { + picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText; + img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; + var scale = new ScaleBoy(); + picBoard.appendChild(scale.init()); + scale.startScale(img); + } else { + if (scaleCon.style.visibility == "visible") { + scaleCon.style.visibility = "hidden"; + picBoard.style.position = ""; + picBoard.style.zIndex = ""; + } else { + scaleCon.style.visibility = "visible"; + picBoard.style.cssText += "position:relative;z-index:999"; + } + } + } + }); + }, + _addClearSelectionListenter:function () { + var doc = document; + domUtils.on(doc, 'mousemove', function (e) { + if (browser.ie && browser.version < 11) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + }); + }, + _clearSelection:function () { + var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; + for (var i = 0, group; group = list[i++];) { + domUtils.unSelectable($G(group)); + } + }, + + _saveOPerate:function (saveNum) { + var me = this; + if (drawStep.length <= saveNum) { + if(drawStepIndex"); + } + scale.innerHTML = arr.join(""); + return scale; + } + + var rect = [ + //[left, top, width, height] + [1, 1, -1, -1], + [0, 1, 0, -1], + [0, 1, 1, -1], + [1, 0, -1, 0], + [0, 0, 1, 0], + [1, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + ScaleBoy.prototype = { + init:function () { + _appendStyle(); + var me = this, + scale = me.dom = _getDom(); + + me.scaleMousemove.fp = me; + domUtils.on(scale, 'mousedown', function (e) { + var target = e.target || e.srcElement; + me.start = {x:e.clientX, y:e.clientY}; + if (target.className.indexOf('hand') != -1) { + me.dir = target.className.replace('hand', ''); + } + domUtils.on(document.body, 'mousemove', me.scaleMousemove); + e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; + }); + domUtils.on(document.body, 'mouseup', function (e) { + if (me.start) { + domUtils.un(document.body, 'mousemove', me.scaleMousemove); + if (me.moved) { + me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}}); + } + delete me.start; + delete me.moved; + delete me.dir; + } + }); + return scale; + }, + startScale:function (objElement) { + var me = this, Idom = me.dom; + + Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; + me.scalingElement = objElement; + }, + updateScaledElement:function (objStyle) { + var cur = this.scalingElement, + pos = objStyle.position, + size = objStyle.size; + if (pos) { + typeof pos.x != 'undefined' && (cur.style.left = pos.x); + typeof pos.y != 'undefined' && (cur.style.top = pos.y); + } + if (size) { + size.w && (cur.style.width = size.w); + size.h && (cur.style.height = size.h); + } + }, + updateStyleByDir:function (dir, offset) { + var me = this, + dom = me.dom, tmp; + + rect['def'] = [1, 1, 0, 0]; + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + if (dir === 'def') { + me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}}); + } + }, + scaleMousemove:function (e) { + var me = arguments.callee.fp, + start = me.start, + dir = me.dir || 'def', + offset = {x:e.clientX - start.x, y:e.clientY - start.y}; + + me.updateStyleByDir(dir, offset); + arguments.callee.fp.start = {x:e.clientX, y:e.clientY}; + arguments.callee.fp.moved = 1; + }, + _validScaledProp:function (prop, value) { + var ele = this.dom, + wrap = $G("J_picBoard"); + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + } + }; +})(); + +//后台回调 +function ue_callback(url, state) { + var doc = document, + picBorard = $G("J_picBoard"), + img = doc.createElement("img"); + + //图片缩放 + function scale(img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + } + + //移除遮罩层 + removeMaskLayer(); + //状态响应 + if (state == "SUCCESS") { + picBorard.innerHTML = ""; + img.onload = function () { + scale(this, 300); + picBorard.appendChild(img); + + var obj = new scrawl(); + obj.btn2Highlight("J_removeImg"); + //trace 2457 + obj.btn2Highlight("J_sacleBoard"); + }; + img.src = url; + } else { + alert(state); + } +} +//去掉遮罩层 +function removeMaskLayer() { + var maskLayer = $G("J_maskLayer"); + maskLayer.className = "maskLayerNull"; + maskLayer.innerHTML = ""; + dialog.buttons[0].setDisabled(false); +} +//添加遮罩层 +function addMaskLayer(html) { + var maskLayer = $G("J_maskLayer"); + dialog.buttons[0].setDisabled(true); + maskLayer.className = "maskLayer"; + maskLayer.innerHTML = html; +} +//执行确认按钮方法 +function exec(scrawlObj) { + if (scrawlObj.isScrawl) { + addMaskLayer(lang.scrawlUpLoading); + var base64 = scrawlObj.getCanvasData(); + if (!!base64) { + var options = { + timeout:100000, + onsuccess:function (xhr) { + if (!scrawlObj.isCancelScrawl) { + var responseObj; + responseObj = eval("(" + xhr.responseText + ")"); + if (responseObj.state == "SUCCESS") { + var imgObj = {}, + url = editor.options.scrawlUrlPrefix + responseObj.url; + imgObj.src = url; + imgObj._src = url; + imgObj.alt = responseObj.original || ''; + imgObj.title = responseObj.title || ''; + editor.execCommand("insertImage", imgObj); + dialog.close(); + } else { + alert(responseObj.state); + } + + } + }, + onerror:function () { + alert(lang.imageError); + dialog.close(); + } + }; + options[editor.getOpt('scrawlFieldName')] = base64; + + var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')), + params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + ajax.request(url, options); + } + } else { + addMaskLayer(lang.noScarwl + "   "); + } +} + diff --git a/member/editor/ueditor/dialogs/searchreplace/searchreplace.html b/member/editor/ueditor/dialogs/searchreplace/searchreplace.html new file mode 100644 index 0000000..b91f190 --- /dev/null +++ b/member/editor/ueditor/dialogs/searchreplace/searchreplace.html @@ -0,0 +1,102 @@ + + + + + + + + + +
      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + +
      :
      + +
      + + +
      +   +
      + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      :
      :
      + +
      + + + + +
      +   +
      + +
      +
      +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/searchreplace/searchreplace.js b/member/editor/ueditor/dialogs/searchreplace/searchreplace.js new file mode 100644 index 0000000..1b52857 --- /dev/null +++ b/member/editor/ueditor/dialogs/searchreplace/searchreplace.js @@ -0,0 +1,164 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午12:29 + * To change this template use File | Settings | File Templates. + */ + +//清空上次查选的痕迹 +editor.firstForSR = 0; +editor.currentRangeForSR = null; +//给tab注册切换事件 +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head样式更改 + for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body显隐 + var tabSrc = obj.getAttribute( "tabSrc" ); + for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var body = tabBodys[j], + id = body.getAttribute( "id" ); + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +function switchTab( tabParentId ) { + var tabElements = $G( tabParentId ).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +$G('searchtab').onmousedown = function(){ + $G('search-msg').innerHTML = ''; + $G('replace-msg').innerHTML = '' +} +//是否区分大小写 +function getMatchCase(id) { + return $G(id).checked ? true : false; +} +//查找 +$G("nextFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + var bk = editor.selection.getRange().createBookmark(); + $G('search-msg').innerHTML = lang.getEnd; + editor.selection.getRange().moveToBookmark(bk).select(); + + + } +}; +$G("nextReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +$G("preFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + $G('search-msg').innerHTML = lang.getStart; + } +}; +$G("preReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +//替换 +$G("repalceBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt + }; + frCommond(obj); +}; +//全部替换 +$G("repalceAllBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt, + all:true + }; + var num = frCommond(obj); + if (num) { + $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); + } +}; +//执行 +var frCommond = function (obj) { + return editor.execCommand("searchreplace", obj); +}; +switchTab("searchtab"); \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/snapscreen/snapscreen.html b/member/editor/ueditor/dialogs/snapscreen/snapscreen.html new file mode 100644 index 0000000..cf8209e --- /dev/null +++ b/member/editor/ueditor/dialogs/snapscreen/snapscreen.html @@ -0,0 +1,58 @@ + + + + + + + + + +
      +

      +
      +
      +
      +
      +
      +
      + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/spechars/spechars.html b/member/editor/ueditor/dialogs/spechars/spechars.html new file mode 100644 index 0000000..0b5c416 --- /dev/null +++ b/member/editor/ueditor/dialogs/spechars/spechars.html @@ -0,0 +1,21 @@ + + + + + + + + + +
      +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/spechars/spechars.js b/member/editor/ueditor/dialogs/spechars/spechars.js new file mode 100644 index 0000000..f4c155e --- /dev/null +++ b/member/editor/ueditor/dialogs/spechars/spechars.js @@ -0,0 +1,57 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:09 + * To change this template use File | Settings | File Templates. + */ +var charsContent = [ + { name:"tsfh", title:lang.tsfh, content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")}, + { name:"lmsz", title:lang.lmsz, content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")}, + { name:"szfh", title:lang.szfh, content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")}, + { name:"rwfh", title:lang.rwfh, content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")}, + { name:"xlzm", title:lang.xlzm, content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")}, + { name:"ewzm", title:lang.ewzm, content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")}, + { name:"pyzm", title:lang.pyzm, content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")}, + { name:"yyyb", title:lang.yyyb, content:toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")}, + { name:"zyzf", title:lang.zyzf, content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")} +]; +(function createTab(content) { + for (var i = 0, ci; ci = content[i++];) { + var span = document.createElement("span"); + span.setAttribute("tabSrc", ci.name); + span.innerHTML = ci.title; + if (i == 1)span.className = "focus"; + domUtils.on(span, "click", function () { + var tmps = $G("tabHeads").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.className = ""; + } + tmps = $G("tabBodys").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.style.display = "none"; + } + this.className = "focus"; + $G(this.getAttribute("tabSrc")).style.display = ""; + }); + $G("tabHeads").appendChild(span); + domUtils.insertAfter(span, document.createTextNode("\n")); + var div = document.createElement("div"); + div.id = ci.name; + div.style.display = (i == 1) ? "" : "none"; + var cons = ci.content; + for (var j = 0, con; con = cons[j++];) { + var charSpan = document.createElement("span"); + charSpan.innerHTML = con; + domUtils.on(charSpan, "click", function () { + editor.execCommand("insertHTML", this.innerHTML); + dialog.close(); + }); + div.appendChild(charSpan); + } + $G("tabBodys").appendChild(div); + } +})(charsContent); +function toArray(str) { + return str.split(","); +} diff --git a/member/editor/ueditor/dialogs/table/dragicon.png b/member/editor/ueditor/dialogs/table/dragicon.png new file mode 100644 index 0000000..f26203b Binary files /dev/null and b/member/editor/ueditor/dialogs/table/dragicon.png differ diff --git a/member/editor/ueditor/dialogs/table/edittable.css b/member/editor/ueditor/dialogs/table/edittable.css new file mode 100644 index 0000000..c6f9396 --- /dev/null +++ b/member/editor/ueditor/dialogs/table/edittable.css @@ -0,0 +1,84 @@ +body{ + overflow: hidden; + width: 540px; +} +.wrapper { + margin: 10px auto 0; + font-size: 12px; + overflow: hidden; + width: 520px; + height: 315px; +} + +.clear { + clear: both; +} + +.wrapper .left { + float: left; + margin-left: 10px;; +} + +.wrapper .right { + float: right; + border-left: 2px dotted #EDEDED; + padding-left: 15px; +} + +.section { + margin-bottom: 15px; + width: 240px; + overflow: hidden; +} + +.section h3 { + font-weight: bold; + padding: 5px 0; + margin-bottom: 10px; + border-bottom: 1px solid #EDEDED; + font-size: 12px; +} + +.section ul { + list-style: none; + overflow: hidden; + clear: both; + +} + +.section li { + float: left; + width: 120px;; +} + +.section .tone { + width: 80px;; +} + +.section .preview { + width: 220px; +} + +.section .preview table { + text-align: center; + vertical-align: middle; + color: #666; +} + +.section .preview caption { + font-weight: bold; +} + +.section .preview td { + border-width: 1px; + border-style: solid; + height: 22px; +} + +.section .preview th { + border-style: solid; + border-color: #DDD; + border-width: 2px 1px 1px 1px; + height: 22px; + background-color: #F7F7F7; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/table/edittable.html b/member/editor/ueditor/dialogs/table/edittable.html new file mode 100644 index 0000000..3c412fb --- /dev/null +++ b/member/editor/ueditor/dialogs/table/edittable.html @@ -0,0 +1,64 @@ + + + + + + + + +
      +
      +
      +

      +
        +
      • + +
      • +
      • + +
      • +
      +
        +
      • + +
      • +
      • + +
      • +
      +
      +
      +
      +

      +
        +
      • + +
      • +
      • + +
      • +
      +
      +
      +
      +

      +
        +
      • + + +
      • +
      +
      +
      +
      +
      +
      +

      +
      +
      +
      +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/table/edittable.js b/member/editor/ueditor/dialogs/table/edittable.js new file mode 100644 index 0000000..11dbee7 --- /dev/null +++ b/member/editor/ueditor/dialogs/table/edittable.js @@ -0,0 +1,237 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-12-19 + * Time: 下午4:55 + * To change this template use File | Settings | File Templates. + */ +(function () { + var title = $G("J_title"), + titleCol = $G("J_titleCol"), + caption = $G("J_caption"), + sorttable = $G("J_sorttable"), + autoSizeContent = $G("J_autoSizeContent"), + autoSizePage = $G("J_autoSizePage"), + tone = $G("J_tone"), + me, + preview = $G("J_preview"); + + var editTable = function () { + me = this; + me.init(); + }; + editTable.prototype = { + init:function () { + var colorPiker = new UE.ui.ColorPicker({ + editor:editor + }), + colorPop = new UE.ui.Popup({ + editor:editor, + content:colorPiker + }); + + title.checked = editor.queryCommandState("inserttitle") == -1; + titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; + caption.checked = editor.queryCommandState("insertcaption") == -1; + sorttable.checked = editor.queryCommandState("enablesort") == 1; + + var enablesortState = editor.queryCommandState("enablesort"), + disablesortState = editor.queryCommandState("disablesort"); + + sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); + sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); + sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; + + me.createTable(title.checked, titleCol.checked, caption.checked); + me.setAutoSize(); + me.setColor(me.getColor()); + + domUtils.on(title, "click", me.titleHanler); + domUtils.on(titleCol, "click", me.titleColHanler); + domUtils.on(caption, "click", me.captionHanler); + domUtils.on(sorttable, "click", me.sorttableHanler); + domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); + domUtils.on(autoSizePage, "click", me.autoSizePageHanler); + + domUtils.on(tone, "click", function () { + colorPop.showAnchor(tone); + }); + domUtils.on(document, 'mousedown', function () { + colorPop.hide(); + }); + colorPiker.addListener("pickcolor", function () { + me.setColor(arguments[1]); + colorPop.hide(); + }); + colorPiker.addListener("picknocolor", function () { + me.setColor(""); + colorPop.hide(); + }); + }, + + createTable:function (hasTitle, hasTitleCol, hasCaption) { + var arr = [], + sortSpan = '^'; + arr.push(""); + if (hasCaption) { + arr.push("") + } + if (hasTitle) { + arr.push(""); + if(hasTitleCol) { arr.push(""); } + for (var j = 0; j < 5; j++) { + arr.push(""); + } + arr.push(""); + } + for (var i = 0; i < 6; i++) { + arr.push(""); + if(hasTitleCol) { arr.push("") } + for (var k = 0; k < 5; k++) { + arr.push("") + } + arr.push(""); + } + arr.push("
      " + lang.captionName + "
      " + lang.titleName + "" + lang.titleName + "
      " + lang.titleName + "" + lang.cellsName + "
      "); + preview.innerHTML = arr.join(""); + this.updateSortSpan(); + }, + titleHanler:function () { + var example = $G("J_example"), + frg=document.createDocumentFragment(), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colCount = example.rows[0].children.length; + + if (title.checked) { + example.insertRow(0); + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + frg.appendChild(node); + } + example.rows[0].appendChild(frg); + + } else { + domUtils.remove(example.rows[0]); + } + me.setColor(color); + me.updateSortSpan(); + }, + titleColHanler:function () { + var example = $G("J_example"), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colArr = example.rows, + colCount = colArr.length; + + if (titleCol.checked) { + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + colArr[i].insertBefore(node, colArr[i].children[0]); + } + } else { + for (var i = 0; i < colCount; i++) { + domUtils.remove(colArr[i].children[0]); + } + } + me.setColor(color); + me.updateSortSpan(); + }, + captionHanler:function () { + var example = $G("J_example"); + if (caption.checked) { + var row = document.createElement('caption'); + row.innerHTML = lang.captionName; + example.insertBefore(row, example.firstChild); + } else { + domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); + } + }, + sorttableHanler:function(){ + me.updateSortSpan(); + }, + autoSizeContentHanler:function () { + var example = $G("J_example"); + example.removeAttribute("width"); + }, + autoSizePageHanler:function () { + var example = $G("J_example"); + var tds = example.getElementsByTagName(example, "td"); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + example.setAttribute('width', '100%'); + }, + updateSortSpan: function(){ + var example = $G("J_example"), + row = example.rows[0]; + + var spans = domUtils.getElementsByTagName(example,"span"); + utils.each(spans,function(span){ + span.parentNode.removeChild(span); + }); + if (sorttable.checked) { + utils.each(row.cells, function(cell, i){ + var span = document.createElement("span"); + span.innerHTML = "^"; + cell.appendChild(span); + }); + } + }, + getColor:function () { + var start = editor.selection.getStart(), color, + cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + color = cell && domUtils.getComputedStyle(cell, "border-color"); + if (!color) color = "#DDDDDD"; + return color; + }, + setColor:function (color) { + var example = $G("J_example"), + arr = domUtils.getElementsByTagName(example, "td").concat( + domUtils.getElementsByTagName(example, "th"), + domUtils.getElementsByTagName(example, "caption") + ); + + tone.value = color; + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + + }, + setAutoSize:function () { + var me = this; + autoSizePage.checked = true; + me.autoSizePageHanler(); + } + }; + + new editTable; + + dialog.onok = function () { + editor.__hasEnterExecCommand = true; + + var checks = { + title:"inserttitle deletetitle", + titleCol:"inserttitlecol deletetitlecol", + caption:"insertcaption deletecaption", + sorttable:"enablesort disablesort" + }; + editor.fireEvent('saveScene'); + for(var i in checks){ + var cmds = checks[i].split(" "), + input = $G("J_" + i); + if(input["checked"]){ + editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]); + }else{ + editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]); + } + } + + editor.execCommand("edittable", tone.value); + autoSizeContent.checked ?editor.execCommand('adaptbytext') : ""; + autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; + editor.fireEvent('saveScene'); + + editor.__hasEnterExecCommand = false; + }; +})(); \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/table/edittd.html b/member/editor/ueditor/dialogs/table/edittd.html new file mode 100644 index 0000000..49a52f7 --- /dev/null +++ b/member/editor/ueditor/dialogs/table/edittd.html @@ -0,0 +1,61 @@ + + + + + + + + +
      + + +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/table/edittip.html b/member/editor/ueditor/dialogs/table/edittip.html new file mode 100644 index 0000000..954f7bb --- /dev/null +++ b/member/editor/ueditor/dialogs/table/edittip.html @@ -0,0 +1,33 @@ + + + + 表格删除提示 + + + + +
      +
      + +
      +
      + +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/template/config.js b/member/editor/ueditor/dialogs/template/config.js new file mode 100644 index 0000000..417b8f7 --- /dev/null +++ b/member/editor/ueditor/dialogs/template/config.js @@ -0,0 +1,42 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:00 + * To change this template use File | Settings | File Templates. + */ +var templates = [ + { + "pre":"pre0.png", + 'title':lang.blank, + 'preHtml':'

       欢迎使用UEditor!

      ', + "html":'

      欢迎使用UEditor!

      ' + + }, + { + "pre":"pre1.png", + 'title':lang.blog, + 'preHtml':'

      深入理解Range

      UEditor二次开发

      什么是Range

      对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。


      Range能干什么

      在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。

      ', + "html":'

      [键入文档标题]

      [键入文档副标题]

      [标题 1]

      对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。

      [标题 2]

      在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。

      [标题 3]

      对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。


      ' + + }, + { + "pre":"pre2.png", + 'title':lang.resume, + 'preHtml':'

      WEB前端开发简历


      联系电话:[键入您的电话]

      电子邮件:[键入您的电子邮件地址]

      家庭住址:[键入您的地址]

      目标职位

      WEB前端研发工程师

      学历

      1. [起止时间] [学校名称] [所学专业] [所获学位]

      工作经验


      ', + "html":'

      [此处键入简历标题]


      【此处插入照片】


      联系电话:[键入您的电话]


      电子邮件:[键入您的电子邮件地址]


      家庭住址:[键入您的地址]


      目标职位

      [此处键入您的期望职位]

      学历

      1. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

      2. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

      工作经验

      1. [键入起止时间] [键入公司名称] [键入职位名称]

        1. [键入负责项目] [键入项目简介]

        2. [键入负责项目] [键入项目简介]

      2. [键入起止时间] [键入公司名称] [键入职位名称]

        1. [键入负责项目] [键入项目简介]

      掌握技能

       [这里可以键入您所掌握的技能]

      ' + + }, + { + "pre":"pre3.png", + 'title':lang.richText, + 'preHtml':'

      [此处键入文章标题]

      图文混排方法

      图片居左,文字围绕图片排版

      方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文


      还有没有什么其他的环绕方式呢?这里是居右环绕


      欢迎大家多多尝试,为UEditor提供更多高质量模板!

      ', + "html":'


      [此处键入文章标题]

      图文混排方法

      1. 图片居左,文字围绕图片排版

      方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本


      2. 图片居右,文字围绕图片排版

      方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本


      3. 图片居中环绕排版

      方法:亲,这个真心没有办法。。。



      还有没有什么其他的环绕方式呢?这里是居右环绕


      欢迎大家多多尝试,为UEditor提供更多高质量模板!


      占位


      占位


      占位


      占位


      占位



      ' + }, + { + "pre":"pre4.png", + 'title':lang.sciPapers, + 'preHtml':'

      [键入文章标题]

      摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

      标题 1

      这里可以输入很多内容,可以图文混排,可以有列表等。

      标题 2

      1. 列表 1

      2. 列表 2

        1. 多级列表 1

        2. 多级列表 2

      3. 列表 3

      标题 3

      来个文字图文混排的


      ', + 'html':'

      [键入文章标题]

      摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

      标题 1

      这里可以输入很多内容,可以图文混排,可以有列表等。

      标题 2

      来个列表瞅瞅:

      1. 列表 1

      2. 列表 2

        1. 多级列表 1

        2. 多级列表 2

      3. 列表 3

      标题 3

      来个文字图文混排的

      这里可以多行

      右边是图片

      绝对没有问题的,不信你也可以试试看


      ' + } +]; \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/template/images/bg.gif b/member/editor/ueditor/dialogs/template/images/bg.gif new file mode 100644 index 0000000..8c1d10a Binary files /dev/null and b/member/editor/ueditor/dialogs/template/images/bg.gif differ diff --git a/member/editor/ueditor/dialogs/template/images/pre0.png b/member/editor/ueditor/dialogs/template/images/pre0.png new file mode 100644 index 0000000..8f3c16a Binary files /dev/null and b/member/editor/ueditor/dialogs/template/images/pre0.png differ diff --git a/member/editor/ueditor/dialogs/template/images/pre1.png b/member/editor/ueditor/dialogs/template/images/pre1.png new file mode 100644 index 0000000..5a03f96 Binary files /dev/null and b/member/editor/ueditor/dialogs/template/images/pre1.png differ diff --git a/member/editor/ueditor/dialogs/template/images/pre2.png b/member/editor/ueditor/dialogs/template/images/pre2.png new file mode 100644 index 0000000..5a55672 Binary files /dev/null and b/member/editor/ueditor/dialogs/template/images/pre2.png differ diff --git a/member/editor/ueditor/dialogs/template/images/pre3.png b/member/editor/ueditor/dialogs/template/images/pre3.png new file mode 100644 index 0000000..d852d29 Binary files /dev/null and b/member/editor/ueditor/dialogs/template/images/pre3.png differ diff --git a/member/editor/ueditor/dialogs/template/images/pre4.png b/member/editor/ueditor/dialogs/template/images/pre4.png new file mode 100644 index 0000000..0d7bc72 Binary files /dev/null and b/member/editor/ueditor/dialogs/template/images/pre4.png differ diff --git a/member/editor/ueditor/dialogs/template/template.css b/member/editor/ueditor/dialogs/template/template.css new file mode 100644 index 0000000..6c1608d --- /dev/null +++ b/member/editor/ueditor/dialogs/template/template.css @@ -0,0 +1,18 @@ +.wrap{ padding: 5px;font-size: 14px;} +.left{width:425px;float: left;} +.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} +.right .pre{height: 332px;overflow-y: auto;} +.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} +.right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;} +.right .preitem img{display: block;margin: 0 auto;width:100px;} +.clear{clear: both;} +.top{height:26px;line-height: 26px;padding: 5px;} +.bottom{height:320px;width:100%;margin: 0 auto;} +.transparent{ background: url("images/bg.gif") repeat;} +.bottom table tr td{border:1px dashed #ccc;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} +.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +p{margin: 5px 0} +table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} +li{clear:both} +ol{padding-left:40px; } \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/template/template.html b/member/editor/ueditor/dialogs/template/template.html new file mode 100644 index 0000000..d9903a4 --- /dev/null +++ b/member/editor/ueditor/dialogs/template/template.html @@ -0,0 +1,26 @@ + + + + + + + + + +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + + + + diff --git a/member/editor/ueditor/dialogs/template/template.js b/member/editor/ueditor/dialogs/template/template.js new file mode 100644 index 0000000..80a334b --- /dev/null +++ b/member/editor/ueditor/dialogs/template/template.js @@ -0,0 +1,53 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:09 + * To change this template use File | Settings | File Templates. + */ +(function () { + var me = editor, + preview = $G( "preview" ), + preitem = $G( "preitem" ), + tmps = templates, + currentTmp; + var initPre = function () { + var str = ""; + for ( var i = 0, tmp; tmp = tmps[i++]; ) { + str += '
      '; + } + preitem.innerHTML = str; + }; + var pre = function ( n ) { + var tmp = tmps[n - 1]; + currentTmp = tmp; + clearItem(); + domUtils.setStyles( preitem.childNodes[n - 1], { + "background-color":"lemonChiffon", + "border":"#ccc 1px solid" + } ); + preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; + }; + var clearItem = function () { + var items = preitem.children; + for ( var i = 0, item; item = items[i++]; ) { + domUtils.setStyles( item, { + "background-color":"", + "border":"white 1px solid" + } ); + } + }; + dialog.onok = function () { + if ( !$G( "issave" ).checked ){ + me.execCommand( "cleardoc" ); + } + var obj = { + html:currentTmp && currentTmp.html + }; + me.execCommand( "template", obj ); + }; + initPre(); + window.pre = pre; + pre(2) + +})(); \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/video/images/bg.png b/member/editor/ueditor/dialogs/video/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/bg.png differ diff --git a/member/editor/ueditor/dialogs/video/images/center_focus.jpg b/member/editor/ueditor/dialogs/video/images/center_focus.jpg new file mode 100644 index 0000000..262b029 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/center_focus.jpg differ diff --git a/member/editor/ueditor/dialogs/video/images/file-icons.gif b/member/editor/ueditor/dialogs/video/images/file-icons.gif new file mode 100644 index 0000000..d8c02c2 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/file-icons.gif differ diff --git a/member/editor/ueditor/dialogs/video/images/file-icons.png b/member/editor/ueditor/dialogs/video/images/file-icons.png new file mode 100644 index 0000000..3ff82c8 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/file-icons.png differ diff --git a/member/editor/ueditor/dialogs/video/images/icons.gif b/member/editor/ueditor/dialogs/video/images/icons.gif new file mode 100644 index 0000000..78459de Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/icons.gif differ diff --git a/member/editor/ueditor/dialogs/video/images/icons.png b/member/editor/ueditor/dialogs/video/images/icons.png new file mode 100644 index 0000000..12e4700 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/icons.png differ diff --git a/member/editor/ueditor/dialogs/video/images/image.png b/member/editor/ueditor/dialogs/video/images/image.png new file mode 100644 index 0000000..19699f6 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/image.png differ diff --git a/member/editor/ueditor/dialogs/video/images/left_focus.jpg b/member/editor/ueditor/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000..7886d27 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/left_focus.jpg differ diff --git a/member/editor/ueditor/dialogs/video/images/none_focus.jpg b/member/editor/ueditor/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000..7c768dc Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/none_focus.jpg differ diff --git a/member/editor/ueditor/dialogs/video/images/progress.png b/member/editor/ueditor/dialogs/video/images/progress.png new file mode 100644 index 0000000..717c486 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/progress.png differ diff --git a/member/editor/ueditor/dialogs/video/images/right_focus.jpg b/member/editor/ueditor/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000..173e10d Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/right_focus.jpg differ diff --git a/member/editor/ueditor/dialogs/video/images/success.gif b/member/editor/ueditor/dialogs/video/images/success.gif new file mode 100644 index 0000000..8d4f311 Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/success.gif differ diff --git a/member/editor/ueditor/dialogs/video/images/success.png b/member/editor/ueditor/dialogs/video/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/member/editor/ueditor/dialogs/video/images/success.png differ diff --git a/member/editor/ueditor/dialogs/video/player.js b/member/editor/ueditor/dialogs/video/player.js new file mode 100644 index 0000000..0876694 --- /dev/null +++ b/member/editor/ueditor/dialogs/video/player.js @@ -0,0 +1,91 @@ +/* + DESTOON Copyright (C)2008-2099 www.destoon.com + This is NOT a freeware,Use is subject to license.txt +*/ +function player(u, w, h, a) { + var w = w ? w : 480; + var h = h ? h : 270; + var m = '', e = '', t = '', c = '', x = '', d = '', u5 = '', p1 = '', p2 = ''; + var ua = navigator.userAgent.toLowerCase(); + if(ua.indexOf('mac os')!=-1) m = 'Mac'; + if(ua.indexOf('ipad')!=-1) m = 'iPad'; + if(ua.indexOf('iphone')!=-1) m = 'iPhone'; + if(ua.indexOf('ipod')!=-1) m = 'iPod'; + if(ua.indexOf('android')!=-1) m = 'Android'; + x = ext_url(u); + d = _cuturl(u, '://', '/'); + switch(d) { + case 'player.youku.com': + case 'v.qq.com': + case 'm.iqiyi.com': + case 'player.bilibili.com': + case 'www.acfun.cn': + return html_frame(u, w, h); + break; + default: + break; + } + if(m) { + if(x == 'mp4' || x == 'ogg' || x == 'webm') { + u5 = u; + } else if(d.indexOf('.youtube.com')!=-1) { + u5 = url2video5(u); + if(u5) return html_frame(u5, w, h); + } else if(u.indexOf('.huya.com')!=-1) { + u5 = url2video5(u); + if(u5) return html_play(u5); + } else if(d.indexOf('.douyucdn.cn')!=-1) { + u5 = url2video5(u); + if(u5) return html_play(u5); + } + return u5 ? '' : html_play(u); + } + if(x == 'mp4' || x == 'ogg' || x == 'webm') { + return ''; + } else if(d.indexOf('.huya.com')!=-1) { + return html_frame(u, w, h); + } else if(d.indexOf('.douyucdn.cn')!=-1) { + return ''; + } else if(x == 'rm' || x == 'rmvb' || x == 'ram') { + t = 'audio/x-pn-realaudio-extend'; + } else if(x == 'wma' || x == 'wmv') { + t = 'application/x-mplayer2'; + c = 'controls="imagewindow,controlpanel,statusbar"'; + } else { + if(x == 'flv') return ''; + t = 'application/x-shockwave-flash'; + c = 'quality="high" extendspage="http://get.adobe.com/flashplayer/" allowfullscreen="true" allowscriptaccess="never"'; + } + return ''; +} +function _cuturl(str, mark1, mark2) { + var p1 = str.indexOf(mark1); + if(p1 == -1) return ''; + str = str.substr(p1 + mark1.length); + var p2 = str.indexOf(mark2); + if(p2 == -1) return str; + return str.substr(0, p2); +} +function ext_url(v) {return v.substring(v.lastIndexOf('.')+1, v.length).toLowerCase();} +function html_frame(u, w, h) {return '';} +function html_play(u) {return '
      ';} +function url2video5(u) { + var p = ''; + var d = _cuturl(u, '://', '/'); + var h = u.substr(0, 5) == 'https' ? 'https://' : 'http://'; + switch(d) { + case 'www.youtube.com': + p = _cuturl(u, '/v/', '&'); + if(p) return h+'www.youtube.com/embed/'+p; + break; + case 'liveshare.huya.com': + p = _cuturl(u, '/iframe/', '/'); + if(p) return h+'m.huya.com/'+p; + break; + case 'staticlive.douyucdn.cn': + p = _cuturl(u, 'room_id=', '&'); + if(p) return h+'m.douyu.com/'+p; + break; + } + return u; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/video/video.css b/member/editor/ueditor/dialogs/video/video.css new file mode 100644 index 0000000..5870e7a --- /dev/null +++ b/member/editor/ueditor/dialogs/video/video.css @@ -0,0 +1,635 @@ +@charset "utf-8"; +.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative} +.tabbody{height: 335px;} +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} +.tabbody .panel.focus { + width: 100%; + height: 335px; + display: block; +} + +.tabbody .panel table td{vertical-align: middle;} +#videoUrl { + width: 490px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;} +#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;} +#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;} +#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/ +#searchList p{margin-left: 10px;} +#videoType{ + width: 65px; + height: 23px; + line-height: 22px; + border: 1px solid #d7d7d7; +} +#videoSearchBtn,#videoSearchReset{ + /*width: 80px;*/ + height: 25px; + line-height: 25px; + background: #eee; + border: 1px solid #d7d7d7; + cursor: pointer; + padding: 0 5px; +} + + + +#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left} +#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;} +#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;} +#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;} +.edui-video-wrapper fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} + +#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;} +fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} +fieldset legend{font-weight: bold;} +fieldset p{line-height: 30px;} +fieldset input.txt{ + width: 65px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +label.url{font-weight: bold;margin-left: 5px;color: #06c;} +#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)} +span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue} + + + + +/* upload video */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} +.tabbody #upload.panel.focus { + width: 100%; + height: 335px; + display: block; + clip: auto; +} +#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)} +#upload_left { width:427px; float:left; } +#upload_left .controller { height: 30px; clear: both; } +#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;} + +#upload .queueList { + margin: 0; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + margin-right:0; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 161px; + padding-top: 150px; + text-align: center; + width: 97%; + float: left; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *margin-left: 0; + *left: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 285px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 15px 0 0 20px; + *margin: 15px 0 0 15px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + +/* 在线文件的文件预览图标 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} +i.file-preview.file-type-dir{ + background-position: 0 center; +} +i.file-preview.file-type-file{ + background-position: -140px center; +} +i.file-preview.file-type-filelist{ + background-position: -210px center; +} +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2{ + background-position: -280px center; +} +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx{ + background-position: -350px center; +} +i.file-preview.file-type-doc, +i.file-preview.file-type-docx{ + background-position: -420px center; +} +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx{ + background-position: -490px center; +} +i.file-preview.file-type-vsd{ + background-position: -560px center; +} +i.file-preview.file-type-pdf{ + background-position: -630px center; +} +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp{ + background-position: -700px center; +} +i.file-preview.file-type-apk{ + background-position: -770px center; +} +i.file-preview.file-type-exe{ + background-position: -840px center; +} +i.file-preview.file-type-ipa{ + background-position: -910px center; +} +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb{ + background-position: -980px center; +} +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3{ + background-position: -1050px center; +} +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd{ + background-position: -140px center; +} \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/video/video.html b/member/editor/ueditor/dialogs/video/video.html new file mode 100644 index 0000000..878697b --- /dev/null +++ b/member/editor/ueditor/dialogs/video/video.html @@ -0,0 +1,87 @@ + + + + + + + + + +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      + + + + +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      + 0% + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
        +
      • +
      +
      +
      +
      +
      + + + + +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/video/video.js b/member/editor/ueditor/dialogs/video/video.js new file mode 100644 index 0000000..634b8fb --- /dev/null +++ b/member/editor/ueditor/dialogs/video/video.js @@ -0,0 +1,795 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-2-20 + * Time: 上午11:19 + * To change this template use File | Settings | File Templates. + */ + +(function(){ + + var video = {}, + uploadVideoList = [], + isModifyUploadVideo = false, + uploadFile; + + window.onload = function(){ + $focus($G("videoUrl")); + initTabs(); + initVideo(); + initUpload(); + }; + + /* 初始化tab标签 */ + function initTabs(){ + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var j, bodyId, target = e.target || e.srcElement; + for (j = 0; j < tabs.length; j++) { + bodyId = tabs[j].getAttribute('data-content-id'); + if(tabs[j] == target){ + domUtils.addClass(tabs[j], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + }else { + domUtils.removeClasses(tabs[j], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + }); + } + } + + function initVideo(){ + createAlignButton( ["videoFloat", "upload_alignment"] ); + addUrlChangeListener($G("videoUrl")); + addOkListener(); + + //编辑视频时初始化相关信息 + (function(){ + var img = editor.selection.getRange().getClosedNode(),url; + if(img && img.className){ + var hasFakedClass = (img.className == "edui-faked-video"), + hasUploadClass = img.className.indexOf("edui-upload-video")!=-1; + if(hasFakedClass || hasUploadClass) { + $G("videoUrl").value = url = img.getAttribute("_url"); + $G("videoWidth").value = img.width; + $G("videoHeight").value = img.height; + var align = domUtils.getComputedStyle(img,"float"), + parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); + updateAlignButton(parentAlign==="center"?"center":align); + } + if(hasUploadClass) { + isModifyUploadVideo = true; + } + } + createPreviewVideo(url); + })(); + } + + /** + * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 + */ + function addOkListener(){ + dialog.onok = function(){ + $G("preview").innerHTML = ""; + var currentTab = findFocus("tabHeads","tabSrc"); + switch(currentTab){ + case "video": + return insertSingle(); + break; + case "videoSearch": + return insertSearch("searchList"); + break; + case "upload": + return insertUpload(); + break; + } + }; + dialog.oncancel = function(){ + $G("preview").innerHTML = ""; + }; + } + + /** + * 依据传入的align值更新按钮信息 + * @param align + */ + function updateAlignButton( align ) { + var aligns = $G( "videoFloat" ).children; + for ( var i = 0, ci; ci = aligns[i++]; ) { + if ( ci.getAttribute( "name" ) == align ) { + if ( ci.className !="focus" ) { + ci.className = "focus"; + } + } else { + if ( ci.className =="focus" ) { + ci.className = ""; + } + } + } + } + + /** + * 将单个视频信息插入编辑器中 + */ + function insertSingle(){ + var width = $G("videoWidth"), + height = $G("videoHeight"), + url=$G('videoUrl').value, + align = findFocus("videoFloat","name"); + if(!url) return false; + if ( !checkNum( [width, height] ) ) return false; + //console.log(player(url, width.value||420, height.value||280)); + //editor.execCommand("inserthtml",player(url, width.value||420, height.value||280),true); + editor.execCommand('insertvideo', { + url: convert_url(url), + width: width.value, + height: height.value, + align: align + }, isModifyUploadVideo ? 'upload':null); + } + + /** + * 将元素id下的所有代表视频的图片插入编辑器中 + * @param id + */ + function insertSearch(id){ + var imgs = domUtils.getElementsByTagName($G(id),"img"), + videoObjs=[]; + for(var i=0,img; img=imgs[i++];){ + if(img.getAttribute("selected")){ + videoObjs.push({ + url:img.getAttribute("ue_video_url"), + width:420, + height:280, + align:"none" + }); + } + } + editor.execCommand('insertvideo',videoObjs); + } + + /** + * 找到id下具有focus类的节点并返回该节点下的某个属性 + * @param id + * @param returnProperty + */ + function findFocus( id, returnProperty ) { + var tabs = $G( id ).children, + property; + for ( var i = 0, ci; ci = tabs[i++]; ) { + if ( ci.className=="focus" ) { + property = ci.getAttribute( returnProperty ); + break; + } + } + return property; + } + function convert_url(url){ + if ( !url ) return ''; + url = utils.trim(url) + .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') + .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") + .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") + .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") + .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") + .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") + .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") + .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); + + return url; + } + + /** + * 检测传入的所有input框中输入的长宽是否是正数 + * @param nodes input框集合, + */ + function checkNum( nodes ) { + for ( var i = 0, ci; ci = nodes[i++]; ) { + var value = ci.value; + if ( !isNumber( value ) && value) { + alert( lang.numError ); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + } + + /** + * 数字判断 + * @param value + */ + function isNumber( value ) { + return /(0|^[1-9]\d*$)/.test( value ); + } + + /** + * 创建图片浮动选择按钮 + * @param ids + */ + function createAlignButton( ids ) { + for ( var i = 0, ci; ci = ids[i++]; ) { + var floatContainer = $G( ci ), + nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight, "center":lang.block}; + for ( var j in nameMaps ) { + var div = document.createElement( "div" ); + div.setAttribute( "name", j ); + if ( j == "none" ) div.className="focus"; + div.style.cssText = "background:url(images/" + j + "_focus.jpg);"; + div.setAttribute( "title", nameMaps[j] ); + floatContainer.appendChild( div ); + } + switchSelect( ci ); + } + } + + /** + * 选择切换 + * @param selectParentId + */ + function switchSelect( selectParentId ) { + var selects = $G( selectParentId ).children; + for ( var i = 0, ci; ci = selects[i++]; ) { + domUtils.on( ci, "click", function () { + for ( var j = 0, cj; cj = selects[j++]; ) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute( "class" ); + } + this.className = "focus"; + } ) + } + } + + /** + * 监听url改变事件 + * @param url + */ + function addUrlChangeListener(url){ + if (browser.ie) { + url.onpropertychange = function () { + createPreviewVideo( this.value ); + } + } else { + url.addEventListener( "input", function () { + createPreviewVideo( this.value ); + }, false ); + } + } + + /** + * 根据url生成视频预览 + * @param url + */ + function createPreviewVideo(url){ + if ( !url )return; + + var conUrl = convert_url(url); + + conUrl = utils.unhtmlForUrl(conUrl); + $G("preview").innerHTML = player(conUrl, 420, 280); + /* + $G("preview").innerHTML = '
      '+lang.urlError+'
      '+ + '' + + ''; + */ + } + + + /* 插入上传视频 */ + function insertUpload(){ + var videoObjs=[], + uploadDir = editor.getOpt('videoUrlPrefix'), + width = parseInt($G('upload_width').value, 10) || 420, + height = parseInt($G('upload_height').value, 10) || 280, + align = findFocus("upload_alignment","name") || 'none'; + for(var key in uploadVideoList) { + var file = uploadVideoList[key]; + videoObjs.push({ + url: uploadDir + file.url, + width:width, + height:height, + align:align + }); + } + + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } else { + editor.execCommand('insertvideo', videoObjs, 'upload'); + } + } + + /*初始化上传标签*/ + function initUpload(){ + uploadFile = new UploadFile('queueList'); + } + + + /* 上传附件 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')), + fileMaxSize = editor.getOpt('videoMaxSize'), + acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
      ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('videoActionName')) { + $('#filePickerReady').after($('
      ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('videoFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
    • ' + + '

      ' + file.name + '

      ' + + '

      ' + + '

      ' + + '
    • '), + + $btns = $('
      ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
      ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

      ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + uploadVideoList.push({ + 'url': json.url, + 'type': json.type, + 'original':json.original + }); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + refresh: function(){ + this.uploader.refresh(); + } + }; + +})(); diff --git a/member/editor/ueditor/dialogs/webapp/webapp.html b/member/editor/ueditor/dialogs/webapp/webapp.html new file mode 100644 index 0000000..1614377 --- /dev/null +++ b/member/editor/ueditor/dialogs/webapp/webapp.html @@ -0,0 +1,53 @@ + + + + + + + + + +
      +
      +
      + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/wordimage/fClipboard_ueditor.swf b/member/editor/ueditor/dialogs/wordimage/fClipboard_ueditor.swf new file mode 100644 index 0000000..ac5d27f Binary files /dev/null and b/member/editor/ueditor/dialogs/wordimage/fClipboard_ueditor.swf differ diff --git a/member/editor/ueditor/dialogs/wordimage/imageUploader.swf b/member/editor/ueditor/dialogs/wordimage/imageUploader.swf new file mode 100644 index 0000000..2a554ca Binary files /dev/null and b/member/editor/ueditor/dialogs/wordimage/imageUploader.swf differ diff --git a/member/editor/ueditor/dialogs/wordimage/tangram.js b/member/editor/ueditor/dialogs/wordimage/tangram.js new file mode 100644 index 0000000..2ebd8fd --- /dev/null +++ b/member/editor/ueditor/dialogs/wordimage/tangram.js @@ -0,0 +1,1495 @@ +// Copyright (c) 2009, Baidu Inc. All rights reserved. +// +// Licensed under the BSD License +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http:// tangram.baidu.com/license.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /** + * @namespace T Tangram七巧板 + * @name T + * @version 1.6.0 +*/ + +/** + * 声明baidu包 + * @author: allstar, erik, meizz, berg + */ +var T, + baidu = T = baidu || {version: "1.5.0"}; +baidu.guid = "$BAIDU$"; +baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}}; + +/** + * 使用flash资源封装的一些功能 + * @namespace baidu.flash + */ +baidu.flash = baidu.flash || {}; + +/** + * 操作dom的方法 + * @namespace baidu.dom + */ +baidu.dom = baidu.dom || {}; + + +/** + * 从文档中获取指定的DOM元素 + * @name baidu.dom.g + * @function + * @grammar baidu.dom.g(id) + * @param {string|HTMLElement} id 元素的id或DOM元素. + * @shortcut g,T.G + * @meta standard + * @see baidu.dom.q + * + * @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数. + */ +baidu.dom.g = function(id) { + if (!id) return null; + if ('string' == typeof id || id instanceof String) { + return document.getElementById(id); + } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { + return id; + } + return null; +}; +baidu.g = baidu.G = baidu.dom.g; + + +/** + * 操作数组的方法 + * @namespace baidu.array + */ + +baidu.array = baidu.array || {}; + + +/** + * 遍历数组中所有元素 + * @name baidu.array.each + * @function + * @grammar baidu.array.each(source, iterator[, thisObject]) + * @param {Array} source 需要遍历的数组 + * @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。 + * @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组 + * @remark + * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。 + * @shortcut each + * @meta standard + * + * @returns {Array} 遍历的数组 + */ + +baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) { + var returnValue, item, i, len = source.length; + + if ('function' == typeof iterator) { + for (i = 0; i < len; i++) { + item = source[i]; + returnValue = iterator.call(thisObject || source, item, i); + + if (returnValue === false) { + break; + } + } + } + return source; +}; + +/** + * 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。 + * @namespace baidu.lang + */ +baidu.lang = baidu.lang || {}; + + +/** + * 判断目标参数是否为function或Function实例 + * @name baidu.lang.isFunction + * @function + * @grammar baidu.lang.isFunction(source) + * @param {Any} source 目标参数 + * @version 1.2 + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * @meta standard + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isFunction = function (source) { + return '[object Function]' == Object.prototype.toString.call(source); +}; + +/** + * 判断目标参数是否string类型或String对象 + * @name baidu.lang.isString + * @function + * @grammar baidu.lang.isString(source) + * @param {Any} source 目标参数 + * @shortcut isString + * @meta standard + * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isString = function (source) { + return '[object String]' == Object.prototype.toString.call(source); +}; +baidu.isString = baidu.lang.isString; + + +/** + * 判断浏览器类型和特性的属性 + * @namespace baidu.browser + */ +baidu.browser = baidu.browser || {}; + + +/** + * 判断是否为opera浏览器 + * @property opera opera版本号 + * @grammar baidu.browser.opera + * @meta standard + * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome + * @returns {Number} opera版本号 + */ + +/** + * opera 从10开始不是用opera后面的字符串进行版本的判断 + * 在Browser identification最后添加Version + 数字进行版本标识 + * opera后面的数字保持在9.80不变 + */ +baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ? + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined; + + +/** + * 在目标元素的指定位置插入HTML代码 + * @name baidu.dom.insertHTML + * @function + * @grammar baidu.dom.insertHTML(element, position, html) + * @param {HTMLElement|string} element 目标元素或目标元素的id + * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd + * @param {string} html 要插入的html + * @remark + * + * 对于position参数,大小写不敏感
      + * 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
      + * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 + * + * @shortcut insertHTML + * @meta standard + * + * @returns {HTMLElement} 目标元素 + */ +baidu.dom.insertHTML = function (element, position, html) { + element = baidu.dom.g(element); + var range,begin; + if (element.insertAdjacentHTML && !baidu.browser.opera) { + element.insertAdjacentHTML(position, html); + } else { + range = element.ownerDocument.createRange(); + position = position.toUpperCase(); + if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { + range.selectNodeContents(element); + range.collapse(position == 'AFTERBEGIN'); + } else { + begin = position == 'BEFOREBEGIN'; + range[begin ? 'setStartBefore' : 'setEndAfter'](element); + range.collapse(begin); + } + range.insertNode(range.createContextualFragment(html)); + } + return element; +}; + +baidu.insertHTML = baidu.dom.insertHTML; + +/** + * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号 + * @namespace baidu.swf + */ +baidu.swf = baidu.swf || {}; + + +/** + * 浏览器支持的flash插件版本 + * @property version 浏览器支持的flash插件版本 + * @grammar baidu.swf.version + * @return {String} 版本号 + * @meta standard + */ +baidu.swf.version = (function () { + var n = navigator; + if (n.plugins && n.mimeTypes.length) { + var plugin = n.plugins["Shockwave Flash"]; + if (plugin && plugin.description) { + return plugin.description + .replace(/([a-zA-Z]|\s)+/, "") + .replace(/(\s)+r/, ".") + ".0"; + } + } else if (window.ActiveXObject && !window.opera) { + for (var i = 12; i >= 2; i--) { + try { + var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); + if (c) { + var version = c.GetVariable("$version"); + return version.replace(/WIN/g,'').replace(/,/g,'.'); + } + } catch(e) {} + } + } +})(); + +/** + * 操作字符串的方法 + * @namespace baidu.string + */ +baidu.string = baidu.string || {}; + + +/** + * 对目标字符串进行html编码 + * @name baidu.string.encodeHTML + * @function + * @grammar baidu.string.encodeHTML(source) + * @param {string} source 目标字符串 + * @remark + * 编码字符有5个:&<>"' + * @shortcut encodeHTML + * @meta standard + * @see baidu.string.decodeHTML + * + * @returns {string} html编码后的字符串 + */ +baidu.string.encodeHTML = function (source) { + return String(source) + .replace(/&/g,'&') + .replace(//g,'>') + .replace(/"/g, """) + .replace(/'/g, "'"); +}; + +baidu.encodeHTML = baidu.string.encodeHTML; + +/** + * 创建flash对象的html字符串 + * @name baidu.swf.createHTML + * @function + * @grammar baidu.swf.createHTML(options) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @see baidu.swf.create + * @meta standard + * @returns {string} flash对象的html字符串 + */ +baidu.swf.createHTML = function (options) { + options = options || {}; + var version = baidu.swf.version, + needVersion = options['ver'] || '6.0.0', + vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, + encodeHTML = baidu.string.encodeHTML; + for (k in options) { + tmpOpt[k] = options[k]; + } + options = tmpOpt; + if (version) { + version = version.split('.'); + needVersion = needVersion.split('.'); + for (i = 0; i < 3; i++) { + vUnit1 = parseInt(version[i], 10); + vUnit2 = parseInt(needVersion[i], 10); + if (vUnit2 < vUnit1) { + break; + } else if (vUnit2 > vUnit1) { + return ''; + } + } + } else { + return ''; + } + + var vars = options['vars'], + objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; + options['align'] = options['align'] || 'middle'; + options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; + options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; + options['movie'] = options['url'] || ''; + delete options['vars']; + delete options['url']; + if ('string' == typeof vars) { + options['flashvars'] = vars; + } else { + var fvars = []; + for (k in vars) { + item = vars[k]; + fvars.push(k + "=" + encodeURIComponent(item)); + } + options['flashvars'] = fvars.join('&'); + } + var str = [''); + var params = { + 'wmode' : 1, + 'scale' : 1, + 'quality' : 1, + 'play' : 1, + 'loop' : 1, + 'menu' : 1, + 'salign' : 1, + 'bgcolor' : 1, + 'base' : 1, + 'allowscriptaccess' : 1, + 'allownetworking' : 1, + 'allowfullscreen' : 1, + 'seamlesstabbing' : 1, + 'devicefont' : 1, + 'swliveconnect' : 1, + 'flashvars' : 1, + 'movie' : 1 + }; + + for (k in options) { + item = options[k]; + k = k.toLowerCase(); + if (params[k] && (item || item === false || item === 0)) { + str.push(''); + } + } + options['src'] = options['movie']; + options['name'] = options['id']; + delete options['id']; + delete options['movie']; + delete options['classid']; + delete options['codebase']; + options['type'] = 'application/x-shockwave-flash'; + options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; + str.push(''); + + return str.join(''); +}; + + +/** + * 在页面中创建一个flash对象 + * @name baidu.swf.create + * @function + * @grammar baidu.swf.create(options[, container]) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。 + * @meta standard + * @see baidu.swf.createHTML,baidu.swf.getMovie + */ +baidu.swf.create = function (options, target) { + options = options || {}; + var html = baidu.swf.createHTML(options) + || options['errorMessage'] + || ''; + + if (target && 'string' == typeof target) { + target = document.getElementById(target); + } + baidu.dom.insertHTML( target || document.body ,'beforeEnd',html ); +}; +/** + * 判断是否为ie浏览器 + * @name baidu.browser.ie + * @field + * @grammar baidu.browser.ie + * @returns {Number} IE版本号 + */ +baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined; + +/** + * 移除数组中的项 + * @name baidu.array.remove + * @function + * @grammar baidu.array.remove(source, match) + * @param {Array} source 需要移除项的数组 + * @param {Any} match 要移除的项 + * @meta standard + * @see baidu.array.removeAt + * + * @returns {Array} 移除后的数组 + */ +baidu.array.remove = function (source, match) { + var len = source.length; + + while (len--) { + if (len in source && source[len] === match) { + source.splice(len, 1); + } + } + return source; +}; + +/** + * 判断目标参数是否Array对象 + * @name baidu.lang.isArray + * @function + * @grammar baidu.lang.isArray(source) + * @param {Any} source 目标参数 + * @meta standard + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isArray = function (source) { + return '[object Array]' == Object.prototype.toString.call(source); +}; + + + +/** + * 将一个变量转换成array + * @name baidu.lang.toArray + * @function + * @grammar baidu.lang.toArray(source) + * @param {mix} source 需要转换成array的变量 + * @version 1.3 + * @meta standard + * @returns {array} 转换后的array + */ +baidu.lang.toArray = function (source) { + if (source === null || source === undefined) + return []; + if (baidu.lang.isArray(source)) + return source; + if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { + return [source]; + } + if (source.item) { + var l = source.length, array = new Array(l); + while (l--) + array[l] = source[l]; + return array; + } + + return [].slice.call(source); +}; + +/** + * 获得flash对象的实例 + * @name baidu.swf.getMovie + * @function + * @grammar baidu.swf.getMovie(name) + * @param {string} name flash对象的名称 + * @see baidu.swf.create + * @meta standard + * @returns {HTMLElement} flash对象的实例 + */ +baidu.swf.getMovie = function (name) { + var movie = document[name], ret; + return baidu.browser.ie == 9 ? + movie && movie.length ? + (ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){ + return item.tagName.toLowerCase() != "embed"; + })).length == 1 ? ret[0] : ret + : movie + : movie || window[name]; +}; + + +baidu.flash._Base = (function(){ + + var prefix = 'bd__flash__'; + + /** + * 创建一个随机的字符串 + * @private + * @return {String} + */ + function _createString(){ + return prefix + Math.floor(Math.random() * 2147483648).toString(36); + }; + + /** + * 检查flash状态 + * @private + * @param {Object} target flash对象 + * @return {Boolean} + */ + function _checkReady(target){ + if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){ + return true; + }else{ + return false; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @param {Array} callQueue 调用队列 + * @param {Object} target flash对象 + * @return {Null} + */ + function _callFn(callQueue, target){ + var result = null; + + callQueue = callQueue.reverse(); + baidu.each(callQueue, function(item){ + result = target.call(item.fnName, item.params); + item.callBack(result); + }); + }; + + /** + * 为传入的匿名函数创建函数名 + * @private + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + function _createFunName(fun){ + var name = ''; + + if(baidu.lang.isFunction(fun)){ + name = _createString(); + window[name] = function(){ + fun.apply(window, arguments); + }; + + return name; + }else if(baidu.lang.isString){ + return fun; + } + }; + + /** + * 绘制flash + * @private + * @param {Object} options 创建参数 + * @return {Object} + */ + function _render(options){ + if(!options.id){ + options.id = _createString(); + } + + var container = options.container || ''; + delete(options.container); + + baidu.swf.create(options, container); + + return baidu.swf.getMovie(options.id); + }; + + return function(options, callBack){ + var me = this, + autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), + createOptions = options.createOptions || {}, + target = null, + isReady = false, + callQueue = [], + timeHandle = null, + callBack = callBack || []; + + /** + * 将flash文件绘制到页面上 + * @public + * @return {Null} + */ + me.render = function(){ + target = _render(createOptions); + + if(callBack.length > 0){ + baidu.each(callBack, function(funName, index){ + callBack[index] = _createFunName(options[funName] || new Function()); + }); + } + me.call('setJSFuncName', [callBack]); + }; + + /** + * 返回flash状态 + * @return {Boolean} + */ + me.isReady = function(){ + return isReady; + }; + + /** + * 调用flash接口的统一入口 + * @param {String} fnName 调用的函数名 + * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组 + * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数 + * @return {Null} + */ + me.call = function(fnName, params, callBack){ + if(!fnName) return null; + callBack = callBack || new Function(); + + var result = null; + + if(isReady){ + result = target.call(fnName, params); + callBack(result); + }else{ + callQueue.push({ + fnName: fnName, + params: params, + callBack: callBack + }); + + (!timeHandle) && (timeHandle = setInterval(_check, 200)); + } + }; + + /** + * 为传入的匿名函数创建函数名 + * @public + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + me.createFunName = function(fun){ + return _createFunName(fun); + }; + + /** + * 检查flash是否ready, 并进行调用 + * @private + * @return {Null} + */ + function _check(){ + if(_checkReady(target)){ + clearInterval(timeHandle); + timeHandle = null; + _call(); + + isReady = true; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @return {Null} + */ + function _call(){ + _callFn(callQueue, target); + callQueue = []; + } + + autoRender && me.render(); + }; +})(); + + + +/** + * 创建flash based imageUploader + * @class + * @grammar baidu.flash.imageUploader(options) + * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {Object} vars 创建imageUploader时所需要的参数 + * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除 + * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除 + * @config {Number} vars.picWidth 单张预览图片的宽度 + * @config {Number} vars.picHeight 单张预览图片的高度 + * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata' + * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc' + * @config {Number} vars.maxSize 文件的最大体积,单位'MB' + * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩 + * @config {Number} vars.maxNum:32 最大上传多少个文件 + * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩 + * @config {String} vars.url 上传的url地址 + * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0 + * @see baidu.swf.createHTML + * @param {String} backgroundUrl 背景图片路径 + * @param {String} listBacgroundkUrl 布局控件背景 + * @param {String} buttonUrl 按钮图片不背景 + * @param {String|Function} selectFileCallback 选择文件的回调 + * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调 + * @param {String|Function} deleteFileCallback 删除文件的回调 + * @param {String|Function} startUploadCallback 开始上传某个文件时的回调 + * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调 + * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调 + * @param {String|Function} allCompleteCallback 全部上传完成时的回调 + * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用 + */ +baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){ + + var me = this, + options = options || {}, + _flash = new baidu.flash._Base(options, [ + 'selectFileCallback', + 'exceedFileCallback', + 'deleteFileCallback', + 'startUploadCallback', + 'uploadCompleteCallback', + 'uploadErrorCallback', + 'allCompleteCallback', + 'changeFlashHeight' + ]); + /** + * 开始或回复上传图片 + * @public + * @return {Null} + */ + me.upload = function(){ + _flash.call('upload'); + }; + + /** + * 暂停上传图片 + * @public + * @return {Null} + */ + me.pause = function(){ + _flash.call('pause'); + }; + me.addCustomizedParams = function(index,obj){ + _flash.call('addCustomizedParams',[index,obj]); + } +}; + +/** + * 操作原生对象的方法 + * @namespace baidu.object + */ +baidu.object = baidu.object || {}; + + +/** + * 将源对象的所有属性拷贝到目标对象中 + * @author erik + * @name baidu.object.extend + * @function + * @grammar baidu.object.extend(target, source) + * @param {Object} target 目标对象 + * @param {Object} source 源对象 + * @see baidu.array.merge + * @remark + * +1.目标对象中,与源对象key相同的成员将会被覆盖。
      +2.源对象的prototype成员不会拷贝。 + + * @shortcut extend + * @meta standard + * + * @returns {Object} 目标对象 + */ +baidu.extend = +baidu.object.extend = function (target, source) { + for (var p in source) { + if (source.hasOwnProperty(p)) { + target[p] = source[p]; + } + } + + return target; +}; + + + + + +/** + * 创建flash based fileUploader + * @class + * @grammar baidu.flash.fileUploader(options) + * @param {Object} options + * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {String} createOptions.width + * @config {String} createOptions.height + * @config {Number} maxNum 最大可选文件数 + * @config {Function|String} selectFile + * @config {Function|String} exceedMaxSize + * @config {Function|String} deleteFile + * @config {Function|String} uploadStart + * @config {Function|String} uploadComplete + * @config {Function|String} uploadError + * @config {Function|String} uploadProgress + */ +baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){ + var me = this, + options = options || {}; + + options.createOptions = baidu.extend({ + wmod: 'transparent' + },options.createOptions || {}); + + var _flash = new baidu.flash._Base(options, [ + 'selectFile', + 'exceedMaxSize', + 'deleteFile', + 'uploadStart', + 'uploadComplete', + 'uploadError', + 'uploadProgress' + ]); + + _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); + + /** + * 设置当鼠标移动到flash上时,是否变成手型 + * @public + * @param {Boolean} isCursor + * @return {Null} + */ + me.setHandCursor = function(isCursor){ + _flash.call('setHandCursor', [isCursor || false]); + }; + + /** + * 设置鼠标相应函数名 + * @param {String|Function} fun + */ + me.setMSFunName = function(fun){ + _flash.call('setMSFunName',[_flash.createFunName(fun)]); + }; + + /** + * 执行上传操作 + * @param {String} url 上传的url + * @param {String} fieldName 上传的表单字段名 + * @param {Object} postData 键值对,上传的POST数据 + * @param {Number|Array|null|-1} [index]上传的文件序列 + * Int值上传该文件 + * Array一次串行上传该序列文件 + * -1/null上传所有文件 + * @return {Null} + */ + me.upload = function(url, fieldName, postData, index){ + + if(typeof url !== 'string' || typeof fieldName !== 'string') return null; + if(typeof index === 'undefined') index = -1; + + _flash.call('upload', [url, fieldName, postData, index]); + }; + + /** + * 取消上传操作 + * @public + * @param {Number|-1} index + */ + me.cancel = function(index){ + if(typeof index === 'undefined') index = -1; + _flash.call('cancel', [index]); + }; + + /** + * 删除文件 + * @public + * @param {Number|Array} [index] 要删除的index,不传则全部删除 + * @param {Function} callBack + * */ + me.deleteFile = function(index, callBack){ + + var callBackAll = function(list){ + callBack && callBack(list); + }; + + if(typeof index === 'undefined'){ + _flash.call('deleteFilesAll', [], callBackAll); + return; + }; + + if(typeof index === 'Number') index = [index]; + index.sort(function(a,b){ + return b-a; + }); + baidu.each(index, function(item){ + _flash.call('deleteFileBy', item, callBackAll); + }); + }; + + /** + * 添加文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.addFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('addFileTypes', type); + }; + + /** + * 设置文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.setFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('setFileTypes', type); + }; + + /** + * 设置可选文件的数量限制 + * @public + * @param {Number} num + * @return {Null} + */ + me.setMaxNum = function(num){ + _flash.call('setMaxNum', [num]); + }; + + /** + * 设置可选文件大小限制,以兆M为单位 + * @public + * @param {Number} num,0为无限制 + * @return {Null} + */ + me.setMaxSize = function(num){ + _flash.call('setMaxSize', [num]); + }; + + /** + * @public + */ + me.getFileAll = function(callBack){ + _flash.call('getFileAll', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {Function} [callBack] + */ + me.getFileByIndex = function(index, callBack){ + _flash.call('getFileByIndex', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {function} [callBack] + */ + me.getStatusByIndex = function(index, callBack){ + _flash.call('getStatusByIndex', [], callBack); + }; +}; + +/** + * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调 + * @namespace baidu.sio + */ +baidu.sio = baidu.sio || {}; + +/** + * + * @param {HTMLElement} src script节点 + * @param {String} url script节点的地址 + * @param {String} [charset] 编码 + */ +baidu.sio._createScriptTag = function(scr, url, charset){ + scr.setAttribute('type', 'text/javascript'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); +}; + +/** + * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题 + * + * @param {HTMLElement} src script节点 + */ +baidu.sio._removeScriptTag = function(scr){ + if (scr.clearAttributes) { + scr.clearAttributes(); + } else { + for (var attr in scr) { + if (scr.hasOwnProperty(attr)) { + delete scr[attr]; + } + } + } + if(scr && scr.parentNode){ + scr.parentNode.removeChild(scr); + } + scr = null; +}; + + +/** + * 通过script标签加载数据,加载完成由浏览器端触发回调 + * @name baidu.sio.callByBrowser + * @function + * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) + * @param {string} url 加载数据的url + * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名 + * @param {Object} opt_options 其他可选项 + * @config {String} [charset] script的字符集 + * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 1、与callByServer不同,callback参数只支持Function类型,不支持string。 + * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。 + * @meta standard + * @see baidu.sio.callByServer + */ +baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { + var scr = document.createElement("SCRIPT"), + scriptLoaded = 0, + options = opt_options || {}, + charset = options['charset'], + callback = opt_callback || function(){}, + timeOut = options['timeOut'] || 0, + timer; + scr.onload = scr.onreadystatechange = function () { + if (scriptLoaded) { + return; + } + + var readyState = scr.readyState; + if ('undefined' == typeof readyState + || readyState == "loaded" + || readyState == "complete") { + scriptLoaded = 1; + try { + callback(); + clearTimeout(timer); + } finally { + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + } + } + }; + + if( timeOut ){ + timer = setTimeout(function(){ + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + options.onfailure && options.onfailure(); + }, timeOut); + } + + baidu.sio._createScriptTag(scr, url, charset); +}; + +/** + * 通过script标签加载数据,加载完成由服务器端触发回调 + * @name baidu.sio.callByServer + * @function + * @grammar baidu.sio.callByServer(url, callback[, opt_options]) + * @param {string} url 加载数据的url. + * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名. + * @param {Object} opt_options 加载数据时的选项. + * @config {string} [charset] script的字符集 + * @config {string} [queryField] 服务器端callback请求字段名,默认为callback + * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。 + * @meta standard + * @see baidu.sio.callByBrowser + */ +baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) { + var scr = document.createElement('SCRIPT'), + prefix = 'bd__cbs__', + callbackName, + callbackImpl, + options = opt_options || {}, + charset = options['charset'], + queryField = options['queryField'] || 'callback', + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), + matches; + + if (baidu.lang.isFunction(callback)) { + callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackName] = getCallBack(0); + } else if(baidu.lang.isString(callback)){ + callbackName = callback; + } else { + if (matches = reg.exec(url)) { + callbackName = matches[2]; + } + } + + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + url = url.replace(reg, '\x241' + queryField + '=' + callbackName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; + } + baidu.sio._createScriptTag(scr, url, charset); + + /* + * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行 + */ + function getCallBack(onTimeOut){ + /*global callbackName, callback, scr, options;*/ + return function(){ + try { + if( onTimeOut ){ + options.onfailure && options.onfailure(); + }else{ + callback.apply(window, arguments); + clearTimeout(timer); + } + window[callbackName] = null; + delete window[callbackName]; + } catch (exception) { + } finally { + baidu.sio._removeScriptTag(scr); + } + } + } +}; + +/** + * 通过请求一个图片的方式令服务器存储一条日志 + * @function + * @grammar baidu.sio.log(url) + * @param {string} url 要发送的地址. + * @author: int08h,leeight + */ +baidu.sio.log = function(url) { + var img = new Image(), + key = 'tangram_sio_log_' + Math.floor(Math.random() * + 2147483648).toString(36); + window[key] = img; + + img.onload = img.onerror = img.onabort = function() { + img.onload = img.onerror = img.onabort = null; + + window[key] = null; + img = null; + }; + img.src = url; +}; + + + +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json.js + * author: erik + * version: 1.1.0 + * date: 2009/12/02 + */ + + +/** + * 操作json对象的方法 + * @namespace baidu.json + */ +baidu.json = baidu.json || {}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/parse.js + * author: erik, berg + * version: 1.2 + * date: 2009/11/23 + */ + + + +/** + * 将字符串解析成json对象。注:不会自动祛除空格 + * @name baidu.json.parse + * @function + * @grammar baidu.json.parse(data) + * @param {string} source 需要解析的字符串 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.stringify,baidu.json.decode + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.parse = function (data) { + //2010/12/09:更新至不使用原生parse,不检测用户输入是否正确 + return (new Function("return (" + data + ")"))(); +}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/decode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替 + * @name baidu.json.decode + * @function + * @grammar baidu.json.decode(source) + * @param {string} source 需要解析的字符串 + * @meta out + * @see baidu.json.encode,baidu.json.parse + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.decode = baidu.json.parse; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/stringify.js + * author: erik + * version: 1.1.0 + * date: 2010/01/11 + */ + + + +/** + * 将json对象序列化 + * @name baidu.json.stringify + * @function + * @grammar baidu.json.stringify(value) + * @param {JSON} value 需要序列化的json对象 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.parse,baidu.json.encode + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.stringify = (function () { + /** + * 字符串处理时需要转义的字符表 + * @private + */ + var escapeMap = { + "\b": '\\b', + "\t": '\\t', + "\n": '\\n', + "\f": '\\f', + "\r": '\\r', + '"' : '\\"', + "\\": '\\\\' + }; + + /** + * 字符串序列化 + * @private + */ + function encodeString(source) { + if (/["\\\x00-\x1f]/.test(source)) { + source = source.replace( + /["\\\x00-\x1f]/g, + function (match) { + var c = escapeMap[match]; + if (c) { + return c; + } + c = match.charCodeAt(); + return "\\u00" + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }); + } + return '"' + source + '"'; + } + + /** + * 数组序列化 + * @private + */ + function encodeArray(source) { + var result = ["["], + l = source.length, + preComma, i, item; + + for (i = 0; i < l; i++) { + item = source[i]; + + switch (typeof item) { + case "undefined": + case "function": + case "unknown": + break; + default: + if(preComma) { + result.push(','); + } + result.push(baidu.json.stringify(item)); + preComma = 1; + } + } + result.push("]"); + return result.join(""); + } + + /** + * 处理日期序列化时的补零 + * @private + */ + function pad(source) { + return source < 10 ? '0' + source : source; + } + + /** + * 日期序列化 + * @private + */ + function encodeDate(source){ + return '"' + source.getFullYear() + "-" + + pad(source.getMonth() + 1) + "-" + + pad(source.getDate()) + "T" + + pad(source.getHours()) + ":" + + pad(source.getMinutes()) + ":" + + pad(source.getSeconds()) + '"'; + } + + return function (value) { + switch (typeof value) { + case 'undefined': + return 'undefined'; + + case 'number': + return isFinite(value) ? String(value) : "null"; + + case 'string': + return encodeString(value); + + case 'boolean': + return String(value); + + default: + if (value === null) { + return 'null'; + } else if (value instanceof Array) { + return encodeArray(value); + } else if (value instanceof Date) { + return encodeDate(value); + } else { + var result = ['{'], + encode = baidu.json.stringify, + preComma, + item; + + for (var key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + item = value[key]; + switch (typeof item) { + case 'undefined': + case 'unknown': + case 'function': + break; + default: + if (preComma) { + result.push(','); + } + preComma = 1; + result.push(encode(key) + ':' + encode(item)); + } + } + } + result.push('}'); + return result.join(''); + } + } + }; +})(); +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/encode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替 + * @name baidu.json.encode + * @function + * @grammar baidu.json.encode(value) + * @param {JSON} value 需要序列化的json对象 + * @meta out + * @see baidu.json.decode,baidu.json.stringify + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.encode = baidu.json.stringify; diff --git a/member/editor/ueditor/dialogs/wordimage/wordimage.html b/member/editor/ueditor/dialogs/wordimage/wordimage.html new file mode 100644 index 0000000..6cf6067 --- /dev/null +++ b/member/editor/ueditor/dialogs/wordimage/wordimage.html @@ -0,0 +1,111 @@ + + + + + + + + + +
      +
      + +
      +
      +
      +
      +
      + +
      + : +
      +
      +
      + + + + + + \ No newline at end of file diff --git a/member/editor/ueditor/dialogs/wordimage/wordimage.js b/member/editor/ueditor/dialogs/wordimage/wordimage.js new file mode 100644 index 0000000..98f3a22 --- /dev/null +++ b/member/editor/ueditor/dialogs/wordimage/wordimage.js @@ -0,0 +1,157 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-1-30 + * Time: 下午12:50 + * To change this template use File | Settings | File Templates. + */ + + + +var wordImage = {}; +//(function(){ +var g = baidu.g, + flashObj,flashContainer; + +wordImage.init = function(opt, callbacks) { + showLocalPath("localPath"); + //createCopyButton("clipboard","localPath"); + createFlashUploader(opt, callbacks); + addUploadListener(); + addOkListener(); +}; + +function hideFlash(){ + flashObj = null; + flashContainer.innerHTML = ""; +} +function addOkListener() { + dialog.onok = function() { + if (!imageUrls.length) return; + var urlPrefix = editor.getOpt('imageUrlPrefix'), + images = domUtils.getElementsByTagName(editor.document,"img"); + editor.fireEvent('saveScene'); + for (var i = 0,img; img = images[i++];) { + var src = img.getAttribute("word_img"); + if (!src) continue; + for (var j = 0,url; url = imageUrls[j++];) { + if (src.indexOf(url.original.replace(" ","")) != -1) { + img.src = urlPrefix + url.url; + img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 + img.setAttribute("title",url.title); + domUtils.removeAttributes(img, ["word_img","style","width","height"]); + editor.fireEvent("selectionchange"); + break; + } + } + } + editor.fireEvent('saveScene'); + hideFlash(); + }; + dialog.oncancel = function(){ + hideFlash(); + } +} + +/** + * 绑定开始上传事件 + */ +function addUploadListener() { + g("upload").onclick = function () { + flashObj.upload(); + this.style.display = "none"; + }; +} + +function showLocalPath(id) { + //单张编辑 + var img = editor.selection.getRange().getClosedNode(); + var images = editor.execCommand('wordimage'); + if(images.length==1 || img && img.tagName == 'IMG'){ + g(id).value = images[0]; + return; + } + var path = images[0]; + var leftSlashIndex = path.lastIndexOf("/")||0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种 + rightSlashIndex = path.lastIndexOf("\\")||0, + separater = leftSlashIndex > rightSlashIndex ? "/":"\\" ; + + path = path.substring(0, path.lastIndexOf(separater)+1); + g(id).value = path; +} + +function createFlashUploader(opt, callbacks) { + //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容 + var i18n = utils.extend({},lang.flashI18n); + //处理图片资源地址的编码,补全等问题 + for(var i in i18n){ + if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){ + i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); + } + } + opt = utils.extend(opt,i18n,false); + var option = { + createOptions:{ + id:'flash', + url:opt.flashUrl, + width:opt.width, + height:opt.height, + errorMessage:lang.flashError, + wmode:browser.safari ? 'transparent' : 'window', + ver:'10.0.0', + vars:opt, + container:opt.container + } + }; + + option = extendProperty(callbacks, option); + flashObj = new baidu.flash.imageUploader(option); + flashContainer = $G(opt.container); +} + +function extendProperty(fromObj, toObj) { + for (var i in fromObj) { + if (!toObj[i]) { + toObj[i] = fromObj[i]; + } + } + return toObj; +} + +//})(); + +function getPasteData(id) { + baidu.g("msg").innerHTML = lang.copySuccess + "
      "; + setTimeout(function() { + baidu.g("msg").innerHTML = ""; + }, 5000); + return baidu.g(id).value; +} + +function createCopyButton(id, dataFrom) { + baidu.swf.create({ + id:"copyFlash", + url:"fClipboard_ueditor.swf", + width:"58", + height:"25", + errorMessage:"", + bgColor:"#CBCBCB", + wmode:"transparent", + ver:"10.0.0", + vars:{ + tid:dataFrom + } + }, id + ); + + var clipboard = baidu.swf.getMovie("copyFlash"); + var clipinterval = setInterval(function() { + if (clipboard && clipboard.flashInit) { + clearInterval(clipinterval); + clipboard.setHandCursor(true); + clipboard.setContentFuncName("getPasteData"); + //clipboard.setMEFuncName("mouseEventHandler"); + } + }, 500); +} +createCopyButton("clipboard", "localPath"); \ No newline at end of file diff --git a/member/editor/ueditor/index.html b/member/editor/ueditor/index.html new file mode 100644 index 0000000..c1e1f00 --- /dev/null +++ b/member/editor/ueditor/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/member/editor/ueditor/init.api.js b/member/editor/ueditor/init.api.js new file mode 100644 index 0000000..1255ed2 --- /dev/null +++ b/member/editor/ueditor/init.api.js @@ -0,0 +1,21 @@ +function EditorAPI(i, k, v) { + var i = i ? i : 'content'; + var k = k ? k : 'len'; + var v = v ? v : ''; + switch(k) { + case 'get': + return ue.getContent(); + break; + case 'set': + ue.setContent(v); + break; + case 'ins': + ue.execCommand('inserthtml', v); + break; + case 'len': + return ue.getContentTxt().length; + break; + default: + break; + } +} \ No newline at end of file diff --git a/member/editor/ueditor/init.inc.php b/member/editor/ueditor/init.inc.php new file mode 100644 index 0000000..b0d83ba --- /dev/null +++ b/member/editor/ueditor/init.inc.php @@ -0,0 +1,50 @@ +'; + $editor .= ''; +} +$editor .= ''; +if($destoon_editor_id == 1) { + $editor .= ''; + $editor .= ''; +} +?> \ No newline at end of file diff --git a/member/editor/ueditor/lang/en/en.js b/member/editor/ueditor/lang/en/en.js new file mode 100644 index 0000000..c7e22f5 --- /dev/null +++ b/member/editor/ueditor/lang/en/en.js @@ -0,0 +1,684 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午6:57 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['en'] = { + 'labelMap':{ + 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', + 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', + 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', + 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', + 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', + 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', + 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', + 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', + 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", + 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', + 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', + 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', + 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', + 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', + 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', + 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', + 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', + 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' + }, + 'insertorderedlist':{ + 'num':'1,2,3...', + 'num1':'1),2),3)...', + 'num2':'(1),(2),(3)...', + 'cn':'一,二,三....', + 'cn1':'一),二),三)....', + 'cn2':'(一),(二),(三)....', + 'decimal':'1,2,3...', + 'lower-alpha':'a,b,c...', + 'lower-roman':'i,ii,iii...', + 'upper-alpha':'A,B,C...', + 'upper-roman':'I,II,III...' + }, + 'insertunorderedlist':{ + 'circle':'○ Circle', + 'disc':'● Circle dot', + 'square':'■ Rectangle ', + 'dash' :'- Dash', + 'dot' : '。dot' + }, + 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, + 'fontfamily':{ + 'songti':'Sim Sun', + 'kaiti':'Sim Kai', + 'heiti':'Sim Hei', + 'lishu':'Sim Li', + 'yahei': 'Microsoft YaHei', + 'andaleMono':'Andale Mono', + 'arial': 'Arial', + 'arialBlack':'Arial Black', + 'comicSansMs':'Comic Sans MS', + 'impact':'Impact', + 'timesNewRoman':'Times New Roman' + }, + 'customstyle':{ + 'tc':'Title center', + 'tl':'Title left', + 'im':'Important', + 'hi':'Highlight' + }, + 'autoupload': { + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading':"loading...", + 'loadError':"load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'simpleupload':{ + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading':"loading...", + 'loadError':"load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'elementPathTip':"Path", + 'wordCountTip':"Word Count", + 'wordCountMsg':'{#count} characters entered,{#leave} left. ', + 'wordOverFlowMsg':'The number of characters has exceeded allowable maximum values, the server may refuse to save!', + 'ok':"OK", + 'cancel':"Cancel", + 'closeDialog':"closeDialog", + 'tableDrag':"You must import the file uiUtils.js before drag! ", + 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", + 'loadconfigError': 'Get server config error.', + 'loadconfigFormatError': 'Server config format error.', + 'loadconfigHttpError': 'Get server config http error.', + 'snapScreen_plugin':{ + 'browserMsg':"Only IE supported!", + 'callBackErrorMsg':"The callback data is wrong,please check the config!", + 'uploadErrorMsg':"Upload error,please check your server environment! " + }, + 'insertcode':{ + 'as3':'ActionScript 3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'CSS', + 'cf':'ColdFusion', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'HTML', + 'java':'Java', + 'jfx':'JavaFX', + 'js':'JavaScript', + 'pl':'Perl', + 'php':'PHP', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'SQL', + 'vb':'Visual Basic', + 'xml':'XML' + }, + 'confirmClear':"Do you confirm to clear the Document?", + 'contextMenu':{ + 'delete':"Delete", + 'selectall':"Select all", + 'deletecode':"Delete Code", + 'cleardoc':"Clear Document", + 'confirmclear':"Do you confirm to clear the Document?", + 'unlink':"Unlink", + 'paragraph':"Paragraph", + 'edittable':"Table property", + 'aligncell':'Align cell', + 'aligntable':'Table alignment', + 'tableleft':'Left float', + 'tablecenter':'Center', + 'tableright':'Right float', + 'aligntd':'Cell alignment', + 'edittd':"Cell property", + 'setbordervisible':'set table edge visible', + 'table':"Table", + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justifyjustify':'Default', + 'deletetable':"Delete table", + 'insertparagraphbefore':"InsertedBeforeLine", + 'insertparagraphafter':'InsertedAfterLine', + 'inserttable':'Insert table', + 'insertcaption':'Insert caption', + 'deletecaption':'Delete Caption', + 'inserttitle':'Insert Title', + 'deletetitle':'Delete Title', + 'inserttitlecol':'Insert Title Col', + 'deletetitlecol':'Delete Title Col', + 'averageDiseRow':'AverageDise Row', + 'averageDisCol':'AverageDis Col', + 'deleterow':"Delete row", + 'deletecol':"Delete col", + 'insertrow':"Insert row", + 'insertcol':"Insert col", + 'insertrownext':'Insert Row Next', + 'insertcolnext':'Insert Col Next', + 'mergeright':"Merge right", + 'mergeleft':"Merge left", + 'mergedown':"Merge down", + 'mergecells':"Merge cells", + 'splittocells':"Split to cells", + 'splittocols':"Split to Cols", + 'splittorows':"Split to Rows", + 'tablesort':'Table sorting', + 'enablesort':'Sorting Enable', + 'disablesort':'Sorting Disable', + 'reversecurrent':'Reverse current', + 'orderbyasc':'Order By ASCII', + 'reversebyasc':'Reverse By ASCII', + 'orderbynum':'Order By Num', + 'reversebynum':'Reverse By Num', + 'borderbk':'Border shading', + 'setcolor':'interlaced color', + 'unsetcolor':'Cancel interlacedcolor', + 'setbackground':'Background interlaced', + 'unsetbackground':'Cancel Bk interlaced', + 'redandblue':'Blue and red', + 'threecolorgradient':'Three-color gradient', + 'copy':"Copy(Ctrl + c)", + 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!", + 'paste':"Paste(Ctrl + v)", + 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!" + }, + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", + 'anthorMsg':"Link", + 'clearColor':'Clear', + 'standardColor':'Standard color', + 'themeColor':'Theme color', + 'property':'Property', + 'default':'Default', + 'modify':'Modify', + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justify':'Default', + 'clear':'Clear', + 'anchorMsg':'Anchor', + 'delete':'Delete', + 'clickToUpload':"Click to upload", + 'unset':'Language hasn\'t been set!', + 't_row':'row', + 't_col':'col', + 'pasteOpt':'Paste Option', + 'pasteSourceFormat':"Keep Source Formatting", + 'tagFormat':'Keep tag', + 'pasteTextFormat':'Keep Text only', + 'more':'More', + 'autoTypeSet':{ + 'mergeLine':"Merge empty line", + 'delLine':"Del empty line", + 'removeFormat':"Remove format", + 'indent':"Indent", + 'alignment':"Alignment", + 'imageFloat':"Image float", + 'removeFontsize':"Remove font size", + 'removeFontFamily':"Remove fontFamily", + 'removeHtml':"Remove redundant HTML code", + 'pasteFilter':"Paste filter", + 'run':"Done", + 'symbol':'Symbol Conversion', + 'bdc2sb':'Full-width to Half-width', + 'tobdc':'Half-width to Full-width' + }, + + 'background':{ + 'static':{ + 'lang_background_normal':'Normal', + 'lang_background_local':'Online', + 'lang_background_set':'Background Set', + 'lang_background_none':'No Background', + 'lang_background_colored':'Colored Background', + 'lang_background_color':'Color Set', + 'lang_background_netimg':'Net-Image', + 'lang_background_align':'Align Type', + 'lang_background_position':'Position', + 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]} + }, + 'noUploadImage':"No pictures has been uploaded!", + 'toggleSelect':'Change the active state by click!\n Image Size: ' + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"Insert", + 'lang_tab_upload':"Local", + 'lang_tab_online':"Manager", + 'lang_tab_search':"Search", + 'lang_input_url':"Address:", + 'lang_input_size':"Size:", + 'lang_input_width':"Width", + 'lang_input_height':"Height", + 'lang_input_border':"Border:", + 'lang_input_vhspace':"Margins:", + 'lang_input_title':"Title:", + 'lang_input_align':'Image Float Style:', + 'lang_imgLoading':"Loading...", + 'lang_start_upload':"Start Upload", + 'lock':{'title':"Lock rate"}, + 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]}, + 'searchTxt':{'value':"Enter the search keyword!"}, + 'searchBtn':{'value':"Search"}, + 'searchReset':{'value':"Clear"}, + 'noneAlign':{'title':'None Float'}, + 'leftAlign':{'title':'Left Float'}, + 'rightAlign':{'title':'Right Float'}, + 'centerAlign':{'title':'Center In A Line'} + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'uploadNoPreview':'Can Not Preview', + 'updateStatusReady': 'Selected _ pictures, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.', + 'remoteLockError':"Cannot Lock the Proportion between width and height", + 'numError':"Please enter the correct Num. e.g 123,400", + 'imageUrlError':"The image format may be wrong!", + 'imageLoadError':"Error,please check the network or URL!", + 'searchRemind':"Enter the search keyword!", + 'searchLoading':"Image is loading,please wait...", + 'searchRetry':" Sorry,can't find the image,please try again!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': 'Upload', + 'lang_tab_online': 'Online', + 'lang_start_upload':"Start upload", + 'lang_drop_remind':"You can drop files here, a single maximum of 300 files" + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.' + }, + + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"Video", + 'lang_tab_searchV':"Search", + 'lang_tab_uploadV':"Upload", + 'lang_video_url':" URL ", + 'lang_video_size':"Video Size", + 'lang_videoW':"Width", + 'lang_videoH':"Height", + 'lang_alignment':"Alignment", + 'videoSearchTxt':{'value':"Enter the search keyword!"}, + 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn':{'value':"Search in Baidu"}, + 'videoSearchReset':{'value':"Clear result"}, + + 'lang_input_fileStatus':' No file uploaded!', + 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + + 'lang_upload_size':"Video Size", + 'lang_upload_width':"Width", + 'lang_upload_height':"Height", + 'lang_upload_alignment':"Alignment", + 'lang_format_advice':"Recommends mp4 format." + }, + 'numError':"Please enter the correct Num. e.g 123,400", + 'floatLeft':"Float left", + 'floatRight':"Float right", + 'default':"Default", + 'block':"Display in block", + 'urlError':"The video url format may be wrong!", + 'loading':"  The video is loading, please wait…", + 'clickToSelect':"Click to select", + 'goToSource':'Visit source video ', + 'noVideo':"    Sorry,can't find the video,please try again!", + + 'browseFiles':'Open files', + 'uploadSuccess':'Upload Successful!', + 'delSuccessFile':'Remove from the success of the queue', + 'delFailSaveFile':'Remove the save failed file', + 'statusPrompt':' file(s) uploaded! ', + 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!', + 'flashLoadingError':'The Flash failed loading! Please check the path or network state', + 'fileUploadReady':'Wait for uploading...', + 'delUploadQueue':'Remove from the uploading queue ', + 'limitPrompt1':'Can not choose more than single', + 'limitPrompt2':'file(s)!Please choose again!', + 'delFailFile':'Remove failure file', + 'fileSizeLimit':'File size exceeds the limit!', + 'emptyFile':'Can not upload an empty file!', + 'fileTypeError':'File type error!', + 'unknownError':'Unknown error!', + 'fileUploading':'Uploading,please wait...', + 'cancelUpload':'Cancel upload', + 'netError':'Network error', + 'failUpload':'Upload failed', + 'serverIOError':'Server IO error!', + 'noAuthority':'No Permission!', + 'fileNumLimit':'Upload limit to the number', + 'failCheck':'Authentication fails, the upload is skipped!', + 'fileCanceling':'Cancel, please wait...', + 'stopUploading':'Upload has stopped...', + + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.' + }, + 'webapp':{ + 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", + 'tip2':"And then open the file ueditor.config.js to set it! ", + 'applyFor':"APPLY FOR", + 'anthorApi':"Baidu API" + }, + 'template':{ + 'static':{ + 'lang_template_bkcolor':'Background Color', + 'lang_template_clear' : 'Keep Content', + 'lang_template_select':'Select Template' + }, + 'blank':"Blank", + 'blog':"Blog", + 'resume':"Resume", + 'richText':"Rich Text", + 'scrPapers':"Scientific Papers" + }, + scrawl:{ + 'static':{ + 'lang_input_previousStep':"Previous", + 'lang_input_nextsStep':"Next", + 'lang_input_clear':'Clear', + 'lang_input_addPic':'AddImage', + 'lang_input_ScalePic':'ScaleImage', + 'lang_input_removePic':'RemoveImage', + 'J_imgTxt':{title:'Add background image'} + }, + 'noScarwl':"No paint, a white paper...", + 'scrawlUpLoading':"Image is uploading, please wait...", + 'continueBtn':"Try again", + 'imageError':"Image failed to load!", + 'backgroundUploading':'Image is uploading,please wait...' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"Input singer/song/album, search you interested in music!", + 'J_searchBtn':{value:'Search songs'} + }, + 'emptyTxt':'Not search to the relevant music results, please change a keyword try.', + 'chapter':'Songs', + 'singer':'Singer', + 'special':'Album', + 'listenTest':'Audition' + }, + anchor:{ + 'static':{ + 'lang_input_anchorName':'Anchor Name:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'Data source:', + 'lang_chart_format': 'Chart format:', + 'lang_data_align': 'Align', + 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', + 'lang_chart_align_reverse': 'X-axis Y-axis opposite', + 'lang_chart_title': 'Title', + 'lang_chart_main_title': 'main title:', + 'lang_chart_sub_title': 'sub title:', + 'lang_chart_x_title': 'X-axis title:', + 'lang_chart_y_title': 'Y-axis title:', + 'lang_chart_tip': 'Prompt', + 'lang_cahrt_tip_prefix': 'prefix:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': 'Unit', + 'lang_chart_data_unit_title': 'unit:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': 'Chart type:', + 'lang_prev_btn': 'Previous', + 'lang_next_btn': 'Next' + } + }, + emotion:{ + 'static':{ + 'lang_input_choice':'Choice', + 'lang_input_Tuzki':'Tuzki', + 'lang_input_lvdouwa':'LvDouWa', + 'lang_input_BOBO':'BOBO', + 'lang_input_babyCat':'BabyCat', + 'lang_input_bubble':'Bubble', + 'lang_input_youa':'YouA' + } + }, + gmap:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_search':'Search', + 'address':{value:"Beijing"} + }, + searchError:'Unable to locate the address!' + }, + help:{ + 'static':{ + 'lang_input_about':'About', + 'lang_input_shortcuts':'Shortcuts', + 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", + 'lang_Txt_shortcuts':'Shortcuts', + 'lang_Txt_func':'Function', + 'lang_Txt_bold':'Bold', + 'lang_Txt_copy':'Copy', + 'lang_Txt_cut':'Cut', + 'lang_Txt_Paste':'Paste', + 'lang_Txt_undo':'Undo', + 'lang_Txt_redo':'Redo', + 'lang_Txt_italic':'Italic', + 'lang_Txt_underline':'Underline', + 'lang_Txt_selectAll':'Select All', + 'lang_Txt_visualEnter':'Submit', + 'lang_Txt_fullscreen':'Fullscreen' + } + }, + insertframe:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_width':'Width:', + 'lang_input_height':'height:', + 'lang_input_isScroll':'Enable scrollbars:', + 'lang_input_frameborder':'Show frame border:', + 'lang_input_alignMode':'Alignment:', + 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]} + }, + 'enterAddress':'Please enter an address!' + }, + link:{ + 'static':{ + 'lang_input_text':'Text:', + 'lang_input_url':'URL:', + 'lang_input_title':'Title:', + 'lang_input_target':'open in new window:' + }, + 'validLink':'Supports only effective when a link is selected', + 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + }, + map:{ + 'static':{ + lang_city:"City", + lang_address:"Address", + city:{value:"Beijing"}, + lang_search:"Search", + lang_dynamicmap:"Dynamic map" + }, + cityMsg:"Please enter the city name!", + errorMsg:"Can't find the place!" + }, + searchreplace:{ + 'static':{ + lang_tab_search:"Search", + lang_tab_replace:"Replace", + lang_search1:"Search", + lang_search2:"Search", + lang_replace:"Replace", + lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_case_sensitive1:"Case sense", + lang_case_sensitive2:"Case sense", + nextFindBtn:{value:"Next"}, + preFindBtn:{value:"Preview"}, + nextReplaceBtn:{value:"Next"}, + preReplaceBtn:{value:"Preview"}, + repalceBtn:{value:"Replace"}, + repalceAllBtn:{value:"Replace all"} + }, + getEnd:"Has the search to the bottom!", + getStart:"Has the search to the top!", + countMsg:"Altogether replaced {#count} character(s)!" + }, + snapscreen:{ + 'static':{ + lang_showMsg:"You should install the UEditor screenshots program first!", + lang_download:"Download!", + lang_step1:"Step1:Download the program and then run it", + lang_step2:"Step2:After complete install,try to click the button again" + } + }, + spechars:{ + 'static':{}, + tsfh:"Special", + lmsz:"Roman", + szfh:"Numeral", + rwfh:"Japanese", + xlzm:"The Greek", + ewzm:"Russian", + pyzm:"Phonetic", + yyyb:"English", + zyzf:"Others" + }, + 'edittable':{ + 'static':{ + 'lang_tableStyle':'Table style', + 'lang_insertCaption':'Add table header row', + 'lang_insertTitle':'Add table title row', + 'lang_insertTitleCol':'Add table title col', + 'lang_tableSize':'Automatically adjust table size', + 'lang_autoSizeContent':'Adaptive by form text', + 'lang_orderbycontent':"Table of contents sortable", + 'lang_autoSizePage':'Page width adaptive', + 'lang_example':'Example', + 'lang_borderStyle':'Table Border', + 'lang_color':'Color:' + }, + captionName:'Caption', + titleName:'Title', + cellsName:'text', + errorMsg:'There are merged cells, can not sort.' + }, + 'edittip':{ + 'static':{ + lang_delRow:'Delete entire row', + lang_delCol:'Delete entire col' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'Background Color:' + } + }, + 'formula':{ + 'static':{ + } + }, + wordimage:{ + 'static':{ + lang_resave:"The re-save step", + uploadBtn:{src:"upload.png", alt:"Upload"}, + clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, + lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." + }, + fileType:"Image", + flashError:"Flash initialization failed!", + netError:"Network error! Please try again!", + copySuccess:"URL has been copied!", + + 'flashI18n':{ + lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ), + uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ), + imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ), + textEncoding:"utf-8", + addImageSkinURL:"addImage.png", + allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png", + allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png", + rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png", + rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png", + rotateRightBtnEnableSkinURL:"rotateRightEnable.png", + rotateRightBtnDisableSkinURL:"rotateRightDisable.png", + deleteBtnEnableSkinURL:"deleteEnable.png", + deleteBtnDisableSkinURL:"deleteDisable.png", + backgroundURL:'', + listBackgroundURL:'', + buttonURL:'button.png' + } + }, + 'autosave': { + 'success':'Local conservation success' + } +}; diff --git a/member/editor/ueditor/lang/en/images/addimage.png b/member/editor/ueditor/lang/en/images/addimage.png new file mode 100644 index 0000000..3a2fd17 Binary files /dev/null and b/member/editor/ueditor/lang/en/images/addimage.png differ diff --git a/member/editor/ueditor/lang/en/images/alldeletebtnhoverskin.png b/member/editor/ueditor/lang/en/images/alldeletebtnhoverskin.png new file mode 100644 index 0000000..355eeab Binary files /dev/null and b/member/editor/ueditor/lang/en/images/alldeletebtnhoverskin.png differ diff --git a/member/editor/ueditor/lang/en/images/alldeletebtnupskin.png b/member/editor/ueditor/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000..61658ce Binary files /dev/null and b/member/editor/ueditor/lang/en/images/alldeletebtnupskin.png differ diff --git a/member/editor/ueditor/lang/en/images/background.png b/member/editor/ueditor/lang/en/images/background.png new file mode 100644 index 0000000..d5bf5fd Binary files /dev/null and b/member/editor/ueditor/lang/en/images/background.png differ diff --git a/member/editor/ueditor/lang/en/images/button.png b/member/editor/ueditor/lang/en/images/button.png new file mode 100644 index 0000000..098874c Binary files /dev/null and b/member/editor/ueditor/lang/en/images/button.png differ diff --git a/member/editor/ueditor/lang/en/images/copy.png b/member/editor/ueditor/lang/en/images/copy.png new file mode 100644 index 0000000..f982e8b Binary files /dev/null and b/member/editor/ueditor/lang/en/images/copy.png differ diff --git a/member/editor/ueditor/lang/en/images/deletedisable.png b/member/editor/ueditor/lang/en/images/deletedisable.png new file mode 100644 index 0000000..c8ee750 Binary files /dev/null and b/member/editor/ueditor/lang/en/images/deletedisable.png differ diff --git a/member/editor/ueditor/lang/en/images/deleteenable.png b/member/editor/ueditor/lang/en/images/deleteenable.png new file mode 100644 index 0000000..26acc88 Binary files /dev/null and b/member/editor/ueditor/lang/en/images/deleteenable.png differ diff --git a/member/editor/ueditor/lang/en/images/listbackground.png b/member/editor/ueditor/lang/en/images/listbackground.png new file mode 100644 index 0000000..4f82ccd Binary files /dev/null and b/member/editor/ueditor/lang/en/images/listbackground.png differ diff --git a/member/editor/ueditor/lang/en/images/localimage.png b/member/editor/ueditor/lang/en/images/localimage.png new file mode 100644 index 0000000..12c8e6a Binary files /dev/null and b/member/editor/ueditor/lang/en/images/localimage.png differ diff --git a/member/editor/ueditor/lang/en/images/music.png b/member/editor/ueditor/lang/en/images/music.png new file mode 100644 index 0000000..2f495fe Binary files /dev/null and b/member/editor/ueditor/lang/en/images/music.png differ diff --git a/member/editor/ueditor/lang/en/images/rotateleftdisable.png b/member/editor/ueditor/lang/en/images/rotateleftdisable.png new file mode 100644 index 0000000..741526e Binary files /dev/null and b/member/editor/ueditor/lang/en/images/rotateleftdisable.png differ diff --git a/member/editor/ueditor/lang/en/images/rotateleftenable.png b/member/editor/ueditor/lang/en/images/rotateleftenable.png new file mode 100644 index 0000000..e164ddb Binary files /dev/null and b/member/editor/ueditor/lang/en/images/rotateleftenable.png differ diff --git a/member/editor/ueditor/lang/en/images/rotaterightdisable.png b/member/editor/ueditor/lang/en/images/rotaterightdisable.png new file mode 100644 index 0000000..5a78c26 Binary files /dev/null and b/member/editor/ueditor/lang/en/images/rotaterightdisable.png differ diff --git a/member/editor/ueditor/lang/en/images/rotaterightenable.png b/member/editor/ueditor/lang/en/images/rotaterightenable.png new file mode 100644 index 0000000..d768531 Binary files /dev/null and b/member/editor/ueditor/lang/en/images/rotaterightenable.png differ diff --git a/member/editor/ueditor/lang/en/images/upload.png b/member/editor/ueditor/lang/en/images/upload.png new file mode 100644 index 0000000..7bb15b3 Binary files /dev/null and b/member/editor/ueditor/lang/en/images/upload.png differ diff --git a/member/editor/ueditor/lang/zh-cn/images/copy.png b/member/editor/ueditor/lang/zh-cn/images/copy.png new file mode 100644 index 0000000..b2536aa Binary files /dev/null and b/member/editor/ueditor/lang/zh-cn/images/copy.png differ diff --git a/member/editor/ueditor/lang/zh-cn/images/localimage.png b/member/editor/ueditor/lang/zh-cn/images/localimage.png new file mode 100644 index 0000000..7303c36 Binary files /dev/null and b/member/editor/ueditor/lang/zh-cn/images/localimage.png differ diff --git a/member/editor/ueditor/lang/zh-cn/images/music.png b/member/editor/ueditor/lang/zh-cn/images/music.png new file mode 100644 index 0000000..354edeb Binary files /dev/null and b/member/editor/ueditor/lang/zh-cn/images/music.png differ diff --git a/member/editor/ueditor/lang/zh-cn/images/upload.png b/member/editor/ueditor/lang/zh-cn/images/upload.png new file mode 100644 index 0000000..08d4d92 Binary files /dev/null and b/member/editor/ueditor/lang/zh-cn/images/upload.png differ diff --git a/member/editor/ueditor/lang/zh-cn/zh-cn.js b/member/editor/ueditor/lang/zh-cn/zh-cn.js new file mode 100644 index 0000000..4d5178f --- /dev/null +++ b/member/editor/ueditor/lang/zh-cn/zh-cn.js @@ -0,0 +1,669 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午5:02 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['zh-cn'] = { + 'labelMap':{ + 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图', + 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框', + 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用', + 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览', + 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期', + 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格', + 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', + 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题', + 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言', + 'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接', + 'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图', + 'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表', + 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入', + 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认', + 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存', + 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', + 'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦', + 'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表' + }, + 'insertorderedlist':{ + 'num':'1,2,3...', + 'num1':'1),2),3)...', + 'num2':'(1),(2),(3)...', + 'cn':'一,二,三....', + 'cn1':'一),二),三)....', + 'cn2':'(一),(二),(三)....', + 'decimal':'1,2,3...', + 'lower-alpha':'a,b,c...', + 'lower-roman':'i,ii,iii...', + 'upper-alpha':'A,B,C...', + 'upper-roman':'I,II,III...' + }, + 'insertunorderedlist':{ + 'circle':'○ 大圆圈', + 'disc':'● 小黑点', + 'square':'■ 小方块 ', + 'dash' :'— 破折号', + 'dot':' 。 小圆圈' + }, + 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'}, + 'fontfamily':{ + 'songti':'宋体', + 'kaiti':'楷体', + 'heiti':'黑体', + 'lishu':'隶书', + 'yahei':'微软雅黑', + 'andaleMono':'andale mono', + 'arial': 'arial', + 'arialBlack':'arial black', + 'comicSansMs':'comic sans ms', + 'impact':'impact', + 'timesNewRoman':'times new roman' + }, + 'customstyle':{ + 'tc':'标题居中', + 'tl':'标题居左', + 'im':'强调', + 'hi':'明显强调' + }, + 'autoupload': { + 'exceedSizeError': '文件大小超出限制', + 'exceedTypeError': '文件格式不允许', + 'jsonEncodeError': '服务器返回格式错误', + 'loading':"正在上传...", + 'loadError':"上传错误", + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' + }, + 'simpleupload':{ + 'exceedSizeError': '文件大小超出限制', + 'exceedTypeError': '文件格式不允许', + 'jsonEncodeError': '服务器返回格式错误', + 'loading':"正在上传...", + 'loadError':"上传错误", + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' + }, + 'elementPathTip':"元素路径", + 'wordCountTip':"字数统计", + 'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ', + 'wordOverFlowMsg':'字数超出最大允许值,服务器可能拒绝保存!', + 'ok':"确认", + 'cancel':"取消", + 'closeDialog':"关闭对话框", + 'tableDrag':"表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', + 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', + 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', + 'snapScreen_plugin':{ + 'browserMsg':"仅支持IE浏览器!", + 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。", + 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! " + }, + 'insertcode':{ + 'as3':'ActionScript 3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'CSS', + 'cf':'ColdFusion', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'HTML', + 'java':'Java', + 'jfx':'JavaFX', + 'js':'JavaScript', + 'pl':'Perl', + 'php':'PHP', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'SQL', + 'vb':'Visual Basic', + 'xml':'XML' + }, + 'confirmClear':"确定清空当前文档么?", + 'contextMenu':{ + 'delete':"删除", + 'selectall':"全选", + 'deletecode':"删除代码", + 'cleardoc':"清空文档", + 'confirmclear':"确定清空当前文档么?", + 'unlink':"删除超链接", + 'paragraph':"段落格式", + 'edittable':"表格属性", + 'aligntd':"单元格对齐方式", + 'aligntable':'表格对齐方式', + 'tableleft':'左浮动', + 'tablecenter':'居中显示', + 'tableright':'右浮动', + 'edittd':"单元格属性", + 'setbordervisible':'设置表格边线可见', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', + 'table':"表格", + 'inserttable':'插入表格', + 'deletetable':"删除表格", + 'insertparagraphbefore':"前插入段落", + 'insertparagraphafter':'后插入段落', + 'deleterow':"删除当前行", + 'deletecol':"删除当前列", + 'insertrow':"前插入行", + 'insertcol':"左插入列", + 'insertrownext':'后插入行', + 'insertcolnext':'右插入列', + 'insertcaption':'插入表格名称', + 'deletecaption':'删除表格名称', + 'inserttitle':'插入表格标题行', + 'deletetitle':'删除表格标题行', + 'inserttitlecol':'插入表格标题列', + 'deletetitlecol':'删除表格标题列', + 'averageDiseRow':'平均分布各行', + 'averageDisCol':'平均分布各列', + 'mergeright':"向右合并", + 'mergeleft':"向左合并", + 'mergedown':"向下合并", + 'mergecells':"合并单元格", + 'splittocells':"完全拆分单元格", + 'splittocols':"拆分成列", + 'splittorows':"拆分成行", + 'tablesort':'表格排序', + 'enablesort':'设置表格可排序', + 'disablesort':'取消表格可排序', + 'reversecurrent':'逆序当前', + 'orderbyasc':'按ASCII字符升序', + 'reversebyasc':'按ASCII字符降序', + 'orderbynum':'按数值大小升序', + 'reversebynum':'按数值大小降序', + 'borderbk':'边框底纹', + 'setcolor':'表格隔行变色', + 'unsetcolor':'取消表格隔行变色', + 'setbackground':'选区背景隔行', + 'unsetbackground':'取消选区背景', + 'redandblue':'红蓝相间', + 'threecolorgradient':'三色渐变', + 'copy':"复制(Ctrl + c)", + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'paste':"粘贴(Ctrl + v)", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" + }, + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", + 'anthorMsg':"链接", + 'clearColor':'清空颜色', + 'standardColor':'标准颜色', + 'themeColor':'主题颜色', + 'property':'属性', + 'default':'默认', + 'modify':'修改', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中', + 'justify':'默认', + 'clear':'清除', + 'anchorMsg':'锚点', + 'delete':'删除', + 'clickToUpload':"点击上传", + 'unset':'尚未设置语言文件', + 't_row':'行', + 't_col':'列', + 'more':'更多', + 'pasteOpt':'粘贴选项', + 'pasteSourceFormat':"保留源格式", + 'tagFormat':'只保留标签', + 'pasteTextFormat':'只保留文本', + 'autoTypeSet':{ + 'mergeLine':"合并空行", + 'delLine':"清除空行", + 'removeFormat':"清除格式", + 'indent':"首行缩进", + 'alignment':"对齐方式", + 'imageFloat':"图片浮动", + 'removeFontsize':"清除字号", + 'removeFontFamily':"清除字体", + 'removeHtml':"清除冗余HTML代码", + 'pasteFilter':"粘贴过滤", + 'run':"执行", + 'symbol':'符号转换', + 'bdc2sb':'全角转半角', + 'tobdc':'半角转全角' + }, + + 'background':{ + 'static':{ + 'lang_background_normal':'背景设置', + 'lang_background_local':'在线图片', + 'lang_background_set':'选项', + 'lang_background_none':'无背景色', + 'lang_background_colored':'有背景色', + 'lang_background_color':'颜色设置', + 'lang_background_netimg':'网络图片', + 'lang_background_align':'对齐方式', + 'lang_background_position':'精确定位', + 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]} + + }, + 'noUploadImage':"当前未上传过任何图片!", + 'toggleSelect':"单击可切换选中状态\n原图尺寸: " + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"插入图片", //节点 + 'lang_tab_upload':"本地上传", + 'lang_tab_online':"在线管理", + 'lang_tab_search':"图片搜索", + 'lang_input_url':"地 址:", + 'lang_input_size':"大 小:", + 'lang_input_width':"宽度", + 'lang_input_height':"高度", + 'lang_input_border':"边 框:", + 'lang_input_vhspace':"边 距:", + 'lang_input_title':"描 述:", + 'lang_input_align':'图片浮动方式:', + 'lang_imgLoading':" 图片加载中……", + 'lang_start_upload':"开始上传", + 'lock':{'title':"锁定宽高比例"}, //属性 + 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option + 'searchTxt':{'value':"请输入搜索关键词"}, + 'searchBtn':{'value':"百度一下"}, + 'searchReset':{'value':"清空搜索"}, + 'noneAlign':{'title':'无浮动'}, + 'leftAlign':{'title':'左浮动'}, + 'rightAlign':{'title':'右浮动'}, + 'centerAlign':{'title':'居中独占一行'} + }, + 'uploadSelectFile':'点击选择图片', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'uploadNoPreview':'不能预览', + 'updateStatusReady': '选中_张图片,共_KB。', + 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败', + 'updateStatusFinish': '共_张(_KB),_张上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错', + 'remoteLockError':"宽高不正确,不能所定比例", + 'numError':"请输入正确的长度或者宽度值!例如:123,400", + 'imageUrlError':"不允许的图片格式或者图片域!", + 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!", + 'searchRemind':"请输入搜索关键词", + 'searchLoading':"图片加载中,请稍后……", + 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': '上传附件', + 'lang_tab_online': '在线附件', + 'lang_start_upload':"开始上传", + 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" + }, + 'uploadSelectFile':'点击选择文件', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败', + 'updateStatusFinish': '共_个(_KB),_个上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错' + }, + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"插入视频", + 'lang_tab_searchV':"搜索视频", + 'lang_tab_uploadV':"上传视频", + 'lang_video_url':"视频网址", + 'lang_video_size':"视频尺寸", + 'lang_videoW':"宽度", + 'lang_videoH':"高度", + 'lang_alignment':"对齐方式", + 'videoSearchTxt':{'value':"请输入搜索关键字!"}, + 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn':{'value':"百度一下"}, + 'videoSearchReset':{'value':"清空结果"}, + + 'lang_input_fileStatus':' 当前未上传文件', + 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + + 'lang_upload_size':"视频尺寸", + 'lang_upload_width':"宽度", + 'lang_upload_height':"高度", + 'lang_upload_alignment':"对齐方式", + 'lang_format_advice':"建议使用mp4格式." + + }, + 'numError':"请输入正确的数值,如123,400", + 'floatLeft':"左浮动", + 'floatRight':"右浮动", + '"default"':"默认", + 'block':"独占一行", + 'urlError':"输入的视频地址有误,请检查后再试!", + 'loading':"  视频加载中,请等待……", + 'clickToSelect':"点击选中", + 'goToSource':'访问源视频', + 'noVideo':"    抱歉,找不到对应的视频,请重试!", + + 'browseFiles':'浏览文件', + 'uploadSuccess':'上传成功!', + 'delSuccessFile':'从成功队列中移除', + 'delFailSaveFile':'移除保存失败文件', + 'statusPrompt':' 个文件已上传! ', + 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!', + 'flashLoadingError':'Flash加载失败!请检查路径或网络状态', + 'fileUploadReady':'等待上传……', + 'delUploadQueue':'从上传队列中移除', + 'limitPrompt1':'单次不能选择超过', + 'limitPrompt2':'个文件!请重新选择!', + 'delFailFile':'移除失败文件', + 'fileSizeLimit':'文件大小超出限制!', + 'emptyFile':'空文件无法上传!', + 'fileTypeError':'文件类型不允许!', + 'unknownError':'未知错误!', + 'fileUploading':'上传中,请等待……', + 'cancelUpload':'取消上传', + 'netError':'网络错误', + 'failUpload':'上传失败!', + 'serverIOError':'服务器IO错误!', + 'noAuthority':'无权限!', + 'fileNumLimit':'上传个数限制', + 'failCheck':'验证失败,本次上传被跳过!', + 'fileCanceling':'取消中,请等待……', + 'stopUploading':'上传已停止……', + + 'uploadSelectFile':'点击选择文件', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '成功上传_个,_个失败', + 'updateStatusFinish': '共_个(_KB),_个成功上传', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错' + }, + 'webapp':{ + 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", + 'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ", + 'applyFor':"点此申请", + 'anthorApi':"百度API" + }, + 'template':{ + 'static':{ + 'lang_template_bkcolor':'背景颜色', + 'lang_template_clear' : '保留原有内容', + 'lang_template_select' : '选择模板' + }, + 'blank':"空白文档", + 'blog':"博客文章", + 'resume':"个人简历", + 'richText':"图文混排", + 'sciPapers':"科技论文" + + + }, + 'scrawl':{ + 'static':{ + 'lang_input_previousStep':"上一步", + 'lang_input_nextsStep':"下一步", + 'lang_input_clear':'清空', + 'lang_input_addPic':'添加背景', + 'lang_input_ScalePic':'缩放背景', + 'lang_input_removePic':'删除背景', + 'J_imgTxt':{title:'添加背景图片'} + }, + 'noScarwl':"尚未作画,白纸一张~", + 'scrawlUpLoading':"涂鸦上传中,别急哦~", + 'continueBtn':"继续", + 'imageError':"糟糕,图片读取失败了!", + 'backgroundUploading':'背景图片上传中,别急哦~' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", + 'J_searchBtn':{value:'搜索歌曲'} + }, + 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。', + 'chapter':'歌曲', + 'singer':'歌手', + 'special':'专辑', + 'listenTest':'试听' + }, + 'anchor':{ + 'static':{ + 'lang_input_anchorName':'锚点名字:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'数据源:', + 'lang_chart_format': '图表格式:', + 'lang_data_align': '数据对齐方式', + 'lang_chart_align_same': '数据源与图表X轴Y轴一致', + 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', + 'lang_chart_title': '图表标题', + 'lang_chart_main_title': '主标题:', + 'lang_chart_sub_title': '子标题:', + 'lang_chart_x_title': 'X轴标题:', + 'lang_chart_y_title': 'Y轴标题:', + 'lang_chart_tip': '提示文字', + 'lang_cahrt_tip_prefix': '提示文字前缀:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': '数据单位', + 'lang_chart_data_unit_title': '单位:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': '图表类型:', + 'lang_prev_btn': '上一个', + 'lang_next_btn': '下一个' + } + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'精选', + 'lang_input_Tuzki':'兔斯基', + 'lang_input_BOBO':'BOBO', + 'lang_input_lvdouwa':'绿豆蛙', + 'lang_input_babyCat':'baby猫', + 'lang_input_bubble':'泡泡', + 'lang_input_youa':'有啊' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'地址', + 'lang_input_search':'搜索', + 'address':{value:"北京"} + }, + searchError:'无法定位到该地址!' + }, + 'help':{ + 'static':{ + 'lang_input_about':'关于UEditor', + 'lang_input_shortcuts':'快捷键', + 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', + 'lang_Txt_shortcuts':'快捷键', + 'lang_Txt_func':'功能', + 'lang_Txt_bold':'给选中字设置为加粗', + 'lang_Txt_copy':'复制选中内容', + 'lang_Txt_cut':'剪切选中内容', + 'lang_Txt_Paste':'粘贴', + 'lang_Txt_undo':'重新执行上次操作', + 'lang_Txt_redo':'撤销上一次操作', + 'lang_Txt_italic':'给选中字设置为斜体', + 'lang_Txt_underline':'给选中字加下划线', + 'lang_Txt_selectAll':'全部选中', + 'lang_Txt_visualEnter':'软回车', + 'lang_Txt_fullscreen':'全屏' + } + }, + 'insertframe':{ + 'static':{ + 'lang_input_address':'地址:', + 'lang_input_width':'宽度:', + 'lang_input_height':'高度:', + 'lang_input_isScroll':'允许滚动条:', + 'lang_input_frameborder':'显示框架边框:', + 'lang_input_alignMode':'对齐方式:', + 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]} + }, + 'enterAddress':'请输入地址!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'文本内容:', + 'lang_input_url':'链接地址:', + 'lang_input_title':'标题:', + 'lang_input_target':'是否在新窗口打开:' + }, + 'validLink':'只支持选中一个链接时生效', + 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map':{ + 'static':{ + lang_city:"城市", + lang_address:"地址", + city:{value:"北京"}, + lang_search:"搜索", + lang_dynamicmap:"插入动态地图" + }, + cityMsg:"请选择城市", + errorMsg:"抱歉,找不到该位置!" + }, + 'searchreplace':{ + 'static':{ + lang_tab_search:"查找", + lang_tab_replace:"替换", + lang_search1:"查找", + lang_search2:"查找", + lang_replace:"替换", + lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_case_sensitive1:"区分大小写", + lang_case_sensitive2:"区分大小写", + nextFindBtn:{value:"下一个"}, + preFindBtn:{value:"上一个"}, + nextReplaceBtn:{value:"下一个"}, + preReplaceBtn:{value:"上一个"}, + repalceBtn:{value:"替换"}, + repalceAllBtn:{value:"全部替换"} + }, + getEnd:"已经搜索到文章末尾!", + getStart:"已经搜索到文章头部", + countMsg:"总共替换了{#count}处!" + }, + 'snapscreen':{ + 'static':{ + lang_showMsg:"截图功能需要首先安装UEditor截图插件! ", + lang_download:"点此下载", + lang_step1:"第一步,下载UEditor截图插件并运行安装。", + lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" + } + }, + 'spechars':{ + 'static':{}, + tsfh:"特殊字符", + lmsz:"罗马字符", + szfh:"数学字符", + rwfh:"日文字符", + xlzm:"希腊字母", + ewzm:"俄文字符", + pyzm:"拼音字母", + yyyb:"英语音标", + zyzf:"其他" + }, + 'edittable':{ + 'static':{ + 'lang_tableStyle':'表格样式', + 'lang_insertCaption':'添加表格名称行', + 'lang_insertTitle':'添加表格标题行', + 'lang_insertTitleCol':'添加表格标题列', + 'lang_orderbycontent':"使表格内容可排序", + 'lang_tableSize':'自动调整表格尺寸', + 'lang_autoSizeContent':'按表格文字自适应', + 'lang_autoSizePage':'按页面宽度自适应', + 'lang_example':'示例', + 'lang_borderStyle':'表格边框', + 'lang_color':'颜色:' + }, + captionName:'表格名称', + titleName:'标题', + cellsName:'内容', + errorMsg:'有合并单元格,不可排序' + }, + 'edittip':{ + 'static':{ + lang_delRow:'删除整行', + lang_delCol:'删除整列' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'背景颜色:' + } + }, + 'formula':{ + 'static':{ + } + }, + 'wordimage':{ + 'static':{ + lang_resave:"转存步骤", + uploadBtn:{src:"upload.png",alt:"上传"}, + clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, + lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" + }, + 'fileType':"图片", + 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", + 'netError':"网络连接错误,请重试!", + 'copySuccess':"图片地址已经复制!", + 'flashI18n':{} //留空默认中文 + }, + 'autosave': { + 'saving':'保存中...', + 'success':'本地保存成功' + } +}; diff --git a/member/editor/ueditor/themes/default/css/ueditor.css b/member/editor/ueditor/themes/default/css/ueditor.css new file mode 100644 index 0000000..44ae805 --- /dev/null +++ b/member/editor/ueditor/themes/default/css/ueditor.css @@ -0,0 +1,1903 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-default .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.edui-default a.edui-box { + display: block; + text-decoration: none; + color: black; +} + +.edui-default a.edui-box:hover { + text-decoration: none; +} + +.edui-default a.edui-box:active { + text-decoration: none; +} + +.edui-default table.edui-box { + border-collapse: collapse; +} + +.edui-default ul.edui-box { + list-style-type: none; +} + +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: top; +} + +.edui-default .edui-clearfix { + zoom: 1 +} + +.edui-default .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} + + * html div.edui-box { + display: inline !important; +} + +*:first-child+html div.edui-box { + display: inline !important; +} + +/* control layout */ +.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { + position: relative; +} + +.edui-default .edui-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} + +.edui-default .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} + +.edui-default .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} + +.edui-default .edui-tablepicker .edui-canvas { + position: relative; +} + +.edui-default .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} + +.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-toolbar { + position: relative; +} + +/* + * default theme + */ +.edui-default .edui-label { + cursor: default; +} + +.edui-default span.edui-clickable { + color: blue; + cursor: pointer; + text-decoration: underline; +} + +.edui-default span.edui-unclickable { + color: gray; + cursor: default; +} +/* 工具栏 */ +.edui-default .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + padding: 1px; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width:auto; + height:auto; +} + +.edui-default .edui-toolbar .edui-button, +.edui-default .edui-toolbar .edui-splitbutton, +.edui-default .edui-toolbar .edui-menubutton, +.edui-default .edui-toolbar .edui-combox { + margin: 1px; +} +/*UI工具栏、编辑区域、底部*/ +.edui-default .edui-editor { + border: 1px solid #d4d4d4; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.edui-editor div{ + width:auto; + height:auto; +} +.edui-default .edui-editor-toolbarbox { + position: relative; + zoom: 1; + -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + border-top-left-radius:2px; + border-top-right-radius:2px; +} + +.edui-default .edui-editor-toolbarboxouter { + border-bottom: 1px solid #d4d4d4; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + /*border: 1px solid #d4d4d4;*/ + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.edui-default .edui-editor-toolbarboxinner { + padding: 2px; +} + +.edui-default .edui-editor-iframeholder { + position: relative; + /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ + /*_position: static !important;* +} + +.edui-default .edui-editor-iframeholder textarea { + font-family: consolas, "Courier New", "lucida console", monospace; + font-size: 12px; + line-height: 18px; +} + +.edui-default .edui-editor-bottombar { + /*border-top: 1px solid #ccc;*/ + /*height: 20px;*/ + /*width: 40%;*/ + /*float: left;*/ + /*overflow: hidden;*/ +} + +.edui-default .edui-editor-bottomContainer { + overflow: hidden; +} + +.edui-default .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} + +.edui-default .edui-editor-bottomContainer td { + white-space: nowrap; + border-top: 1px solid #ccc; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} + +.edui-default .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} +.edui-default .edui-editor-scale { + width: 12px; +} +.edui-default .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} +.edui-default .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} + +.edui-default .edui-editor-breadcrumb span { + cursor: pointer; + text-decoration: underline; + color: blue; +} + +.edui-default .edui-toolbar .edui-for-fullscreen { + float: right; +} + +.edui-default .edui-bubble .edui-popup-content { + border: 1px solid #DCAC6C; + background-color: #fff6d9; + padding: 5px; + font-size: 10pt; + font-family: "宋体"; +} + +.edui-default .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} + +.edui-default .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} + +.edui-default .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} + +.edui-default .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} + +.edui-default .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} +/*可选中菜单按钮*/ +.edui-default .edui-list .edui-bordereraser { + display: none; +} + +.edui-default .edui-listitem { + padding: 1px; + white-space: nowrap; +} + +.edui-default .edui-list .edui-state-hover { + position: relative; + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} + +.edui-default .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + +} + +.edui-default .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} + +.edui-default .edui-for-rowspacingtop .edui-listitem-label, +.edui-default .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} +/* 可选中按钮弹出菜单*/ +.edui-default .edui-menu { + z-index: 3000; +} + +.edui-default .edui-menu .edui-popup-content { + padding: 3px; +} + +.edui-default .edui-menu-body { + _width: 150px; + min-width: 170px; + background: url("../images/sparator_v.png") repeat-y 25px; +} + +.edui-default .edui-menuitem-body { +} + +.edui-default .edui-menuitem { + height: 20px; + cursor: default; + vertical-align: top; +} + +.edui-default .edui-menuitem .edui-icon { + width: 20px !important; + height: 20px !important; + background: url(../images/icons.png) 0 -4000px; + background: url(../images/icons.gif) 0 -4000px\9; +} + +.edui-default .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} + +.edui-default .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} + +.edui-default .edui-state-disabled .edui-menuitem-label { + color: gray; +} + + +/*不可选中菜单按钮 */ +.edui-default .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity = 30); +} + +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} +/*普通按钮样式及状态*/ +.edui-default .edui-toolbar .edui-button .edui-icon, +.edui-default .edui-toolbar .edui-menubutton .edui-icon, +.edui-default .edui-toolbar .edui-splitbutton .edui-icon { + height: 20px !important; + width: 20px !important; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +.edui-default .edui-toolbar .edui-button .edui-button-wrap { + padding: 1px; + position: relative; +} + +.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #fff5d4; + padding: 0; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #ffe69f; + padding: 0; + border: 1px solid #dcac6c; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #ffffff; + padding: 0; + border: 1px solid gray; +} +.edui-default .edui-toolbar .edui-state-disabled .edui-label { + color: #ccc; +} +.edui-default .edui-toolbar .edui-state-disabled .edui-icon { + opacity: 0.3; + filter: alpha(opacity = 30); +} + +/* toolbar icons */ +.edui-default .edui-for-undo .edui-icon { + background-position: -160px 0; +} + +.edui-default .edui-for-redo .edui-icon { + background-position: -100px 0; +} + +.edui-default .edui-for-bold .edui-icon { + background-position: 0 0; +} + +.edui-default .edui-for-italic .edui-icon { + background-position: -60px 0; +} + +.edui-default .edui-for-fontborder .edui-icon { + background-position:-160px -40px; +} +.edui-default .edui-for-underline .edui-icon { + background-position: -140px 0; +} + +.edui-default .edui-for-strikethrough .edui-icon { + background-position: -120px 0; +} + +.edui-default .edui-for-subscript .edui-icon { + background-position: -600px 0; +} + +.edui-default .edui-for-superscript .edui-icon { + background-position: -620px 0; +} + +.edui-default .edui-for-blockquote .edui-icon { + background-position: -220px 0; +} + +.edui-default .edui-for-forecolor .edui-icon { + background-position: -720px 0; +} + +.edui-default .edui-for-backcolor .edui-icon { + background-position: -760px 0; +} + +.edui-default .edui-for-inserttable .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-autotypeset .edui-icon { + background-position: -640px -40px; +} + +.edui-default .edui-for-justifyleft .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-justifycenter .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-justifyright .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-justifyjustify .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-insertorderedlist .edui-icon { + background-position: -80px 0; +} + +.edui-default .edui-for-insertunorderedlist .edui-icon { + background-position: -20px 0; +} + +.edui-default .edui-for-lineheight .edui-icon { + background-position: -725px -40px; +} + +.edui-default .edui-for-rowspacingbottom .edui-icon { + background-position: -745px -40px; +} + +.edui-default .edui-for-rowspacingtop .edui-icon { + background-position: -765px -40px; +} + +.edui-default .edui-for-horizontal .edui-icon { + background-position: -360px 0; +} + +.edui-default .edui-for-link .edui-icon { + background-position: -500px 0; +} + +.edui-default .edui-for-code .edui-icon { + background-position: -440px -40px; +} + +.edui-default .edui-for-insertimage .edui-icon { + background-position: -726px -77px; +} + +.edui-default .edui-for-insertframe .edui-icon { + background-position: -240px -40px; +} + +.edui-default .edui-for-emoticon .edui-icon { + background-position: -60px -20px; +} + +.edui-default .edui-for-spechars .edui-icon { + background-position: -240px 0; +} + +.edui-default .edui-for-help .edui-icon { + background-position: -340px 0; +} + +.edui-default .edui-for-print .edui-icon { + background-position: -440px -20px; +} + +.edui-default .edui-for-preview .edui-icon { + background-position: -420px -20px; +} + +.edui-default .edui-for-selectall .edui-icon { + background-position: -400px -20px; +} + +.edui-default .edui-for-searchreplace .edui-icon { + background-position: -520px -20px; +} + +.edui-default .edui-for-map .edui-icon { + background-position: -40px -40px; +} + +.edui-default .edui-for-gmap .edui-icon { + background-position: -260px -40px; +} + +.edui-default .edui-for-insertvideo .edui-icon { + background-position: -320px -20px; +} + +.edui-default .edui-for-time .edui-icon { + background-position: -160px -20px; +} + +.edui-default .edui-for-date .edui-icon { + background-position: -140px -20px; +} + +.edui-default .edui-for-cut .edui-icon { + background-position: -680px 0; +} + +.edui-default .edui-for-copy .edui-icon { + background-position: -700px 0; +} + +.edui-default .edui-for-paste .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-formatmatch .edui-icon { + background-position: -40px 0; +} + +.edui-default .edui-for-pasteplain .edui-icon { + background-position: -360px -20px; +} + +.edui-default .edui-for-directionalityltr .edui-icon { + background-position: -20px -20px; +} + +.edui-default .edui-for-directionalityrtl .edui-icon { + background-position: -40px -20px; +} + +.edui-default .edui-for-source .edui-icon { + background-position: -261px -0px; +} + +.edui-default .edui-for-removeformat .edui-icon { + background-position: -580px 0; +} + +.edui-default .edui-for-unlink .edui-icon { + background-position: -640px 0; +} + +.edui-default .edui-for-touppercase .edui-icon { + background-position: -786px 0; +} + +.edui-default .edui-for-tolowercase .edui-icon { + background-position: -806px 0; +} + +.edui-default .edui-for-insertrow .edui-icon { + background-position: -478px -76px; +} + +.edui-default .edui-for-insertrownext .edui-icon { + background-position: -498px -76px; +} + +.edui-default .edui-for-insertcol .edui-icon { + background-position: -455px -76px; +} + +.edui-default .edui-for-insertcolnext .edui-icon { + background-position: -429px -76px; +} + +.edui-default .edui-for-mergeright .edui-icon { + background-position: -60px -40px; +} + +.edui-default .edui-for-mergedown .edui-icon { + background-position: -80px -40px; +} + +.edui-default .edui-for-splittorows .edui-icon { + background-position: -100px -40px; +} + +.edui-default .edui-for-splittocols .edui-icon { + background-position: -120px -40px; +} + +.edui-default .edui-for-insertparagraphbeforetable .edui-icon { + background-position: -140px -40px; +} + +.edui-default .edui-for-deleterow .edui-icon { + background-position: -660px -20px; +} + +.edui-default .edui-for-deletecol .edui-icon { + background-position: -640px -20px; +} + +.edui-default .edui-for-splittocells .edui-icon { + background-position: -800px -20px; +} + +.edui-default .edui-for-mergecells .edui-icon { + background-position: -760px -20px; +} + +.edui-default .edui-for-deletetable .edui-icon { + background-position: -620px -20px; +} + +.edui-default .edui-for-cleardoc .edui-icon { + background-position: -520px 0; +} + +.edui-default .edui-for-fullscreen .edui-icon { + background-position: -100px -20px; +} + +.edui-default .edui-for-anchor .edui-icon { + background-position: -200px 0; +} + +.edui-default .edui-for-pagebreak .edui-icon { + background-position: -460px -40px; +} + +.edui-default .edui-for-imagenone .edui-icon { + background-position: -480px -40px; +} + +.edui-default .edui-for-imageleft .edui-icon { + background-position: -500px -40px; +} + +.edui-default .edui-for-wordimage .edui-icon { + background-position: -660px -40px; +} + +.edui-default .edui-for-imageright .edui-icon { + background-position: -520px -40px; +} + +.edui-default .edui-for-imagecenter .edui-icon { + background-position: -540px -40px; +} + +.edui-default .edui-for-indent .edui-icon { + background-position: -400px 0; +} + +.edui-default .edui-for-outdent .edui-icon { + background-position: -540px 0; +} + +.edui-default .edui-for-webapp .edui-icon { + background-position: -601px -40px +} + +.edui-default .edui-for-table .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-edittable .edui-icon { + background-position: -420px -40px; +} + +.edui-default .edui-for-template .edui-icon { + background-position: -339px -40px; +} + +.edui-default .edui-for-delete .edui-icon { + background-position: -360px -40px; +} + +.edui-default .edui-for-attachment .edui-icon { + background-position: -620px -40px; +} + +.edui-default .edui-for-edittd .edui-icon { + background-position: -700px -40px; +} + +.edui-default .edui-for-snapscreen .edui-icon { + background-position: -581px -40px +} + +.edui-default .edui-for-scrawl .edui-icon { + background-position: -801px -41px +} + +.edui-default .edui-for-background .edui-icon { + background-position: -680px -40px; +} + +.edui-default .edui-for-music .edui-icon { + background-position: -18px -40px +} + +.edui-default .edui-for-formula .edui-icon { + background-position: -200px -40px +} + +.edui-default .edui-for-aligntd .edui-icon { + background-position: -236px -76px; +} + +.edui-default .edui-for-insertparagraphtrue .edui-icon { + background-position: -625px -76px; +} + +.edui-default .edui-for-insertparagraph .edui-icon { + background-position: -602px -76px; +} + +.edui-default .edui-for-insertcaption .edui-icon { + background-position: -336px -76px; +} + +.edui-default .edui-for-deletecaption .edui-icon { + background-position: -362px -76px; +} + +.edui-default .edui-for-inserttitle .edui-icon { + background-position: -286px -76px; +} + +.edui-default .edui-for-deletetitle .edui-icon { + background-position: -311px -76px; +} + +.edui-default .edui-for-aligntable .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-tablealignment-left .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-tablealignment-center .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-tablealignment-right .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-drafts .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-charts .edui-icon { + background: url( ../images/charts.png ) no-repeat 2px 3px!important; +} + +.edui-default .edui-for-inserttitlecol .edui-icon { + background-position: -673px -76px; +} + +.edui-default .edui-for-deletetitlecol .edui-icon { + background-position: -698px -76px; +} + +.edui-default .edui-for-simpleupload .edui-icon { + background-position: -380px 0px; +} +/*splitbutton*/ +.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, +.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { + padding: 1px; +} + +.edui-default .edui-toolbar .edui-splitborder { + width: 1px; + height: 20px; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-splitborder { + width: 1px; + border-left: 0px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-active .edui-splitborder { + width: 0; + border-left: 1px solid gray; +} + +.edui-default .edui-toolbar .edui-state-opened .edui-splitborder { + width: 1px; + border: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #ffffff; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity = 30); +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + background-color: white; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-for-insertorderedlist .edui-bordereraser, +.edui-default .edui-for-lineheight .edui-bordereraser, +.edui-default .edui-for-rowspacingtop .edui-bordereraser, +.edui-default .edui-for-rowspacingbottom .edui-bordereraser, +.edui-default .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-default .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, +.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { + /*background-position: 0 -40px;*/ + background-image: none ; +} + +/* 弹出菜单 */ +.edui-default .edui-popup { + z-index: 3000; + background-color: #ffffff; + width:auto; + height:auto; + +} + +.edui-default .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-popup-content { + border:1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 5px; + background:#ffffff; +} + +.edui-default .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; +} + +.edui-default .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-default .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-default .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-default .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-default .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div{ + width:auto; + height:auto; +} +.edui-default .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} + +.edui-default .edui-message{ + min-height: 10px; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} +.edui-default .edui-message-body{ + border-radius: 3px; + padding: 8px 15px 8px 8px; + color: #c09853; + background-color: #fcf8e3; + border: 1px solid #fbeed5; +} +.edui-default .edui-message-type-info{ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} +.edui-default .edui-message-type-success{ + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.edui-default .edui-message-type-danger, +.edui-default .edui-message-type-error{ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} +.edui-default .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} +.edui-default .edui-message .edui-message-content { + font-size: 10pt; + word-wrap: break-word; + word-break: normal; +} +/* 弹出对话框按钮和对话框大小 */ +.edui-default .edui-dialog { + z-index: 2000; + position: absolute; + +} + +.edui-dialog div{ + width:auto; +} + +.edui-default .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} + +.edui-default .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} + +.edui-default .edui-dialog-body { + position: relative; + padding:2px 0 0 2px; + _zoom: 1; +} + +.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} + +.edui-default .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.edui-default .edui-dialog-foot { + background-color: white; +} + +.edui-default .edui-dialog-titlebar { + height: 26px; + border-bottom: 1px solid #c6c6c6; + background: url(../images/dialog-title-bg.png) repeat-x bottom; + position: relative; + cursor: move; +} +.edui-default .edui-dialog-caption { + font-weight: bold; + font-size: 12px; + line-height: 26px; + padding-left: 5px; +} + +.edui-default .edui-dialog-draghandle { + height: 26px; +} + +.edui-default .edui-dialog-closebutton { + position: absolute !important; + right: 5px; + top: 3px; +} + +.edui-default .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + background: url("../images/icons-all.gif") no-repeat 0 -59px; +} + +.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -89px; +} + +.edui-default .edui-dialog-foot { + height: 40px; +} + +.edui-default .edui-dialog-buttons { + position: absolute; + right: 0; +} + +.edui-default .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-button-body { + background: url("../images/icons-all.gif") no-repeat; + height: 24px; + width: 96px; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: default; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -30px; +} + +.edui-default .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-default .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity = 30); + background-color: #ccc; + position: absolute; + /*z-index: 1999;*/ +} + +.edui-default .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-default .edui-dialog-content { + position: relative; +} + +.edui-default .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity = 0); +} + +/*link-dialog*/ +.edui-default .edui-for-link .edui-dialog-content { + width: 420px; + height: 200px; + overflow: hidden; +} +/*background-dialog*/ +.edui-default .edui-for-background .edui-dialog-content { + width: 440px; + height: 280px; + overflow: hidden; +} + +/*template-dialog*/ +.edui-default .edui-for-template .edui-dialog-content { + width: 630px; + height: 390px; + overflow: hidden; +} + +/*scrawl-dialog*/ +.edui-default .edui-for-scrawl .edui-dialog-content { + width: 515px; + *width: 506px; + height: 360px; +} + +/*spechars-dialog*/ +.edui-default .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-default .edui-for-insertimage .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} +/*webapp-dialog*/ +.edui-default .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-default .edui-for-insertframe .edui-dialog-content { + width: 350px; + height: 200px; + overflow: hidden; +} + +/*wordImage-dialog*/ +.edui-default .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-default .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + + +/*map-dialog*/ +.edui-default .edui-for-map .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*gmap-dialog*/ +.edui-default .edui-for-gmap .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*video-dialog*/ +.edui-default .edui-for-insertvideo .edui-dialog-content { + width: 590px; + height: 390px; +} + +/*anchor-dialog*/ +.edui-default .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-default .edui-for-searchreplace .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*help-dialog*/ +.edui-default .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-default .edui-for-edittable .edui-dialog-content { + width: 540px; + _width:590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-default .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-default .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} +/*snapscreen-dialog*/ +.edui-default .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-default .edui-for-music .edui-dialog-content { + width: 515px; + height: 360px; +} + +/*段落弹出菜单*/ +.edui-default .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} +/* 表格弹出菜单 */ +.edui-default .edui-for-inserttable .edui-splitborder { + display: none +} +.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} +.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ + border-left: 1px solid transparent; +} +.edui-default .edui-tablepicker .edui-infoarea { + height: 14px; + line-height: 14px; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-default .edui-dialog-buttons .edui-label { + line-height: 24px; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-default .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-default .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} + +/* 颜色弹出菜单 */ +.edui-default .edui-colorpicker-topbar { + height: 27px; + width: 200px; + /*border-bottom: 1px gray dashed;*/ +} + +.edui-default .edui-colorpicker-preview { + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} + +.edui-default .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} + +.edui-default .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-default .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-default .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} +.edui-default .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.edui-colorpicker-adv{ + position: relative; + overflow: hidden; + height: 180px; + display: none; +} +.edui-colorpicker-plant, .edui-colorpicker-hue { + border: solid 1px #666; +} +.edui-colorpicker-pad { + width: 150px; + height: 150px; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} +/*自动排版弹出菜单*/ +.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-default .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap:break-word; +} + +.edui-default .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} +/*自动排版弹出菜单*/ +.edui-default .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-default .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} +.edui-default .edui-cellalignpicker-body td{ + padding: 1px; +} +.edui-default .edui-cellalignpicker-body .edui-icon{ + height: 20px; + width: 20px; + padding: 1px; + background-image: url(../images/table-cell-align.png); +} + +.edui-default .edui-cellalignpicker-body .edui-left{ + background-position: 0 0; +} + +.edui-default .edui-cellalignpicker-body .edui-center{ + background-position: -25px 0; +} +.edui-default .edui-cellalignpicker-body .edui-right{ + background-position: -51px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{ + background-position: -73px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{ + background-position: -98px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ + background-position: -124px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} +/*分隔线*/ +.edui-default .edui-toolbar .edui-separator { + width: 2px; + height: 20px; + margin: 2px 4px 2px 3px; + background: url(../images/icons.png) -181px 0; + background: url(../images/icons.gif) -181px 0 \9; +} + +/*颜色按钮 */ +.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 1px; + left: 1px; + width: 18px; + height: 4px; +} +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-default .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} +.edui-default .edui-for-emotion .edui-popup-content iframe +{ + width: 514px; + height: 380px; + overflow: hidden; +} +.edui-default .edui-for-emotion .edui-popup-content +{ + position: relative; + z-index: 555 +} + +.edui-default .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow +{ + width: 0 +} +.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder +{ + border-left: 1px solid transparent; +} +/*contextmenu*/ +.edui-default .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; + background: url("../images/icons-all.gif") no-repeat 10px -233px; +} + +.edui-default .edui-menu-body .edui-menuitem { + padding: 1px; +} + +.edui-default .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; +} + +.edui-default .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-default .edui-menu-body .edui-state-hover { + padding: 0 !important; + background-color: #fff5d4; + border: 1px solid #dcac6c; +} +/*弹出菜单*/ +.edui-default .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} + +/*粘贴弹出菜单*/ +.edui-default .edui-wordpastepop .edui-popup-content{ + border: none; + padding: 0; + width: 54px; + height: 21px; +} +.edui-default .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-default .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-default .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-default .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.edui-default .edui-pastecontainer .edui-button { + overflow: hidden; + margin: 3px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-default .edui-pastecontainer .edui-button .edui-tagicon, +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{ + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} +.edui-default .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { + background-position: -109px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ + background-position: -148px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + background-position: -72px -34px; +} \ No newline at end of file diff --git a/member/editor/ueditor/themes/default/css/ueditor.min.css b/member/editor/ueditor/themes/default/css/ueditor.min.css new file mode 100644 index 0000000..4bc00c7 --- /dev/null +++ b/member/editor/ueditor/themes/default/css/ueditor.min.css @@ -0,0 +1,8 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) + */ + + +.edui-default .edui-box{border:0;padding:0;margin:0;overflow:hidden}.edui-default a.edui-box{display:block;text-decoration:none;color:#000}.edui-default a.edui-box:hover{text-decoration:none}.edui-default a.edui-box:active{text-decoration:none}.edui-default table.edui-box{border-collapse:collapse}.edui-default ul.edui-box{list-style-type:none}div.edui-box{position:relative;display:-moz-inline-box!important;display:inline-block!important;vertical-align:top}.edui-default .edui-clearfix{zoom:1}.edui-default .edui-clearfix:after{content:'\20';display:block;clear:both}* html div.edui-box{display:inline!important}:first-child+html div.edui-box{display:inline!important}.edui-default .edui-button-body,.edui-splitbutton-body,.edui-menubutton-body,.edui-combox-body{position:relative}.edui-default .edui-popup{position:absolute;-webkit-user-select:none;-moz-user-select:none}.edui-default .edui-popup .edui-shadow{position:absolute;z-index:-1}.edui-default .edui-popup .edui-bordereraser{position:absolute;overflow:hidden}.edui-default .edui-tablepicker .edui-canvas{position:relative}.edui-default .edui-tablepicker .edui-canvas .edui-overlay{position:absolute}.edui-default .edui-dialog-modalmask,.edui-dialog-dragmask{position:absolute;left:0;top:0;width:100%;height:100%}.edui-default .edui-toolbar{position:relative}.edui-default .edui-label{cursor:default}.edui-default span.edui-clickable{color:#00f;cursor:pointer;text-decoration:underline}.edui-default span.edui-unclickable{color:gray;cursor:default}.edui-default .edui-toolbar{cursor:default;-webkit-user-select:none;-moz-user-select:none;padding:1px;overflow:hidden;zoom:1;width:auto;height:auto}.edui-default .edui-toolbar .edui-button,.edui-default .edui-toolbar .edui-splitbutton,.edui-default .edui-toolbar .edui-menubutton,.edui-default .edui-toolbar .edui-combox{margin:1px}.edui-default .edui-editor{border:1px solid #d4d4d4;background-color:#fff;position:relative;overflow:visible;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.edui-editor div{width:auto;height:auto}.edui-default .edui-editor-toolbarbox{position:relative;zoom:1;-webkit-box-shadow:0 1px 4px rgba(204,204,204,.6);-moz-box-shadow:0 1px 4px rgba(204,204,204,.6);box-shadow:0 1px 4px rgba(204,204,204,.6);border-top-left-radius:2px;border-top-right-radius:2px}.edui-default .edui-editor-toolbarboxouter{border-bottom:1px solid #d4d4d4;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.edui-default .edui-editor-toolbarboxinner{padding:2px}.edui-default .edui-editor-iframeholder{position:relative}.edui-default .edui-editor-bottomContainer{overflow:hidden}.edui-default .edui-editor-bottomContainer table{width:100%;height:0;overflow:hidden;border-spacing:0}.edui-default .edui-editor-bottomContainer td{white-space:nowrap;border-top:1px solid #ccc;line-height:20px;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif}.edui-default .edui-editor-wordcount{text-align:right;margin-right:5px;color:#aaa}.edui-default .edui-editor-scale{width:12px}.edui-default .edui-editor-scale .edui-editor-icon{float:right;width:100%;height:12px;margin-top:10px;background:url(../images/scale.png) no-repeat;cursor:se-resize}.edui-default .edui-editor-breadcrumb{margin:2px 0 0 3px}.edui-default .edui-editor-breadcrumb span{cursor:pointer;text-decoration:underline;color:#00f}.edui-default .edui-toolbar .edui-for-fullscreen{float:right}.edui-default .edui-bubble .edui-popup-content{border:1px solid #DCAC6C;background-color:#fff6d9;padding:5px;font-size:10pt;font-family:"宋体"}.edui-default .edui-bubble .edui-shadow{}.edui-default .edui-editor-toolbarmsg{background-color:#FFF6D9;border-bottom:1px solid #ccc;position:absolute;bottom:-25px;left:0;z-index:1009;width:99.9%}.edui-default .edui-editor-toolbarmsg-upload{font-size:14px;color:#00f;width:100px;height:16px;line-height:16px;cursor:pointer;position:absolute;top:5px;left:350px}.edui-default .edui-editor-toolbarmsg-label{font-size:12px;line-height:16px;padding:4px}.edui-default .edui-editor-toolbarmsg-close{float:right;width:20px;height:16px;line-height:16px;cursor:pointer;color:red}.edui-default .edui-list .edui-bordereraser{display:none}.edui-default .edui-listitem{padding:1px;white-space:nowrap}.edui-default .edui-list .edui-state-hover{position:relative;background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-for-fontfamily .edui-listitem-label{min-width:130px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-insertcode .edui-listitem-label{min-width:120px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-underline .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px;font-size:12px}.edui-default .edui-for-fontsize .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px}.edui-default .edui-for-paragraph .edui-listitem-label{min-width:200px;_width:200px;padding:2px 5px}.edui-default .edui-for-rowspacingtop .edui-listitem-label,.edui-default .edui-for-rowspacingbottom .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-lineheight .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-customstyle .edui-listitem-label{min-width:200px;_width:200px;width:200px!important;padding:2px 5px}.edui-default .edui-menu{z-index:3000}.edui-default .edui-menu .edui-popup-content{padding:3px}.edui-default .edui-menu-body{_width:150px;min-width:170px;background:url(../images/sparator_v.png) repeat-y 25px}.edui-default .edui-menuitem-body{}.edui-default .edui-menuitem{height:20px;cursor:default;vertical-align:top}.edui-default .edui-menuitem .edui-icon{width:20px!important;height:20px!important;background:url(../images/icons.png) 0 -4000px;background:url(../images/icons.gif) 0 -4000px\9}.edui-default .edui-menuitem .edui-label{font-size:12px;line-height:20px;height:20px;padding-left:10px}.edui-default .edui-state-checked .edui-menuitem-body{background:url(../images/icons-all.gif) no-repeat 6px -205px}.edui-default .edui-state-disabled .edui-menuitem-label{color:gray}.edui-default .edui-toolbar .edui-combox-body .edui-button-body{width:60px;font-size:12px;height:20px;line-height:20px;padding-left:5px;white-space:nowrap;margin:0 3px 0 0}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-combox .edui-combox-body{border:1px solid #CCC;background-color:#fff;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-combox-body .edui-splitborder{display:none}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{border-left:1px solid #CCC}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body{background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow{border-left:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-checked .edui-combox-body{background-color:#FFE69F;border:1px solid #DCAC6C}.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow{border-left:1px solid #DCAC6C}.edui-toolbar .edui-state-disabled .edui-combox-body{background-color:#F0F0EE;opacity:.3;filter:alpha(opacity=30)}.edui-toolbar .edui-state-opened .edui-combox-body{background-color:#fff;border:1px solid gray}.edui-default .edui-toolbar .edui-button .edui-icon,.edui-default .edui-toolbar .edui-menubutton .edui-icon,.edui-default .edui-toolbar .edui-splitbutton .edui-icon{height:20px!important;width:20px!important;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-default .edui-toolbar .edui-button .edui-button-wrap{padding:1px;position:relative}.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap{background-color:#fff5d4;padding:0;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap{background-color:#ffe69f;padding:0;border:1px solid #dcac6c;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap{background-color:#fff;padding:0;border:1px solid gray}.edui-default .edui-toolbar .edui-state-disabled .edui-label{color:#ccc}.edui-default .edui-toolbar .edui-state-disabled .edui-icon{opacity:.3;filter:alpha(opacity=30)}.edui-default .edui-for-undo .edui-icon{background-position:-160px 0}.edui-default .edui-for-redo .edui-icon{background-position:-100px 0}.edui-default .edui-for-bold .edui-icon{background-position:0 0}.edui-default .edui-for-italic .edui-icon{background-position:-60px 0}.edui-default .edui-for-fontborder .edui-icon{background-position:-160px -40px}.edui-default .edui-for-underline .edui-icon{background-position:-140px 0}.edui-default .edui-for-strikethrough .edui-icon{background-position:-120px 0}.edui-default .edui-for-subscript .edui-icon{background-position:-600px 0}.edui-default .edui-for-superscript .edui-icon{background-position:-620px 0}.edui-default .edui-for-blockquote .edui-icon{background-position:-220px 0}.edui-default .edui-for-forecolor .edui-icon{background-position:-720px 0}.edui-default .edui-for-backcolor .edui-icon{background-position:-760px 0}.edui-default .edui-for-inserttable .edui-icon{background-position:-580px -20px}.edui-default .edui-for-autotypeset .edui-icon{background-position:-640px -40px}.edui-default .edui-for-justifyleft .edui-icon{background-position:-460px 0}.edui-default .edui-for-justifycenter .edui-icon{background-position:-420px 0}.edui-default .edui-for-justifyright .edui-icon{background-position:-480px 0}.edui-default .edui-for-justifyjustify .edui-icon{background-position:-440px 0}.edui-default .edui-for-insertorderedlist .edui-icon{background-position:-80px 0}.edui-default .edui-for-insertunorderedlist .edui-icon{background-position:-20px 0}.edui-default .edui-for-lineheight .edui-icon{background-position:-725px -40px}.edui-default .edui-for-rowspacingbottom .edui-icon{background-position:-745px -40px}.edui-default .edui-for-rowspacingtop .edui-icon{background-position:-765px -40px}.edui-default .edui-for-horizontal .edui-icon{background-position:-360px 0}.edui-default .edui-for-link .edui-icon{background-position:-500px 0}.edui-default .edui-for-code .edui-icon{background-position:-440px -40px}.edui-default .edui-for-insertimage .edui-icon{background-position:-726px -77px}.edui-default .edui-for-insertframe .edui-icon{background-position:-240px -40px}.edui-default .edui-for-emoticon .edui-icon{background-position:-60px -20px}.edui-default .edui-for-spechars .edui-icon{background-position:-240px 0}.edui-default .edui-for-help .edui-icon{background-position:-340px 0}.edui-default .edui-for-print .edui-icon{background-position:-440px -20px}.edui-default .edui-for-preview .edui-icon{background-position:-420px -20px}.edui-default .edui-for-selectall .edui-icon{background-position:-400px -20px}.edui-default .edui-for-searchreplace .edui-icon{background-position:-520px -20px}.edui-default .edui-for-map .edui-icon{background-position:-40px -40px}.edui-default .edui-for-gmap .edui-icon{background-position:-260px -40px}.edui-default .edui-for-insertvideo .edui-icon{background-position:-320px -20px}.edui-default .edui-for-time .edui-icon{background-position:-160px -20px}.edui-default .edui-for-date .edui-icon{background-position:-140px -20px}.edui-default .edui-for-cut .edui-icon{background-position:-680px 0}.edui-default .edui-for-copy .edui-icon{background-position:-700px 0}.edui-default .edui-for-paste .edui-icon{background-position:-560px 0}.edui-default .edui-for-formatmatch .edui-icon{background-position:-40px 0}.edui-default .edui-for-pasteplain .edui-icon{background-position:-360px -20px}.edui-default .edui-for-directionalityltr .edui-icon{background-position:-20px -20px}.edui-default .edui-for-directionalityrtl .edui-icon{background-position:-40px -20px}.edui-default .edui-for-source .edui-icon{background-position:-261px -0px}.edui-default .edui-for-removeformat .edui-icon{background-position:-580px 0}.edui-default .edui-for-unlink .edui-icon{background-position:-640px 0}.edui-default .edui-for-touppercase .edui-icon{background-position:-786px 0}.edui-default .edui-for-tolowercase .edui-icon{background-position:-806px 0}.edui-default .edui-for-insertrow .edui-icon{background-position:-478px -76px}.edui-default .edui-for-insertrownext .edui-icon{background-position:-498px -76px}.edui-default .edui-for-insertcol .edui-icon{background-position:-455px -76px}.edui-default .edui-for-insertcolnext .edui-icon{background-position:-429px -76px}.edui-default .edui-for-mergeright .edui-icon{background-position:-60px -40px}.edui-default .edui-for-mergedown .edui-icon{background-position:-80px -40px}.edui-default .edui-for-splittorows .edui-icon{background-position:-100px -40px}.edui-default .edui-for-splittocols .edui-icon{background-position:-120px -40px}.edui-default .edui-for-insertparagraphbeforetable .edui-icon{background-position:-140px -40px}.edui-default .edui-for-deleterow .edui-icon{background-position:-660px -20px}.edui-default .edui-for-deletecol .edui-icon{background-position:-640px -20px}.edui-default .edui-for-splittocells .edui-icon{background-position:-800px -20px}.edui-default .edui-for-mergecells .edui-icon{background-position:-760px -20px}.edui-default .edui-for-deletetable .edui-icon{background-position:-620px -20px}.edui-default .edui-for-cleardoc .edui-icon{background-position:-520px 0}.edui-default .edui-for-fullscreen .edui-icon{background-position:-100px -20px}.edui-default .edui-for-anchor .edui-icon{background-position:-200px 0}.edui-default .edui-for-pagebreak .edui-icon{background-position:-460px -40px}.edui-default .edui-for-imagenone .edui-icon{background-position:-480px -40px}.edui-default .edui-for-imageleft .edui-icon{background-position:-500px -40px}.edui-default .edui-for-wordimage .edui-icon{background-position:-660px -40px}.edui-default .edui-for-imageright .edui-icon{background-position:-520px -40px}.edui-default .edui-for-imagecenter .edui-icon{background-position:-540px -40px}.edui-default .edui-for-indent .edui-icon{background-position:-400px 0}.edui-default .edui-for-outdent .edui-icon{background-position:-540px 0}.edui-default .edui-for-webapp .edui-icon{background-position:-601px -40px}.edui-default .edui-for-table .edui-icon{background-position:-580px -20px}.edui-default .edui-for-edittable .edui-icon{background-position:-420px -40px}.edui-default .edui-for-template .edui-icon{background-position:-339px -40px}.edui-default .edui-for-delete .edui-icon{background-position:-360px -40px}.edui-default .edui-for-attachment .edui-icon{background-position:-620px -40px}.edui-default .edui-for-edittd .edui-icon{background-position:-700px -40px}.edui-default .edui-for-snapscreen .edui-icon{background-position:-581px -40px}.edui-default .edui-for-scrawl .edui-icon{background-position:-801px -41px}.edui-default .edui-for-background .edui-icon{background-position:-680px -40px}.edui-default .edui-for-music .edui-icon{background-position:-18px -40px}.edui-default .edui-for-formula .edui-icon{background-position:-200px -40px}.edui-default .edui-for-aligntd .edui-icon{background-position:-236px -76px}.edui-default .edui-for-insertparagraphtrue .edui-icon{background-position:-625px -76px}.edui-default .edui-for-insertparagraph .edui-icon{background-position:-602px -76px}.edui-default .edui-for-insertcaption .edui-icon{background-position:-336px -76px}.edui-default .edui-for-deletecaption .edui-icon{background-position:-362px -76px}.edui-default .edui-for-inserttitle .edui-icon{background-position:-286px -76px}.edui-default .edui-for-deletetitle .edui-icon{background-position:-311px -76px}.edui-default .edui-for-aligntable .edui-icon{background-position:-440px 0}.edui-default .edui-for-tablealignment-left .edui-icon{background-position:-460px 0}.edui-default .edui-for-tablealignment-center .edui-icon{background-position:-420px 0}.edui-default .edui-for-tablealignment-right .edui-icon{background-position:-480px 0}.edui-default .edui-for-drafts .edui-icon{background-position:-560px 0}.edui-default .edui-for-charts .edui-icon{background:url( ../images/charts.png ) no-repeat 2px 3px!important}.edui-default .edui-for-inserttitlecol .edui-icon{background-position:-673px -76px}.edui-default .edui-for-deletetitlecol .edui-icon{background-position:-698px -76px}.edui-default .edui-for-simpleupload .edui-icon{background-position:-380px 0}.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body{padding:1px}.edui-default .edui-toolbar .edui-splitborder{width:1px;height:20px}.edui-default .edui-toolbar .edui-state-hover .edui-splitborder{width:1px;border-left:0 solid #dcac6c}.edui-default .edui-toolbar .edui-state-active .edui-splitborder{width:0;border-left:1px solid gray}.edui-default .edui-toolbar .edui-state-opened .edui-splitborder{width:1px;border:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body{background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body{background-color:#FFE69F;border:1px solid #DCAC6C;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-state-disabled .edui-arrow{opacity:.3;_filter:alpha(opacity=30)}.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-for-insertorderedlist .edui-bordereraser,.edui-default .edui-for-lineheight .edui-bordereraser,.edui-default .edui-for-rowspacingtop .edui-bordereraser,.edui-default .edui-for-rowspacingbottom .edui-bordereraser,.edui-default .edui-for-insertunorderedlist .edui-bordereraser{background-color:#fff}.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon{background-image:none}.edui-default .edui-popup{z-index:3000;background-color:#fff;width:auto;height:auto}.edui-default .edui-popup .edui-shadow{left:0;top:0;width:100%;height:100%}.edui-default .edui-popup-content{border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 4px rgba(0,0,0,.2);-moz-box-shadow:0 3px 4px rgba(0,0,0,.2);box-shadow:0 3px 4px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;padding:5px;background:#fff}.edui-default .edui-popup .edui-bordereraser{background-color:#fff;height:3px}.edui-default .edui-menu .edui-bordereraser{height:3px}.edui-default .edui-anchor-topleft .edui-bordereraser{left:1px;top:-2px}.edui-default .edui-anchor-topright .edui-bordereraser{right:1px;top:-2px}.edui-default .edui-anchor-bottomleft .edui-bordereraser{left:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-default .edui-anchor-bottomright .edui-bordereraser{right:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-popup div{width:auto;height:auto}.edui-default .edui-editor-messageholder{display:block;width:150px;height:auto;border:0;margin:0;padding:0;position:absolute;top:28px;right:3px}.edui-default .edui-message{min-height:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);padding:0;margin-bottom:3px;position:relative}.edui-default .edui-message-body{border-radius:3px;padding:8px 15px 8px 8px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5}.edui-default .edui-message-type-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.edui-default .edui-message-type-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.edui-default .edui-message-type-danger,.edui-default .edui-message-type-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.edui-default .edui-message .edui-message-closer{display:block;width:16px;height:16px;line-height:16px;position:absolute;top:0;right:0;padding:0;cursor:pointer;background:transparent;border:0;float:right;font-size:20px;font-weight:700;color:#999;text-shadow:0 1px 0 #fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.edui-default .edui-message .edui-message-content{font-size:10pt;word-wrap:break-word;word-break:normal}.edui-default .edui-dialog{z-index:2000;position:absolute}.edui-dialog div{width:auto}.edui-default .edui-dialog-wrap{margin-right:6px;margin-bottom:6px}.edui-default .edui-dialog-fullscreen-flag{margin-right:0;margin-bottom:0}.edui-default .edui-dialog-body{position:relative;padding:2px 0 0 2px;_zoom:1}.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body{padding:0}.edui-default .edui-dialog-shadow{position:absolute;z-index:-1;left:0;top:0;width:100%;height:100%;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.edui-default .edui-dialog-foot{background-color:#fff}.edui-default .edui-dialog-titlebar{height:26px;border-bottom:1px solid #c6c6c6;background:url(../images/dialog-title-bg.png) repeat-x bottom;position:relative;cursor:move}.edui-default .edui-dialog-caption{font-weight:700;font-size:12px;line-height:26px;padding-left:5px}.edui-default .edui-dialog-draghandle{height:26px}.edui-default .edui-dialog-closebutton{position:absolute!important;right:5px;top:3px}.edui-default .edui-dialog-closebutton .edui-button-body{height:20px;width:20px;cursor:pointer;background:url(../images/icons-all.gif) no-repeat 0 -59px}.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -89px}.edui-default .edui-dialog-foot{height:40px}.edui-default .edui-dialog-buttons{position:absolute;right:0}.edui-default .edui-dialog-buttons .edui-button{margin-right:10px}.edui-default .edui-dialog-buttons .edui-button .edui-button-body{background:url(../images/icons-all.gif) no-repeat;height:24px;width:96px;font-size:12px;line-height:24px;text-align:center;cursor:default}.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -30px}.edui-default .edui-dialog iframe{border:0;padding:0;margin:0;vertical-align:top}.edui-default .edui-dialog-modalmask{opacity:.3;filter:alpha(opacity=30);background-color:#ccc;position:absolute}.edui-default .edui-dialog-dragmask{position:absolute;background-color:transparent;cursor:move}.edui-default .edui-dialog-content{position:relative}.edui-default .dialogcontmask{cursor:move;visibility:hidden;display:block;position:absolute;width:100%;height:100%;opacity:0;filter:alpha(opacity=0)}.edui-default .edui-for-link .edui-dialog-content{width:420px;height:200px;overflow:hidden}.edui-default .edui-for-background .edui-dialog-content{width:440px;height:280px;overflow:hidden}.edui-default .edui-for-template .edui-dialog-content{width:630px;height:390px;overflow:hidden}.edui-default .edui-for-scrawl .edui-dialog-content{width:515px;*width:506px;height:360px}.edui-default .edui-for-spechars .edui-dialog-content{width:620px;height:500px;*width:630px;*height:570px}.edui-default .edui-for-insertimage .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-webapp .edui-dialog-content{width:560px;_width:565px;height:450px;overflow:hidden}.edui-default .edui-for-insertframe .edui-dialog-content{width:350px;height:200px;overflow:hidden}.edui-default .edui-for-wordimage .edui-dialog-content{width:620px;height:380px;overflow:hidden}.edui-default .edui-for-attachment .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-map .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-gmap .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-insertvideo .edui-dialog-content{width:590px;height:390px}.edui-default .edui-for-anchor .edui-dialog-content{width:320px;height:60px;overflow:hidden}.edui-default .edui-for-searchreplace .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-help .edui-dialog-content{width:400px;height:420px}.edui-default .edui-for-edittable .edui-dialog-content{width:540px;_width:590px;height:335px}.edui-default .edui-for-edittip .edui-dialog-content{width:225px;height:60px}.edui-default .edui-for-edittd .edui-dialog-content{width:240px;height:50px}.edui-default .edui-for-snapscreen .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-music .edui-dialog-content{width:515px;height:360px}.edui-default .edui-for-paragraph .edui-listitem-label{font-family:Tahoma,Verdana,Arial,Helvetica}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p{font-size:22px;line-height:27px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1{font-weight:bolder;font-size:32px;line-height:36px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2{font-weight:bolder;font-size:27px;line-height:29px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3{font-weight:bolder;font-size:19px;line-height:23px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4{font-weight:bolder;font-size:16px;line-height:19px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5{font-weight:bolder;font-size:13px;line-height:16px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6{font-weight:bolder;font-size:12px;line-height:14px}.edui-default .edui-for-inserttable .edui-splitborder{display:none}.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-tablepicker .edui-infoarea{height:14px;line-height:14px;font-size:12px;width:220px;margin-bottom:3px;clear:both}.edui-default .edui-tablepicker .edui-infoarea .edui-label{float:left}.edui-default .edui-dialog-buttons .edui-label{line-height:24px}.edui-default .edui-tablepicker .edui-infoarea .edui-clickable{float:right}.edui-default .edui-tablepicker .edui-pickarea{background:url(../images/unhighlighted.gif) repeat;height:220px;width:220px}.edui-default .edui-tablepicker .edui-pickarea .edui-overlay{background:url(../images/highlighted.gif) repeat}.edui-default .edui-colorpicker-topbar{height:27px;width:200px}.edui-default .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-default .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:14px;height:14px;border:1px solid #333;padding:3px 5px;cursor:pointer}.edui-default .edui-colorpicker-tablefirstrow{height:30px}.edui-default .edui-colorpicker-colorcell{width:14px;height:14px;display:block;margin:0;cursor:pointer}.edui-default .edui-colorpicker-colorcell:hover{width:14px;height:14px;margin:0}.edui-default .edui-colorpicker-advbtn{display:block;text-align:center;cursor:pointer;height:20px}.arrow_down{background:#fff url(../images/arrow_down.png) no-repeat center}.arrow_up{background:#fff url(../images/arrow_up.png) no-repeat center}.edui-colorpicker-adv{position:relative;overflow:hidden;height:180px;display:none}.edui-colorpicker-plant,.edui-colorpicker-hue{border:solid 1px #666}.edui-colorpicker-pad{width:150px;height:150px;left:14px;top:13px;position:absolute;background:red;overflow:hidden;cursor:crosshair}.edui-colorpicker-cover{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/tangram-colorpicker.png) -160px -200px}.edui-colorpicker-padDot{position:absolute;top:0;left:0;width:11px;height:11px;overflow:hidden;background:url(../images/tangram-colorpicker.png) 0 -200px repeat-x;z-index:1000}.edui-colorpicker-sliderMain{position:absolute;left:171px;top:13px;width:19px;height:152px;background:url(../images/tangram-colorpicker.png) -179px -12px no-repeat}.edui-colorpicker-slider{width:100%;height:100%;cursor:pointer}.edui-colorpicker-thumb{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:#fff;opacity:.8}.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body{font-size:12px;margin-bottom:3px;clear:both}.edui-default .edui-autotypesetpicker-body table{border-collapse:separate;border-spacing:2px}.edui-default .edui-autotypesetpicker-body td{font-size:12px;word-wrap:break-word}.edui-default .edui-autotypesetpicker-body td input{margin:3px 3px 3px 4px;*margin:1px 0 0}.edui-default .edui-cellalignpicker .edui-cellalignpicker-body{width:70px;font-size:12px;cursor:default}.edui-default .edui-cellalignpicker-body table{border-collapse:separate;border-spacing:0}.edui-default .edui-cellalignpicker-body td{padding:1px}.edui-default .edui-cellalignpicker-body .edui-icon{height:20px;width:20px;padding:1px;background-image:url(../images/table-cell-align.png)}.edui-default .edui-cellalignpicker-body .edui-left{background-position:0 0}.edui-default .edui-cellalignpicker-body .edui-center{background-position:-25px 0}.edui-default .edui-cellalignpicker-body .edui-right{background-position:-51px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{background-position:-73px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{background-position:-98px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{background-position:-124px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left{background-position:-146px 0;background-color:#f1f4f5}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center{background-position:-245px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right{background-position:-271px 0}.edui-default .edui-toolbar .edui-separator{width:2px;height:20px;margin:2px 4px 2px 3px;background:url(../images/icons.png) -181px 0;background:url(../images/icons.gif) -181px 0 \9}.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump{position:absolute;overflow:hidden;bottom:1px;left:1px;width:18px;height:4px}.edui-default .edui-for-emotion .edui-icon{background-position:-60px -20px}.edui-default .edui-for-emotion .edui-popup-content iframe{width:514px;height:380px;overflow:hidden}.edui-default .edui-for-emotion .edui-popup-content{position:relative;z-index:555}.edui-default .edui-for-emotion .edui-splitborder{display:none}.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-hassubmenu .edui-arrow{height:20px;width:20px;float:right;background:url(../images/icons-all.gif) no-repeat 10px -233px}.edui-default .edui-menu-body .edui-menuitem{padding:1px}.edui-default .edui-menuseparator{margin:2px 0;height:1px;overflow:hidden}.edui-default .edui-menuseparator-inner{border-bottom:1px solid #e2e3e3;margin-left:29px;margin-right:1px}.edui-default .edui-menu-body .edui-state-hover{padding:0!important;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-shortcutmenu{padding:2px;width:190px;height:50px;background-color:#fff;border:1px solid #ccc;border-radius:5px}.edui-default .edui-wordpastepop .edui-popup-content{border:0;padding:0;width:54px;height:21px}.edui-default .edui-pasteicon{width:100%;height:100%;background-image:url(../images/wordpaste.png);background-position:0 0}.edui-default .edui-pasteicon.edui-state-opened{background-position:0 -34px}.edui-default .edui-pastecontainer{position:relative;visibility:hidden;width:97px;background:#fff;border:1px solid #ccc}.edui-default .edui-pastecontainer .edui-title{font-weight:700;background:#F8F8FF;height:25px;line-height:25px;font-size:12px;padding-left:5px}.edui-default .edui-pastecontainer .edui-button{overflow:hidden;margin:3px 0}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,.edui-default .edui-pastecontainer .edui-button .edui-tagicon,.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{float:left;cursor:pointer;width:29px;height:29px;margin-left:5px;background-image:url(../images/wordpaste.png);background-repeat:no-repeat}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon{margin-left:0;background-position:-109px 0}.edui-default .edui-pastecontainer .edui-button .edui-tagicon{background-position:-148px 1px}.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{background-position:-72px 0}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon{background-position:-109px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{background-position:-148px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{background-position:-72px -34px} \ No newline at end of file diff --git a/member/editor/ueditor/themes/default/dialogbase.css b/member/editor/ueditor/themes/default/dialogbase.css new file mode 100644 index 0000000..cd663d5 --- /dev/null +++ b/member/editor/ueditor/themes/default/dialogbase.css @@ -0,0 +1,100 @@ +/*弹出对话框页面样式组件 +*/ + +/*reset +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + outline: 0; + font-size: 100%; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*module +*/ +body { + background-color: #fff; + font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; + color: #646464; +} + +/*tab*/ +.tabhead { + position: relative; + z-index: 10; +} + +.tabhead span { + display: inline-block; + padding: 0 5px; + height: 30px; + border: 1px solid #ccc; + background: url("images/dialog-title-bg.png") repeat-x; + text-align: center; + line-height: 30px; + cursor: pointer; + *margin-right: 5px; +} + +.tabhead span.focus { + height: 31px; + border-bottom: none; + background: #fff; +} + +.tabbody { + position: relative; + top: -1px; + margin: 0 auto; + border: 1px solid #ccc; +} + +/*button*/ +a.button { + display: block; + text-align: center; + line-height: 24px; + text-decoration: none; + height: 24px; + width: 95px; + border: 0; + color: #838383; + background: url(../../themes/default/images/icons-all.gif) no-repeat; +} + +a.button:hover { + background-position: 0 -30px; +} \ No newline at end of file diff --git a/member/editor/ueditor/themes/default/images/anchor.gif b/member/editor/ueditor/themes/default/images/anchor.gif new file mode 100644 index 0000000..5aa797b Binary files /dev/null and b/member/editor/ueditor/themes/default/images/anchor.gif differ diff --git a/member/editor/ueditor/themes/default/images/arrow.png b/member/editor/ueditor/themes/default/images/arrow.png new file mode 100644 index 0000000..d900886 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/arrow.png differ diff --git a/member/editor/ueditor/themes/default/images/arrow_down.png b/member/editor/ueditor/themes/default/images/arrow_down.png new file mode 100644 index 0000000..e9257e8 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/arrow_down.png differ diff --git a/member/editor/ueditor/themes/default/images/arrow_up.png b/member/editor/ueditor/themes/default/images/arrow_up.png new file mode 100644 index 0000000..74277af Binary files /dev/null and b/member/editor/ueditor/themes/default/images/arrow_up.png differ diff --git a/member/editor/ueditor/themes/default/images/button-bg.gif b/member/editor/ueditor/themes/default/images/button-bg.gif new file mode 100644 index 0000000..ec7fa2e Binary files /dev/null and b/member/editor/ueditor/themes/default/images/button-bg.gif differ diff --git a/member/editor/ueditor/themes/default/images/cancelbutton.gif b/member/editor/ueditor/themes/default/images/cancelbutton.gif new file mode 100644 index 0000000..df4bc2c Binary files /dev/null and b/member/editor/ueditor/themes/default/images/cancelbutton.gif differ diff --git a/member/editor/ueditor/themes/default/images/charts.png b/member/editor/ueditor/themes/default/images/charts.png new file mode 100644 index 0000000..713965c Binary files /dev/null and b/member/editor/ueditor/themes/default/images/charts.png differ diff --git a/member/editor/ueditor/themes/default/images/cursor_h.gif b/member/editor/ueditor/themes/default/images/cursor_h.gif new file mode 100644 index 0000000..d7c3e7e Binary files /dev/null and b/member/editor/ueditor/themes/default/images/cursor_h.gif differ diff --git a/member/editor/ueditor/themes/default/images/cursor_h.png b/member/editor/ueditor/themes/default/images/cursor_h.png new file mode 100644 index 0000000..2088fc2 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/cursor_h.png differ diff --git a/member/editor/ueditor/themes/default/images/cursor_v.gif b/member/editor/ueditor/themes/default/images/cursor_v.gif new file mode 100644 index 0000000..bb508db Binary files /dev/null and b/member/editor/ueditor/themes/default/images/cursor_v.gif differ diff --git a/member/editor/ueditor/themes/default/images/cursor_v.png b/member/editor/ueditor/themes/default/images/cursor_v.png new file mode 100644 index 0000000..6f39ca3 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/cursor_v.png differ diff --git a/member/editor/ueditor/themes/default/images/dialog-title-bg.png b/member/editor/ueditor/themes/default/images/dialog-title-bg.png new file mode 100644 index 0000000..f744f26 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/dialog-title-bg.png differ diff --git a/member/editor/ueditor/themes/default/images/filescan.png b/member/editor/ueditor/themes/default/images/filescan.png new file mode 100644 index 0000000..1d27158 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/filescan.png differ diff --git a/member/editor/ueditor/themes/default/images/highlighted.gif b/member/editor/ueditor/themes/default/images/highlighted.gif new file mode 100644 index 0000000..9272b49 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/highlighted.gif differ diff --git a/member/editor/ueditor/themes/default/images/icons-all.gif b/member/editor/ueditor/themes/default/images/icons-all.gif new file mode 100644 index 0000000..21915e5 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/icons-all.gif differ diff --git a/member/editor/ueditor/themes/default/images/icons.gif b/member/editor/ueditor/themes/default/images/icons.gif new file mode 100644 index 0000000..7abd30a Binary files /dev/null and b/member/editor/ueditor/themes/default/images/icons.gif differ diff --git a/member/editor/ueditor/themes/default/images/icons.png b/member/editor/ueditor/themes/default/images/icons.png new file mode 100644 index 0000000..c015e3a Binary files /dev/null and b/member/editor/ueditor/themes/default/images/icons.png differ diff --git a/member/editor/ueditor/themes/default/images/loaderror.png b/member/editor/ueditor/themes/default/images/loaderror.png new file mode 100644 index 0000000..35ff333 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/loaderror.png differ diff --git a/member/editor/ueditor/themes/default/images/loading.gif b/member/editor/ueditor/themes/default/images/loading.gif new file mode 100644 index 0000000..b713e27 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/loading.gif differ diff --git a/member/editor/ueditor/themes/default/images/lock.gif b/member/editor/ueditor/themes/default/images/lock.gif new file mode 100644 index 0000000..b4e6d78 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/lock.gif differ diff --git a/member/editor/ueditor/themes/default/images/neweditor-tab-bg.png b/member/editor/ueditor/themes/default/images/neweditor-tab-bg.png new file mode 100644 index 0000000..8f398b0 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/neweditor-tab-bg.png differ diff --git a/member/editor/ueditor/themes/default/images/pagebreak.gif b/member/editor/ueditor/themes/default/images/pagebreak.gif new file mode 100644 index 0000000..8d1cffd Binary files /dev/null and b/member/editor/ueditor/themes/default/images/pagebreak.gif differ diff --git a/member/editor/ueditor/themes/default/images/scale.png b/member/editor/ueditor/themes/default/images/scale.png new file mode 100644 index 0000000..f45adb5 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/scale.png differ diff --git a/member/editor/ueditor/themes/default/images/sortable.png b/member/editor/ueditor/themes/default/images/sortable.png new file mode 100644 index 0000000..1bca649 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/sortable.png differ diff --git a/member/editor/ueditor/themes/default/images/spacer.gif b/member/editor/ueditor/themes/default/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/member/editor/ueditor/themes/default/images/spacer.gif differ diff --git a/member/editor/ueditor/themes/default/images/sparator_v.png b/member/editor/ueditor/themes/default/images/sparator_v.png new file mode 100644 index 0000000..8cf5662 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/sparator_v.png differ diff --git a/member/editor/ueditor/themes/default/images/table-cell-align.png b/member/editor/ueditor/themes/default/images/table-cell-align.png new file mode 100644 index 0000000..ddf4285 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/table-cell-align.png differ diff --git a/member/editor/ueditor/themes/default/images/tangram-colorpicker.png b/member/editor/ueditor/themes/default/images/tangram-colorpicker.png new file mode 100644 index 0000000..738e500 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/tangram-colorpicker.png differ diff --git a/member/editor/ueditor/themes/default/images/toolbar_bg.png b/member/editor/ueditor/themes/default/images/toolbar_bg.png new file mode 100644 index 0000000..7ab685f Binary files /dev/null and b/member/editor/ueditor/themes/default/images/toolbar_bg.png differ diff --git a/member/editor/ueditor/themes/default/images/unhighlighted.gif b/member/editor/ueditor/themes/default/images/unhighlighted.gif new file mode 100644 index 0000000..7ad0b67 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/unhighlighted.gif differ diff --git a/member/editor/ueditor/themes/default/images/upload.png b/member/editor/ueditor/themes/default/images/upload.png new file mode 100644 index 0000000..08d4d92 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/upload.png differ diff --git a/member/editor/ueditor/themes/default/images/videologo.gif b/member/editor/ueditor/themes/default/images/videologo.gif new file mode 100644 index 0000000..555af74 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/videologo.gif differ diff --git a/member/editor/ueditor/themes/default/images/word.gif b/member/editor/ueditor/themes/default/images/word.gif new file mode 100644 index 0000000..9ef5d09 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/word.gif differ diff --git a/member/editor/ueditor/themes/default/images/wordpaste.png b/member/editor/ueditor/themes/default/images/wordpaste.png new file mode 100644 index 0000000..9367758 Binary files /dev/null and b/member/editor/ueditor/themes/default/images/wordpaste.png differ diff --git a/member/editor/ueditor/themes/iframe.css b/member/editor/ueditor/themes/iframe.css new file mode 100644 index 0000000..feb4678 --- /dev/null +++ b/member/editor/ueditor/themes/iframe.css @@ -0,0 +1,3 @@ +/*可以在这里添加你自己的css*/ +a:link,a:visited,a:active{text-decoration:none;color:#2B579A;} +a:hover{color:#FF3300;} diff --git a/member/editor/ueditor/third-party/SyntaxHighlighter/shCore.js b/member/editor/ueditor/third-party/SyntaxHighlighter/shCore.js new file mode 100644 index 0000000..3249184 --- /dev/null +++ b/member/editor/ueditor/third-party/SyntaxHighlighter/shCore.js @@ -0,0 +1,3655 @@ +// XRegExp 1.5.1 +// (c) 2007-2012 Steven Levithan +// MIT License +// +// Provides an augmented, extensible, cross-browser implementation of regular expressions, +// including support for additional syntax, flags, and methods + +var XRegExp; + +if (XRegExp) { + // Avoid running twice, since that would break references to native globals + throw Error("can't load XRegExp twice in the same frame"); +} + +// Run within an anonymous function to protect variables and avoid new globals +(function (undefined) { + + //--------------------------------- + // Constructor + //--------------------------------- + + // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native + // regular expression in that additional syntax and flags are supported and cross-browser + // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and + // converts to type XRegExp + XRegExp = function (pattern, flags) { + var output = [], + currScope = XRegExp.OUTSIDE_CLASS, + pos = 0, + context, tokenResult, match, chr, regex; + + if (XRegExp.isRegExp(pattern)) { + if (flags !== undefined) + throw TypeError("can't supply flags when constructing one RegExp from another"); + return clone(pattern); + } + // Tokens become part of the regex construction process, so protect against infinite + // recursion when an XRegExp is constructed within a token handler or trigger + if (isInsideConstructor) + throw Error("can't call the XRegExp constructor within token definition functions"); + + flags = flags || ""; + context = { // `this` object for custom tokens + hasNamedCapture: false, + captureNames: [], + hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, + setFlag: function (flag) {flags += flag;} + }; + + while (pos < pattern.length) { + // Check for custom tokens at the current position + tokenResult = runTokens(pattern, pos, currScope, context); + + if (tokenResult) { + output.push(tokenResult.output); + pos += (tokenResult.match[0].length || 1); + } else { + // Check for native multicharacter metasequences (excluding character classes) at + // the current position + if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { + output.push(match[0]); + pos += match[0].length; + } else { + chr = pattern.charAt(pos); + if (chr === "[") + currScope = XRegExp.INSIDE_CLASS; + else if (chr === "]") + currScope = XRegExp.OUTSIDE_CLASS; + // Advance position one character + output.push(chr); + pos++; + } + } + } + + regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); + regex._xregexp = { + source: pattern, + captureNames: context.hasNamedCapture ? context.captureNames : null + }; + return regex; + }; + + + //--------------------------------- + // Public properties + //--------------------------------- + + XRegExp.version = "1.5.1"; + + // Token scope bitflags + XRegExp.INSIDE_CLASS = 1; + XRegExp.OUTSIDE_CLASS = 2; + + + //--------------------------------- + // Private variables + //--------------------------------- + + var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, + flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags + quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, + isInsideConstructor = false, + tokens = [], + // Copy native globals for reference ("native" is an ES3 reserved keyword) + nativ = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + nativ.test.call(x, ""); + return !x.lastIndex; + }(), + hasNativeY = RegExp.prototype.sticky !== undefined, + nativeTokens = {}; + + // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, + // excluding character classes) + nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; + nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; + + + //--------------------------------- + // Public methods + //--------------------------------- + + // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by + // the XRegExp library and can be used to create XRegExp plugins. This function is intended for + // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can + // be disabled by `XRegExp.freezeTokens` + XRegExp.addToken = function (regex, handler, scope, trigger) { + tokens.push({ + pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), + handler: handler, + scope: scope || XRegExp.OUTSIDE_CLASS, + trigger: trigger || null + }); + }; + + // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag + // combination has previously been cached, the cached copy is returned; otherwise the newly + // created regex is cached + XRegExp.cache = function (pattern, flags) { + var key = pattern + "/" + (flags || ""); + return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); + }; + + // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh + // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` + // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve + // special properties required for named capture + XRegExp.copyAsGlobal = function (regex) { + return clone(regex, "g"); + }; + + // Accepts a string; returns the string with regex metacharacters escaped. The returned string + // can safely be used at any point within a regex to match the provided literal string. Escaped + // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace + XRegExp.escape = function (str) { + return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }; + + // Accepts a string to search, regex to search with, position to start the search within the + // string (default: 0), and an optional Boolean indicating whether matches must start at-or- + // after the position or at the specified position only. This function ignores the `lastIndex` + // of the provided regex in its own handling, but updates the property for compatibility + XRegExp.execAt = function (str, regex, pos, anchored) { + var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), + match; + r2.lastIndex = pos = pos || 0; + match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (anchored && match && match.index !== pos) + match = null; + if (regex.global) + regex.lastIndex = match ? r2.lastIndex : 0; + return match; + }; + + // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing + // syntax and flag changes. Should be run after XRegExp and any plugins are loaded + XRegExp.freezeTokens = function () { + XRegExp.addToken = function () { + throw Error("can't run addToken after freezeTokens"); + }; + }; + + // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. + // Note that this is also `true` for regex literals and regexes created by the `XRegExp` + // constructor. This works correctly for variables created in another frame, when `instanceof` + // and `constructor` checks would fail to work as intended + XRegExp.isRegExp = function (o) { + return Object.prototype.toString.call(o) === "[object RegExp]"; + }; + + // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to + // iterate over regex matches compared to the traditional approaches of subverting + // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop + XRegExp.iterate = function (str, regex, callback, context) { + var r2 = clone(regex, "g"), + i = -1, match; + while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (regex.global) + regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` + callback.call(context, match, ++i, str, regex); + if (r2.lastIndex === match.index) + r2.lastIndex++; + } + if (regex.global) + regex.lastIndex = 0; + }; + + // Accepts a string and an array of regexes; returns the result of using each successive regex + // to search within the matches of the previous regex. The array of regexes can also contain + // objects with `regex` and `backref` properties, in which case the named or numbered back- + // references specified are passed forward to the next regex or returned. E.g.: + // var xregexpImgFileNames = XRegExp.matchChain(html, [ + // {regex: /]+)>/i, backref: 1}, // tag attributes + // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values + // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths + // /[^\/]+$/ // filenames (strip directory paths) + // ]); + XRegExp.matchChain = function (str, chain) { + return function recurseChain (values, level) { + var item = chain[level].regex ? chain[level] : {regex: chain[level]}, + regex = clone(item.regex, "g"), + matches = [], i; + for (i = 0; i < values.length; i++) { + XRegExp.iterate(values[i], regex, function (match) { + matches.push(item.backref ? (match[item.backref] || "") : match[0]); + }); + } + return ((level === chain.length - 1) || !matches.length) ? + matches : recurseChain(matches, level + 1); + }([str], 0); + }; + + + //--------------------------------- + // New RegExp prototype methods + //--------------------------------- + + // Accepts a context object and arguments array; returns the result of calling `exec` with the + // first value in the arguments array. the context is ignored but is accepted for congruity + // with `Function.prototype.apply` + RegExp.prototype.apply = function (context, args) { + return this.exec(args[0]); + }; + + // Accepts a context object and string; returns the result of calling `exec` with the provided + // string. the context is ignored but is accepted for congruity with `Function.prototype.call` + RegExp.prototype.call = function (context, str) { + return this.exec(str); + }; + + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match, name, r2, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.apply(this, arguments); + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + nativ.replace.call((str + "").slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return match; + }; + + // Fix browser bugs in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the altered + // `exec` would take care of the `lastIndex` fixes + var match, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return !!match; + }; + + // Adds named capture support and fixes browser bugs in native method + String.prototype.match = function (regex) { + if (!XRegExp.isRegExp(regex)) + regex = RegExp(regex); // Native `RegExp` + if (regex.global) { + var result = nativ.match.apply(this, arguments); + regex.lastIndex = 0; // Fix IE bug + return result; + } + return regex.exec(this); // Run the altered `exec` + }; + + // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, + // and provides named backreferences to replacement functions as `arguments[0].name`. Also + // fixes cross-browser differences in replacement text syntax when performing a replacement + // using a nonregex search value, and the value of replacement regexes' `lastIndex` property + // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary + // third (`flags`) parameter + String.prototype.replace = function (search, replacement) { + var isRegex = XRegExp.isRegExp(search), + captureNames, result, str, origLastIndex; + + // There are too many combinations of search/replacement types/values and browser bugs that + // preclude passing to native `replace`, so don't try + //if (...) + // return nativ.replace.apply(this, arguments); + + if (isRegex) { + if (search._xregexp) + captureNames = search._xregexp.captureNames; // Array or `null` + if (!search.global) + origLastIndex = search.lastIndex; + } else { + search = search + ""; // Type conversion + } + + if (Object.prototype.toString.call(replacement) === "[object Function]") { + result = nativ.replace.call(this + "", search, function () { + if (captureNames) { + // Change the `arguments[0]` string primitive to a String object which can store properties + arguments[0] = new String(arguments[0]); + // Store named backreferences on `arguments[0]` + for (var i = 0; i < captureNames.length; i++) { + if (captureNames[i]) + arguments[0][captureNames[i]] = arguments[i + 1]; + } + } + // Update `lastIndex` before calling `replacement` (fix browsers) + if (isRegex && search.global) + search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; + return replacement.apply(null, arguments); + }); + } else { + str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) + result = nativ.replace.call(str, search, function () { + var args = arguments; // Keep this function's `arguments` available through closure + return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { + // Numbered backreference (without delimiters) or special variable + if ($1) { + switch ($1) { + case "$": return "$"; + case "&": return args[0]; + case "`": return args[args.length - 1].slice(0, args[args.length - 2]); + case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); + // Numbered backreference + default: + // What does "$10" mean? + // - Backreference 10, if 10 or more capturing groups exist + // - Backreference 1 followed by "0", if 1-9 capturing groups exist + // - Otherwise, it's the string "$10" + // Also note: + // - Backreferences cannot be more than two digits (enforced by `replacementToken`) + // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" + // - There is no "$0" token ("$&" is the entire match) + var literalNumbers = ""; + $1 = +$1; // Type conversion; drop leading zero + if (!$1) // `$1` was "0" or "00" + return $0; + while ($1 > args.length - 3) { + literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; + $1 = Math.floor($1 / 10); // Drop the last digit + } + return ($1 ? args[$1] || "" : "$") + literalNumbers; + } + // Named backreference or delimited numbered backreference + } else { + // What does "${n}" mean? + // - Backreference to numbered capture n. Two differences from "$n": + // - n can be more than two digits + // - Backreference 0 is allowed, and is the entire match + // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture + // - Otherwise, it's the string "${n}" + var n = +$2; // Type conversion; drop leading zeros + if (n <= args.length - 3) + return args[n]; + n = captureNames ? indexOf(captureNames, $2) : -1; + return n > -1 ? args[n + 1] : $0; + } + }); + }); + } + + if (isRegex) { + if (search.global) + search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) + else + search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + } + + return result; + }; + + // A consistent cross-browser, ES3 compliant `split` + String.prototype.split = function (s /* separator */, limit) { + // If separator `s` is not a regex, use the native `split` + if (!XRegExp.isRegExp(s)) + return nativ.split.apply(this, arguments); + + var str = this + "", // Type conversion + output = [], + lastLastIndex = 0, + match, lastLength; + + // Behavior for `limit`: if it's... + // - `undefined`: No limit + // - `NaN` or zero: Return an empty array + // - A positive number: Use `Math.floor(limit)` + // - A negative number: No limit + // - Other: Type-convert, then use the above rules + if (limit === undefined || +limit < 0) { + limit = Infinity; + } else { + limit = Math.floor(+limit); + if (!limit) + return []; + } + + // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero + // and restore it to its original value when we're done using the regex + s = XRegExp.copyAsGlobal(s); + + while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (s.lastIndex > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + + if (match.length > 1 && match.index < str.length) + Array.prototype.push.apply(output, match.slice(1)); + + lastLength = match[0].length; + lastLastIndex = s.lastIndex; + + if (output.length >= limit) + break; + } + + if (s.lastIndex === match.index) + s.lastIndex++; + } + + if (lastLastIndex === str.length) { + if (!nativ.test.call(s, "") || lastLength) + output.push(""); + } else { + output.push(str.slice(lastLastIndex)); + } + + return output.length > limit ? output.slice(0, limit) : output; + }; + + + //--------------------------------- + // Private helper functions + //--------------------------------- + + // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` + // instance with a fresh `lastIndex` (set to zero), preserving properties required for named + // capture. Also allows adding new flags in the process of copying the regex + function clone (regex, additionalFlags) { + if (!XRegExp.isRegExp(regex)) + throw TypeError("type RegExp expected"); + var x = regex._xregexp; + regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); + if (x) { + regex._xregexp = { + source: x.source, + captureNames: x.captureNames ? x.captureNames.slice(0) : null + }; + } + return regex; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function runTokens (pattern, index, scope, context) { + var i = tokens.length, + result, match, t; + // Protect against constructing XRegExps within token handler and trigger functions + isInsideConstructor = true; + // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws + try { + while (i--) { // Run in reverse order + t = tokens[i]; + if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { + t.pattern.lastIndex = index; + match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. + if (match && match.index === index) { + result = { + output: t.handler.call(context, match, scope), + match: match + }; + break; + } + } + } + } catch (err) { + throw err; + } finally { + isInsideConstructor = false; + } + return result; + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + + + //--------------------------------- + // Built-in tokens + //--------------------------------- + + // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the + // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` + + // Comment pattern: (?# ) + XRegExp.addToken( + /\(\?#[^)]*\)/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + } + ); + + // Capturing group (match the opening parenthesis only). + // Required for support of named capturing groups + XRegExp.addToken( + /\((?!\?)/, + function () { + this.captureNames.push(null); + return "("; + } + ); + + // Named capturing group (match the opening delimiter only): (? + XRegExp.addToken( + /\(\?<([$\w]+)>/, + function (match) { + this.captureNames.push(match[1]); + this.hasNamedCapture = true; + return "("; + } + ); + + // Named backreference: \k + XRegExp.addToken( + /\\k<([\w$]+)>/, + function (match) { + var index = indexOf(this.captureNames, match[1]); + // Keep backreferences separate from subsequent literal numbers. Preserve back- + // references to named groups that are undefined at this point as literal strings + return index > -1 ? + "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : + match[0]; + } + ); + + // Empty character class: [] or [^] + XRegExp.addToken( + /\[\^?]/, + function (match) { + // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. + // (?!) should work like \b\B, but is unreliable in Firefox + return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; + } + ); + + // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) + // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. + XRegExp.addToken( + /^\(\?([imsx]+)\)/, + function (match) { + this.setFlag(match[1]); + return ""; + } + ); + + // Whitespace and comments, in free-spacing (aka extended) mode only + XRegExp.addToken( + /(?:\s+|#.*)+/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + }, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("x");} + ); + + // Dot, in dotall (aka singleline) mode only + XRegExp.addToken( + /\./, + function () {return "[\\s\\S]";}, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("s");} + ); + + + //--------------------------------- + // Backward compatibility + //--------------------------------- + + // Uncomment the following block for compatibility with XRegExp 1.0-1.2: + /* + XRegExp.matchWithinChain = XRegExp.matchChain; + RegExp.prototype.addFlags = function (s) {return clone(this, s);}; + RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; + RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; + RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; + */ + +})(); + +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() { + +// CommonJS + if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') + { + XRegExp = require('XRegExp').XRegExp; + } + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... + var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : false, + + /** Lines to highlight. */ + 'highlight' : false, + + /** Title to be displayed above the code block. */ + 'title' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : false, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + 'unindent' : true, + + 'html-script' : false + }, + + config : { + space : ' ', + + /** Enables use of + * + * ``` + */ + findParent:function (node, filterFn, includeSelf) { + if (node && !domUtils.isBody(node)) { + node = includeSelf ? node : node.parentNode; + while (node) { + if (!filterFn || filterFn(node) || domUtils.isBody(node)) { + return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node; + } + node = node.parentNode; + } + } + return null; + }, + /** + * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); + * //output: BODY + * console.log( node.tagName ); + * ``` + */ + + /** + * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, + * 否则, 起点是node的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @param { Boolean } includeSelf 查找过程是否包含node节点自身 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var queryTarget = document.getElementsByTagName("div")[0]; + * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); + * //output: true + * console.log( queryTarget === node ); + * ``` + */ + findParentByTagName:function (node, tagNames, includeSelf, excludeFn) { + tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); + return domUtils.findParent(node, function (node) { + return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); + }, includeSelf); + }, + /** + * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 + */ + + /** + * 查找节点node的祖先节点集合, 如果includeSelf的值为true, + * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + */ + findParents:function (node, includeSelf, filterFn, closerFirst) { + var parents = includeSelf && ( filterFn && filterFn(node) || !filterFn ) ? [node] : []; + while (node = domUtils.findParent(node, filterFn)) { + parents.push(node); + } + return closerFirst ? parents : parents.reverse(); + }, + + /** + * 在节点node后面插入新节点newNode + * @method insertAfter + * @param { Node } node 目标节点 + * @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后 + * @return { Node } 新插入的节点 + */ + insertAfter:function (node, newNode) { + return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling): + node.parentNode.appendChild(newNode); + }, + + /** + * 删除节点node及其下属的所有节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
      + *
      你好
      + *
      + * + * ``` + */ + + /** + * 删除节点node,并根据keepChildren的值决定是否保留子节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @param { Boolean } keepChildren 是否需要保留子节点 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
      + *
      你好
      + *
      + * + * ``` + */ + remove:function (node, keepChildren) { + var parent = node.parentNode, + child; + if (parent) { + if (keepChildren && node.hasChildNodes()) { + while (child = node.firstChild) { + parent.insertBefore(child, node); + } + } + parent.removeChild(node); + } + return node; + }, + + /** + * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, + * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```html + * + *
      + * + *
      + * xxx + * + * + * ``` + * @example + * ```html + * + *
      + * + * xxx + *
      + * xxx + * + * + * ``` + */ + + /** + * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, + * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, + * 则执行getNextDomNode(Node node)的查找过程。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @param { Boolean } startFromChild 查找过程是否从其子节点开始 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @see UE.dom.domUtils.getNextDomNode(Node) + */ + getNextDomNode:function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard); + }, + getPreDomNode:function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'lastChild', 'previousSibling', startFromChild, filterFn, guard); + }, + /** + * 检测节点node是否属是UEditor定义的bookmark节点 + * @method isBookmarkNode + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是bookmark节点 + * @example + * ```html + * + * + * ``` + */ + isBookmarkNode:function (node) { + return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); + }, + /** + * 获取节点node所属的window对象 + * @method getWindow + * @param { Node } node 节点对象 + * @return { Window } 当前节点所属的window对象 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); + * ``` + */ + getWindow:function (node) { + var doc = node.ownerDocument || node; + return doc.defaultView || doc.parentWindow; + }, + /** + * 获取离nodeA与nodeB最近的公共的祖先节点 + * @method getCommonAncestor + * @param { Node } nodeA 第一个节点 + * @param { Node } nodeB 第二个节点 + * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 + * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 + * @example + * ```javascript + * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); + * //output: true + * console.log( commonAncestor.tagName.toLowerCase() === 'body' ); + * ``` + */ + getCommonAncestor:function (nodeA, nodeB) { + if (nodeA === nodeB) + return nodeA; + var parentsA = [nodeA] , parentsB = [nodeB], parent = nodeA, i = -1; + while (parent = parent.parentNode) { + if (parent === nodeB) { + return parent; + } + parentsA.push(parent); + } + parent = nodeB; + while (parent = parent.parentNode) { + if (parent === nodeA) + return parent; + parentsB.push(parent); + } + parentsA.reverse(); + parentsB.reverse(); + while (i++, parentsA[i] === parentsB[i]) { + } + return i == 0 ? null : parentsA[i - 1]; + + }, + /** + * 清除node节点左右连续为空的兄弟inline节点 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * 则这些兄弟节点将被删除 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 + * @example + * ```html + * + *
      + * + * + * + * xxx + * + * + * + * ``` + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + clearEmptySibling:function (node, ignoreNext, ignorePre) { + function clear(next, dir) { + var tmpNode; + while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next) + //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 + || !new RegExp('[^\t\n\r' + domUtils.fillChar + ']').test(next.nodeValue) )) { + tmpNode = next[dir]; + domUtils.remove(next); + next = tmpNode; + } + } + !ignoreNext && clear(node.nextSibling, 'nextSibling'); + !ignorePre && clear(node.previousSibling, 'previousSibling'); + }, + /** + * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 + * @method split + * @param { Node } textNode 需要拆分的文本节点对象 + * @param { int } offset 需要拆分的位置, 位置计算从0开始 + * @return { Node } 拆分后形成的新节点 + * @example + * ```html + *
      abcdef
      + * + * ``` + */ + split:function (node, offset) { + var doc = node.ownerDocument; + if (browser.ie && offset == node.nodeValue.length) { + var next = doc.createTextNode(''); + return domUtils.insertAfter(node, next); + } + var retval = node.splitText(offset); + //ie8下splitText不会跟新childNodes,我们手动触发他的更新 + if (browser.ie8) { + var tmpNode = doc.createTextNode(''); + domUtils.insertAfter(retval, tmpNode); + domUtils.remove(tmpNode); + } + return retval; + }, + + /** + * 检测文本节点textNode是否为空节点(包括空格、换行、占位符等字符) + * @method isWhitespace + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 检测的节点是否为空 + * @example + * ```html + *
      + * + *
      + * + * ``` + */ + isWhitespace:function (node) { + return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(node.nodeValue); + }, + /** + * 获取元素element相对于viewport的位置坐标 + * @method getXY + * @param { Node } element 需要计算位置的节点对象 + * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, + * y代表垂直偏移距离。 + * + * @example + * ```javascript + * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); + * //output: test的坐标为: 12, 24 + * console.log( 'test的坐标为: ', location.x, ',', location.y ); + * ``` + */ + getXY:function (element) { + var x = 0, y = 0; + while (element.offsetParent) { + y += element.offsetTop; + x += element.offsetLeft; + element = element.offsetParent; + } + return { 'x':x, 'y':y}; + }, + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { String } type 绑定的事件类型 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,"click",function(e){ + * //e为事件对象,this为被点击元素对戏那个 + * }); + * ``` + */ + + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { Array } type 绑定的事件类型数组 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + on:function (element, type, handler) { + + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); + } + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { String } type 需要接触绑定的事件类型 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body,"click",function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { Array } type 需要接触绑定的事件类型数组 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + un:function (element, type, handler) { + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try{ + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + + /** + * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 + * @method isSameElement + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameElement:function (nodeA, nodeB) { + if (nodeA.tagName != nodeB.tagName) { + return false; + } + var thisAttrs = nodeA.attributes, + otherAttrs = nodeB.attributes; + if (!ie && thisAttrs.length != otherAttrs.length) { + return false; + } + var attrA, attrB, al = 0, bl = 0; + for (var i = 0; attrA = thisAttrs[i++];) { + if (attrA.nodeName == 'style') { + if (attrA.specified) { + al++; + } + if (domUtils.isSameStyle(nodeA, nodeB)) { + continue; + } else { + return false; + } + } + if (ie) { + if (attrA.specified) { + al++; + attrB = otherAttrs.getNamedItem(attrA.nodeName); + } else { + continue; + } + } else { + attrB = nodeB.attributes[attrA.nodeName]; + } + if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { + return false; + } + } + // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 + if (ie) { + for (i = 0; attrB = otherAttrs[i++];) { + if (attrB.specified) { + bl++; + } + } + if (al != bl) { + return false; + } + } + return true; + }, + + /** + * 判断节点nodeA与节点nodeB的元素的style属性是否一致 + * @method isSameStyle + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的style属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameStyle:function (nodeA, nodeB) { + var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'), + styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'); + if (browser.opera) { + styleA = nodeA.style; + styleB = nodeB.style; + if (styleA.length != styleB.length) + return false; + for (var p in styleA) { + if (/^(\d+|csstext)$/i.test(p)) { + continue; + } + if (styleA[p] != styleB[p]) { + return false; + } + } + return true; + } + if (!styleA || !styleB) { + return styleA == styleB; + } + styleA = styleA.split(';'); + styleB = styleB.split(';'); + if (styleA.length != styleB.length) { + return false; + } + for (var i = 0, ci; ci = styleA[i++];) { + if (utils.indexOf(styleB, ci) == -1) { + return false; + } + } + return true; + }, + /** + * 检查节点node是否为block元素 + * @method isBlockElm + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是block元素节点 + * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; + * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 + * @example + * ```html + * + * + *
      + * + * + * ``` + */ + isBlockElm:function (node) { + return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName]; + }, + /** + * 检测node节点是否为body节点 + * @method isBody + * @param { Element } node 需要检测的dom元素 + * @return { Boolean } 给定的元素是否是body元素 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.isBody( document.body ) ); + * ``` + */ + isBody:function (node) { + return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body'; + }, + /** + * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, + * 拆分形成的两个节点之间是node节点 + * @method breakParent + * @param { Node } node 作为分界的节点对象 + * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 + * @return { Node } 给定的node分界节点 + * @example + * ```javascript + * + * var node = document.createElement("span"), + * wrapNode = document.createElement( "div" ), + * parent = document.createElement("p"); + * + * parent.appendChild( node ); + * wrapNode.appendChild( parent ); + * + * //拆分前 + * //output:

      + * console.log( wrapNode.innerHTML ); + * + * + * UE.dom.domUtils.breakParent( node, parent ); + * //拆分后 + * //output:

      + * console.log( wrapNode.innerHTML ); + * + * ``` + */ + breakParent:function (node, parent) { + var tmpNode, + parentClone = node, + clone = node, + leftNodes, + rightNodes; + do { + parentClone = parentClone.parentNode; + if (leftNodes) { + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(leftNodes); + leftNodes = tmpNode; + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(rightNodes); + rightNodes = tmpNode; + } else { + leftNodes = parentClone.cloneNode(false); + rightNodes = leftNodes.cloneNode(false); + } + while (tmpNode = clone.previousSibling) { + leftNodes.insertBefore(tmpNode, leftNodes.firstChild); + } + while (tmpNode = clone.nextSibling) { + rightNodes.appendChild(tmpNode); + } + clone = parentClone; + } while (parent !== parentClone); + tmpNode = parent.parentNode; + tmpNode.insertBefore(leftNodes, parent); + tmpNode.insertBefore(rightNodes, parent); + tmpNode.insertBefore(node, rightNodes); + domUtils.remove(parent); + return node; + }, + /** + * 检查节点node是否是空inline节点 + * @method isEmptyInlineElement + * @param { Node } node 需要检测的节点对象 + * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 + * @example + * ```html + * => 1 + * => 1 + * => 1 + * xx => 0 + * ``` + */ + isEmptyInlineElement:function (node) { + if (node.nodeType != 1 || !dtd.$removeEmpty[ node.tagName ]) { + return 0; + } + node = node.firstChild; + while (node) { + //如果是创建的bookmark就跳过 + if (domUtils.isBookmarkNode(node)) { + return 0; + } + if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) || + node.nodeType == 3 && !domUtils.isWhitespace(node) + ) { + return 0; + } + node = node.nextSibling; + } + return 1; + + }, + + /** + * 删除node节点下首尾两端的空白文本子节点 + * @method trimWhiteTextNode + * @param { Element } node 需要执行删除操作的元素对象 + * @example + * ```javascript + * var node = document.createElement("div"); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * node.appendChild( document.createElement("div") ); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * //3 + * console.log( node.childNodes.length ); + * + * UE.dom.domUtils.trimWhiteTextNode( node ); + * + * //1 + * console.log( node.childNodes.length ); + * ``` + */ + trimWhiteTextNode:function (node) { + function remove(dir) { + var child; + while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) { + node.removeChild(child); + } + } + remove('firstChild'); + remove('lastChild'); + }, + + /** + * 合并node节点下相同的子节点 + * @name mergeChild + * @desc + * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 + * @example + *

      xxaaxx

      + * ==> UE.dom.domUtils.mergeChild(node,'span') + *

      xxaaxx

      + */ + mergeChild:function (node, tagName, attrs) { + var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); + for (var i = 0, ci; ci = list[i++];) { + if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { + continue; + } + //span单独处理 + if (ci.tagName.toLowerCase() == 'span') { + if (node === ci.parentNode) { + domUtils.trimWhiteTextNode(node); + if (node.childNodes.length == 1) { + node.style.cssText = ci.style.cssText + ";" + node.style.cssText; + domUtils.remove(ci, true); + continue; + } + } + ci.style.cssText = node.style.cssText + ';' + ci.style.cssText; + if (attrs) { + var style = attrs.style; + if (style) { + style = style.split(';'); + for (var j = 0, s; s = style[j++];) { + ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] = s.split(':')[1]; + } + } + } + if (domUtils.isSameStyle(ci, node)) { + domUtils.remove(ci, true); + } + continue; + } + if (domUtils.isSameElement(node, ci)) { + domUtils.remove(ci, true); + } + } + }, + + /** + * 原生方法getElementsByTagName的封装 + * @method getElementsByTagName + * @param { Node } node 目标节点对象 + * @param { String } tagName 需要查找的节点的tagName, 多个tagName以空格分割 + * @return { Array } 符合条件的节点集合 + */ + getElementsByTagName:function (node, name,filter) { + if(filter && utils.isString(filter)){ + var className = filter; + filter = function(node){return domUtils.hasClass(node,className)} + } + name = utils.trim(name).replace(/[ ]{2,}/g,' ').split(' '); + var arr = []; + for(var n = 0,ni;ni=name[n++];){ + var list = node.getElementsByTagName(ni); + for (var i = 0, ci; ci = list[i++];) { + if(!filter || filter(ci)) + arr.push(ci); + } + } + + return arr; + }, + /** + * 将节点node提取到父节点上 + * @method mergeToParent + * @param { Element } node 需要提取的元素对象 + * @example + * ```html + *
      + *
      + * + *
      + *
      + * + * + * ``` + */ + mergeToParent:function (node) { + var parent = node.parentNode; + while (parent && dtd.$removeEmpty[parent.tagName]) { + if (parent.tagName == node.tagName || parent.tagName == 'A') {//针对a标签单独处理 + domUtils.trimWhiteTextNode(parent); + //span需要特殊处理 不处理这样的情况 xxxxxxxxx + if (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node) + || (parent.tagName == 'A' && node.tagName == 'SPAN')) { + if (parent.childNodes.length > 1 || parent !== node.parentNode) { + node.style.cssText = parent.style.cssText + ";" + node.style.cssText; + parent = parent.parentNode; + continue; + } else { + parent.style.cssText += ";" + node.style.cssText; + //trace:952 a标签要保持下划线 + if (parent.tagName == 'A') { + parent.style.textDecoration = 'underline'; + } + } + } + if (parent.tagName != 'A') { + parent === node.parentNode && domUtils.remove(node, true); + break; + } + } + parent = parent.parentNode; + } + }, + /** + * 合并节点node的左右兄弟节点 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @param { Boolean } ignoreNext 是否忽略合并右节点 + * @remind 如果同时忽略左右节点, 则该操作什么也不会做 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + mergeSibling:function (node, ignorePre, ignoreNext) { + function merge(rtl, start, node) { + var next; + if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) { + while (next.firstChild) { + if (start == 'firstChild') { + node.insertBefore(next.lastChild, node.firstChild); + } else { + node.appendChild(next.firstChild); + } + } + domUtils.remove(next); + } + } + !ignorePre && merge('previousSibling', 'firstChild', node); + !ignoreNext && merge('nextSibling', 'lastChild', node); + }, + + /** + * 设置节点node及其子节点不会被选中 + * @method unSelectable + * @param { Element } node 需要执行操作的dom元素 + * @remind 执行该操作后的节点, 将不能被鼠标选中 + * @example + * ```javascript + * UE.dom.domUtils.unSelectable( document.body ); + * ``` + */ + unSelectable:ie && browser.ie9below || browser.opera ? function (node) { + //for ie9 + node.onselectstart = function () { + return false; + }; + node.onclick = node.onkeyup = node.onkeydown = function () { + return false; + }; + node.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + for (var i = 0, ci; ci = node.all[i++];) { + switch (ci.tagName.toLowerCase()) { + case 'iframe' : + case 'textarea' : + case 'input' : + case 'select' : + break; + default : + ci.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + } + } + } : function (node) { + node.style.MozUserSelect = + node.style.webkitUserSelect = + node.style.msUserSelect = + node.style.KhtmlUserSelect = 'none'; + }, + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 + * @example + * ```html + *
      + * xxxxx + *
      + * + * + * ``` + */ + + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { Array } attrNames 需要删除的属性名数组 + * @example + * ```html + *
      + * xxxxx + *
      + * + * + * ``` + */ + removeAttributes:function (node, attrNames) { + attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g,' ').split(' '); + for (var i = 0, ci; ci = attrNames[i++];) { + ci = attrFix[ci] || ci; + switch (ci) { + case 'className': + node[ci] = ''; + break; + case 'style': + node.style.cssText = ''; + var val = node.getAttributeNode('style'); + !browser.ie && val && node.removeAttributeNode(val); + } + node.removeAttribute(ci); + } + }, + /** + * 在doc下创建一个标签名为tag,属性为attrs的元素 + * @method createElement + * @param { DomDocument } doc 新创建的元素属于该document节点创建 + * @param { String } tagName 需要创建的元素的标签名 + * @param { Object } attrs 新创建的元素的属性key-value集合 + * @return { Element } 新创建的元素对象 + * @example + * ```javascript + * var ele = UE.dom.domUtils.createElement( document, 'div', { + * id: 'test' + * } ); + * + * //output: DIV + * console.log( ele.tagName ); + * + * //output: test + * console.log( ele.id ); + * + * ``` + */ + createElement:function (doc, tag, attrs) { + return domUtils.setAttributes(doc.createElement(tag), attrs) + }, + /** + * 为节点node添加属性attrs,attrs为属性键值对 + * @method setAttributes + * @param { Element } node 需要设置属性的元素对象 + * @param { Object } attrs 需要设置的属性名-值对 + * @return { Element } 设置属性的元素对象 + * @example + * ```html + * + * + * + * + */ + setAttributes:function (node, attrs) { + for (var attr in attrs) { + if(attrs.hasOwnProperty(attr)){ + var value = attrs[attr]; + switch (attr) { + case 'class': + //ie下要这样赋值,setAttribute不起作用 + node.className = value; + break; + case 'style' : + node.style.cssText = node.style.cssText + ";" + value; + break; + case 'innerHTML': + node[attr] = value; + break; + case 'value': + node.value = value; + break; + default: + node.setAttribute(attrFix[attr] || attr, value); + } + } + } + return node; + }, + + /** + * 获取元素element经过计算后的样式值 + * @method getComputedStyle + * @param { Element } element 需要获取样式的元素对象 + * @param { String } styleName 需要获取的样式名 + * @return { String } 获取到的样式值 + * @example + * ```html + * + * + * + * + * + * ``` + */ + getComputedStyle:function (element, styleName) { + //一下的属性单独处理 + var pros = 'width height top left'; + + if(pros.indexOf(styleName) > -1){ + return element['offset' + styleName.replace(/^\w/,function(s){return s.toUpperCase()})] + 'px'; + } + //忽略文本节点 + if (element.nodeType == 3) { + element = element.parentNode; + } + //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. + if (browser.ie && browser.version < 9 && styleName == 'font-size' && !element.style.fontSize && + !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) { + var span = element.ownerDocument.createElement('span'); + span.style.cssText = 'padding:0;border:0;font-family:simsun;'; + span.innerHTML = '.'; + element.appendChild(span); + var result = span.offsetHeight; + element.removeChild(span); + span = null; + return result + 'px'; + } + try { + var value = domUtils.getStyle(element, styleName) || + (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, '').getPropertyValue(styleName) : + ( element.currentStyle || element.style )[utils.cssStyleToDomStyle(styleName)]); + + } catch (e) { + return ""; + } + return utils.transUnitToPx(utils.fixColor(styleName, value)); + }, + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { String } classNames 需要删除的className, 多个className之间以空格分开 + * @example + * ```html + * xxx + * + * + * ``` + */ + + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { Array } classNames 需要删除的className数组 + * @example + * ```html + * xxx + * + * + * ``` + */ + removeClasses:function (elm, classNames) { + classNames = utils.isArray(classNames) ? classNames : + utils.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') + } + cls = utils.trim(cls).replace(/[ ]{2,}/g,' '); + if(cls){ + elm.className = cls; + }else{ + domUtils.removeAttributes(elm,['class']); + } + }, + /** + * 给元素element添加className + * @method addClass + * @param { Node } ele 需要增加className的元素 + * @param { String } classNames 需要添加的className, 多个className之间以空格分割 + * @remind 相同的类名不会被重复添加 + * @example + * ```html + * + * + * + * ``` + */ + + /** + * 判断元素element是否包含给定的样式类名className + * @method hasClass + * @param { Node } ele 需要检测的元素 + * @param { Array } classNames 需要检测的className数组 + * @return { Boolean } 元素是否包含所有给定的className + * @example + * ```html + * + * + * + * ``` + */ + hasClass:function (element, className) { + if(utils.isRegExp(className)){ + return className.test(element.className) + } + className = utils.trim(className).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = element.className;ci=className[i++];){ + if(!new RegExp('\\b' + ci + '\\b','i').test(cls)){ + return false; + } + } + return i - 1 == className.length; + }, + + /** + * 阻止事件默认行为 + * @method preventDefault + * @param { Event } evt 需要阻止默认行为的事件对象 + * @example + * ```javascript + * UE.dom.domUtils.preventDefault( evt ); + * ``` + */ + preventDefault:function (evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** + * 删除元素element指定的样式 + * @method removeStyle + * @param { Element } element 需要删除样式的元素 + * @param { String } styleName 需要删除的样式名 + * @example + * ```html + * + * + * + * ``` + */ + removeStyle:function (element, name) { + if(browser.ie ){ + //针对color先单独处理一下 + if(name == 'color'){ + name = '(^|;)' + name; + } + element.style.cssText = element.style.cssText.replace(new RegExp(name + '[^:]*:[^;]+;?','ig'),'') + }else{ + if (element.style.removeProperty) { + element.style.removeProperty (name); + }else { + element.style.removeAttribute (utils.cssStyleToDomStyle(name)); + } + } + + + if (!element.style.cssText) { + domUtils.removeAttributes(element, ['style']); + } + }, + /** + * 获取元素element的style属性的指定值 + * @method getStyle + * @param { Element } element 需要获取属性值的元素 + * @param { String } styleName 需要获取的style的名称 + * @warning 该方法仅获取元素style属性中所标明的值 + * @return { String } 该元素包含指定的style属性值 + * @example + * ```html + *
      + * + * + * ``` + */ + getStyle:function (element, name) { + var value = element.style[ utils.cssStyleToDomStyle(name) ]; + return utils.fixColor(name, value); + }, + /** + * 为元素element设置样式属性值 + * @method setStyle + * @param { Element } element 需要设置样式的元素 + * @param { String } styleName 样式名 + * @param { String } styleValue 样式值 + * @example + * ```html + *
      + * + * + * ``` + */ + setStyle:function (element, name, value) { + element.style[utils.cssStyleToDomStyle(name)] = value; + if(!utils.trim(element.style.cssText)){ + this.removeAttributes(element,'style') + } + }, + /** + * 为元素element设置多个样式属性值 + * @method setStyles + * @param { Element } element 需要设置样式的元素 + * @param { Object } styles 样式名值对 + * @example + * ```html + *
      + * + * + * ``` + */ + setStyles:function (element, styles) { + for (var name in styles) { + if (styles.hasOwnProperty(name)) { + domUtils.setStyle(element, name, styles[name]); + } + } + }, + /** + * 删除_moz_dirty属性 + * @private + * @method removeDirtyAttr + */ + removeDirtyAttr:function (node) { + for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + node.removeAttribute('_moz_dirty'); + }, + /** + * 获取子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @return { Number } 给定的node元素的子节点数量 + * @example + * ```html + *
      + * + *
      + * + * + * ``` + */ + + /** + * 根据给定的过滤规则, 获取符合条件的子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false + * @return { Number } 符合过滤条件的node元素的子节点数量 + * @example + * ```html + *
      + * + *
      + * + * + * ``` + */ + getChildCount:function (node, fn) { + var count = 0, first = node.firstChild; + fn = fn || function () { + return 1; + }; + while (first) { + if (fn(first)) { + count++; + } + first = first.nextSibling; + } + return count; + }, + + /** + * 判断给定节点是否为空节点 + * @method isEmptyNode + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否为空 + * @example + * ```javascript + * UE.dom.domUtils.isEmptyNode( document.body ); + * ``` + */ + isEmptyNode:function (node) { + return !node.firstChild || domUtils.getChildCount(node, function (node) { + return !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node) + }) == 0 + }, + clearSelectedArr:function (nodes) { + var node; + while (node = nodes.pop()) { + domUtils.removeAttributes(node, ['class']); + } + }, + /** + * 将显示区域滚动到指定节点的位置 + * @method scrollToView + * @param {Node} node 节点 + * @param {window} win window对象 + * @param {Number} offsetTop 距离上方的偏移量 + */ + scrollToView:function (node, win, offsetTop) { + var getViewPaneSize = function () { + var doc = win.document, + mode = doc.compatMode == 'CSS1Compat'; + return { + width:( mode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0, + height:( mode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0 + }; + }, + getScrollPosition = function (win) { + if ('pageXOffset' in win) { + return { + x:win.pageXOffset || 0, + y:win.pageYOffset || 0 + }; + } + else { + var doc = win.document; + return { + x:doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, + y:doc.documentElement.scrollTop || doc.body.scrollTop || 0 + }; + } + }; + var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop; + offset += (node.offsetHeight || 0); + var elementPosition = domUtils.getXY(node); + offset += elementPosition.y; + var currentScroll = getScrollPosition(win).y; + // offset += 50; + if (offset > currentScroll || offset < currentScroll - winHeight) { + win.scrollTo(0, offset + (offset < 0 ? -20 : 20)); + } + }, + /** + * 判断给定节点是否为br + * @method isBr + * @param { Node } node 需要判断的节点对象 + * @return { Boolean } 给定的节点是否是br节点 + */ + isBr:function (node) { + return node.nodeType == 1 && node.tagName == 'BR'; + }, + /** + * 判断给定的节点是否是一个“填充”节点 + * @private + * @method isFillChar + * @param { Node } node 需要判断的节点 + * @param { Boolean } isInStart 是否从节点内容的开始位置匹配 + * @returns { Boolean } 节点是否是填充节点 + */ + isFillChar:function (node,isInStart) { + if(node.nodeType != 3) + return false; + var text = node.nodeValue; + if(isInStart){ + return new RegExp('^' + domUtils.fillChar).test(text) + } + return !text.replace(new RegExp(domUtils.fillChar,'g'), '').length + }, + isStartInblock:function (range) { + var tmpRange = range.cloneRange(), + flag = 0, + start = tmpRange.startContainer, + tmp; + if(start.nodeType == 1 && start.childNodes[tmpRange.startOffset]){ + start = start.childNodes[tmpRange.startOffset]; + var pre = start.previousSibling; + while(pre && domUtils.isFillChar(pre)){ + start = pre; + pre = pre.previousSibling; + } + } + if(this.isFillChar(start,true) && tmpRange.startOffset == 1){ + tmpRange.setStartBefore(start); + start = tmpRange.startContainer; + } + + while (start && domUtils.isFillChar(start)) { + tmp = start; + start = start.previousSibling + } + if (tmp) { + tmpRange.setStartBefore(tmp); + start = tmpRange.startContainer; + } + if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) { + tmpRange.setStart(start, 0).collapse(true); + } + while (!tmpRange.startOffset) { + start = tmpRange.startContainer; + if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { + flag = 1; + break; + } + var pre = tmpRange.startContainer.previousSibling, + tmpNode; + if (!pre) { + tmpRange.setStartBefore(tmpRange.startContainer); + } else { + while (pre && domUtils.isFillChar(pre)) { + tmpNode = pre; + pre = pre.previousSibling; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** + * 判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @return { Boolean } 是否是空元素 + * @example + * ```html + *
      + * + * + * ``` + */ + + /** + * 根据指定的判断规则判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @param { RegExp } reg 对内容执行判断的正则表达式对象 + * @return { Boolean } 是否是空元素 + */ + isEmptyBlock:function (node,reg) { + if(node.nodeType != 1) + return 0; + reg = reg || new RegExp('[ \xa0\t\r\n' + domUtils.fillChar + ']', 'g'); + + if (node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + }, + + /** + * 移动元素使得该元素的位置移动指定的偏移量的距离 + * @method setViewportOffset + * @param { Element } element 需要设置偏移量的元素 + * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 + * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 + * offset.top的距离 + * @example + * ```html + *
      + * + * + * ``` + */ + setViewportOffset:function (element, offset) { + var left = parseInt(element.style.left) | 0; + var top = parseInt(element.style.top) | 0; + var rect = element.getBoundingClientRect(); + var offsetLeft = offset.left - rect.left; + var offsetTop = offset.top - rect.top; + if (offsetLeft) { + element.style.left = left + offsetLeft + 'px'; + } + if (offsetTop) { + element.style.top = top + offsetTop + 'px'; + } + }, + + /** + * 用“填充字符”填充节点 + * @method fillNode + * @private + * @param { DomDocument } doc 填充的节点所在的docment对象 + * @param { Node } node 需要填充的节点对象 + * @example + * ```html + *
      + * + * + * ``` + */ + fillNode:function (doc, node) { + var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br'); + node.innerHTML = ''; + node.appendChild(tmpNode); + }, + + /** + * 把节点src的所有子节点追加到另一个节点tag上去 + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 + * @example + * ```html + *
      + * + *
      + *
      + *
      + *
      + * + * + * ``` + */ + + /** + * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 + * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 + * @example + * ```html + *
      + * + *
      + *
      + *
      + *
      + * + * + * ``` + */ + moveChild:function (src, tag, dir) { + while (src.firstChild) { + if (dir && tag.firstChild) { + tag.insertBefore(src.lastChild, tag.firstChild); + } else { + tag.appendChild(src.firstChild); + } + } + }, + + /** + * 判断节点的标签上是否不存在任何属性 + * @method hasNoAttributes + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否不包含任何属性 + * @example + * ```html + *
      xxxx
      + * + * + * ``` + */ + hasNoAttributes:function (node) { + return browser.ie ? /^<\w+\s*?>/.test(node.outerHTML) : node.attributes.length == 0; + }, + + /** + * 检测节点是否是UEditor所使用的辅助节点 + * @method isCustomeNode + * @private + * @param { Node } node 需要检测的节点 + * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 + * @return { Boolean } 给定的节点是否是一个辅助节点 + */ + isCustomeNode:function (node) { + return node.nodeType == 1 && node.getAttribute('_ue_custom_node_'); + }, + + /** + * 检测节点的标签是否是给定的标签 + * @method isTagNode + * @param { Node } node 需要检测的节点对象 + * @param { String } tagName 标签 + * @return { Boolean } 节点的标签是否是给定的标签 + * @example + * ```html + *
      + * + * + * ``` + */ + isTagNode:function (node, tagNames) { + return node.nodeType == 1 && new RegExp('\\b' + node.tagName + '\\b','i').test(tagNames) + }, + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() !== 'div'; + * } ) ); + * ``` + */ + + /** + * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 + * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); + * ``` + */ + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 + * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 + * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 + * 过滤条件的节点数组或第一个节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: 3(假定有3个div) + * console.log( divNodes.length ); + * + * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, true ); + * + * //output: 3 + * console.log( nodes.length ); + * + * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, false ); + * + * //output: div + * console.log( node.nodeName ); + * ``` + */ + filterNodeList : function(nodelist,filter,forAll){ + var results = []; + if(!utils .isFunction(filter)){ + var str = filter; + filter = function(n){ + return utils.indexOf(utils.isArray(str) ? str:str.split(' '), n.tagName.toLowerCase()) != -1 + }; + } + utils.each(nodelist,function(n){ + filter(n) && results.push(n) + }); + return results.length == 0 ? null : results.length == 1 || !forAll ? results[0] : results + }, + + /** + * 查询给定的range选区是否在给定的node节点内,且在该节点的最末尾 + * @method isInNodeEndBoundary + * @param { UE.dom.Range } rng 需要判断的range对象, 该对象的startContainer不能为NULL + * @param node 需要检测的节点对象 + * @return { Number } 如果给定的选取range对象是在node内部的最末端, 则返回1, 否则返回0 + */ + isInNodeEndBoundary : function (rng,node){ + var start = rng.startContainer; + if(start.nodeType == 3 && rng.startOffset != start.nodeValue.length){ + return 0; + } + if(start.nodeType == 1 && rng.startOffset != start.childNodes.length){ + return 0; + } + while(start !== node){ + if(start.nextSibling){ + return 0 + }; + start = start.parentNode; + } + return 1; + }, + isBoundaryNode : function (node,dir){ + var tmp; + while(!domUtils.isBody(node)){ + tmp = node; + node = node.parentNode; + if(tmp !== node[dir]){ + return false; + } + } + return true; + }, + fillHtml : browser.ie11below ? ' ' : '
      ' +}; +var fillCharReg = new RegExp(domUtils.fillChar, 'g'); + +// core/Range.js +/** + * Range封装 + * @file + * @module UE.dom + * @class Range + * @since 1.2.6.1 + */ + +/** + * dom操作封装 + * @unfile + * @module UE.dom + */ + +/** + * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 + * @unfile + * @module UE.dom + * @class Range + */ + + +(function () { + var guid = 0, + fillChar = domUtils.fillChar, + fillData; + + /** + * 更新range的collapse状态 + * @param {Range} range range对象 + */ + function updateCollapse(range) { + range.collapsed = + range.startContainer && range.endContainer && + range.startContainer === range.endContainer && + range.startOffset == range.endOffset; + } + + function selectOneNode(rng){ + return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1 + } + function setEndPoint(toStart, node, offset, range) { + //如果node是自闭合标签要处理 + if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) { + offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); + node = node.parentNode; + } + if (toStart) { + range.startContainer = node; + range.startOffset = offset; + if (!range.endContainer) { + range.collapse(true); + } + } else { + range.endContainer = node; + range.endOffset = offset; + if (!range.startContainer) { + range.collapse(false); + } + } + updateCollapse(range); + return range; + } + + function execContentsAction(range, action) { + //调整边界 + //range.includeBookmark(); + var start = range.startContainer, + end = range.endContainer, + startOffset = range.startOffset, + endOffset = range.endOffset, + doc = range.document, + frag = doc.createDocumentFragment(), + tmpStart, tmpEnd; + if (start.nodeType == 1) { + start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode(''))); + } + if (end.nodeType == 1) { + end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode(''))); + } + if (start === end && start.nodeType == 3) { + frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, endOffset - startOffset); + range.collapse(true); + } + return frag; + } + var current, currentLevel, clone = frag, + startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); + for (var i = 0; startParents[i] == endParents[i];) { + i++; + } + for (var j = i, si; si = startParents[j]; j++) { + current = si.nextSibling; + if (si == start) { + if (!tmpStart) { + if (range.startContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, start.nodeValue.length - startOffset); + } + } else { + clone.appendChild(!action ? start.cloneNode(true) : start); + } + } + } else { + currentLevel = si.cloneNode(false); + clone.appendChild(currentLevel); + } + while (current) { + if (current === end || current === endParents[j]) { + break; + } + si = current.nextSibling; + clone.appendChild(!action ? current.cloneNode(true) : current); + current = si; + } + clone = currentLevel; + } + clone = frag; + if (!startParents[i]) { + clone.appendChild(startParents[i - 1].cloneNode(false)); + clone = clone.firstChild; + } + for (var j = i, ei; ei = endParents[j]; j++) { + current = ei.previousSibling; + if (ei == end) { + if (!tmpEnd && range.endContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); + //is not clone + if (action) { + end.deleteData(0, endOffset); + } + } + } else { + currentLevel = ei.cloneNode(false); + clone.appendChild(currentLevel); + } + //如果两端同级,右边第一次已经被开始做了 + if (j != i || !startParents[i]) { + while (current) { + if (current === start) { + break; + } + ei = current.previousSibling; + clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild); + current = ei; + } + } + clone = currentLevel; + } + if (action) { + range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true); + } + tmpStart && domUtils.remove(tmpStart); + tmpEnd && domUtils.remove(tmpEnd); + return frag; + } + + /** + * 创建一个跟document绑定的空的Range实例 + * @constructor + * @param { Document } document 新建的选区所属的文档对象 + */ + + /** + * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Boolean } collapsed 当前Range是否闭合 + * @default true + * @remind Range是闭合的时候, startContainer === endContainer && startOffset === endOffset + */ + + /** + * @property { Document } document 当前Range所属的Document对象 + * @remind 不同range的的document属性可以是不同的 + */ + var Range = dom.Range = function (document) { + var me = this; + me.startContainer = + me.startOffset = + me.endContainer = + me.endOffset = null; + me.document = document; + me.collapsed = true; + }; + + /** + * 删除fillData + * @param doc + * @param excludeNode + */ + function removeFillData(doc, excludeNode) { + try { + if (fillData && domUtils.inDoc(fillData, doc)) { + if (!fillData.nodeValue.replace(fillCharReg, '').length) { + var tmpNode = fillData.parentNode; + domUtils.remove(fillData); + while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) && + //safari的contains有bug + (browser.safari ? !(domUtils.getPosition(tmpNode,excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode)) + ) { + fillData = tmpNode.parentNode; + domUtils.remove(tmpNode); + tmpNode = fillData; + } + } else { + fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ''); + } + } + } catch (e) { + } + } + + /** + * @param node + * @param dir + */ + function mergeSibling(node, dir) { + var tmpNode; + node = node[dir]; + while (node && domUtils.isFillChar(node)) { + tmpNode = node[dir]; + domUtils.remove(node); + node = tmpNode; + } + } + + Range.prototype = { + + /** + * 克隆选区的内容到一个DocumentFragment里 + * @method cloneContents + * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + cloneContents:function () { + return this.collapsed ? null : execContentsAction(this, 0); + }, + + /** + * 删除当前选区范围中的所有内容 + * @method deleteContents + * @remind 执行完该操作后, 当前Range对象变成了闭合状态 + * @return { UE.dom.Range } 当前操作的Range对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + deleteContents:function () { + var txt; + if (!this.collapsed) { + execContentsAction(this, 1); + } + if (browser.webkit) { + txt = this.startContainer; + if (txt.nodeType == 3 && !txt.nodeValue.length) { + this.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + } + return this; + }, + + /** + * 将当前选区的内容提取到一个DocumentFragment里 + * @method extractContents + * @remind 执行该操作后, 选区将变成闭合状态 + * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 + * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + */ + extractContents:function () { + return this.collapsed ? null : execContentsAction(this, 2); + }, + + /** + * 设置Range的开始容器节点和偏移量 + * @method setStart + * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, + * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 + * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 + * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 + * 中的索引 + * @param { Node } node 将被设为当前选区开始边界容器的节点对象 + * @param { int } offset 选区的开始位置偏移量 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxxxxxxxx[xxx] + * + * + * ``` + * @example + * ```html + * + * xxx[xx]x + * + * + * ``` + */ + setStart:function (node, offset) { + return setEndPoint(true, node, offset, this); + }, + + /** + * 设置Range的结束容器和偏移量 + * @method setEnd + * @param { Node } node 作为当前选区结束边界容器的节点对象 + * @param { int } offset 结束边界的偏移量 + * @see UE.dom.Range:setStart(Node,int) + * @return { UE.dom.Range } 当前range对象 + */ + setEnd:function (node, offset) { + return setEndPoint(false, node, offset, this); + }, + + /** + * 将Range开始位置设置到node节点之后 + * @method setStartAfter + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 选区的开始边界将紧接着该节点之后 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxx[xxxx] + * + * + * ``` + */ + setStartAfter:function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range开始位置设置到node节点之前 + * @method setStartBefore + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 新的选区开始位置在该节点之前 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartBefore:function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 将Range结束位置设置到node节点之后 + * @method setEndAfter + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * [xxxxxxx]xxxx + * + * + * ``` + */ + setEndAfter:function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range结束位置设置到node节点之前 + * @method setEndBefore + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setEndAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndBefore:function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 设置Range的开始位置到node节点内的第一个子节点之前 + * @method setStartAtFirst + * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartBefore(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + setStartAtFirst:function (node) { + return this.setStart(node, 0); + }, + + /** + * 设置Range的开始位置到node节点内的最后一个节点之后 + * @method setStartAtLast + * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartAtLast:function (node) { + return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 设置Range的结束位置到node节点内的第一个节点之前 + * @method setEndAtFirst + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtFirst:function (node) { + return this.setEnd(node, 0); + }, + + /** + * 设置Range的结束位置到node节点内的最后一个节点之后 + * @method setEndAtLast + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtLast:function (node) { + return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 选中给定节点 + * @method selectNode + * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, + * 而endOffset为startOffset+1 + * @param { Node } node 需要选中的节点 + * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNode:function (node) { + return this.setStartBefore(node).setEndAfter(node); + }, + + /** + * 选中给定节点内部的所有节点 + * @method selectNodeContents + * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, + * 而endOffset是该节点的子节点数。 + * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 + * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNodeContents:function (node) { + return this.setStart(node, 0).setEndAtLast(node); + }, + + /** + * clone当前Range对象 + * @method cloneRange + * @remind 返回的range是一个全新的range对象, 其内部所有属性与当前被clone的range相同。 + * @return { UE.dom.Range } 当前range对象的一个副本 + */ + cloneRange:function () { + var me = this; + return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset); + + }, + + /** + * 向当前选区的结束处闭合选区 + * @method collapse + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + + /** + * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, + * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 + * @method collapse + * @param { Boolean } toStart 是否向选区开始处闭合 + * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 + * @see UE.dom.Range:collapse() + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + collapse:function (toStart) { + var me = this; + if (toStart) { + me.endContainer = me.startContainer; + me.endOffset = me.startOffset; + } else { + me.startContainer = me.endContainer; + me.startOffset = me.endOffset; + } + me.collapsed = true; + return me; + }, + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置 + * @method shrinkBoundary + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * xxxx[xxxxx] => xxxx[xxxxx] + * ``` + * + * @example + * ```html + * + * x[xx]xxx + * + * + * ``` + * + * @example + * ```html + * [xxxxxxxxxxx] => [xxxxxxxxxxx] + * ``` + */ + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, + * 如果ignoreEnd的值为true,则忽略对结束位置的调整 + * @method shrinkBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.domUtils.Range:shrinkBoundary() + */ + shrinkBoundary:function (ignoreEnd) { + var me = this, child, + collapsed = me.collapsed; + function check(node){ + return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName] + } + while (me.startContainer.nodeType == 1 //是element + && (child = me.startContainer.childNodes[me.startOffset]) //子节点也是element + && check(child)) { + me.setStart(child, 0); + } + if (collapsed) { + return me.collapse(true); + } + if (!ignoreEnd) { + while (me.endContainer.nodeType == 1//是element + && me.endOffset > 0 //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 + && (child = me.endContainer.childNodes[me.endOffset - 1]) //子节点也是element + && check(child)) { + me.setEnd(child, child.childNodes.length); + } + } + return me; + }, + + /** + * 获取离当前选区内包含的所有节点最近的公共祖先节点, + * @method getCommonAncestor + * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @example + * ```html + * //选区示例 + * xxxx[xxx]xxxxxx + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @example + * ```html + * + * + * + * xxxxxxxxx[xxx]xxxxxxxx + * + * + * + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 + * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @see UE.dom.Range:getCommonAncestor(Boolean) + * @example + * ```html + * + * + * + * xxxxxxxx[x]xxxxxxxxxxx + * + * + * + * + * ``` + */ + getCommonAncestor:function (includeSelf, ignoreTextNode) { + var me = this, + start = me.startContainer, + end = me.endContainer; + if (start === end) { + if (includeSelf && selectOneNode(this)) { + start = start.childNodes[me.startOffset]; + if(start.nodeType == 1) + return start; + } + //只有在上来就相等的情况下才会出现是文本的情况 + return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; + } + return domUtils.getCommonAncestor(start, end); + }, + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上 + * @method trimBoundary + * @remind 该操作有可能会引起文本节点被切开 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, + * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 + * @method trimBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + trimBoundary:function (ignoreEnd) { + this.txtToElmBoundary(); + var start = this.startContainer, + offset = this.startOffset, + collapsed = this.collapsed, + end = this.endContainer; + if (start.nodeType == 3) { + if (offset == 0) { + this.setStartBefore(start); + } else { + if (offset >= start.nodeValue.length) { + this.setStartAfter(start); + } else { + var textNode = domUtils.split(start, offset); + //跟新结束边界 + if (start === end) { + this.setEnd(textNode, this.endOffset - offset); + } else if (start.parentNode === end) { + this.endOffset += 1; + } + this.setStartBefore(textNode); + } + } + if (collapsed) { + return this.collapse(true); + } + } + if (!ignoreEnd) { + offset = this.endOffset; + end = this.endContainer; + if (end.nodeType == 3) { + if (offset == 0) { + this.setEndBefore(end); + } else { + offset < end.nodeValue.length && domUtils.split(end, offset); + this.setEndAfter(end); + } + } + } + return this; + }, + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则什么也不做 + * @method txtToElmBoundary + * @remind 该操作不会修改dom节点 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项 + * ignoreCollapsed 的值决定是否执行该调整 + * @method txtToElmBoundary + * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 + * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 + * @return { UE.dom.Range } 当前range对象 + */ + txtToElmBoundary:function (ignoreCollapsed) { + function adjust(r, c) { + var container = r[c + 'Container'], + offset = r[c + 'Offset']; + if (container.nodeType == 3) { + if (!offset) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'Before'](container); + } else if (offset >= container.nodeValue.length) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'After' ](container); + } + } + } + + if (ignoreCollapsed || !this.collapsed) { + adjust(this, 'start'); + adjust(this, 'end'); + } + return this; + }, + + /** + * 在当前选区的开始位置前插入节点,新插入的节点会被该range包含 + * @method insertNode + * @param { Node } node 需要插入的节点 + * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点 + * @return { UE.dom.Range } 当前range对象 + */ + insertNode:function (node) { + var first = node, length = 1; + if (node.nodeType == 11) { + first = node.firstChild; + length = node.childNodes.length; + } + this.trimBoundary(true); + var start = this.startContainer, + offset = this.startOffset; + var nextNode = start.childNodes[ offset ]; + if (nextNode) { + start.insertBefore(node, nextNode); + } else { + start.appendChild(node); + } + if (first.parentNode === this.endContainer) { + this.endOffset = this.endOffset + length; + } + return this.setStartBefore(first); + }, + + /** + * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 + * @method setCursor + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse() + */ + + /** + * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 + * @method setCursor + * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, + * 反之,则向开始容器方向闭合 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse(Boolean) + */ + setCursor:function (toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, + + /** + * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 + * @method createBookmark + * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 + * 返回标记位置的ID, 反之则返回标记位置节点的引用 + * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, + * end => 结束标记的ID或引用, id => 当前标记的类型, 如果为true,则表示 + * 返回的记录的类型为ID, 反之则为引用 + */ + createBookmark:function (serialize, same) { + var endNode, + startNode = this.document.createElement('span'); + startNode.style.cssText = 'display:none;line-height:0px;'; + startNode.appendChild(this.document.createTextNode('\u200D')); + startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++); + + if (!this.collapsed) { + endNode = startNode.cloneNode(true); + endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++); + } + this.insertNode(startNode); + if (endNode) { + this.collapse().insertNode(endNode).setEndBefore(endNode); + } + this.setStartAfter(startNode); + return { + start:serialize ? startNode.id : startNode, + end:endNode ? serialize ? endNode.id : endNode : null, + id:serialize + } + }, + + /** + * 调整当前range的边界到书签位置,并删除该书签对象所标记的位置内的节点 + * @method moveToBookmark + * @param { BookMark } bookmark createBookmark所创建的标签对象 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:createBookmark(Boolean) + */ + moveToBookmark:function (bookmark) { + var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start, + end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end; + this.setStartBefore(start); + domUtils.remove(start); + if (end) { + this.setEndBefore(end); + domUtils.remove(end); + } else { + this.collapse(true); + } + return this; + }, + + /** + * 调整range的边界,使其"放大"到最近的父节点 + * @method enlarge + * @remind 会引起选区的变化 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 调整range的边界,使其"放大"到最近的父节点,根据参数 toBlock 的取值, 可以 + * 要求扩大之后的父节点是block节点 + * @method enlarge + * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点 + * @return { UE.dom.Range } 当前range对象 + */ + enlarge:function (toBlock, stopFn) { + var isBody = domUtils.isBody, + pre, node, tmp = this.document.createTextNode(''); + if (toBlock) { + node = this.startContainer; + if (node.nodeType == 1) { + if (node.childNodes[this.startOffset]) { + pre = node = node.childNodes[this.startOffset] + } else { + node.appendChild(tmp); + pre = node = tmp; + } + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setStartBefore(node); + break; + } + pre = node; + node = node.parentNode; + } + node = this.endContainer; + if (node.nodeType == 1) { + if (pre = node.childNodes[this.endOffset]) { + node.insertBefore(tmp, pre); + } else { + node.appendChild(tmp); + } + pre = node = tmp; + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setEndAfter(node); + break; + } + pre = node; + node = node.parentNode; + } + if (tmp.parentNode === this.endContainer) { + this.endOffset--; + } + domUtils.remove(tmp); + } + + // 扩展边界到最大 + if (!this.collapsed) { + while (this.startOffset == 0) { + if (stopFn && stopFn(this.startContainer)) { + break; + } + if (isBody(this.startContainer)) { + break; + } + this.setStartBefore(this.startContainer); + } + while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) { + if (stopFn && stopFn(this.endContainer)) { + break; + } + if (isBody(this.endContainer)) { + break; + } + this.setEndAfter(this.endContainer); + } + } + return this; + }, + enlargeToBlockElm:function(ignoreEnd){ + while(!domUtils.isBlockElm(this.startContainer)){ + this.setStartBefore(this.startContainer); + } + if(!ignoreEnd){ + while(!domUtils.isBlockElm(this.endContainer)){ + this.setEndAfter(this.endContainer); + } + } + return this; + }, + /** + * 调整Range的边界,使其"缩小"到最合适的位置 + * @method adjustmentBoundary + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:shrinkBoundary() + */ + adjustmentBoundary:function () { + if (!this.collapsed) { + while (!domUtils.isBody(this.startContainer) && + this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length && + this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + + this.setStartAfter(this.startContainer); + } + while (!domUtils.isBody(this.endContainer) && !this.endOffset && + this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + this.setEndBefore(this.endContainer); + } + } + return this; + }, + + /** + * 给range选区中的内容添加给定的inline标签 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @example + * ```html + *

      xxxx[xxxx]x

      ==> range.applyInlineStyle("strong") ==>

      xxxx[xxxx]x

      + * ``` + */ + + /** + * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @param { Object } attrs 跟随新添加的标签的属性 + * @return { UE.dom.Range } 当前选区 + * @example + * ```html + *

      xxxx[xxxx]x

      + * + * ==> + * + * + * range.applyInlineStyle("strong",{"style":"font-size:12px"}) + * + * ==> + * + *

      xxxx[xxxx]x

      + * ``` + */ + applyInlineStyle:function (tagName, attrs, list) { + if (this.collapsed)return this; + this.trimBoundary().enlarge(false, + function (node) { + return node.nodeType == 1 && domUtils.isBlockElm(node) + }).adjustmentBoundary(); + var bookmark = this.createBookmark(), + end = bookmark.end, + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn), + node, + pre, + range = this.cloneRange(); + while (current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + if (current.nodeType == 3 || dtd[tagName][current.tagName]) { + range.setStartBefore(current); + node = current; + while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) { + pre = node; + node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) { + return dtd[tagName][parent.tagName]; + }); + } + var frag = range.setEndAfter(pre).extractContents(), elm; + if (list && list.length > 0) { + var level, top; + top = level = list[0].cloneNode(false); + for (var i = 1, ci; ci = list[i++];) { + level.appendChild(ci.cloneNode(false)); + level = level.firstChild; + } + elm = level; + } else { + elm = range.document.createElement(tagName); + } + if (attrs) { + domUtils.setAttributes(elm, attrs); + } + elm.appendChild(frag); + range.insertNode(list ? top : elm); + //处理下滑线在a上的情况 + var aNode; + if (tagName == 'span' && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, 'a', true))) { + domUtils.setAttributes(aNode, attrs); + domUtils.remove(elm, true); + elm = aNode; + } else { + domUtils.mergeSibling(elm); + domUtils.clearEmptySibling(elm); + } + //去除子节点相同的 + domUtils.mergeChild(elm, attrs); + current = domUtils.getNextDomNode(elm, false, filterFn); + domUtils.mergeToParent(elm); + if (node === end) { + break; + } + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return this.moveToBookmark(bookmark); + }, + + /** + * 移除当前选区内指定的inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { String } tagName 需要移除的标签名 + * @return { UE.dom.Range } 当前的range对象 + * @example + * ```html + * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z + * ``` + */ + + /** + * 移除当前选区内指定的一组inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { Array } tagNameArr 需要移除的标签名的数组 + * @return { UE.dom.Range } 当前的range对象 + * @see UE.dom.Range:removeInlineStyle(String) + */ + removeInlineStyle:function (tagNames) { + if (this.collapsed)return this; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + this.shrinkBoundary().adjustmentBoundary(); + var start = this.startContainer, end = this.endContainer; + while (1) { + if (start.nodeType == 1) { + if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { + break; + } + if (start.tagName.toLowerCase() == 'body') { + start = null; + break; + } + } + start = start.parentNode; + } + while (1) { + if (end.nodeType == 1) { + if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { + break; + } + if (end.tagName.toLowerCase() == 'body') { + end = null; + break; + } + } + end = end.parentNode; + } + var bookmark = this.createBookmark(), + frag, + tmpRange; + if (start) { + tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(start, true); + start.parentNode.insertBefore(bookmark.start, start); + } + if (end) { + tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(end, false, true); + end.parentNode.insertBefore(bookmark.end, end.nextSibling); + } + var current = domUtils.getNextDomNode(bookmark.start, false, function (node) { + return node.nodeType == 1; + }), next; + while (current && current !== bookmark.end) { + next = domUtils.getNextDomNode(current, true, function (node) { + return node.nodeType == 1; + }); + if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { + domUtils.remove(current, true); + } + current = next; + } + return this.moveToBookmark(bookmark); + }, + + /** + * 获取当前选中的自闭合的节点 + * @method getClosedNode + * @return { Node | NULL } 如果当前选中的是自闭合节点, 则返回该节点, 否则返回NULL + */ + getClosedNode:function () { + var node; + if (!this.collapsed) { + var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); + if (selectOneNode(range)) { + var child = range.startContainer.childNodes[range.startOffset]; + if (child && child.nodeType == 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) { + node = child; + } + } + } + return node; + }, + + /** + * 在页面上高亮range所表示的选区 + * @method select + * @return { UE.dom.Range } 返回当前Range对象 + */ + //这里不区分ie9以上,trace:3824 + select:browser.ie ? function (noFillData, textRange) { + var nativeRange; + if (!this.collapsed) + this.shrinkBoundary(); + var node = this.getClosedNode(); + if (node && !textRange) { + try { + nativeRange = this.document.body.createControlRange(); + nativeRange.addElement(node); + nativeRange.select(); + } catch (e) {} + return this; + } + var bookmark = this.createBookmark(), + start = bookmark.start, + end; + nativeRange = this.document.body.createTextRange(); + nativeRange.moveToElementText(start); + nativeRange.moveStart('character', 1); + if (!this.collapsed) { + var nativeRangeEnd = this.document.body.createTextRange(); + end = bookmark.end; + nativeRangeEnd.moveToElementText(end); + nativeRange.setEndPoint('EndToEnd', nativeRangeEnd); + } else { + if (!noFillData && this.startContainer.nodeType != 3) { + //使用|x固定住光标 + var tmpText = this.document.createTextNode(fillChar), + tmp = this.document.createElement('span'); + tmp.appendChild(this.document.createTextNode(fillChar)); + start.parentNode.insertBefore(tmp, start); + start.parentNode.insertBefore(tmpText, start); + //当点b,i,u时,不能清除i上边的b + removeFillData(this.document, tmpText); + fillData = tmpText; + mergeSibling(tmp, 'previousSibling'); + mergeSibling(start, 'nextSibling'); + nativeRange.moveStart('character', -1); + nativeRange.collapse(true); + } + } + this.moveToBookmark(bookmark); + tmp && domUtils.remove(tmp); + //IE在隐藏状态下不支持range操作,catch一下 + try { + nativeRange.select(); + } catch (e) { + } + return this; + } : function (notInsertFillData) { + function checkOffset(rng){ + + function check(node,offset,dir){ + if(node.nodeType == 3 && node.nodeValue.length < offset){ + rng[dir + 'Offset'] = node.nodeValue.length + } + } + check(rng.startContainer,rng.startOffset,'start'); + check(rng.endContainer,rng.endOffset,'end'); + } + var win = domUtils.getWindow(this.document), + sel = win.getSelection(), + txtNode; + //FF下关闭自动长高时滚动条在关闭dialog时会跳 + //ff下如果不body.focus将不能定位闭合光标到编辑器内 + browser.gecko ? this.document.body.focus() : win.focus(); + if (sel) { + sel.removeAllRanges(); + // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 + // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' + if (this.collapsed && !notInsertFillData) { +// //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 +// if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { +// var tmp = this.document.createTextNode(''); +// this.insertNode(tmp).setStart(tmp, 0).collapse(true); +// } +// + //处理光标落在文本节点的情况 + //处理以下的情况 + //|xxxx + //xxxx|xxxx + //xxxx| + var start = this.startContainer,child = start; + if(start.nodeType == 1){ + child = start.childNodes[this.startOffset]; + + } + if( !(start.nodeType == 3 && this.startOffset) && + (child ? + (!child.previousSibling || child.previousSibling.nodeType != 3) + : + (!start.lastChild || start.lastChild.nodeType != 3) + ) + ){ + txtNode = this.document.createTextNode(fillChar); + //跟着前边走 + this.insertNode(txtNode); + removeFillData(this.document, txtNode); + mergeSibling(txtNode, 'previousSibling'); + mergeSibling(txtNode, 'nextSibling'); + fillData = txtNode; + this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); + } + } + var nativeRange = this.document.createRange(); + if(this.collapsed && browser.opera && this.startContainer.nodeType == 1){ + var child = this.startContainer.childNodes[this.startOffset]; + if(!child){ + //往前靠拢 + child = this.startContainer.lastChild; + if( child && domUtils.isBr(child)){ + this.setStartBefore(child).collapse(true); + } + }else{ + //向后靠拢 + while(child && domUtils.isBlockElm(child)){ + if(child.nodeType == 1 && child.childNodes[0]){ + child = child.childNodes[0] + }else{ + break; + } + } + child && this.setStartBefore(child).collapse(true) + } + + } + //是createAddress最后一位算的不准,现在这里进行微调 + checkOffset(this); + nativeRange.setStart(this.startContainer, this.startOffset); + nativeRange.setEnd(this.endContainer, this.endOffset); + sel.addRange(nativeRange); + } + return this; + }, + + /** + * 滚动到当前range开始的位置 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @return { UE.dom.Range } 当前Range对象 + */ + + /** + * 滚动到距离当前range开始位置 offset 的位置处 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @param { Number } offset 距离range开始位置处的偏移量, 如果为正数, 则向下偏移, 反之, 则向上偏移 + * @return { UE.dom.Range } 当前Range对象 + */ + scrollToView:function (win, offset) { + win = win ? window : domUtils.getWindow(this.document); + var me = this, + span = me.document.createElement('span'); + //trace:717 + span.innerHTML = ' '; + me.cloneRange().insertNode(span); + domUtils.scrollToView(span, win, offset); + domUtils.remove(span); + return me; + }, + + /** + * 判断当前选区内容是否占位符 + * @private + * @method inFillChar + * @return { Boolean } 如果是占位符返回true,否则返回false + */ + inFillChar : function(){ + var start = this.startContainer; + if(this.collapsed && start.nodeType == 3 + && start.nodeValue.replace(new RegExp('^' + domUtils.fillChar),'').length + 1 == start.nodeValue.length + ){ + return true; + } + return false; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

      + * aaaa + * + * + * bbbb + * + * + *

      + * + * + * + * ``` + */ + createAddress : function(ignoreEnd,ignoreTxt){ + var addr = {},me = this; + + function getAddress(isStart){ + var node = isStart ? me.startContainer : me.endContainer; + var parents = domUtils.findParents(node,true,function(node){return !domUtils.isBody(node)}), + addrs = []; + for(var i = 0,ci;ci = parents[i++];){ + addrs.push(domUtils.getNodeIndex(ci,ignoreTxt)); + } + var firstIndex = 0; + + if(ignoreTxt){ + if(node.nodeType == 3){ + var tmpNode = node.previousSibling; + while(tmpNode && tmpNode.nodeType == 3){ + firstIndex += tmpNode.nodeValue.replace(fillCharReg,'').length; + tmpNode = tmpNode.previousSibling; + } + firstIndex += (isStart ? me.startOffset : me.endOffset)// - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) + }else{ + node = node.childNodes[ isStart ? me.startOffset : me.endOffset]; + if(node){ + firstIndex = domUtils.getNodeIndex(node,ignoreTxt); + }else{ + node = isStart ? me.startContainer : me.endContainer; + var first = node.firstChild; + while(first){ + if(domUtils.isFillChar(first)){ + first = first.nextSibling; + continue; + } + firstIndex++; + if(first.nodeType == 3){ + while( first && first.nodeType == 3){ + first = first.nextSibling; + } + }else{ + first = first.nextSibling; + } + } + } + } + + }else{ + firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset : me.endOffset + } + if(firstIndex < 0){ + firstIndex = 0; + } + addrs.push(firstIndex); + return addrs; + } + addr.startAddress = getAddress(true); + if(!ignoreEnd){ + addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress(); + } + return addr; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

      + * aaaa + * + * + * bbbb + * + * + *

      + * + * + * + * ``` + */ + moveToAddress : function(addr,ignoreEnd){ + var me = this; + function getNode(address,isStart){ + var tmpNode = me.document.body, + parentNode,offset; + for(var i= 0,ci,l=address.length;i + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历range内的节点。 + * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 + * 发doFn函数的执行 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 + * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 + * 会触发doFn。 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + traversal:function(doFn,filterFn){ + if (this.collapsed) + return this; + var bookmark = this.createBookmark(), + end = bookmark.end, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + var tmpNode = domUtils.getNextDomNode(current,false,filterFn); + doFn(current); + current = tmpNode; + } + return this.moveToBookmark(bookmark); + } + }; +})(); + +// core/Selection.js +/** + * 选集 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + +/** + * 选区集合 + * @unfile + * @module UE.dom + * @class Selection + */ +(function () { + + function getBoundaryInformation( range, start ) { + var getIndex = domUtils.getNodeIndex; + range = range.duplicate(); + range.collapse( start ); + var parent = range.parentElement(); + //如果节点里没有子节点,直接退出 + if ( !parent.hasChildNodes() ) { + return {container:parent, offset:0}; + } + var siblings = parent.children, + child, + testRange = range.duplicate(), + startIndex = 0, endIndex = siblings.length - 1, index = -1, + distance; + while ( startIndex <= endIndex ) { + index = Math.floor( (startIndex + endIndex) / 2 ); + child = siblings[index]; + testRange.moveToElementText( child ); + var position = testRange.compareEndPoints( 'StartToStart', range ); + if ( position > 0 ) { + endIndex = index - 1; + } else if ( position < 0 ) { + startIndex = index + 1; + } else { + //trace:1043 + return {container:parent, offset:getIndex( child )}; + } + } + if ( index == -1 ) { + testRange.moveToElementText( parent ); + testRange.setEndPoint( 'StartToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + siblings = parent.childNodes; + if ( !distance ) { + child = siblings[siblings.length - 1]; + return {container:child, offset:child.nodeValue.length}; + } + + var i = siblings.length; + while ( distance > 0 ){ + distance -= siblings[ --i ].nodeValue.length; + } + return {container:siblings[i], offset:-distance}; + } + testRange.collapse( position > 0 ); + testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + if ( !distance ) { + return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? + {container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} : + {container:child, offset:position > 0 ? 0 : child.childNodes.length} + } + while ( distance > 0 ) { + try { + var pre = child; + child = child[position > 0 ? 'previousSibling' : 'nextSibling']; + distance -= child.nodeValue.length; + } catch ( e ) { + return {container:parent, offset:getIndex( pre )}; + } + } + return {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance} + } + + /** + * 将ieRange转换为Range对象 + * @param {Range} ieRange ieRange对象 + * @param {Range} range Range对象 + * @return {Range} range 返回转换后的Range对象 + */ + function transformIERangeToRange( ieRange, range ) { + if ( ieRange.item ) { + range.selectNode( ieRange.item( 0 ) ); + } else { + var bi = getBoundaryInformation( ieRange, true ); + range.setStart( bi.container, bi.offset ); + if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) { + bi = getBoundaryInformation( ieRange, false ); + range.setEnd( bi.container, bi.offset ); + } + } + return range; + } + + /** + * 获得ieRange + * @param {Selection} sel Selection对象 + * @return {ieRange} 得到ieRange + */ + function _getIERange( sel ) { + var ieRange; + //ie下有可能报错 + try { + ieRange = sel.getNative().createRange(); + } catch ( e ) { + return null; + } + var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement(); + if ( ( el.ownerDocument || el ) === sel.document ) { + return ieRange; + } + return null; + } + + var Selection = dom.Selection = function ( doc ) { + var me = this, iframe; + me.document = doc; + if ( browser.ie9below ) { + iframe = domUtils.getWindow( doc ).frameElement; + domUtils.on( iframe, 'beforedeactivate', function () { + me._bakIERange = me.getIERange(); + } ); + domUtils.on( iframe, 'activate', function () { + try { + if ( !_getIERange( me ) && me._bakIERange ) { + me._bakIERange.select(); + } + } catch ( ex ) { + } + me._bakIERange = null; + } ); + } + iframe = doc = null; + }; + + Selection.prototype = { + + rangeInBody : function(rng,txtRange){ + var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; + + return node === this.document.body || domUtils.inDoc(node,this.document); + }, + + /** + * 获取原生seleciton对象 + * @method getNative + * @return { Object } 获得selection对象 + * @example + * ```javascript + * editor.selection.getNative(); + * ``` + */ + getNative:function () { + var doc = this.document; + try { + return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow( doc ).getSelection(); + } catch ( e ) { + return null; + } + }, + + /** + * 获得ieRange + * @method getIERange + * @return { Object } 返回ie原生的Range + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + getIERange:function () { + var ieRange = _getIERange( this ); + if ( !ieRange ) { + if ( this._bakIERange ) { + return this._bakIERange; + } + } + return ieRange; + }, + + /** + * 缓存当前选区的range和选区的开始节点 + * @method cache + */ + cache:function () { + this.clear(); + this._cachedRange = this.getRange(); + this._cachedStartElement = this.getStart(); + this._cachedStartElementPath = this.getStartElementPath(); + }, + + /** + * 获取选区开始位置的父节点到body + * @method getStartElementPath + * @return { Array } 返回父节点集合 + * @example + * ```javascript + * editor.selection.getStartElementPath(); + * ``` + */ + getStartElementPath:function () { + if ( this._cachedStartElementPath ) { + return this._cachedStartElementPath; + } + var start = this.getStart(); + if ( start ) { + return domUtils.findParents( start, true, null, true ) + } + return []; + }, + + /** + * 清空缓存 + * @method clear + */ + clear:function () { + this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; + }, + + /** + * 编辑器是否得到了选区 + * @method isFocus + */ + isFocus:function () { + try { + if(browser.ie9below){ + + var nativeRange = _getIERange(this); + return !!(nativeRange && this.rangeInBody(nativeRange)); + }else{ + return !!this.getNative().rangeCount; + } + } catch ( e ) { + return false; + } + + }, + + /** + * 获取选区对应的Range + * @method getRange + * @return { Object } 得到Range对象 + * @example + * ```javascript + * editor.selection.getRange(); + * ``` + */ + getRange:function () { + var me = this; + function optimze( range ) { + var child = me.document.body.firstChild, + collapsed = range.collapsed; + while ( child && child.firstChild ) { + range.setStart( child, 0 ); + child = child.firstChild; + } + if ( !range.startContainer ) { + range.setStart( me.document.body, 0 ) + } + if ( collapsed ) { + range.collapse( true ); + } + } + + if ( me._cachedRange != null ) { + return this._cachedRange; + } + var range = new baidu.editor.dom.Range( me.document ); + + if ( browser.ie9below ) { + var nativeRange = me.getIERange(); + if ( nativeRange ) { + //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 + try{ + transformIERangeToRange( nativeRange, range ); + }catch(e){ + optimze( range ); + } + + } else { + optimze( range ); + } + } else { + var sel = me.getNative(); + if ( sel && sel.rangeCount ) { + var firstRange = sel.getRangeAt( 0 ); + var lastRange = sel.getRangeAt( sel.rangeCount - 1 ); + range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset ); + if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) { + optimze( range ); + } + } else { + //trace:1734 有可能已经不在dom树上了,标识的节点 + if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){ + return this._bakRange; + } + optimze( range ); + } + } + return this._bakRange = range; + }, + + /** + * 获取开始元素,用于状态反射 + * @method getStart + * @return { Element } 获得开始元素 + * @example + * ```javascript + * editor.selection.getStart(); + * ``` + */ + getStart:function () { + if ( this._cachedStartElement ) { + return this._cachedStartElement; + } + var range = browser.ie9below ? this.getIERange() : this.getRange(), + tmpRange, + start, tmp, parent; + if ( browser.ie9below ) { + if ( !range ) { + //todo 给第一个值可能会有问题 + return this.document.body.firstChild; + } + //control元素 + if ( range.item ){ + return range.item( 0 ); + } + tmpRange = range.duplicate(); + //修正ie下x[xx] 闭合后 x|xx + tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 ); + tmpRange.collapse( 1 ); + start = tmpRange.parentElement(); + parent = tmp = range.parentElement(); + while ( tmp = tmp.parentNode ) { + if ( tmp == start ) { + start = parent; + break; + } + } + } else { + range.shrinkBoundary(); + start = range.startContainer; + if ( start.nodeType == 1 && start.hasChildNodes() ){ + start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )]; + } + if ( start.nodeType == 3 ){ + return start.parentNode; + } + } + return start; + }, + + /** + * 得到选区中的文本 + * @method getText + * @return { String } 选区中包含的文本 + * @example + * ```javascript + * editor.selection.getText(); + * ``` + */ + getText:function () { + var nativeSel, nativeRange; + if ( this.isFocus() && (nativeSel = this.getNative()) ) { + nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt( 0 ); + return browser.ie9below ? nativeRange.text : nativeRange.toString(); + } + return ''; + }, + + /** + * 清除选区 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange : function(){ + this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + } + }; +})(); + +// core/Editor.js +/** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * UEditor的核心类,为用户提供与编辑器交互的接口。 + * @unfile + * @module UE + * @class Editor + */ + +(function () { + var uid = 0, _selectionChangeTimer; + + /** + * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面 + * @private + * @method setValue + * @param { UE.Editor } editor 编辑器事例 + */ + function setValue(form, editor) { + var textarea; + if (editor.textarea) { + if (utils.isString(editor.textarea)) { + for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) { + if (ti.id == 'ueditor_textarea_' + editor.options.textarea) { + textarea = ti; + break; + } + } + } else { + textarea = editor.textarea; + } + } + if (!textarea) { + form.appendChild(textarea = domUtils.createElement(document, 'textarea', { + 'name': editor.options.textarea, + 'id': 'ueditor_textarea_' + editor.options.textarea, + 'style': "display:none" + })); + //不要产生多个textarea + editor.textarea = textarea; + } + !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea ); + textarea.value = editor.hasContents() ? + (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) : + '' + } + function loadPlugins(me){ + //初始化插件 + for (var pi in UE.plugins) { + UE.plugins[pi].call(me); + } + + } + function checkCurLang(I18N){ + for(var lang in I18N){ + return lang + } + } + + function langReadied(me){ + me.langIsReady = true; + + me.fireEvent("langReady"); + } + + /** + * 编辑器准备就绪后会触发该事件 + * @module UE + * @class Editor + * @event ready + * @remind render方法执行完成之后,会触发该事件 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 + * } ); + * ``` + */ + /** + * 执行destroy方法,会触发该事件 + * @module UE + * @class Editor + * @event destroy + * @see UE.Editor:destroy() + */ + /** + * 执行reset方法,会触发该事件 + * @module UE + * @class Editor + * @event reset + * @see UE.Editor:reset() + */ + /** + * 执行focus方法,会触发该事件 + * @module UE + * @class Editor + * @event focus + * @see UE.Editor:focus(Boolean) + */ + /** + * 语言加载完成会触发该事件 + * @module UE + * @class Editor + * @event langReady + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event beforeExecCommand + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event afterExecCommand + */ + /** + * 运行命令之前会触发该命令 + * @module UE + * @class Editor + * @event firstBeforeExecCommand + */ + /** + * 在getContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getAllHtml方法执行时会触发该事件 + * @module UE + * @class Editor + * @event getAllHtml + * @see UE.Editor:getAllHtml() + */ + /** + * 在setContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 在setContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 每当编辑器内部选区发生改变时,将触发该事件 + * @event selectionchange + * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * console.log('选区发生改变'); + * } + */ + /** + * 在所有selectionchange的监听函数执行之前,会触发该事件 + * @module UE + * @class Editor + * @event beforeSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 在所有selectionchange的监听函数执行完之后,会触发该事件 + * @module UE + * @class Editor + * @event afterSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 编辑器内容发生改变时会触发该事件 + * @module UE + * @class Editor + * @event contentChange + */ + + + /** + * 以默认参数构建一个编辑器实例 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @param { Object } setting 创建编辑器的参数 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + var Editor = UE.Editor = function (options) { + var me = this; + me.uid = uid++; + EventBase.call(me); + me.commands = {}; + me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); + me.shortcutkeys = {}; + me.inputRules = []; + me.outputRules = []; + //设置默认的常用属性 + me.setOpt(Editor.defaultOptions(me)); + + /* 尝试异步加载后台配置 */ + me.loadServerConfig(); + + if(!utils.isEmptyObject(UE.I18N)){ + //修改默认的语言类型 + me.options.lang = checkCurLang(UE.I18N); + UE.plugin.load(me); + langReadied(me); + + }else{ + utils.loadFile(document, { + src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + UE.plugin.load(me); + langReadied(me); + }); + } + + UE.instants['ueditorInstant' + me.uid] = me; + }; + Editor.prototype = { + registerCommand : function(name,obj){ + this.commands[name] = obj; + }, + /** + * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 + * @method ready + * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 + * 立即触发该回调。 + * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('初始化完毕'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function (fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener('ready', fn); + } + }, + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { String } key 编辑器的可接受的选项名称 + * @param { * } val 该选项可接受的值 + * @example + * ```javascript + * editor.setOpt( 'initContent', '欢迎使用编辑器' ); + * ``` + */ + + /** + * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { Object } options 将要设置的选项的键值对对象 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '欢迎使用编辑器' + * } ); + * ``` + */ + setOpt: function (key, val) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = val + } else { + obj = key; + } + utils.extend(this.options, obj, true); + }, + getOpt:function(key){ + return this.options[key] + }, + /** + * 销毁编辑器实例,使用textarea代替 + * @method destroy + * @example + * ```javascript + * editor.destroy(); + * ``` + */ + destroy: function () { + + var me = this; + me.fireEvent('destroy'); + var container = me.container.parentNode; + var textarea = me.textarea; + if (!textarea) { + textarea = document.createElement('textarea'); + container.parentNode.insertBefore(textarea, container); + } else { + textarea.style.display = '' + } + + textarea.style.width = me.iframe.offsetWidth + 'px'; + textarea.style.height = me.iframe.offsetHeight + 'px'; + textarea.value = me.getContent(); + textarea.id = me.key; + container.innerHTML = ''; + domUtils.remove(container); + var key = me.key; + //trace:2004 + for (var p in me) { + if (me.hasOwnProperty(p)) { + delete this[p]; + } + } + UE.delEditor(key); + }, + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { String } containerId 指定一个容器ID + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { Element } containerDom 直接指定容器对象 + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + render: function (container) { + var me = this, + options = me.options, + getStyleValue=function(attr){ + return parseInt(domUtils.getComputedStyle(container,attr)); + }; + if (utils.isString(container)) { + container = document.getElementById(container); + } + if (container) { + if(options.initialFrameWidth){ + options.minFrameWidth = options.initialFrameWidth + }else{ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + } + if(options.initialFrameHeight){ + options.minFrameHeight = options.initialFrameHeight + }else{ + options.initialFrameHeight = options.minFrameHeight = container.offsetHeight; + } + + container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth- + getStyleValue("padding-left")- getStyleValue("padding-right") +'px'; + container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight - + getStyleValue("padding-top")- getStyleValue("padding-bottom") +'px'; + + container.style.zIndex = options.zIndex; + + var html = ( ie && browser.version < 9 ? '' : '') + + '' + + '' + + ( options.iframeCssUrl ? '' : '' ) + + (options.initialStyle ? '' : '') + + '' + + ''; + container.appendChild(domUtils.createElement(document, 'iframe', { + id: 'ueditor_' + me.uid, + width: "100%", + height: "100%", + frameborder: "0", + //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 +// scrolling :'no', + src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";' : '') + + 'document.write("' + html + '");document.close();}())' + })); + container.style.overflow = 'hidden'; + //解决如果是给定的百分比,会导致高度算不对的问题 + setTimeout(function(){ + if( /%$/.test(options.initialFrameWidth)){ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 +// container.style.width = options.initialFrameWidth + 'px'; + } + if(/%$/.test(options.initialFrameHeight)){ + options.minFrameHeight = options.initialFrameHeight = container.offsetHeight; + container.style.height = options.initialFrameHeight + 'px'; + } + }) + } + }, + + /** + * 编辑器初始化 + * @method _setup + * @private + * @param { Element } doc 编辑器Iframe中的文档对象 + */ + _setup: function (doc) { + + var me = this, + options = me.options; + if (ie) { + doc.body.disabled = true; + doc.body.contentEditable = true; + doc.body.disabled = false; + } else { + doc.body.contentEditable = true; + } + doc.body.spellcheck = false; + me.document = doc; + me.window = doc.defaultView || doc.parentWindow; + me.iframe = me.window.frameElement; + me.body = doc.body; + me.selection = new dom.Selection(doc); + //gecko初始化就能得到range,无法判断isFocus了 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + this._initEvents(); + //为form提交提供一个隐藏的textarea + for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) { + if (form.tagName == 'FORM') { + me.form = form; + if(me.options.autoSyncData){ + domUtils.on(me.window,'blur',function(){ + setValue(form,me); + }); + }else{ + domUtils.on(form, 'submit', function () { + setValue(this, me); + }); + } + break; + } + } + if (options.initialContent) { + if (options.autoClearinitialContent) { + var oldExecCommand = me.execCommand; + me.execCommand = function () { + me.fireEvent('firstBeforeExecCommand'); + return oldExecCommand.apply(me, arguments); + }; + this._setDefaultContent(options.initialContent); + } else + this.setContent(options.initialContent, false, true); + } + + //编辑器不能为空内容 + + if (domUtils.isEmptyNode(me.body)) { + me.body.innerHTML = '

      ' + (browser.ie ? '' : '
      ') + '

      '; + } + //如果要求focus, 就把光标定位到内容开始 + if (options.focus) { + setTimeout(function () { + me.focus(me.options.focusInEnd); + //如果自动清除开着,就不需要做selectionchange; + !me.options.autoClearinitialContent && me._selectionChange(); + }, 0); + } + if (!me.container) { + me.container = this.iframe.parentNode; + } + if (options.fullscreen && me.ui) { + me.ui.setFullScreen(true); + } + + try { + me.document.execCommand('2D-position', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableInlineTableEditing', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableObjectResizing', false, false); + } catch (e) { + } + + //挂接快捷键 + me._bindshortcutKeys(); + me.isReady = 1; + me.fireEvent('ready'); + options.onready && options.onready.call(me); + if (!browser.ie9below) { + domUtils.on(me.window, ['blur', 'focus'], function (e) { + //chrome下会出现alt+tab切换时,导致选区位置不对 + if (e.type == 'blur') { + me._bakRange = me.selection.getRange(); + try { + me._bakNativeRange = me.selection.getNative().getRangeAt(0); + me.selection.getNative().removeAllRanges(); + } catch (e) { + me._bakNativeRange = null; + } + + } else { + try { + me._bakRange && me._bakRange.select(); + } catch (e) { + } + } + }); + } + //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 + if (browser.gecko && browser.version <= 10902) { + //修复ff3.6初始化进来,不能点击获得焦点 + me.body.contentEditable = false; + setTimeout(function () { + me.body.contentEditable = true; + }, 100); + setInterval(function () { + me.body.style.height = me.iframe.offsetHeight - 20 + 'px' + }, 100) + } + + !options.isShow && me.setHide(); + options.readonly && me.setDisabled(); + }, + + /** + * 同步数据到编辑器所在的form + * 从编辑器的容器节点向上查找form元素,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况 + * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项 + * @method sync + * @example + * ```javascript + * editor.sync(); + * form.sumbit(); //form变量已经指向了form元素 + * ``` + */ + + /** + * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备 + * 后台取得数据的键值,该键值默认使用给定的编辑器容器的name属性,如果没有name属性则使用参数项里给定的“textarea”项 + * @method sync + * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下 + */ + sync: function (formId) { + var me = this, + form = formId ? document.getElementById(formId) : + domUtils.findParent(me.iframe.parentNode, function (node) { + return node.tagName == 'FORM' + }, true); + form && setValue(form, me); + }, + + /** + * 设置编辑器高度 + * @method setHeight + * @remind 当配置项autoHeightEnabled为真时,该方法无效 + * @param { Number } number 设置的高度值,纯数值,不带单位 + * @example + * ```javascript + * editor.setHeight(number); + * ``` + */ + setHeight: function (height,notSetHeight) { + if (height !== parseInt(this.iframe.parentNode.style.height)) { + this.iframe.parentNode.style.height = height + 'px'; + } + !notSetHeight && (this.options.minFrameHeight = this.options.initialFrameHeight = height); + this.body.style.height = height + 'px'; + !notSetHeight && this.trigger('setHeight') + }, + + /** + * 为编辑器的编辑命令提供快捷键 + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey({ + * "Bold" : "ctrl+66",//^B + * "Italic" : "ctrl+73", //^I + * }); + * ``` + */ + /** + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { String } cmd 触发快捷键时,响应的命令 + * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey("Underline", "ctrl+85"); //^U + * ``` + */ + addshortcutkey: function (cmd, keys) { + var obj = {}; + if (keys) { + obj[cmd] = keys + } else { + obj = cmd; + } + utils.extend(this.shortcutkeys, obj) + }, + + /** + * 对编辑器设置keydown事件监听,绑定快捷键和命令,当快捷键组合触发成功,会响应对应的命令 + * @method _bindshortcutKeys + * @private + */ + _bindshortcutKeys: function () { + var me = this, shortcutkeys = this.shortcutkeys; + me.addListener('keydown', function (type, e) { + var keyCode = e.keyCode || e.which; + for (var i in shortcutkeys) { + var tmp = shortcutkeys[i].split(','); + for (var t = 0, ti; ti = tmp[t++];) { + ti = ti.split(':'); + var key = ti[0], param = ti[1]; + if (/^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || /^(\d+)$/.test(key)) { + if (( (RegExp.$1 == 'ctrl' ? (e.ctrlKey || e.metaKey) : 0) + && (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) + && keyCode == RegExp.$3 + ) || + keyCode == RegExp.$1 + ) { + if (me.queryCommandState(i,param) != -1) + me.execCommand(i, param); + domUtils.preventDefault(e); + } + } + } + + } + }); + }, + + /** + * 获取编辑器的内容 + * @method getContent + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 + * @example + * ```javascript + * //编辑器html内容:

      123456

      + * var content = editor.getContent(); //返回值:

      123456

      + * ``` + */ + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + getContent: function (cmd, fn,notSetCursor,ignoreBlank,formatter) { + var me = this; + if (cmd && utils.isFunction(cmd)) { + fn = cmd; + cmd = ''; + } + if (fn ? !fn() : !this.hasContents()) { + return ''; + } + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML,ignoreBlank); + me.filterOutputRule(root); + me.fireEvent('aftergetcontent', cmd,root); + return root.toHtml(formatter); + }, + + /** + * 取得完整的html代码,可以直接显示成完整的html文档 + * @method getAllHtml + * @return { String } 编辑器的内容html文档字符串 + * @eaxmple + * ```javascript + * editor.getAllHtml(); //返回格式大致是: ...... + * ``` + */ + getAllHtml: function () { + var me = this, + headHtml = [], + html = ''; + me.fireEvent('getAllHtml', headHtml); + if (browser.ie && browser.version > 8) { + var headHtmlForIE9 = ''; + utils.each(me.document.styleSheets, function (si) { + headHtmlForIE9 += ( si.href ? '' : ''); + }); + utils.each(me.document.getElementsByTagName('script'), function (si) { + headHtmlForIE9 += si.outerHTML; + }); + + } + return '' + (me.options.charset ? '' : '') + + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '' + + '' + me.getContent(null, null, true) + ''; + }, + + /** + * 得到编辑器的纯文本内容,但会保留段落格式 + * @method getPlainTxt + * @return { String } 编辑器带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

      1

      2

      + * console.log(editor.getPlainTxt()); //输出:"1\n2\n + * ``` + */ + getPlainTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'), + html = this.body.innerHTML.replace(/[\n\r]/g, '');//ie要先去了\n在处理 + html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, '\n') + .replace(//gi, '\n') + .replace(/<[^>/]+>/g, '') + .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { + return dtd.$block[c] ? '\n' : b ? b : ''; + }); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return html.replace(reg, '').replace(/\u00a0/g, ' ').replace(/ /g, ' '); + }, + + /** + * 获取编辑器中的纯文本内容,没有段落格式 + * @method getContentTxt + * @return { String } 编辑器不带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

      1

      2

      + * console.log(editor.getPlainTxt()); //输出:"12 + * ``` + */ + getContentTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\u00a0/g, ' '); + }, + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @example + * ```javascript + * editor.getContent('

      test

      '); + * ``` + */ + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @example + * ```javascript + * //假设设置前的编辑器内容是

      old text

      + * editor.setContent('

      new text

      ', true); //插入的结果是

      old text

      new text

      + * ``` + */ + setContent: function (html, isAppendTo, notFireSelectionchange) { + var me = this; + + me.fireEvent('beforesetcontent', html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + + me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html; + + + function isCdataDiv(node){ + return node.tagName == 'DIV' && node.getAttribute('cdata_tag'); + } + //给文本或者inline节点套p标签 + if (me.options.enterTag == 'p') { + + var child = this.body.firstChild, tmpNode; + if (!child || child.nodeType == 1 && + (dtd.$cdata[child.tagName] || isCdataDiv(child) || + domUtils.isCustomeNode(child) + ) + && child === this.body.lastChild) { + this.body.innerHTML = '

      ' + (browser.ie ? ' ' : '
      ') + '

      ' + this.body.innerHTML; + + } else { + var p = me.document.createElement('p'); + while (child) { + while (child && (child.nodeType == 3 || child.nodeType == 1 && dtd.p[child.tagName] && !dtd.$cdata[child.tagName])) { + tmpNode = child.nextSibling; + p.appendChild(child); + child = tmpNode; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement('p'); + } + } + child = child.nextSibling; + } + } + } + me.fireEvent('aftersetcontent'); + me.fireEvent('contentchange'); + + !notFireSelectionchange && me._selectionChange(); + //清除保存的选区 + me._bakRange = me._bakIERange = me._bakNativeRange = null; + //trace:1742 setContent后gecko能得到焦点问题 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + if(me.options.autoSyncData){ + me.form && setValue(me.form,me); + } + }, + + /** + * 让编辑器获得焦点,默认focus到编辑器头部 + * @method focus + * @example + * ```javascript + * editor.focus() + * ``` + */ + + /** + * 让编辑器获得焦点,toEnd确定focus位置 + * @method focus + * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 + * @example + * ```javascript + * editor.focus(true) + * ``` + */ + focus: function (toEnd) { + try { + var me = this, + rng = me.selection.getRange(); + if (toEnd) { + var node = me.body.lastChild; + if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ + if(domUtils.isEmptyBlock(node)){ + rng.setStartAtFirst(node) + }else{ + rng.setStartAtLast(node) + } + rng.collapse(true); + } + rng.setCursor(true); + } else { + if(!rng.collapsed && domUtils.isBody(rng.startContainer) && rng.startOffset == 0){ + + var node = me.body.firstChild; + if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ + rng.setStartAtFirst(node).collapse(true); + } + } + + rng.select(true); + + } + this.fireEvent('focus selectionchange'); + } catch (e) { + } + + }, + isFocus:function(){ + return this.selection.isFocus(); + }, + blur:function(){ + var sel = this.selection.getNative(); + if(sel.empty && browser.ie){ + var nativeRng = document.body.createTextRange(); + nativeRng.moveToElementText(document.body); + nativeRng.collapse(true); + nativeRng.select(); + sel.empty() + }else{ + sel.removeAllRanges() + } + + //this.fireEvent('blur selectionchange'); + }, + /** + * 初始化UE事件及部分事件代理 + * @method _initEvents + * @private + */ + _initEvents: function () { + var me = this, + doc = me.document, + win = me.window; + me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); + domUtils.on(doc, ['click', 'contextmenu', 'mousedown', 'keydown', 'keyup', 'keypress', 'mouseup', 'mouseover', 'mouseout', 'selectstart'], me._proxyDomEvent); + domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent); + domUtils.on(me.body,'drop',function(e){ + //阻止ff下默认的弹出新页面打开图片 + if(browser.gecko && e.stopPropagation) { e.stopPropagation(); } + me.fireEvent('contentchange') + }); + domUtils.on(doc, ['mouseup', 'keydown'], function (evt) { + //特殊键不触发selectionchange + if (evt.type == 'keydown' && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)) { + return; + } + if (evt.button == 2)return; + me._selectionChange(250, evt); + }); + }, + /** + * 触发事件代理 + * @method _proxyDomEvent + * @private + * @return { * } fireEvent的返回值 + * @see UE.EventBase:fireEvent(String) + */ + _proxyDomEvent: function (evt) { + if(this.fireEvent('before' + evt.type.replace(/^on/, '').toLowerCase()) === false){ + return false; + } + if(this.fireEvent(evt.type.replace(/^on/, ''), evt) === false){ + return false; + } + return this.fireEvent('after' + evt.type.replace(/^on/, '').toLowerCase()) + }, + /** + * 变化选区 + * @method _selectionChange + * @private + */ + _selectionChange: function (delay, evt) { + var me = this; + //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) +// if ( !me.selection.isFocus() ){ +// return; +// } + + + var hackForMouseUp = false; + var mouseX, mouseY; + if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') { + var range = this.selection.getRange(); + if (!range.collapsed) { + hackForMouseUp = true; + mouseX = evt.clientX; + mouseY = evt.clientY; + } + } + clearTimeout(_selectionChangeTimer); + _selectionChangeTimer = setTimeout(function () { + if (!me.selection || !me.selection.getNative()) { + return; + } + //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. + //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 + var ieRange; + if (hackForMouseUp && me.selection.getNative().type == 'None') { + ieRange = me.document.body.createTextRange(); + try { + ieRange.moveToPoint(mouseX, mouseY); + } catch (ex) { + ieRange = null; + } + } + var bakGetIERange; + if (ieRange) { + bakGetIERange = me.selection.getIERange; + me.selection.getIERange = function () { + return ieRange; + }; + } + me.selection.cache(); + if (bakGetIERange) { + me.selection.getIERange = bakGetIERange; + } + if (me.selection._cachedRange && me.selection._cachedStartElement) { + me.fireEvent('beforeselectionchange'); + // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. + me.fireEvent('selectionchange', !!evt); + me.fireEvent('afterselectionchange'); + me.selection.clear(); + } + }, delay || 50); + }, + + /** + * 执行编辑命令 + * @method _callCmdFn + * @private + * @param { String } fnName 函数名称 + * @param { * } args 传给命令函数的参数 + * @return { * } 返回命令函数运行的返回值 + */ + _callCmdFn: function (fnName, args) { + var cmdName = args[0].toLowerCase(), + cmd, cmdFn; + cmd = this.commands[cmdName] || UE.commands[cmdName]; + cmdFn = cmd && cmd[fnName]; + //没有querycommandstate或者没有command的都默认返回0 + if ((!cmd || !cmdFn) && fnName == 'queryCommandState') { + return 0; + } else if (cmdFn) { + return cmdFn.apply(this, args); + } + }, + + /** + * 执行编辑命令cmdName,完成富文本编辑效果 + * @method execCommand + * @param { String } cmdName 需要执行的命令 + * @remind 具体命令的使用请参考命令列表 + * @return { * } 返回命令函数运行的返回值 + * @example + * ```javascript + * editor.execCommand(cmdName); + * ``` + */ + execCommand: function (cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this, + result, + cmd = me.commands[cmdName] || UE.commands[cmdName]; + if (!cmd || !cmd.execCommand) { + return null; + } + if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + if (me.queryCommandState.apply(me,arguments) != -1) { + me.fireEvent('saveScene'); + me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments)); + result = this._callCmdFn('execCommand', arguments); + //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 +// (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); + me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments)); + me.fireEvent('saveScene'); + } + me.__hasEnterExecCommand = false; + } else { + result = this._callCmdFn('execCommand', arguments); + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange') + } + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange(); + return result; + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 + * @method queryCommandState + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) + * @example + * ```javascript + * editor.queryCommandState(cmdName) => (-1|0|1) + * ``` + * @see COMMAND.LIST + */ + queryCommandState: function (cmdName) { + return this._callCmdFn('queryCommandState', arguments); + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 + * @method queryCommandValue + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @remind 只有部分插件有此方法 + * @return { * } 返回每个命令特定的当前状态值 + * @grammar editor.queryCommandValue(cmdName) => {*} + * @see COMMAND.LIST + */ + queryCommandValue: function (cmdName) { + return this._callCmdFn('queryCommandValue', arguments); + }, + + /** + * 检查编辑区域中是否有内容 + * @method hasContents + * @remind 默认有文本内容,或者有以下节点都不认为是空 + * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param + * @return { Boolean } 检查有内容返回true,否则返回false + * @example + * ```javascript + * editor.hasContents() + * ``` + */ + + /** + * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true + * @method hasContents + * @param { Array } tags 传入数组判断时用到的节点类型 + * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false + * @example + * ```javascript + * editor.hasContents(['span']); + * ``` + */ + hasContents: function (tags) { + if (tags) { + for (var i = 0, ci; ci = tags[i++];) { + if (this.document.getElementsByTagName(ci).length > 0) { + return true; + } + } + } + if (!domUtils.isEmptyBlock(this.body)) { + return true + } + //随时添加,定义的特殊标签如果存在,不能认为是空 + tags = ['div']; + for (i = 0; ci = tags[i++];) { + var nodes = domUtils.getElementsByTagName(this.document, ci); + for (var n = 0, cn; cn = nodes[n++];) { + if (domUtils.isCustomeNode(cn)) { + return true; + } + } + } + return false; + }, + + /** + * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + * @method reset + * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 + * @example + * ```javascript + * editor.reset() + * ``` + */ + reset: function () { + this.fireEvent('reset'); + }, + + /** + * 设置当前编辑区域可以编辑 + * @method setEnabled + * @example + * ```javascript + * editor.setEnabled() + * ``` + */ + setEnabled: function () { + var me = this, range; + if (me.body.contentEditable == 'false') { + me.body.contentEditable = true; + range = me.selection.getRange(); + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + range.select(true); + if (me.bkqueryCommandState) { + me.queryCommandState = me.bkqueryCommandState; + delete me.bkqueryCommandState; + } + if (me.bkqueryCommandValue) { + me.queryCommandValue = me.bkqueryCommandValue; + delete me.bkqueryCommandValue; + } + me.fireEvent('selectionchange'); + } + }, + enable: function () { + return this.setEnabled(); + }, + + /** 设置当前编辑区域不可编辑 + * @method setDisabled + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { String } except 例外命令的字符串 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 + * ``` + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能 + * ``` + */ + setDisabled: function (except) { + var me = this; + except = except ? utils.isArray(except) ? except : [except] : []; + if (me.body.contentEditable == 'true') { + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.body.contentEditable = false; + me.bkqueryCommandState = me.queryCommandState; + me.bkqueryCommandValue = me.queryCommandValue; + me.queryCommandState = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandState.apply(me, arguments); + } + return -1; + }; + me.queryCommandValue = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandValue.apply(me, arguments); + } + return null; + }; + me.fireEvent('selectionchange'); + } + }, + disable: function (except) { + return this.setDisabled(except); + }, + + /** + * 设置默认内容 + * @method _setDefaultContent + * @private + * @param { String } cont 要存入的内容 + */ + _setDefaultContent: function () { + function clear() { + var me = this; + if (me.document.getElementById('initContent')) { + me.body.innerHTML = '

      ' + (ie ? '' : '
      ') + '

      '; + me.removeListener('firstBeforeExecCommand focus', clear); + setTimeout(function () { + me.focus(); + me._selectionChange(); + }, 0) + } + } + + return function (cont) { + var me = this; + me.body.innerHTML = '

      ' + cont + '

      '; + + me.addListener('firstBeforeExecCommand focus', clear); + } + }(), + + /** + * 显示编辑器 + * @method setShow + * @example + * ```javascript + * editor.setShow() + * ``` + */ + setShow: function () { + var me = this, range = me.selection.getRange(); + if (me.container.style.display == 'none') { + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + //ie下focus实效,所以做了个延迟 + setTimeout(function () { + range.select(true); + }, 100); + me.container.style.display = ''; + } + + }, + show: function () { + return this.setShow(); + }, + /** + * 隐藏编辑器 + * @method setHide + * @example + * ```javascript + * editor.setHide() + * ``` + */ + setHide: function () { + var me = this; + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.container.style.display = 'none' + }, + hide: function () { + return this.setHide(); + }, + + /** + * 根据指定的路径,获取对应的语言资源 + * @method getLang + * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 + * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 + * @example + * ```javascript + * editor.getLang('contextMenu.delete'); //如果当前是中文,那返回是的是'删除' + * ``` + */ + getLang: function (path) { + var lang = UE.I18N[this.options.lang]; + if (!lang) { + throw Error("not import language file"); + } + path = (path || "").split("."); + for (var i = 0, ci; ci = path[i++];) { + lang = lang[ci]; + if (!lang)break; + } + return lang; + }, + + /** + * 计算编辑器html内容字符串的长度 + * @method getContentLength + * @return { Number } 返回计算的长度 + * @example + * ```javascript + * //编辑器html内容

      132

      + * editor.getContentLength() //返回27 + * ``` + */ + /** + * 计算编辑器当前纯文本内容的长度 + * @method getContentLength + * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 + * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 + * @example + * ```javascript + * //编辑器html内容

      132

      + * editor.getContentLength() //返回3 + * ``` + */ + getContentLength: function (ingoneHtml, tagNames) { + var count = this.getContent(false,false,true).length; + if (ingoneHtml) { + tagNames = (tagNames || []).concat([ 'hr', 'img', 'iframe']); + count = this.getContentTxt().replace(/[\t\r\n]+/g, '').length; + for (var i = 0, ci; ci = tagNames[i++];) { + count += this.document.getElementsByTagName(ci).length; + } + } + return count; + }, + + /** + * 注册输入过滤规则 + * @method addInputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addInputRule(function(root){ + * $.each(root.getNodesByTagName('div'),function(i,node){ + * node.tagName="p"; + * }); + * }); + * ``` + */ + addInputRule: function (rule) { + this.inputRules.push(rule); + }, + + /** + * 执行注册的过滤规则 + * @method filterInputRule + * @param { UE.uNode } root 要过滤的uNode节点 + * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 + * @example + * ```javascript + * editor.filterInputRule(editor.body); + * ``` + * @see UE.Editor:addInputRule + */ + filterInputRule: function (root) { + for (var i = 0, ci; ci = this.inputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 注册输出过滤规则 + * @method addOutputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addOutputRule(function(root){ + * $.each(root.getNodesByTagName('p'),function(i,node){ + * node.tagName="div"; + * }); + * }); + * ``` + */ + addOutputRule: function (rule) { + this.outputRules.push(rule) + }, + + /** + * 根据输出过滤规则,过滤编辑器内容 + * @method filterOutputRule + * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 + * @param { UE.uNode } root 要过滤的uNode节点 + * @example + * ```javascript + * editor.filterOutputRule(editor.body); + * ``` + * @see UE.Editor:addOutputRule + */ + filterOutputRule: function (root) { + for (var i = 0, ci; ci = this.outputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 根据action名称获取请求的路径 + * @method getActionUrl + * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 + * @param { String } action action名称 + * @example + * ```javascript + * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" + * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" + * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" + * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage" + * ``` + */ + getActionUrl: function(action){ + var actionName = this.getOpt(action) || action, + imageUrl = this.getOpt('imageUrl'), + serverUrl = this.getOpt('serverUrl'); + + if(!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2'); + } + + if(serverUrl) { + serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?':'&') + 'action=' + (actionName || ''); + return utils.formatUrl(serverUrl); + } else { + return ''; + } + } + }; + utils.inherits(Editor, EventBase); +})(); + + +// core/Editor.defaultoptions.js +//维护编辑器一下默认的不在插件中的配置项 +UE.Editor.defaultOptions = function(editor){ + + var _url = editor.options.UEDITOR_HOME_URL; + return { + isShow: true, + initialContent: '', + initialStyle:'', + autoClearinitialContent: false, + iframeCssUrl: _url + 'themes/iframe.css', + textarea: 'editorValue', + focus: false, + focusInEnd: true, + autoClearEmptyNode: true, + fullscreen: false, + readonly: false, + zIndex: 999, + imagePopup: true, + enterTag: 'p', + customDomain: false, + lang: 'zh-cn', + langPath: _url + 'lang/', + theme: 'default', + themePath: _url + 'themes/', + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData : true, + fileNameFormat: '{time}{rand:6}' + } +}; + +// core/loadconfig.js +(function(){ + + UE.Editor.prototype.loadServerConfig = function(){ + var me = this; + setTimeout(function(){ + try{ + me.options.imageUrl && me.setOpt('serverUrl', me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2')); + + var configUrl = me.getActionUrl('config'), + isJsonp = utils.isCrossDomainUrl(configUrl); + + /* 发出ajax请求 */ + me._serverConfigLoaded = false; + + configUrl && UE.ajax.request(configUrl,{ + 'method': 'GET', + 'dataType': isJsonp ? 'jsonp':'', + 'onsuccess':function(r){ + try { + var config = isJsonp ? r:eval("("+r.responseText+")"); + utils.extend(me.options, config); + me.fireEvent('serverConfigLoaded'); + me._serverConfigLoaded = true; + } catch (e) { + showErrorMsg(me.getLang('loadconfigFormatError')); + } + }, + 'onerror':function(){ + showErrorMsg(me.getLang('loadconfigHttpError')); + } + }); + } catch(e){ + showErrorMsg(me.getLang('loadconfigError')); + } + }); + + function showErrorMsg(msg) { + console && console.error(msg); + //me.fireEvent('showMessage', { + // 'title': msg, + // 'type': 'error' + //}); + } + }; + + UE.Editor.prototype.isServerConfigLoaded = function(){ + var me = this; + return me._serverConfigLoaded || false; + }; + + UE.Editor.prototype.afterConfigReady = function(handler){ + if (!handler || !utils.isFunction(handler)) return; + var me = this; + var readyHandler = function(){ + handler.apply(me, arguments); + me.removeListener('serverConfigLoaded', readyHandler); + }; + + if (me.isServerConfigLoaded()) { + handler.call(me, 'serverConfigLoaded'); + } else { + me.addListener('serverConfigLoaded', readyHandler); + } + }; + +})(); + + +// core/ajax.js +/** + * @file + * @module UE.ajax + * @since 1.2.6.1 + */ + +/** + * 提供对ajax请求的支持 + * @module UE.ajax + */ +UE.ajax = function() { + + //创建一个ajaxRequest对象 + var fnStr = 'XMLHttpRequest()'; + try { + new ActiveXObject("Msxml2.XMLHTTP"); + fnStr = 'ActiveXObject(\'Msxml2.XMLHTTP\')'; + } catch (e) { + try { + new ActiveXObject("Microsoft.XMLHTTP"); + fnStr = 'ActiveXObject(\'Microsoft.XMLHTTP\')' + } catch (e) { + } + } + var creatAjaxRequest = new Function('return new ' + fnStr); + + + /** + * 将json参数转化成适合ajax提交的参数列表 + * @param json + */ + function json2str(json) { + var strArr = []; + for (var i in json) { + //忽略默认的几个参数 + if(i=="method" || i=="timeout" || i=="async" || i=="dataType" || i=="callback") continue; + //忽略控制 + if(json[i] == undefined || json[i] == null) continue; + //传递过来的对象和函数不在提交之列 + if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) { + strArr.push( encodeURIComponent(i) + "="+encodeURIComponent(json[i]) ); + } else if (utils.isArray(json[i])) { + //支持传数组内容 + for(var j = 0; j < json[i].length; j++) { + strArr.push( encodeURIComponent(i) + "[]="+encodeURIComponent(json[i][j]) ); + } + } + } + return strArr.join("&"); + } + + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method:"POST", + timeout:5000, + async:true, + data:{},//需要传递对象的话只能覆盖 + onsuccess:function() { + }, + onerror:function() { + } + }; + + if (typeof url === "object") { + ajaxOptions = url; + url = ajaxOptions.url; + } + if (!xhr || !url) return; + var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions; + + var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(ajaxOpts.data)){ + submitStr += (submitStr? "&":"") + json2str(ajaxOpts.data); + } + //超时检测 + var timerID = setTimeout(function() { + if (xhr.readyState != 4) { + timeIsOut = true; + xhr.abort(); + clearTimeout(timerID); + } + }, ajaxOpts.timeout); + + var method = ajaxOpts.method.toUpperCase(); + var str = url + (url.indexOf("?")==-1?"?":"&") + (method=="POST"?"":submitStr+ "&noCache=" + +new Date); + xhr.open(method, str, ajaxOpts.async); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (!timeIsOut && xhr.status == 200) { + ajaxOpts.onsuccess(xhr); + } else { + ajaxOpts.onerror(xhr); + } + } + }; + if (method == "POST") { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.send(submitStr); + } else { + xhr.send(null); + } + } + + function doJsonp(url, opts) { + + var successhandler = opts.onsuccess || function(){}, + scr = document.createElement('SCRIPT'), + options = opts || {}, + charset = options['charset'], + callbackField = options['jsonp'] || 'callback', + callbackFnName, + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + callbackField + '=([^&]*)'), + matches; + + if (utils.isFunction(successhandler)) { + callbackFnName = 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackFnName] = getCallBack(0); + } else if(utils.isString(successhandler)){ + callbackFnName = successhandler; + } else { + if (matches = reg.exec(url)) { + callbackFnName = matches[2]; + } + } + + url = url.replace(reg, '\x241' + callbackField + '=' + callbackFnName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + callbackField + '=' + callbackFnName; + } + + var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(opts.data)){ + queryStr += (queryStr? "&":"") + json2str(opts.data); + } + if (queryStr) { + url = url.replace(/\?/, '?' + queryStr + '&'); + } + + scr.onerror = getCallBack(1); + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + createScriptTag(scr, url, charset); + + function createScriptTag(scr, url, charset) { + scr.setAttribute('type', 'text/javascript'); + scr.setAttribute('defer', 'defer'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); + } + + function getCallBack(onTimeOut){ + return function(){ + try { + if(onTimeOut){ + options.onerror && options.onerror(); + }else{ + try{ + clearTimeout(timer); + successhandler.apply(window, arguments); + } catch (e){} + } + } catch (exception) { + options.onerror && options.onerror.call(window, exception); + } finally { + options.oncomplete && options.oncomplete.apply(window, arguments); + scr.parentNode && scr.parentNode.removeChild(scr); + window[callbackFnName] = null; + try { + delete window[callbackFnName]; + }catch(e){} + } + } + } + } + + return { + /** + * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调 + * @method request + * @param { URLString } url ajax请求的url地址 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求方法。可选值: 'GET', 'POST',默认值是'POST' + * method: 'GET', + * + * //超时时间。 默认为5000, 单位是ms + * timeout: 10000, + * + * //是否是异步请求。 true为异步请求, false为同步请求 + * async: true, + * + * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 + * data: { + * name: 'ueditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 + * onsuccess: function ( xhr ) { + * console.log( xhr.responseText ); + * }, + * + * //请求失败或者超时后的回调。 + * onerror: function ( xhr ) { + * alert( 'Ajax请求失败' ); + * } + * + * } ); + * ``` + */ + + /** + * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 + * @method request + * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * + * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求的地址, 该项是必须的。 + * url: 'sayhello.php' + * + * } ); + * ``` + */ + request:function(url, opts) { + if (opts && opts.dataType == 'jsonp') { + doJsonp(url, opts); + } else { + doAjax(url, opts); + } + }, + getJSONP:function(url, data, fn) { + var opts = { + 'data': data, + 'oncomplete': fn + }; + doJsonp(url, opts); + } + }; + + +}(); + + +// core/filterword.js +/** + * UE过滤word的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + +/** + * 根据传入html字符串过滤word + * @module UE + * @since 1.2.6.1 + * @method filterWord + * @param { String } html html字符串 + * @return { String } 已过滤后的结果字符串 + * @example + * ```javascript + * UE.filterWord(html); + * ``` + */ +var filterWord = UE.filterWord = function () { + + //是否是word过来的内容 + function isWordDocument( str ) { + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test( str ); + } + //去掉小数 + function transUnit( v ) { + v = v.replace( /[\d.]+\w+/g, function ( m ) { + return utils.transUnitToPx(m); + } ); + return v; + } + + function filterPasteWord( str ) { + return str.replace(/[\t\r\n]+/g,' ') + .replace( //ig, "" ) + //转换图片 + .replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(str){ + //opera能自己解析出image所这里直接返回空 + if(browser.opera){ + return ''; + } + try{ + //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 + if(/Bitmap/i.test(str)){ + return ''; + } + var width = str.match(/width:([ \d.]*p[tx])/i)[1], + height = str.match(/height:([ \d.]*p[tx])/i)[1], + src = str.match(/src=\s*"([^"]*)"/i)[1]; + return ''; + } catch(e){ + return ''; + } + }) + //针对wps添加的多余标签处理 + .replace(/<\/?div[^>]*>/g,'') + //去掉多余的属性 + .replace( /v:\w+=(["']?)[^'"]+\1/g, '' ) + .replace( /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "" ) + .replace( /

      ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

      $1

      " ) + //去掉多余的属性 + .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){ + //保留list的标示 + return name == 'class' && val == 'MsoListParagraph' ? str : '' + }) + //清除多余的font/span不能匹配 有可能是空格 + .replace( /<(font|span)[^>]*>(\s*)<\/\1>/gi, function(a,b,c){ + return c.replace(/[\t\r\n ]+/g,' ') + }) + //处理style的问题 + .replace( /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( str, tag, tmp, style ) { + var n = [], + s = style.replace( /^\s+|\s+$/, '' ) + .replace(/'/g,'\'') + .replace( /"/gi, "'" ) + .replace(/[\d.]+(cm|pt)/g,function(str){ + return utils.transUnitToPx(str) + }) + .split( /;\s*/g ); + + for ( var i = 0,v; v = s[i];i++ ) { + + var name, value, + parts = v.split( ":" ); + + if ( parts.length == 2 ) { + name = parts[0].toLowerCase(); + value = parts[1].toLowerCase(); + if(/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g,'').length == 0 + || + /^(margin)\w*/.test(name) && /^0\w+$/.test(value) + ){ + continue; + } + + switch ( name ) { + case "mso-padding-alt": + case "mso-padding-top-alt": + case "mso-padding-right-alt": + case "mso-padding-bottom-alt": + case "mso-padding-left-alt": + case "mso-margin-alt": + case "mso-margin-top-alt": + case "mso-margin-right-alt": + case "mso-margin-bottom-alt": + case "mso-margin-left-alt": + //ie下会出现挤到一起的情况 + //case "mso-table-layout-alt": + case "mso-height": + case "mso-width": + case "mso-vertical-align-alt": + //trace:1819 ff下会解析出padding在table上 + if(!/]/.test(html)) { + return UE.htmlparser(html).children[0] + } else { + return new uNode({ + type:'element', + children:[], + tagName:html + }) + } + }; + uNode.createText = function (data,noTrans) { + return new UE.uNode({ + type:'text', + 'data':noTrans ? data : utils.unhtml(data || '') + }) + }; + function nodeToHtml(node, arr, formatter, current) { + switch (node.type) { + case 'root': + for (var i = 0, ci; ci = node.children[i++];) { + //插入新行 + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current, true); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + break; + case 'text': + isText(node, arr); + break; + case 'element': + isElement(node, arr, formatter, current); + break; + case 'comment': + isComment(node, arr, formatter); + } + return arr; + } + + function isText(node, arr) { + if(node.parentNode.tagName == 'pre'){ + //源码模式下输入html标签,不能做转换处理,直接输出 + arr.push(node.data) + }else{ + arr.push(notTransTagName[node.parentNode.tagName] ? utils.html(node.data) : node.data.replace(/[ ]{2}/g,'  ')) + } + + } + + function isElement(node, arr, formatter, current) { + var attrhtml = ''; + if (node.attrs) { + attrhtml = []; + var attrs = node.attrs; + for (var a in attrs) { + //这里就针对 + //

      '

      + //这里边的\"做转换,要不用innerHTML直接被截断了,属性src + //有可能做的不够 + attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) { + return '"' + }) : utils.unhtml(attrs[a])) + '"' : '')) + } + attrhtml = attrhtml.join(' '); + } + arr.push('<' + node.tagName + + (attrhtml ? ' ' + attrhtml : '') + + (dtd.$empty[node.tagName] ? '\/' : '' ) + '>' + ); + //插入新行 + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + if(node.children && node.children.length){ + current = insertLine(arr, current, true); + insertIndent(arr, current) + } + + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + } + if (!dtd.$empty[node.tagName]) { + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + + if(node.children && node.children.length){ + current = insertLine(arr, current); + insertIndent(arr, current) + } + } + arr.push('<\/' + node.tagName + '>'); + } + + } + + function isComment(node, arr) { + arr.push(''); + } + + function getNodeById(root, id) { + var node; + if (root.type == 'element' && root.getAttr('id') == id) { + return root; + } + if (root.children && root.children.length) { + for (var i = 0, ci; ci = root.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + } + + function getNodesByTagName(node, tagName, arr) { + if (node.type == 'element' && node.tagName == tagName) { + arr.push(node); + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + } + function nodeTraversal(root,fn){ + if(root.children && root.children.length){ + for(var i= 0,ci;ci=root.children[i];){ + nodeTraversal(ci,fn); + //ci被替换的情况,这里就不再走 fn了 + if(ci.parentNode ){ + if(ci.children && ci.children.length){ + fn(ci) + } + if(ci.parentNode) i++ + } + } + }else{ + fn(root) + } + + } + uNode.prototype = { + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml(); + * ``` + */ + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @param { Boolean } formatter 是否格式化返回值 + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml( true ); + * ``` + */ + toHtml:function (formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join('') + }, + + /** + * 获取节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的html内容 + * @example + * ```javascript + * var htmlstr = node.innerHTML(); + * ``` + */ + + /** + * 设置节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } htmlstr 传入要设置的html内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerHTML('text'); + * ``` + */ + innerHTML:function (htmlstr) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (utils.isString(htmlstr)) { + if(this.children){ + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + var tmpRoot = UE.htmlparser(htmlstr); + for (var i = 0, ci; ci = tmpRoot.children[i++];) { + this.children.push(ci); + ci.parentNode = this; + } + return this; + } else { + var tmpRoot = new UE.uNode({ + type:'root', + children:this.children + }); + return tmpRoot.toHtml(); + } + }, + + /** + * 获取节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的存文本内容 + * @example + * ```javascript + * var textStr = node.innerText(); + * ``` + */ + + /** + * 设置节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } textStr 传入要设置的文本内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerText('text'); + * ``` + */ + innerText:function (textStr,noTrans) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (textStr) { + if(this.children){ + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + this.appendChild(uNode.createText(textStr,noTrans)); + return this; + } else { + return this.toHtml().replace(/<[^>]+>/g, ''); + } + }, + + /** + * 获取当前对象的data属性 + * @method getData + * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 + * @example + * ```javascript + * node.getData(); + * ``` + */ + getData:function () { + if (this.type == 'element') + return ''; + return this.data + }, + + /** + * 获取当前节点下的第一个子节点 + * @method firstChild + * @return { UE.uNode } 返回第一个子节点 + * @example + * ```javascript + * node.firstChild(); //返回第一个子节点 + * ``` + */ + firstChild:function () { +// if (this.type != 'element' || dtd.$empty[this.tagName]) { +// return this; +// } + return this.children ? this.children[0] : null; + }, + + /** + * 获取当前节点下的最后一个子节点 + * @method lastChild + * @return { UE.uNode } 返回最后一个子节点 + * @example + * ```javascript + * node.lastChild(); //返回最后一个子节点 + * ``` + */ + lastChild:function () { +// if (this.type != 'element' || dtd.$empty[this.tagName] ) { +// return this; +// } + return this.children ? this.children[this.children.length - 1] : null; + }, + + /** + * 获取和当前节点有相同父亲节点的前一个节点 + * @method previousSibling + * @return { UE.uNode } 返回前一个节点 + * @example + * ```javascript + * node.children[2].previousSibling(); //返回子节点node.children[1] + * ``` + */ + previousSibling : function(){ + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i]; i++) { + if (ci === this) { + return i == 0 ? null : parent.children[i-1]; + } + } + + }, + + /** + * 获取和当前节点有相同父亲节点的后一个节点 + * @method nextSibling + * @return { UE.uNode } 返回后一个节点,找不到返回null + * @example + * ```javascript + * node.children[2].nextSibling(); //如果有,返回子节点node.children[3] + * ``` + */ + nextSibling : function(){ + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i++];) { + if (ci === this) { + return parent.children[i]; + } + } + }, + + /** + * 用新的节点替换当前节点 + * @method replaceChild + * @param { UE.uNode } target 要替换成该节点参数 + * @param { UE.uNode } source 要被替换掉的节点 + * @return { UE.uNode } 返回替换之后的节点对象 + * @example + * ```javascript + * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点 + * ``` + */ + replaceChild:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 1, target); + source.parentNode = null; + target.parentNode = this; + return target; + } + } + } + }, + + /** + * 在节点的子节点列表最后位置插入一个节点 + * @method appendChild + * @param { UE.uNode } node 要插入的节点 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.appendChild( newNode ); //在node内插入子节点newNode + * ``` + */ + appendChild:function (node) { + if (this.type == 'root' || (this.type == 'element' && !dtd.$empty[this.tagName])) { + if (!this.children) { + this.children = [] + } + if(node.parentNode){ + node.parentNode.removeChild(node); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + break; + } + } + this.children.push(node); + node.parentNode = this; + return node; + } + + + }, + + /** + * 在传入节点的前面插入一个节点 + * @method insertBefore + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点前面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertBefore:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 0, target); + target.parentNode = this; + return target; + } + } + + } + }, + + /** + * 在传入节点的后面插入一个节点 + * @method insertAfter + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点后面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertAfter:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i + 1, 0, target); + target.parentNode = this; + return target; + } + + } + } + }, + + /** + * 从当前节点的子节点列表中,移除节点 + * @method removeChild + * @param { UE.uNode } node 要移除的节点引用 + * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 + * @return { * } 返回刚移除的子节点 + * @example + * ```javascript + * node.removeChild(childNode,true); //在node的子节点列表中移除child节点,并且吧child的子节点插入到移除的位置 + * ``` + */ + removeChild:function (node,keepChildren) { + if (this.children) { + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + ci.parentNode = null; + if(keepChildren && ci.children && ci.children.length){ + for(var j= 0,cj;cj=ci.children[j];j++){ + this.children.splice(i+j,0,cj); + cj.parentNode = this; + + } + } + return ci; + } + } + } + }, + + /** + * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 + * @method getAttr + * @param { String } attrName 要获取的属性名称 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.getAttr('title'); + * ``` + */ + getAttr:function (attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()] + }, + + /** + * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 + * @method setAttr + * @param { String } attrName 要设置的属性名称 + * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.setAttr('title','标题'); + * ``` + */ + setAttr:function (attrName, attrVal) { + if (!attrName) { + delete this.attrs; + return; + } + if(!this.attrs){ + this.attrs = {}; + } + if (utils.isObject(attrName)) { + for (var a in attrName) { + if (!attrName[a]) { + delete this.attrs[a] + } else { + this.attrs[a.toLowerCase()] = attrName[a]; + } + } + } else { + if (!attrVal) { + delete this.attrs[attrName] + } else { + this.attrs[attrName.toLowerCase()] = attrVal; + } + + } + }, + + /** + * 获取当前节点在父节点下的位置索引 + * @method getIndex + * @return { Number } 返回索引数值,如果没有父节点,返回-1 + * @example + * ```javascript + * node.getIndex(); + * ``` + */ + getIndex:function(){ + var parent = this.parentNode; + for(var i= 0,ci;ci=parent.children[i];i++){ + if(ci === this){ + return i; + } + } + return -1; + }, + + /** + * 在当前节点下,根据id查找节点 + * @method getNodeById + * @param { String } id 要查找的id + * @return { UE.uNode } 返回找到的节点 + * @example + * ```javascript + * node.getNodeById('textId'); + * ``` + */ + getNodeById:function (id) { + var node; + if (this.children && this.children.length) { + for (var i = 0, ci; ci = this.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + }, + + /** + * 在当前节点下,根据元素名称查找节点列表 + * @method getNodesByTagName + * @param { String } tagNames 要查找的元素名称 + * @return { Array } 返回找到的节点列表 + * @example + * ```javascript + * node.getNodesByTagName('span'); + * ``` + */ + getNodesByTagName:function (tagNames) { + tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, ' ').split(' '); + var arr = [], me = this; + utils.each(tagNames, function (tagName) { + if (me.children && me.children.length) { + for (var i = 0, ci; ci = me.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + }); + return arr; + }, + + /** + * 根据样式名称,获取节点的样式值 + * @method getStyle + * @param { String } name 要获取的样式名称 + * @return { String } 返回样式值 + * @example + * ```javascript + * node.getStyle('font-size'); + * ``` + */ + getStyle:function (name) { + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + return '' + } + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+)','i'); + var match = cssStyle.match(reg); + if (match && match[0]) { + return match[2] + } + return ''; + }, + + /** + * 给节点设置样式 + * @method setStyle + * @param { String } name 要设置的的样式名称 + * @param { String } val 要设置的的样值 + * @example + * ```javascript + * node.setStyle('font-size', '12px'); + * ``` + */ + setStyle:function (name, val) { + function exec(name, val) { + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+;?)', 'gi'); + cssStyle = cssStyle.replace(reg, '$1'); + if (val) { + cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle + } + + } + + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + cssStyle = ''; + } + if (utils.isObject(name)) { + for (var a in name) { + exec(a, name[a]) + } + } else { + exec(name, val) + } + this.setAttr('style', utils.trim(cssStyle)) + }, + + /** + * 传入一个函数,递归遍历当前节点下的所有节点 + * @method traversal + * @param { Function } fn 遍历到节点的时,传入节点作为参数,运行此函数 + * @example + * ```javascript + * traversal(node, function(){ + * console.log(node.type); + * }); + * ``` + */ + traversal:function(fn){ + if(this.children && this.children.length){ + nodeTraversal(this,fn); + } + return this; + } + } +})(); + + +// core/htmlparser.js +/** + * html字符串转换成uNode节点 + * @file + * @module UE + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * html字符串转换成uNode节点的静态方法 + * @method htmlparser + * @param { String } htmlstr 要转换的html代码 + * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 + * @return { uNode } 给定的html片段转换形成的uNode对象 + * @example + * ```javascript + * var root = UE.htmlparser('

      htmlparser

      ', true); + * ``` + */ + +var htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 ') + } + html.push('') + } + //禁止指定table-width + return '
      这样的标签了 + //先去掉了,加上的原因忘了,这里先记录 + var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, + re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; + + //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 + var allowEmptyTags = { + b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1, + sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1 + }; + htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), ''); + if(!ignoreBlank){ + htmlstr = htmlstr.replace(new RegExp('[\\r\\t\\n'+(ignoreBlank?'':' ')+']*<\/?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n'+(ignoreBlank?'':' ')+']*','g'), function(a,b){ + //br暂时单独处理 + if(b && allowEmptyTags[b.toLowerCase()]){ + return a.replace(/(^[\n\r]+)|([\n\r]+$)/g,''); + } + return a.replace(new RegExp('^[\\r\\n'+(ignoreBlank?'':' ')+']+'),'').replace(new RegExp('[\\r\\n'+(ignoreBlank?'':' ')+']+$'),''); + }); + } + + var notTransAttrs = { + 'href':1, + 'src':1 + }; + + var uNode = UE.uNode, + needParentNode = { + 'td':'tr', + 'tr':['tbody','thead','tfoot'], + 'tbody':'table', + 'th':'tr', + 'thead':'table', + 'tfoot':'table', + 'caption':'table', + 'li':['ul', 'ol'], + 'dt':'dl', + 'dd':'dl', + 'option':'select' + }, + needChild = { + 'ol':'li', + 'ul':'li' + }; + + function text(parent, data) { + + if(needChild[parent.tagName]){ + var tmpNode = uNode.createElement(needChild[parent.tagName]); + parent.appendChild(tmpNode); + tmpNode.appendChild(uNode.createText(data)); + parent = tmpNode; + }else{ + + parent.appendChild(uNode.createText(data)); + } + } + + function element(parent, tagName, htmlattr) { + var needParentTag; + if (needParentTag = needParentNode[tagName]) { + var tmpParent = parent,hasParent; + while(tmpParent.type != 'root'){ + if(utils.isArray(needParentTag) ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 : needParentTag == tmpParent.tagName){ + parent = tmpParent; + hasParent = true; + break; + } + tmpParent = tmpParent.parentNode; + } + if(!hasParent){ + parent = element(parent, utils.isArray(needParentTag) ? needParentTag[0] : needParentTag) + } + } + //按dtd处理嵌套 +// if(parent.type != 'root' && !dtd[parent.tagName][tagName]) +// parent = parent.parentNode; + var elm = new uNode({ + parentNode:parent, + type:'element', + tagName:tagName.toLowerCase(), + //是自闭合的处理一下 + children:dtd.$empty[tagName] ? null : [] + }); + //如果属性存在,处理属性 + if (htmlattr) { + var attrs = {}, match; + while (match = re_attr.exec(htmlattr)) { + attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] ? (match[2] || match[3] || match[4]) : utils.unhtml(match[2] || match[3] || match[4]) + } + elm.attrs = attrs; + } + //trace:3970 +// //如果parent下不能放elm +// if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ +// parent = parent.parentNode; +// elm.parentNode = parent; +// } + parent.children.push(elm); + //如果是自闭合节点返回父亲节点 + return dtd.$empty[tagName] ? parent : elm + } + + function comment(parent, data) { + parent.children.push(new uNode({ + type:'comment', + data:data, + parentNode:parent + })); + } + + var match, currentIndex = 0, nextIndex = 0; + //设置根节点 + var root = new uNode({ + type:'root', + children:[] + }); + var currentParent = root; + + while (match = re_tag.exec(htmlstr)) { + currentIndex = match.index; + try{ + if (currentIndex > nextIndex) { + //text node + text(currentParent, htmlstr.slice(nextIndex, currentIndex)); + } + if (match[3]) { + + if(dtd.$cdata[currentParent.tagName]){ + text(currentParent, match[0]); + }else{ + //start tag + currentParent = element(currentParent, match[3].toLowerCase(), match[4]); + } + + + } else if (match[1]) { + if(currentParent.type != 'root'){ + if(dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]){ + text(currentParent, match[0]); + }else{ + var tmpParent = currentParent; + while(currentParent.type == 'element' && currentParent.tagName != match[1].toLowerCase()){ + currentParent = currentParent.parentNode; + if(currentParent.type == 'root'){ + currentParent = tmpParent; + throw 'break' + } + } + //end tag + currentParent = currentParent.parentNode; + } + + } + + } else if (match[2]) { + //comment + comment(currentParent, match[2]) + } + }catch(e){} + + nextIndex = re_tag.lastIndex; + + } + //如果结束是文本,就有可能丢掉,所以这里手动判断一下 + //例如
    • sdfsdfsdf
    • sdfsdfsdfsdf + if (nextIndex < htmlstr.length) { + text(currentParent, htmlstr.slice(nextIndex)); + } + return root; +}; + + +// core/filternode.js +/** + * UE过滤节点的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + +/** + * 根据传入节点和过滤规则过滤相应节点 + * @module UE + * @since 1.2.6.1 + * @method filterNode + * @param { Object } root 指定root节点 + * @param { Object } rules 过滤规则json对象 + * @example + * ```javascript + * UE.filterNode(root,editor.options.filterRules); + * ``` + */ +var filterNode = UE.filterNode = function () { + function filterNode(node,rules){ + switch (node.type) { + case 'text': + break; + case 'element': + var val; + if(val = rules[node.tagName]){ + if(val === '-'){ + node.parentNode.removeChild(node) + }else if(utils.isFunction(val)){ + var parentNode = node.parentNode, + index = node.getIndex(); + val(node); + if(node.parentNode){ + if(node.children){ + for(var i = 0,ci;ci=node.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + }else{ + for(var i = index,ci;ci=parentNode.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + + + }else{ + var attrs = val['$']; + if(attrs && node.attrs){ + var tmpAttrs = {},tmpVal; + for(var a in attrs){ + tmpVal = node.getAttr(a); + //todo 只先对style单独处理 + if(a == 'style' && utils.isArray(attrs[a])){ + var tmpCssStyle = []; + utils.each(attrs[a],function(v){ + var tmp; + if(tmp = node.getStyle(v)){ + tmpCssStyle.push(v + ':' + tmp); + } + }); + tmpVal = tmpCssStyle.join(';') + } + if(tmpVal){ + tmpAttrs[a] = tmpVal; + } + + } + node.attrs = tmpAttrs; + } + if(node.children){ + for(var i = 0,ci;ci=node.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + } + }else{ + //如果不在名单里扣出子节点并删除该节点,cdata除外 + if(dtd.$cdata[node.tagName]){ + node.parentNode.removeChild(node) + }else{ + var parentNode = node.parentNode, + index = node.getIndex(); + node.parentNode.removeChild(node,true); + for(var i = index,ci;ci=parentNode.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + } + break; + case 'comment': + node.parentNode.removeChild(node) + } + + } + return function(root,rules){ + if(utils.isEmptyObject(rules)){ + return root; + } + var val; + if(val = rules['-']){ + utils.each(val.split(' '),function(k){ + rules[k] = '-' + }) + } + for(var i= 0,ci;ci=root.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + return root; + } +}(); + +// core/plugin.js +/** + * Created with JetBrains PhpStorm. + * User: campaign + * Date: 10/8/13 + * Time: 6:15 PM + * To change this template use File | Settings | File Templates. + */ +UE.plugin = function(){ + var _plugins = {}; + return { + register : function(pluginName,fn,oldOptionName,afterDisabled){ + if(oldOptionName && utils.isFunction(oldOptionName)){ + afterDisabled = oldOptionName; + oldOptionName = null + } + _plugins[pluginName] = { + optionName : oldOptionName || pluginName, + execFn : fn, + //当插件被禁用时执行 + afterDisabled : afterDisabled + } + }, + load : function(editor){ + utils.each(_plugins,function(plugin){ + var _export = plugin.execFn.call(editor); + if(editor.options[plugin.optionName] !== false){ + if(_export){ + //后边需要再做扩展 + utils.each(_export,function(v,k){ + switch(k.toLowerCase()){ + case 'shortcutkey': + editor.addshortcutkey(v); + break; + case 'bindevents': + utils.each(v,function(fn,eventName){ + editor.addListener(eventName,fn); + }); + break; + case 'bindmultievents': + utils.each(utils.isArray(v) ? v:[v],function(event){ + var types = utils.trim(event.type).split(/\s+/); + utils.each(types,function(eventName){ + editor.addListener(eventName, event.handler); + }); + }); + break; + case 'commands': + utils.each(v,function(execFn,execName){ + editor.commands[execName] = execFn + }); + break; + case 'outputrule': + editor.addOutputRule(v); + break; + case 'inputrule': + editor.addInputRule(v); + break; + case 'defaultoptions': + editor.setOpt(v) + } + }) + } + + }else if(plugin.afterDisabled){ + plugin.afterDisabled.call(editor) + } + + }); + //向下兼容 + utils.each(UE.plugins,function(plugin){ + plugin.call(editor); + }); + }, + run : function(pluginName,editor){ + var plugin = _plugins[pluginName]; + if(plugin){ + plugin.exeFn.call(editor) + } + } + } +}(); + +// core/keymap.js +var keymap = UE.keymap = { + 'Backspace' : 8, + 'Tab' : 9, + 'Enter' : 13, + + 'Shift':16, + 'Control':17, + 'Alt':18, + 'CapsLock':20, + + 'Esc':27, + + 'Spacebar':32, + + 'PageUp':33, + 'PageDown':34, + 'End':35, + 'Home':36, + + 'Left':37, + 'Up':38, + 'Right':39, + 'Down':40, + + 'Insert':45, + + 'Del':46, + + 'NumLock':144, + + 'Cmd':91, + + '=':187, + '-':189, + + "b":66, + 'i':73, + //回退 + 'z':90, + 'y':89, + //粘贴 + 'v' : 86, + 'x' : 88, + + 's' : 83, + + 'n' : 78 +}; + +// core/localstorage.js +//存储媒介封装 +var LocalStorage = UE.LocalStorage = (function () { + + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = 'localStorage'; + + return { + + saveLocalData: function (key, data) { + + if (storage && data) { + storage.setItem(key, data); + return true; + } + + return false; + + }, + + getLocalData: function (key) { + + if (storage) { + return storage.getItem(key); + } + + return null; + + }, + + removeItem: function (key) { + + storage && storage.removeItem(key); + + } + + }; + + function getUserData() { + + var container = document.createElement("div"); + container.style.display = "none"; + + if (!container.addBehavior) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + + getItem: function (key) { + + var result = null; + + try { + document.body.appendChild(container); + container.load(LOCAL_FILE); + result = container.getAttribute(key); + document.body.removeChild(container); + } catch (e) { + } + + return result; + + }, + + setItem: function (key, value) { + + document.body.appendChild(container); + container.setAttribute(key, value); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + }, + + //// 暂时没有用到 + //clear: function () { + // + // var expiresTime = new Date(); + // expiresTime.setFullYear(expiresTime.getFullYear() - 1); + // document.body.appendChild(container); + // container.expires = expiresTime.toUTCString(); + // container.save(LOCAL_FILE); + // document.body.removeChild(container); + // + //}, + + removeItem: function (key) { + + document.body.appendChild(container); + container.removeAttribute(key); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + } + + }; + + } + +})(); + +(function () { + + var ROOTKEY = 'ueditor_preference'; + + UE.Editor.prototype.setPreferences = function(key,value){ + var obj = {}; + if (utils.isString(key)) { + obj[ key ] = value; + } else { + obj = key; + } + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + utils.extend(data, obj); + } else { + data = obj; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + UE.Editor.prototype.getPreferences = function(key){ + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + return key ? data[key] : data + } + return null; + }; + + UE.Editor.prototype.removePreferences = function (key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + data[key] = undefined; + delete data[key] + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + +})(); + + +// plugins/defaultfilter.js +///import core +///plugin 编辑器默认的过滤转换机制 + +UE.plugins['defaultfilter'] = function () { + var me = this; + me.setOpt({ + 'allowDivTransToP':true, + 'disabledTableInTable':true + }); + //默认的过滤处理 + //进入编辑器的内容处理 + me.addInputRule(function (root) { + var allowDivTransToP = this.options.allowDivTransToP; + var val; + function tdParent(node){ + while(node && node.type == 'element'){ + if(node.tagName == 'td'){ + return true; + } + node = node.parentNode; + } + return false; + } + //进行默认的处理 + root.traversal(function (node) { + if (node.type == 'element') { + if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'style': + case 'script': + node.setAttr({ + cdata_tag: node.tagName, + cdata_data: (node.innerHTML() || ''), + '_ue_custom_node_':'true' + }); + node.tagName = 'div'; + node.innerHTML(''); + break; + case 'a': + if (val = node.getAttr('href')) { + node.setAttr('_href', val) + } + break; + case 'img': + //todo base64暂时去掉,后边做远程图片上传后,干掉这个 + if (val = node.getAttr('src')) { + if (/^data:/.test(val)) { + node.parentNode.removeChild(node); + break; + } + } + node.setAttr('_src', node.getAttr('src')); + break; + case 'span': + if (browser.webkit && (val = node.getStyle('white-space'))) { + if (/nowrap|normal/.test(val)) { + node.setStyle('white-space', ''); + if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) { + node.parentNode.removeChild(node, true) + } + } + } + val = node.getAttr('id'); + if(val && /^_baidu_bookmark_/i.test(val)){ + node.parentNode.removeChild(node) + } + break; + case 'p': + if (val = node.getAttr('align')) { + node.setAttr('align'); + node.setStyle('text-align', val) + } + //trace:3431 +// var cssStyle = node.getAttr('style'); +// if (cssStyle) { +// cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); +// node.setAttr('style', cssStyle) +// +// } + //p标签不允许嵌套 + utils.each(node.children,function(n){ + if(n.type == 'element' && n.tagName == 'p'){ + var next = n.nextSibling(); + node.parentNode.insertAfter(n,node); + var last = n; + while(next){ + var tmp = next.nextSibling(); + node.parentNode.insertAfter(next,last); + last = next; + next = tmp; + } + return false; + } + }); + if (!node.firstChild()) { + node.innerHTML(browser.ie ? ' ' : '
      ') + } + break; + case 'div': + if(node.getAttr('cdata_tag')){ + break; + } + //针对代码这里不处理插入代码的div + val = node.getAttr('class'); + if(val && /^line number\d+/.test(val)){ + break; + } + if(!allowDivTransToP){ + break; + } + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + break; + case 'dl': + node.tagName = 'ul'; + break; + case 'dt': + case 'dd': + node.tagName = 'li'; + break; + case 'li': + var className = node.getAttr('class'); + if (!className || !/list\-/.test(className)) { + node.setAttr() + } + var tmpNodes = node.getNodesByTagName('ol ul'); + UE.utils.each(tmpNodes, function (n) { + node.parentNode.insertAfter(n, node); + }); + break; + case 'td': + case 'th': + case 'caption': + if(!node.children || !node.children.length){ + node.appendChild(browser.ie11below ? UE.uNode.createText(' ') : UE.uNode.createElement('br')) + } + break; + case 'table': + if(me.options.disabledTableInTable && tdParent(node)){ + node.parentNode.insertBefore(UE.uNode.createText(node.innerText()),node); + node.parentNode.removeChild(node) + } + } + + } +// if(node.type == 'comment'){ +// node.parentNode.removeChild(node); +// } + }) + + }); + + //从编辑器出去的内容处理 + me.addOutputRule(function (root) { + + var val; + root.traversal(function (node) { + if (node.type == 'element') { + + if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'div': + if (val = node.getAttr('cdata_tag')) { + node.tagName = val; + node.appendChild(UE.uNode.createText(node.getAttr('cdata_data'))); + node.setAttr({cdata_tag: '', cdata_data: '','_ue_custom_node_':''}); + } + break; + case 'a': + if (val = node.getAttr('_href')) { + node.setAttr({ + 'href': utils.html(val), + '_href': '' + }) + } + break; + break; + case 'span': + val = node.getAttr('id'); + if(val && /^_baidu_bookmark_/i.test(val)){ + node.parentNode.removeChild(node) + } + break; + case 'img': + if (val = node.getAttr('_src')) { + node.setAttr({ + 'src': node.getAttr('_src'), + '_src': '' + }) + } + + + } + } + + }) + + + }); +}; + + +// plugins/inserthtml.js +/** + * 插入html字符串插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入html代码 + * @command inserthtml + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } html 插入的html字符串 + * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 + * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 + * @example + * ```javascript + * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 + * //执行命令,插入CC + * //插入后的效果 xxxCCxxx + * //

      xx|xxx

      当前选区为闭合状态 + * //插入

      CC

      + * //结果

      xx

      CC

      xxx

      + * //

      xxxx

      |

      xxx

      当前选区在两个p标签之间 + * //插入 xxxx + * //结果

      xxxx

      xxxx

      xxx

      + * ``` + */ + +UE.commands['inserthtml'] = { + execCommand: function (command,html,notNeedFilter){ + var me = this, + range, + div; + if(!html){ + return; + } + if(me.fireEvent('beforeinserthtml',html) === true){ + return; + } + range = me.selection.getRange(); + div = range.document.createElement( 'div' ); + div.style.display = 'inline'; + + if (!notNeedFilter) { + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if(me.options.filterRules){ + UE.filterNode(root,me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + html = root.toHtml() + } + div.innerHTML = utils.trim( html ); + + if ( !range.collapsed ) { + var tmpNode = range.startContainer; + if(domUtils.isFillChar(tmpNode)){ + range.setStartBefore(tmpNode) + } + tmpNode = range.endContainer; + if(domUtils.isFillChar(tmpNode)){ + range.setEndAfter(tmpNode) + } + range.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
      + if(range.endContainer && range.endContainer.nodeType == 1){ + tmpNode = range.endContainer.childNodes[range.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + range.setEndAfter(tmpNode); + } + } + if(range.startOffset == 0){ + tmpNode = range.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = range.endContainer; + if(range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.body.innerHTML = '

      '+(browser.ie ? '' : '
      ')+'

      '; + range.setStart(me.body.firstChild,0).collapse(true) + + } + } + } + !range.collapsed && range.deleteContents(); + if(range.startContainer.nodeType == 1){ + var child = range.startContainer.childNodes[range.startOffset],pre; + if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){ + range.setEnd(pre,pre.childNodes.length).collapse(); + while(child.firstChild){ + pre.appendChild(child.firstChild); + } + domUtils.remove(child); + } + } + + } + + + var child,parent,pre,tmp,hadBreak = 0, nextNode; + //如果当前位置选中了fillchar要干掉,要不会产生空行 + if(range.inFillChar()){ + child = range.startContainer; + if(domUtils.isFillChar(child)){ + range.setStartBefore(child).collapse(true); + domUtils.remove(child); + }else if(domUtils.isFillChar(child,true)){ + child.nodeValue = child.nodeValue.replace(fillCharReg,''); + range.startOffset--; + range.collapsed && range.collapse(true) + } + } + //列表单独处理 + var li = domUtils.findParentByTagName(range.startContainer,'li',true); + if(li){ + var next,last; + while(child = div.firstChild){ + //针对hr单独处理一下先 + while(child && (child.nodeType == 3 || !domUtils.isBlockElm(child) || child.tagName=='HR' )){ + next = child.nextSibling; + range.insertNode( child).collapse(); + last = child; + child = next; + + } + if(child){ + if(/^(ol|ul)$/i.test(child.tagName)){ + while(child.firstChild){ + last = child.firstChild; + domUtils.insertAfter(li,child.firstChild); + li = li.nextSibling; + } + domUtils.remove(child) + }else{ + var tmpLi; + next = child.nextSibling; + tmpLi = me.document.createElement('li'); + domUtils.insertAfter(li,tmpLi); + tmpLi.appendChild(child); + last = child; + child = next; + li = tmpLi; + } + } + } + li = domUtils.findParentByTagName(range.startContainer,'li',true); + if(domUtils.isEmptyBlock(li)){ + domUtils.remove(li) + } + if(last){ + + range.setStartAfter(last).collapse(true).select(true) + } + }else{ + while ( child = div.firstChild ) { + if(hadBreak){ + var p = me.document.createElement('p'); + while(child && (child.nodeType == 3 || !dtd.$block[child.tagName])){ + nextNode = child.nextSibling; + p.appendChild(child); + child = nextNode; + } + if(p.firstChild){ + + child = p + } + } + range.insertNode( child ); + nextNode = child.nextSibling; + if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){ + + parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } ); + if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){ + if(!dtd[parent.tagName][child.nodeName]){ + pre = parent; + }else{ + tmp = child.parentNode; + while (tmp !== parent){ + pre = tmp; + tmp = tmp.parentNode; + + } + } + + + domUtils.breakParent( child, pre || tmp ); + //去掉break后前一个多余的节点

      |<[p> ==>

      |

      + var pre = child.previousSibling; + domUtils.trimWhiteTextNode(pre); + if(!pre.childNodes.length){ + domUtils.remove(pre); + } + //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 + + if(!browser.ie && + (next = child.nextSibling) && + domUtils.isBlockElm(next) && + next.lastChild && + !domUtils.isBr(next.lastChild)){ + next.appendChild(me.document.createElement('br')); + } + hadBreak = 1; + } + } + var next = child.nextSibling; + if(!div.firstChild && next && domUtils.isBlockElm(next)){ + + range.setStart(next,0).collapse(true); + break; + } + range.setEndAfter( child ).collapse(); + + } + + child = range.startContainer; + + if(nextNode && domUtils.isBr(nextNode)){ + domUtils.remove(nextNode) + } + //用chrome可能有空白展位符 + if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){ + if(nextNode = child.nextSibling){ + domUtils.remove(child); + if(nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]){ + + range.setStart(nextNode,0).collapse(true).shrinkBoundary() + } + }else{ + + try{ + child.innerHTML = browser.ie ? domUtils.fillChar : '
      '; + }catch(e){ + range.setStartBefore(child); + domUtils.remove(child) + } + + } + + } + //加上true因为在删除表情等时会删两次,第一次是删的fillData + try{ + range.select(true); + }catch(e){} + + } + + + + setTimeout(function(){ + range = me.selection.getRange(); + range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0); + me.fireEvent('afterinserthtml', html); + },200); + } +}; + + +// plugins/autotypeset.js +/** + * 自动排版 + * @file + * @since 1.2.6.1 + */ + +/** + * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 + * @command autotypeset + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autotypeset' ); + * ``` + */ + +UE.plugins['autotypeset'] = function(){ + + this.setOpt({'autotypeset': { + mergeEmptyline: true, //合并空行 + removeClass: true, //去掉冗余的class + removeEmptyline: false, //去掉空行 + textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + removeEmptyNode: false, // 去掉空节点 + //可以去掉的标签 + removeTagNames: utils.extend({div:1},dtd.$removeEmpty), + indent: false, // 行首缩进 + indentValue : '2em', //行首缩进的大小 + bdc2sb: false, + tobdc: false + }}); + + var me = this, + opt = me.options.autotypeset, + remainClass = { + 'selectTdClass':1, + 'pagebreak':1, + 'anchorclass':1 + }, + remainTag = { + 'li':1 + }, + tags = { + div:1, + p:1, + //trace:2183 这些也认为是行 + blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1, + span:1 + }, + highlightCont; + //升级了版本,但配置项目里没有autotypeset + if(!opt){ + return; + } + + readLocalOpts(); + + function isLine(node,notEmpty){ + if(!node || node.nodeType == 3) + return 0; + if(domUtils.isBr(node)) + return 1; + if(node && node.parentNode && tags[node.tagName.toLowerCase()]){ + if(highlightCont && highlightCont.contains(node) + || + node.getAttribute('pagebreak') + ){ + return 0; + } + + return notEmpty ? !domUtils.isEmptyBlock(node) : domUtils.isEmptyBlock(node,new RegExp('[\\s'+domUtils.fillChar + +']','g')); + } + } + + function removeNotAttributeSpan(node){ + if(!node.style.cssText){ + domUtils.removeAttributes(node,['style']); + if(node.tagName.toLowerCase() == 'span' && domUtils.hasNoAttributes(node)){ + domUtils.remove(node,true); + } + } + } + function autotype(type,html){ + + var me = this,cont; + if(html){ + if(!opt.pasteFilter){ + return; + } + cont = me.document.createElement('div'); + cont.innerHTML = html.html; + }else{ + cont = me.document.body; + } + var nodes = domUtils.getElementsByTagName(cont,'*'); + + // 行首缩进,段落方向,段间距,段内间距 + for(var i=0,ci;ci=nodes[i++];){ + + if(me.fireEvent('excludeNodeinautotype',ci) === true){ + continue; + } + //font-size + if(opt.clearFontSize && ci.style.fontSize){ + domUtils.removeStyle(ci,'font-size'); + + removeNotAttributeSpan(ci); + + } + //font-family + if(opt.clearFontFamily && ci.style.fontFamily){ + domUtils.removeStyle(ci,'font-family'); + removeNotAttributeSpan(ci); + } + + if(isLine(ci)){ + //合并空行 + if(opt.mergeEmptyline ){ + var next = ci.nextSibling,tmpNode,isBr = domUtils.isBr(ci); + while(isLine(next)){ + tmpNode = next; + next = tmpNode.nextSibling; + if(isBr && (!next || next && !domUtils.isBr(next))){ + break; + } + domUtils.remove(tmpNode); + } + + } + //去掉空行,保留占位的空行 + if(opt.removeEmptyline && domUtils.inDoc(ci,cont) && !remainTag[ci.parentNode.tagName.toLowerCase()] ){ + if(domUtils.isBr(ci)){ + next = ci.nextSibling; + if(next && !domUtils.isBr(next)){ + continue; + } + } + domUtils.remove(ci); + continue; + + } + + } + if(isLine(ci,true) && ci.tagName != 'SPAN'){ + if(opt.indent){ + ci.style.textIndent = opt.indentValue; + } + if(opt.textAlign){ + ci.style.textAlign = opt.textAlign; + } + // if(opt.lineHeight) + // ci.style.lineHeight = opt.lineHeight + 'cm'; + + } + + //去掉class,保留的class不去掉 + if(opt.removeClass && ci.className && !remainClass[ci.className.toLowerCase()]){ + + if(highlightCont && highlightCont.contains(ci)){ + continue; + } + domUtils.removeAttributes(ci,['class']); + } + + //表情不处理 + if(opt.imageBlockLine && ci.tagName.toLowerCase() == 'img' && !ci.getAttribute('emotion')){ + if(html){ + var img = ci; + switch (opt.imageBlockLine){ + case 'left': + case 'right': + case 'none': + var pN = img.parentNode,tmpNode,pre,next; + while(dtd.$inline[pN.tagName] || pN.tagName == 'A'){ + pN = pN.parentNode; + } + tmpNode = pN; + if(tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode,'text-align') == 'center'){ + if(!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1){ + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if(pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)){ + pre.appendChild(tmpNode.firstChild); + while(next.firstChild){ + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + }else{ + domUtils.setStyle(tmpNode,'text-align',''); + } + + + } + + + } + domUtils.setStyle(img,'float', opt.imageBlockLine); + break; + case 'center': + if(me.queryCommandValue('imagefloat') != 'center'){ + pN = img.parentNode; + domUtils.setStyle(img,'float','none'); + tmpNode = img; + while(pN && domUtils.getChildCount(pN,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')){ + tmpNode = pN; + pN = pN.parentNode; + } + var pNode = me.document.createElement('p'); + domUtils.setAttributes(pNode,{ + + style:'text-align:center' + }); + tmpNode.parentNode.insertBefore(pNode,tmpNode); + pNode.appendChild(tmpNode); + domUtils.setStyle(tmpNode,'float',''); + + } + + + } + } else { + var range = me.selection.getRange(); + range.selectNode(ci).select(); + me.execCommand('imagefloat', opt.imageBlockLine); + } + + } + + //去掉冗余的标签 + if(opt.removeEmptyNode){ + if(opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci)){ + domUtils.remove(ci); + } + } + } + if(opt.tobdc){ + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function(node){ + if(node.type == 'text'){ + node.data = ToDBC(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if(opt.bdc2sb){ + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function(node){ + if(node.type == 'text'){ + node.data = DBC2SB(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if(html){ + html.html = cont.innerHTML; + } + } + if(opt.pasteFilter){ + me.addListener('beforepaste',autotype); + } + + function DBC2SB(str) { + var result = ''; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); //获取当前字符的unicode编码 + if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符 + { + result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 + } else if (code == 12288)//空格 + { + result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); + } else { + result += str.charAt(i); + } + } + return result; + } + function ToDBC(txtstring) { + txtstring = utils.html(txtstring); + var tmp = ""; + var mark = "";/*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ + for (var i = 0; i < txtstring.length; i++) { + if (txtstring.charCodeAt(i) == 32) { + tmp = tmp + String.fromCharCode(12288); + } + else if (txtstring.charCodeAt(i) < 127) { + tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); + } + else { + tmp += txtstring.charAt(i); + } + } + return tmp; + } + + function readLocalOpts() { + var cookieOpt = me.getPreferences('autotypeset'); + utils.extend(me.options.autotypeset, cookieOpt); + } + + me.commands['autotypeset'] = { + execCommand:function () { + me.removeListener('beforepaste',autotype); + if(opt.pasteFilter){ + me.addListener('beforepaste',autotype); + } + autotype.call(me) + } + + }; + +}; + + + +// plugins/autosubmit.js +/** + * 快捷键提交 + * @file + * @since 1.2.6.1 + */ + +/** + * 提交表单 + * @command autosubmit + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autosubmit' ); + * ``` + */ + +UE.plugin.register('autosubmit',function(){ + return { + shortcutkey:{ + "autosubmit":"ctrl+13" //手动提交 + }, + commands:{ + 'autosubmit':{ + execCommand:function () { + var me=this, + form = domUtils.findParentByTagName(me.iframe,"form", false); + if (form){ + if(me.fireEvent("beforesubmit")===false){ + return; + } + me.sync(); + form.submit(); + } + } + } + } + } +}); + +// plugins/background.js +/** + * 背景插件,为UEditor提供设置背景功能 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('background', function () { + var me = this, + cssRuleId = 'editor_background', + isSetColored, + reg = new RegExp('body[\\s]*\\{(.+)\\}', 'i'); + + function stringToObj(str) { + var obj = {}, styles = str.split(';'); + utils.each(styles, function (v) { + var index = v.indexOf(':'), + key = utils.trim(v.substr(0, index)).toLowerCase(); + key && (obj[key] = utils.trim(v.substr(index + 1) || '')); + }); + return obj; + } + + function setBackground(obj) { + if (obj) { + var styles = []; + for (var name in obj) { + if (obj.hasOwnProperty(name)) { + styles.push(name + ":" + obj[name] + '; '); + } + } + utils.cssRule(cssRuleId, styles.length ? ('body{' + styles.join("") + '}') : '', me.document); + } else { + utils.cssRule(cssRuleId, '', me.document) + } + } + //重写editor.hasContent方法 + + var orgFn = me.hasContents; + me.hasContents = function(){ + if(me.queryCommandValue('background')){ + return true + } + return orgFn.apply(me,arguments); + }; + return { + bindEvents: { + 'getAllHtml': function (type, headHtml) { + var body = this.body, + su = domUtils.getComputedStyle(body, "background-image"), + url = ""; + if (su.indexOf(me.options.imagePath) > 0) { + url = su.substring(su.indexOf(me.options.imagePath), su.length - 1).replace(/"|\(|\)/ig, ""); + } else { + url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : ""; + } + var html = ' '; + headHtml.push(html); + }, + 'aftersetcontent': function () { + if(isSetColored == false) setBackground(); + } + }, + inputRule: function (root) { + isSetColored = false; + utils.each(root.getNodesByTagName('p'), function (p) { + var styles = p.getAttr('data-background'); + if (styles) { + isSetColored = true; + setBackground(stringToObj(styles)); + p.parentNode.removeChild(p); + } + }) + }, + outputRule: function (root) { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + if (styles) { + root.appendChild(UE.uNode.createElement('


      ')); + } + }, + commands: { + 'background': { + execCommand: function (cmd, obj) { + setBackground(obj); + }, + queryCommandValue: function () { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + return styles ? stringToObj(styles[1]) : null; + }, + notNeedUndo: true + } + } + } +}); + +// plugins/image.js +/** + * 图片插入、排版插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 图片对齐方式 + * @command imagefloat + * @method execCommand + * @remind 值center为独占一行居中 + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式,可传left、right、none、center + * @remaind center表示图片独占一行 + * @example + * ```javascript + * editor.execCommand( 'imagefloat', 'center' ); + * ``` + */ + +/** + * 如果选区所在位置是图片区域 + * @command imagefloat + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回图片对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'imagefloat' ); + * ``` + */ + +UE.commands['imagefloat'] = { + execCommand:function (cmd, align) { + var me = this, + range = me.selection.getRange(); + if (!range.collapsed) { + var img = range.getClosedNode(); + if (img && img.tagName == 'IMG') { + switch (align) { + case 'left': + case 'right': + case 'none': + var pN = img.parentNode, tmpNode, pre, next; + while (dtd.$inline[pN.tagName] || pN.tagName == 'A') { + pN = pN.parentNode; + } + tmpNode = pN; + if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') { + if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, 'text-align', ''); + } + + + } + + range.selectNode(img).select(); + } + domUtils.setStyle(img, 'float', align == 'none' ? '' : align); + if(align == 'none'){ + domUtils.removeAttributes(img,'align'); + } + + break; + case 'center': + if (me.queryCommandValue('imagefloat') != 'center') { + pN = img.parentNode; + domUtils.setStyle(img, 'float', ''); + domUtils.removeAttributes(img,'align'); + tmpNode = img; + while (pN && domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { + tmpNode = pN; + pN = pN.parentNode; + } + range.setStartBefore(tmpNode).setCursor(false); + pN = me.document.createElement('div'); + pN.appendChild(tmpNode); + domUtils.setStyle(tmpNode, 'float', ''); + + me.execCommand('insertHtml', '

      ' + pN.innerHTML + '

      '); + + tmpNode = me.document.getElementById('_img_parent_tmp'); + tmpNode.removeAttribute('id'); + tmpNode = tmpNode.firstChild; + range.selectNode(tmpNode).select(); + //去掉后边多余的元素 + next = tmpNode.parentNode.nextSibling; + if (next && domUtils.isEmptyNode(next)) { + domUtils.remove(next); + } + + } + + break; + } + + } + } + }, + queryCommandValue:function () { + var range = this.selection.getRange(), + startNode, floatStyle; + if (range.collapsed) { + return 'none'; + } + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align'); + + if (floatStyle == 'none') { + floatStyle = domUtils.getComputedStyle(startNode.parentNode, 'text-align') == 'center' ? 'center' : floatStyle; + } + return { + left:1, + right:1, + center:1 + }[floatStyle] ? floatStyle : 'none'; + } + return 'none'; + + + }, + queryCommandState:function () { + var range = this.selection.getRange(), + startNode; + + if (range.collapsed) return -1; + + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + return 0; + } + return -1; + } +}; + + +/** + * 插入图片 + * @command insertimage + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 + * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, + * 此时数组的每一个元素都是一个Object类型的图片属性集合。 + * @example + * ```javascript + * editor.execCommand( 'insertimage', { + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * } ); + * ``` + * @example + * ```javascript + * editor.execCommand( 'insertimage', [{ + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * },{ + * src:'a/b/d.jpg', + * width:'100', + * height:'100' + * }] ); + * ``` + */ + +UE.commands['insertimage'] = { + execCommand:function (cmd, opt) { + + opt = utils.isArray(opt) ? opt : [opt]; + if (!opt.length) { + return; + } + var me = this, + range = me.selection.getRange(), + img = range.getClosedNode(); + + if(me.fireEvent('beforeinsertimage', opt) === true){ + return; + } + + function unhtmlData(imgCi) { + + utils.each('width,height,border,hspace,vspace'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = parseInt(imgCi[item], 10) || 0; + } + }); + + utils.each('src,_src'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtmlForUrl(imgCi[item]); + } + }); + utils.each('title,alt'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtml(imgCi[item]); + } + }); + } + + if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1) && !img.getAttribute("word_img")) { + var first = opt.shift(); + var floatStyle = first['floatStyle']; + delete first['floatStyle']; +//// img.style.border = (first.border||0) +"px solid #000"; +//// img.style.margin = (first.margin||0) +"px"; +// img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; + domUtils.setAttributes(img, first); + me.execCommand('imagefloat', floatStyle); + if (opt.length > 0) { + range.setStartAfter(img).setCursor(false, true); + me.execCommand('insertimage', opt); + } + + } else { + var html = [], str = '', ci; + ci = opt[0]; + if (opt.length == 1) { + unhtmlData(ci); + + str = '' + ci.alt + ''; + if (ci['floatStyle'] == 'center') { + str = '

      ' + str + '

      '; + } + html.push(str); + + } else { + for (var i = 0; ci = opt[i++];) { + unhtmlData(ci); + str = '

      '; + html.push(str); + } + } + + me.execCommand('insertHtml', html.join('')); + } + + me.fireEvent('afterinsertimage', opt) + } +}; + + +// plugins/justify.js +/** + * 段落格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落对齐方式 + * @command justify + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 + * @example + * ```javascript + * editor.execCommand( 'justify', 'center' ); + * ``` + */ +/** + * 如果选区所在位置是段落区域,返回当前段落对齐方式 + * @command justify + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回段落对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'justify' ); + * ``` + */ + +UE.plugins['justify']=function(){ + var me=this, + block = domUtils.isBlockElm, + defaultValue = { + left:1, + right:1, + center:1, + justify:1 + }, + doJustify = function (range, style) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + domUtils.setStyles(common, utils.isString(style) ? {'text-align':style} : style); + current = common; + } else { + var p = range.document.createElement('p'); + domUtils.setStyles(p, utils.isString(style) ? {'text-align':style} : style); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + UE.commands['justify'] = { + execCommand:function (cmdName, align) { + var range = this.selection.getRange(), + txt; + + //闭合时单独处理 + if (range.collapsed) { + txt = this.document.createTextNode('p'); + range.insertNode(txt); + } + doJustify(range, align); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + + + return true; + }, + queryCommandValue:function () { + var startNode = this.selection.getStart(), + value = domUtils.getComputedStyle(startNode, 'text-align'); + return defaultValue[value] ? value : 'left'; + }, + queryCommandState:function () { + var start = this.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th","caption"], true); + + return cell? -1:0; + } + + }; +}; + + +// plugins/font.js +/** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @file + * @since 1.2.6.1 + */ + +/** + * 字体颜色 + * @command forecolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'forecolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command forecolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'forecolor' ); + * ``` + */ + +/** + * 字体背景颜色 + * @command backcolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'backcolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command backcolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体背景颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'backcolor' ); + * ``` + */ + +/** + * 字体大小 + * @command fontsize + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体大小 + * @example + * ```javascript + * editor.execCommand( 'fontsize', '14px' ); + * ``` + */ +/** + * 返回选区字体大小 + * @command fontsize + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体大小 + * @example + * ```javascript + * editor.queryCommandValue( 'fontsize' ); + * ``` + */ + +/** + * 字体样式 + * @command fontfamily + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体样式 + * @example + * ```javascript + * editor.execCommand( 'fontfamily', '微软雅黑' ); + * ``` + */ +/** + * 返回选区字体样式 + * @command fontfamily + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体样式 + * @example + * ```javascript + * editor.queryCommandValue( 'fontfamily' ); + * ``` + */ + +/** + * 字体下划线,与删除线互斥 + * @command underline + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'underline' ); + * ``` + */ + +/** + * 字体删除线,与下划线互斥 + * @command strikethrough + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'strikethrough' ); + * ``` + */ + +/** + * 字体边框 + * @command fontborder + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'fontborder' ); + * ``` + */ + +UE.plugins['font'] = function () { + var me = this, + fonts = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family', + 'underline': 'text-decoration', + 'strikethrough': 'text-decoration', + 'fontborder': 'border' + }, + needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1}, + needSetChild = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family' + + }; + me.setOpt({ + 'fontfamily': [ + { name: 'songti', val: '宋体,SimSun'}, + { name: 'yahei', val: '微软雅黑,Microsoft YaHei'}, + { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'}, + { name: 'heiti', val: '黑体, SimHei'}, + { name: 'lishu', val: '隶书, SimLi'}, + { name: 'andaleMono', val: 'andale mono'}, + { name: 'arial', val: 'arial, helvetica,sans-serif'}, + { name: 'arialBlack', val: 'arial black,avant garde'}, + { name: 'comicSansMs', val: 'comic sans ms'}, + { name: 'impact', val: 'impact,chicago'}, + { name: 'timesNewRoman', val: 'times new roman'} + ], + 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36] + }); + + function mergeWithParent(node){ + var parent; + while(parent = node.parentNode){ + if(parent.tagName == 'SPAN' && domUtils.getChildCount(parent,function(child){ + return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child) + }) == 1) { + parent.style.cssText += node.style.cssText; + domUtils.remove(node,true); + node = parent; + + }else{ + break; + } + } + + } + function mergeChild(rng,cmdName,value){ + if(needSetChild[cmdName]){ + rng.adjustmentBoundary(); + if(!rng.collapsed && rng.startContainer.nodeType == 1){ + var start = rng.startContainer.childNodes[rng.startOffset]; + if(start && domUtils.isTagNode(start,'span')){ + var bk = rng.createBookmark(); + utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){ + return; + } + domUtils.removeStyle(span,needSetChild[cmdName]); + if(span.style.cssText.replace(/^\s+$/,'').length == 0){ + domUtils.remove(span,true) + } + }); + rng.moveToBookmark(bk) + } + } + } + + } + function mergesibling(rng,cmdName,value) { + var collapsed = rng.collapsed, + bk = rng.createBookmark(), common; + if (collapsed) { + common = bk.start.parentNode; + while (dtd.$inline[common.tagName]) { + common = common.parentNode; + } + } else { + common = domUtils.getCommonAncestor(bk.start, bk.end); + } + utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { + if(/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)){ + domUtils.remove(span, true); + }else{ + domUtils.removeStyle(span,'border'); + } + return + } + if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) { + span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, ''); + } + if(!(cmdName=='fontborder' && value=='none')){ + var next = span.nextSibling; + while (next && next.nodeType == 1 && next.tagName == 'SPAN' ) { + if(domUtils.isBookmarkNode(next) && cmdName == 'fontborder') { + span.appendChild(next); + next = span.nextSibling; + continue; + } + if (next.style.cssText == span.style.cssText) { + domUtils.moveChild(next, span); + domUtils.remove(next); + } + if (span.nextSibling === next) + break; + next = span.nextSibling; + } + } + + + mergeWithParent(span); + if(browser.ie && browser.version > 8 ){ + //拷贝父亲们的特别的属性,这里只做背景颜色的处理 + var parent = domUtils.findParent(span,function(n){return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)}); + if(parent && !/background-color/.test(span.style.cssText)){ + span.style.backgroundColor = parent.style.backgroundColor; + } + } + + }); + rng.moveToBookmark(bk); + mergeChild(rng,cmdName,value) + } + + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('u s del font strike'), function (node) { + if (node.tagName == 'font') { + var cssStyle = []; + for (var p in node.attrs) { + switch (p) { + case 'size': + cssStyle.push('font-size:' + + ({ + '1':'10', + '2':'12', + '3':'16', + '4':'18', + '5':'24', + '6':'32', + '7':'48' + }[node.attrs[p]] || node.attrs[p]) + 'px'); + break; + case 'color': + cssStyle.push('color:' + node.attrs[p]); + break; + case 'face': + cssStyle.push('font-family:' + node.attrs[p]); + break; + case 'style': + cssStyle.push(node.attrs[p]); + } + } + node.attrs = { + 'style': cssStyle.join(';') + }; + } else { + var val = node.tagName == 'u' ? 'underline' : 'line-through'; + node.attrs = { + 'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';' + } + } + node.tagName = 'span'; + }); +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getAttr('class')){ +// if(/fontstrikethrough/.test(val)){ +// node.setStyle('text-decoration','line-through'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); +// }else{ +// node.setAttr('class') +// } +// } +// if(/fontborder/.test(val)){ +// node.setStyle('border','1px solid #000'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); +// }else{ +// node.setAttr('class') +// } +// } +// } +// }); + }); +// me.addOutputRule(function(root){ +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getStyle('text-decoration')){ +// if(/line-through/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontstrikethrough'; +// }else{ +// node.setAttr('class','fontstrikethrough') +// } +// } +// +// node.setStyle('text-decoration') +// } +// if(val = node.getStyle('border')){ +// if(/1px/.test(val) && /solid/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontborder'; +// +// }else{ +// node.setAttr('class','fontborder') +// } +// } +// node.setStyle('border') +// +// } +// }); +// }); + for (var p in fonts) { + (function (cmd, style) { + UE.commands[cmd] = { + execCommand: function (cmdName, value) { + value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' : + cmdName == 'fontborder' ? '1px solid #000' : + 'line-through'); + var me = this, + range = this.selection.getRange(), + text; + + if (value == 'default') { + + if (range.collapsed) { + text = me.document.createTextNode('font'); + range.insertNode(text).select(); + + } + me.execCommand('removeFormat', 'span,a', style); + if (text) { + range.setStartBefore(text).collapse(true); + domUtils.remove(text); + } + mergesibling(range,cmdName,value); + range.select() + } else { + if (!range.collapsed) { + if (needCmd[cmd] && me.queryCommandValue(cmd)) { + me.execCommand('removeFormat', 'span,a', style); + } + range = me.selection.getRange(); + + range.applyInlineStyle('span', {'style': style + ':' + value}); + mergesibling(range, cmdName,value); + range.select(); + } else { + + var span = domUtils.findParentByTagName(range.startContainer, 'span', true); + text = me.document.createTextNode('font'); + if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) { + //for ie hack when enter + range.insertNode(text); + if (needCmd[cmd]) { + range.selectNode(text).select(); + me.execCommand('removeFormat', 'span,a', style, null); + + span = domUtils.findParentByTagName(text, 'span', true); + range.setStartBefore(text); + + } + span && (span.style.cssText += ';' + style + ':' + value); + range.collapse(true).select(); + + + } else { + range.insertNode(text); + range.selectNode(text).select(); + span = range.document.createElement('span'); + + if (needCmd[cmd]) { + //a标签内的不处理跳过 + if (domUtils.findParentByTagName(text, 'a', true)) { + range.setStartBefore(text).setCursor(); + domUtils.remove(text); + return; + } + me.execCommand('removeFormat', 'span,a', style); + } + + span.style.cssText = style + ':' + value; + + + text.parentNode.insertBefore(span, text); + //修复,span套span 但样式不继承的问题 + if (!browser.ie || browser.ie && browser.version == 9) { + var spanParent = span.parentNode; + while (!domUtils.isBlockElm(spanParent)) { + if (spanParent.tagName == 'SPAN') { + //opera合并style不会加入";" + span.style.cssText = spanParent.style.cssText + ";" + span.style.cssText; + } + spanParent = spanParent.parentNode; + } + } + + + if (opera) { + setTimeout(function () { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName,value); + range.select(); + }); + } else { + range.setStart(span, 0).collapse(true); + mergesibling(range,cmdName,value); + range.select(); + } + + //trace:981 + //domUtils.mergeToParent(span) + } + domUtils.remove(text); + } + + + } + return true; + }, + queryCommandValue: function (cmdName) { + var startNode = this.selection.getStart(); + + //trace:946 + if (cmdName == 'underline' || cmdName == 'strikethrough') { + var tmpNode = startNode, value; + while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) { + if (tmpNode.nodeType == 1) { + value = domUtils.getComputedStyle(tmpNode, style); + if (value != 'none') { + return value; + } + } + + tmpNode = tmpNode.parentNode; + } + return 'none'; + } + if (cmdName == 'fontborder') { + var tmp = startNode, val; + while (tmp && dtd.$inline[tmp.tagName]) { + if (val = domUtils.getComputedStyle(tmp, 'border')) { + + if (/1px/.test(val) && /solid/.test(val)) { + return val; + } + } + tmp = tmp.parentNode; + } + return '' + } + + if( cmdName == 'FontSize' ) { + var styleVal = domUtils.getComputedStyle(startNode, style), + tmp = /^([\d\.]+)(\w+)$/.exec( styleVal ); + + if( tmp ) { + + return Math.floor( tmp[1] ) + tmp[2]; + + } + + return styleVal; + + } + + return domUtils.getComputedStyle(startNode, style); + }, + queryCommandState: function (cmdName) { + if (!needCmd[cmdName]) + return 0; + var val = this.queryCommandValue(cmdName); + if (cmdName == 'fontborder') { + return /1px/.test(val) && /solid/.test(val) + } else { + return cmdName == 'underline' ? /underline/.test(val) : /line\-through/.test(val); + + } + + } + }; + })(p, fonts[p]); + } +}; + +// plugins/link.js +/** + * 超链接 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入超链接 + * @command link + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } options 设置自定义属性,例如:url、title、target + * @example + * ```javascript + * editor.execCommand( 'link', '{ + * url:'ueditor.baidu.com', + * title:'ueditor', + * target:'_blank' + * }' ); + * ``` + */ +/** + * 返回当前选中的第一个超链接节点 + * @command link + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { Element } 超链接节点 + * @example + * ```javascript + * editor.queryCommandValue( 'link' ); + * ``` + */ + +/** + * 取消超链接 + * @command unlink + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'unlink'); + * ``` + */ + +UE.plugins['link'] = function(){ + function optimize( range ) { + var start = range.startContainer,end = range.endContainer; + + if ( start = domUtils.findParentByTagName( start, 'a', true ) ) { + range.setStartBefore( start ); + } + if ( end = domUtils.findParentByTagName( end, 'a', true ) ) { + range.setEndAfter( end ); + } + } + + + UE.commands['unlink'] = { + execCommand : function() { + var range = this.selection.getRange(), + bookmark; + if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){ + return; + } + bookmark = range.createBookmark(); + optimize( range ); + range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select(); + }, + queryCommandState : function(){ + return !this.highlight && this.queryCommandValue('link') ? 0 : -1; + } + + }; + function doLink(range,opt,me){ + var rngClone = range.cloneRange(), + link = me.queryCommandValue('link'); + optimize( range = range.adjustmentBoundary() ); + var start = range.startContainer; + if(start.nodeType == 1 && link){ + start = start.childNodes[range.startOffset]; + if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie?'innerText':'textContent'])){ + start[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue||opt.href); + + } + } + if( !rngClone.collapsed || link){ + range.removeInlineStyle( 'a' ); + rngClone = range.cloneRange(); + } + + if ( rngClone.collapsed ) { + var a = range.document.createElement( 'a'), + text = ''; + if(opt.textValue){ + + text = utils.html(opt.textValue); + delete opt.textValue; + }else{ + text = utils.html(opt.href); + + } + domUtils.setAttributes( a, opt ); + start = domUtils.findParentByTagName( rngClone.startContainer, 'a', true ); + if(start && domUtils.isInNodeEndBoundary(rngClone,start)){ + range.setStartAfter(start).collapse(true); + + } + a[browser.ie ? 'innerText' : 'textContent'] = text; + range.insertNode(a).selectNode( a ); + } else { + range.applyInlineStyle( 'a', opt ); + + } + } + UE.commands['link'] = { + execCommand : function( cmdName, opt ) { + var range; + opt._href && (opt._href = utils.unhtml(opt._href,/[<">]/g)); + opt.href && (opt.href = utils.unhtml(opt.href,/[<">]/g)); + opt.textValue && (opt.textValue = utils.unhtml(opt.textValue,/[<">]/g)); + doLink(range=this.selection.getRange(),opt,this); + //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 + range.collapse().select(true); + + }, + queryCommandValue : function() { + var range = this.selection.getRange(), + node; + if ( range.collapsed ) { +// node = this.selection.getStart(); + //在ie下getstart()取值偏上了 + node = range.startContainer; + node = node.nodeType == 1 ? node : node.parentNode; + + if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) && ! domUtils.isInNodeEndBoundary(range,node)) { + + return node; + } + } else { + //trace:1111 如果是

      xx

      startContainer是p就会找不到a + range.shrinkBoundary(); + var start = range.startContainer.nodeType == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset], + end = range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1], + common = range.getCommonAncestor(); + node = domUtils.findParentByTagName( common, 'a', true ); + if ( !node && common.nodeType == 1){ + + var as = common.getElementsByTagName( 'a' ), + ps,pe; + + for ( var i = 0,ci; ci = as[i++]; ) { + ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end); + if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) { + node = ci; + break; + } + } + } + return node; + } + + }, + queryCommandState : function() { + //判断如果是视频的话连接不可用 + //fix 853 + var img = this.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1); + return flag ? -1 : 0; + } + }; +}; + +// plugins/iframe.js +///import core +///import plugins\inserthtml.js +///commands 插入框架 +///commandsName InsertFrame +///commandsTitle 插入Iframe +///commandsDialog dialogs\insertframe + +UE.plugins['insertframe'] = function() { + var me =this; + function deleteIframe(){ + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange",function(){ + deleteIframe(); + }); + +}; + + + +// plugins/scrawl.js +///import core +///commands 涂鸦 +///commandsName Scrawl +///commandsTitle 涂鸦 +///commandsDialog dialogs\scrawl +UE.commands['scrawl'] = { + queryCommandState : function(){ + return ( browser.ie && browser.version <= 8 ) ? -1 :0; + } +}; + + +// plugins/removeformat.js +/** + * 清除格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 清除文字样式 + * @command removeformat + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} tags 以逗号隔开的标签。如:strong + * @param {String} style 样式如:color + * @param {String} attrs 属性如:width + * @example + * ```javascript + * editor.execCommand( 'removeformat', 'strong','color','width' ); + * ``` + */ + +UE.plugins['removeformat'] = function(){ + var me = this; + me.setOpt({ + 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', + 'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign' + }); + me.commands['removeformat'] = { + execCommand : function( cmdName, tags, style, attrs,notIncludeA ) { + + var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) , + removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ), + range = new dom.Range( this.document ), + bookmark,node,parent, + filter = function( node ) { + return node.nodeType == 1; + }; + + function isRedundantSpan (node) { + if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){ + return 0; + } + if (browser.ie) { + //ie 下判断实效,所以只能简单用style来判断 + //return node.style.cssText == '' ? 1 : 0; + var attrs = node.attributes; + if ( attrs.length ) { + for ( var i = 0,l = attrs.length; i + var node = range.startContainer, + tmp, + collapsed = range.collapsed; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setStartBefore(node); + //trace:937 + //更新结束边界 + if(range.startContainer === range.endContainer){ + range.endOffset--; + } + domUtils.remove(node); + node = tmp; + } + + if(!collapsed){ + node = range.endContainer; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setEndBefore(node); + domUtils.remove(node); + + node = tmp; + } + + + } + } + + + + range = this.selection.getRange(); + doRemove( range ); + range.select(); + + } + + }; + +}; + + +// plugins/blockquote.js +/** + * 添加引用 + * @file + * @since 1.2.6.1 + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'blockquote' ); + * ``` + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } attrs 节点属性 + * @example + * ```javascript + * editor.execCommand( 'blockquote',{ + * style: "color: red;" + * } ); + * ``` + */ + + +UE.plugins['blockquote'] = function(){ + var me = this; + function getObj(editor){ + return domUtils.filterNodeList(editor.selection.getStartElementPath(),'blockquote'); + } + me.commands['blockquote'] = { + execCommand : function( cmdName, attrs ) { + var range = this.selection.getRange(), + obj = getObj(this), + blockquote = dtd.blockquote, + bookmark = range.createBookmark(); + + if ( obj ) { + + var start = range.startContainer, + startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}), + + end = range.endContainer, + endBlock = domUtils.isBlockElm(end) ? end : domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)}); + + //处理一下li + startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock; + endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock; + + + if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)){ + domUtils.remove(obj,true); + }else{ + domUtils.breakParent(startBlock,obj); + } + + if(startBlock !== endBlock){ + obj = domUtils.findParentByTagName(endBlock,'blockquote'); + if(obj){ + if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'|| domUtils.isBody(endBlock)){ + obj.parentNode && domUtils.remove(obj,true); + }else{ + domUtils.breakParent(endBlock,obj); + } + + } + } + + var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote'); + for(var i=0,bi;bi=blockquotes[i++];){ + if(!bi.childNodes.length){ + domUtils.remove(bi); + }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){ + domUtils.remove(bi,true); + } + } + + + + + } else { + + var tmpRange = range.cloneRange(), + node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode, + preNode = node, + doEnd = 1; + + //调整开始 + while ( 1 ) { + if ( domUtils.isBody(node) ) { + if ( preNode !== node ) { + if ( range.collapsed ) { + tmpRange.selectNode( preNode ); + doEnd = 0; + } else { + tmpRange.setStartBefore( preNode ); + } + }else{ + tmpRange.setStart(node,0); + } + + break; + } + if ( !blockquote[node.tagName] ) { + if ( range.collapsed ) { + tmpRange.selectNode( preNode ); + } else{ + tmpRange.setStartBefore( preNode); + } + break; + } + + preNode = node; + node = node.parentNode; + } + + //调整结束 + if ( doEnd ) { + preNode = node = node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode; + while ( 1 ) { + + if ( domUtils.isBody( node ) ) { + if ( preNode !== node ) { + + tmpRange.setEndAfter( preNode ); + + } else { + tmpRange.setEnd( node, node.childNodes.length ); + } + + break; + } + if ( !blockquote[node.tagName] ) { + tmpRange.setEndAfter( preNode ); + break; + } + + preNode = node; + node = node.parentNode; + } + + } + + + node = range.document.createElement( 'blockquote' ); + domUtils.setAttributes( node, attrs ); + node.appendChild( tmpRange.extractContents() ); + tmpRange.insertNode( node ); + //去除重复的 + var childs = domUtils.getElementsByTagName(node,'blockquote'); + for(var i=0,ci;ci=childs[i++];){ + if(ci.parentNode){ + domUtils.remove(ci,true); + } + } + + } + range.moveToBookmark( bookmark ).select(); + }, + queryCommandState : function() { + return getObj(this) ? 1 : 0; + } + }; +}; + + + +// plugins/convertcase.js +/** + * 大小写转换 + * @file + * @since 1.2.6.1 + */ + +/** + * 把选区内文本变大写,与“tolowercase”命令互斥 + * @command touppercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'touppercase' ); + * ``` + */ + +/** + * 把选区内文本变小写,与“touppercase”命令互斥 + * @command tolowercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'tolowercase' ); + * ``` + */ +UE.commands['touppercase'] = +UE.commands['tolowercase'] = { + execCommand:function (cmd) { + var me = this; + var rng = me.selection.getRange(); + if(rng.collapsed){ + return rng; + } + var bk = rng.createBookmark(), + bkEnd = bk.end, + filterFn = function( node ) { + return !domUtils.isBr(node) && !domUtils.isWhitespace( node ); + }, + curNode = domUtils.getNextDomNode( bk.start, false, filterFn ); + while ( curNode && (domUtils.getPosition( curNode, bkEnd ) & domUtils.POSITION_PRECEDING) ) { + + if ( curNode.nodeType == 3 ) { + curNode.nodeValue = curNode.nodeValue[cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase'](); + } + curNode = domUtils.getNextDomNode( curNode, true, filterFn ); + if(curNode === bkEnd){ + break; + } + + } + rng.moveToBookmark(bk).select(); + } +}; + + + +// plugins/indent.js +/** + * 首行缩进 + * @file + * @since 1.2.6.1 + */ + +/** + * 缩进 + * @command indent + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'indent' ); + * ``` + */ +UE.commands['indent'] = { + execCommand : function() { + var me = this,value = me.queryCommandState("indent") ? "0em" : (me.options.indentValue || '2em'); + me.execCommand('Paragraph','p',{style:'text-indent:'+ value}); + }, + queryCommandState : function() { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); + return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; + } + +}; + + +// plugins/print.js +/** + * 打印 + * @file + * @since 1.2.6.1 + */ + +/** + * 打印 + * @command print + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'print' ); + * ``` + */ +UE.commands['print'] = { + execCommand : function(){ + this.window.print(); + }, + notNeedUndo : 1 +}; + + + +// plugins/preview.js +/** + * 预览 + * @file + * @since 1.2.6.1 + */ + +/** + * 预览 + * @command preview + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'preview' ); + * ``` + */ +UE.commands['preview'] = { + execCommand : function(){ + var w = window.open('', '_blank', ''), + d = w.document; + d.open(); + d.write('
      '+this.getContent(null,null,true)+'
      '); + d.close(); + }, + notNeedUndo : 1 +}; + + +// plugins/selectall.js +/** + * 全选 + * @file + * @since 1.2.6.1 + */ + +/** + * 选中所有内容 + * @command selectall + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'selectall' ); + * ``` + */ +UE.plugins['selectall'] = function(){ + var me = this; + me.commands['selectall'] = { + execCommand : function(){ + //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 + var me = this,body = me.body, + range = me.selection.getRange(); + range.selectNodeContents(body); + if(domUtils.isEmptyBlock(body)){ + //opera不能自动合并到元素的里边,要手动处理一下 + if(browser.opera && body.firstChild && body.firstChild.nodeType == 1){ + range.setStartAtFirst(body.firstChild); + } + range.collapse(true); + } + range.select(true); + }, + notNeedUndo : 1 + }; + + + //快捷键 + me.addshortcutkey({ + "selectAll" : "ctrl+65" + }); +}; + + +// plugins/paragraph.js +/** + * 段落样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落格式 + * @command paragraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {Object} attrs 标签的属性 + * @example + * ```javascript + * editor.execCommand( 'Paragraph','h1','{ + * class:'test' + * }' ); + * ``` + */ + +/** + * 返回选区内节点标签名 + * @command paragraph + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 节点标签名 + * @example + * ```javascript + * editor.queryCommandValue( 'Paragraph' ); + * ``` + */ + +UE.plugins['paragraph'] = function() { + var me = this, + block = domUtils.isBlockElm, + notExchange = ['TD','LI','PRE'], + + doParagraph = function(range,style,attrs,sourceCmdName){ + var bookmark = range.createBookmark(), + filterFn = function( node ) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace( node ); + }, + para; + + range.enlarge( true ); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), + tmpRange = range.cloneRange(), + tmpNode; + while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { + if ( current.nodeType == 3 || !block( current ) ) { + tmpRange.setStartBefore( current ); + while ( current && current !== bookmark2.end && !block( current ) ) { + tmpNode = current; + current = domUtils.getNextDomNode( current, false, null, function( node ) { + return !block( node ); + } ); + } + tmpRange.setEndAfter( tmpNode ); + + para = range.document.createElement( style ); + if(attrs){ + domUtils.setAttributes(para,attrs); + if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ + para.style.cssText = attrs.style; + } + } + para.appendChild( tmpRange.extractContents() ); + //需要内容占位 + if(domUtils.isEmptyNode(para)){ + domUtils.fillChar(range.document,para); + + } + + tmpRange.insertNode( para ); + + var parent = para.parentNode; + //如果para上一级是一个block元素且不是body,td就删除它 + if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) { + //存储dir,style + if(!(sourceCmdName && sourceCmdName == 'customstyle')){ + parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir')); + //trace:1070 + parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText); + //trace:1030 + parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign); + parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent); + parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding); + } + + //trace:1706 选择的就是h1-6要删除 + if(attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName) ){ + domUtils.setAttributes(parent,attrs); + if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ + parent.style.cssText = attrs.style; + } + domUtils.remove(para,true); + para = parent; + }else{ + domUtils.remove( para.parentNode, true ); + } + + } + if( utils.indexOf(notExchange,parent.tagName)!=-1){ + current = parent; + }else{ + current = para; + } + + + current = domUtils.getNextDomNode( current, false, filterFn ); + } else { + current = domUtils.getNextDomNode( current, true, filterFn ); + } + } + return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); + }; + me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}); + me.commands['paragraph'] = { + execCommand : function( cmdName, style,attrs,sourceCmdName ) { + var range = this.selection.getRange(); + //闭合时单独处理 + if(range.collapsed){ + var txt = this.document.createTextNode('p'); + range.insertNode(txt); + //去掉冗余的fillchar + if(browser.ie){ + var node = txt.previousSibling; + if(node && domUtils.isWhitespace(node)){ + domUtils.remove(node); + } + node = txt.nextSibling; + if(node && domUtils.isWhitespace(node)){ + domUtils.remove(node); + } + } + + } + range = doParagraph(range,style,attrs,sourceCmdName); + if(txt){ + range.setStartBefore(txt).collapse(true); + pN = txt.parentNode; + + domUtils.remove(txt); + + if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){ + domUtils.fillNode(this.document,pN); + } + + } + + if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){ + var child = range.startContainer.childNodes[range.startOffset]; + if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){ + range.setStart(child,0).collapse(true); + } + } + //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 + range.select(); + + + return true; + }, + queryCommandValue : function() { + var node = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); + return node ? node.tagName.toLowerCase() : ''; + } + }; +}; + + +// plugins/directionality.js +/** + * 设置文字输入的方向的插件 + * @file + * @since 1.2.6.1 + */ +(function() { + var block = domUtils.isBlockElm , + getObj = function(editor){ +// var startNode = editor.selection.getStart(), +// parents; +// if ( startNode ) { +// //查找所有的是block的父亲节点 +// parents = domUtils.findParents( startNode, true, block, true ); +// for ( var i = 0,ci; ci = parents[i++]; ) { +// if ( ci.getAttribute( 'dir' ) ) { +// return ci; +// } +// } +// } + return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')}); + + }, + doDirectionality = function(range,editor,forward){ + + var bookmark, + filterFn = function( node ) { + return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }, + + obj = getObj( editor ); + + if ( obj && range.collapsed ) { + obj.setAttribute( 'dir', forward ); + return range; + } + bookmark = range.createBookmark(); + range.enlarge( true ); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), + tmpRange = range.cloneRange(), + tmpNode; + while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { + if ( current.nodeType == 3 || !block( current ) ) { + tmpRange.setStartBefore( current ); + while ( current && current !== bookmark2.end && !block( current ) ) { + tmpNode = current; + current = domUtils.getNextDomNode( current, false, null, function( node ) { + return !block( node ); + } ); + } + tmpRange.setEndAfter( tmpNode ); + var common = tmpRange.getCommonAncestor(); + if ( !domUtils.isBody( common ) && block( common ) ) { + //遍历到了block节点 + common.setAttribute( 'dir', forward ); + current = common; + } else { + //没有遍历到,添加一个block节点 + var p = range.document.createElement( 'p' ); + p.setAttribute( 'dir', forward ); + var frag = tmpRange.extractContents(); + p.appendChild( frag ); + tmpRange.insertNode( p ); + current = p; + } + + current = domUtils.getNextDomNode( current, false, filterFn ); + } else { + current = domUtils.getNextDomNode( current, true, filterFn ); + } + } + return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); + }; + + /** + * 文字输入方向 + * @command directionality + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.execCommand( 'directionality', 'ltr'); + * ``` + */ + + /** + * 查询当前选区的文字输入方向 + * @command directionality + * @method queryCommandValue + * @param { String } cmdName 命令字符串 + * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.queryCommandValue( 'directionality'); + * ``` + */ + UE.commands['directionality'] = { + execCommand : function( cmdName,forward ) { + var range = this.selection.getRange(); + //闭合时单独处理 + if(range.collapsed){ + var txt = this.document.createTextNode('d'); + range.insertNode(txt); + } + doDirectionality(range,this,forward); + if(txt){ + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + return true; + }, + queryCommandValue : function() { + var node = getObj(this); + return node ? node.getAttribute('dir') : 'ltr'; + } + }; +})(); + + + +// plugins/horizontal.js +/** + * 插入分割线插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入分割线 + * @command horizontal + * @method execCommand + * @param { String } cmdName 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'horizontal' ); + * ``` + */ +UE.plugins['horizontal'] = function(){ + var me = this; + me.commands['horizontal'] = { + execCommand : function( cmdName ) { + var me = this; + if(me.queryCommandState(cmdName)!==-1){ + me.execCommand('insertHtml','
      '); + var range = me.selection.getRange(), + start = range.startContainer; + if(start.nodeType == 1 && !start.childNodes[range.startOffset] ){ + + var tmp; + if(tmp = start.childNodes[range.startOffset - 1]){ + if(tmp.nodeType == 1 && tmp.tagName == 'HR'){ + if(me.options.enterTag == 'p'){ + tmp = me.document.createElement('p'); + range.insertNode(tmp); + range.setStart(tmp,0).setCursor(); + + }else{ + tmp = me.document.createElement('br'); + range.insertNode(tmp); + range.setStartBefore(tmp).setCursor(); + } + } + } + + } + return true; + } + + }, + //边界在table里不能加分隔线 + queryCommandState : function() { + return domUtils.filterNodeList(this.selection.getStartElementPath(),'table') ? -1 : 0; + } + }; +// me.addListener('delkeyup',function(){ +// var rng = this.selection.getRange(); +// if(browser.ie && browser.version > 8){ +// rng.txtToElmBoundary(true); +// if(domUtils.isStartInblock(rng)){ +// var tmpNode = rng.startContainer; +// var pre = tmpNode.previousSibling; +// if(pre && domUtils.isTagNode(pre,'hr')){ +// domUtils.remove(pre); +// rng.select(); +// return; +// } +// } +// } +// if(domUtils.isBody(rng.startContainer)){ +// var hr = rng.startContainer.childNodes[rng.startOffset -1]; +// if(hr && hr.nodeName == 'HR'){ +// var next = hr.nextSibling; +// if(next){ +// rng.setStart(next,0) +// }else if(hr.previousSibling){ +// rng.setStartAtLast(hr.previousSibling) +// }else{ +// var p = this.document.createElement('p'); +// hr.parentNode.insertBefore(p,hr); +// domUtils.fillNode(this.document,p); +// rng.setStart(p,0); +// } +// domUtils.remove(hr); +// rng.setCursor(false,true); +// } +// } +// }) + me.addListener('delkeydown',function(name,evt){ + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + if(domUtils.isStartInblock(rng)){ + var tmpNode = rng.startContainer; + var pre = tmpNode.previousSibling; + if(pre && domUtils.isTagNode(pre,'hr')){ + domUtils.remove(pre); + rng.select(); + domUtils.preventDefault(evt); + return true; + + } + } + + }) +}; + + + +// plugins/time.js +/** + * 插入时间和日期 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入时间,默认格式:12:59:59 + * @command time + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'time'); + * ``` + */ + +/** + * 插入日期,默认格式:2013-08-30 + * @command date + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'date'); + * ``` + */ +UE.commands['time'] = UE.commands["date"] = { + execCommand : function(cmd, format){ + var date = new Date; + + function formatTime(date, format) { + var hh = ('0' + date.getHours()).slice(-2), + ii = ('0' + date.getMinutes()).slice(-2), + ss = ('0' + date.getSeconds()).slice(-2); + format = format || 'hh:ii:ss'; + return format.replace(/hh/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, ss); + } + function formatDate(date, format) { + var yyyy = ('000' + date.getFullYear()).slice(-4), + yy = yyyy.slice(-2), + mm = ('0' + (date.getMonth()+1)).slice(-2), + dd = ('0' + date.getDate()).slice(-2); + format = format || 'yyyy-mm-dd'; + return format.replace(/yyyy/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd); + } + + this.execCommand('insertHtml',cmd == "time" ? formatTime(date, format):formatDate(date, format) ); + } +}; + + +// plugins/rowspacing.js +/** + * 段前段后间距插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 设置段间距 + * @command rowspacing + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 段间距的值,以px为单位 + * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 + * @example + * ```javascript + * editor.execCommand( 'rowspacing', '10', 'top' ); + * ``` + */ + +UE.plugins['rowspacing'] = function(){ + var me = this; + me.setOpt({ + 'rowspacingtop':['5', '10', '15', '20', '25'], + 'rowspacingbottom':['5', '10', '15', '20', '25'] + + }); + me.commands['rowspacing'] = { + execCommand : function( cmdName,value,dir ) { + this.execCommand('paragraph','p',{style:'margin-'+dir+':'+value + 'px'}); + return true; + }, + queryCommandValue : function(cmdName,dir) { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node) }), + value; + //trace:1026 + if(pN){ + value = domUtils.getComputedStyle(pN,'margin-'+dir).replace(/[^\d]/g,''); + return !value ? 0 : value; + } + return 0; + + } + }; +}; + + + + +// plugins/lineheight.js +/** + * 设置行内间距 + * @file + * @since 1.2.6.1 + */ +UE.plugins['lineheight'] = function(){ + var me = this; + me.setOpt({'lineheight':['1', '1.5','1.75','2', '3', '4', '5']}); + + /** + * 行距 + * @command lineheight + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 + * @example + * ```javascript + * editor.execCommand( 'lineheight', 1.5); + * ``` + */ + /** + * 查询当前选区内容的行高大小 + * @command lineheight + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前行高大小 + * @example + * ```javascript + * editor.queryCommandValue( 'lineheight' ); + * ``` + */ + + me.commands['lineheight'] = { + execCommand : function( cmdName,value ) { + this.execCommand('paragraph','p',{style:'line-height:'+ (value == "1" ? "normal" : value + 'em') }); + return true; + }, + queryCommandValue : function() { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node)}); + if(pN){ + var value = domUtils.getComputedStyle(pN,'line-height'); + return value == 'normal' ? 1 : value.replace(/[^\d.]*/ig,""); + } + } + }; +}; + + + + +// plugins/insertcode.js +/** + * 插入代码插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['insertcode'] = function() { + var me = this; + me.ready(function(){ + utils.cssRule('pre','pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}', + me.document) + }); + me.setOpt('insertcode',{ + 'as3':'ActionScript3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'Css', + 'cf':'CodeFunction', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'Html', + 'java':'Java', + 'jfx':'JavaFx', + 'js':'Javascript', + 'pl':'Perl', + 'php':'Php', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'Sql', + 'vb':'Vb', + 'xml':'Xml' + }); + + /** + * 插入代码 + * @command insertcode + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } lang 插入代码的语言 + * @example + * ```javascript + * editor.execCommand( 'insertcode', 'javascript' ); + * ``` + */ + + /** + * 如果选区所在位置是插入插入代码区域,返回代码的语言 + * @command insertcode + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回代码的语言 + * @example + * ```javascript + * editor.queryCommandValue( 'insertcode' ); + * ``` + */ + + me.commands['insertcode'] = { + execCommand : function(cmd,lang){ + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + pre.className = 'brush:'+lang+';toolbar:false;'; + }else{ + var code = ''; + if(rng.collapsed){ + code = browser.ie && browser.ie11below ? (browser.version <= 8 ? ' ':''):'
      '; + }else{ + var frag = rng.extractContents(); + var div = me.document.createElement('div'); + div.appendChild(frag); + + utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g,'')),me.options.filterTxtRules).children,function(node){ + if(browser.ie && browser.ie11below && browser.version > 8){ + + if(node.type =='element'){ + if(node.tagName == 'br'){ + code += '\n' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + code += '\n' + }else if(!dtd.$empty[node.tagName]){ + code += cn.innerText(); + } + }else{ + code += cn.data + } + }) + if(!/\n$/.test(code)){ + code += '\n'; + } + } + }else{ + code += node.data + '\n' + } + if(!node.nextSibling() && /\n$/.test(code)){ + code = code.replace(/\n$/,''); + } + }else{ + if(browser.ie && browser.ie11below){ + + if(node.type =='element'){ + if(node.tagName == 'br'){ + code += '
      ' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + code += '
      ' + }else if(!dtd.$empty[node.tagName]){ + code += cn.innerText(); + } + }else{ + code += cn.data + } + }); + if(!/br>$/.test(code)){ + code += '
      '; + } + } + }else{ + code += node.data + '
      ' + } + if(!node.nextSibling() && /
      $/.test(code)){ + code = code.replace(/
      $/,''); + } + + }else{ + code += (node.type == 'element' ? (dtd.$empty[node.tagName] ? '' : node.innerText()) : node.data); + if(!/br\/?\s*>$/.test(code)){ + if(!node.nextSibling()) + return; + code += '
      ' + } + } + + } + + }); + } + me.execCommand('inserthtml','
      '+code+'
      ',true); + + pre = me.document.getElementById('coder'); + domUtils.removeAttributes(pre,'id'); + var tmpNode = pre.previousSibling; + + if(tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 || domUtils.isEmptyBlock(tmpNode))){ + + domUtils.remove(tmpNode) + } + var rng = me.selection.getRange(); + if(domUtils.isEmptyBlock(pre)){ + rng.setStart(pre,0).setCursor(false,true) + }else{ + rng.selectNodeContents(pre).select() + } + } + + + + }, + queryCommandValue : function(){ + var path = this.selection.getStartElementPath(); + var lang = ''; + utils.each(path,function(node){ + if(node.nodeName =='PRE'){ + var match = node.className.match(/brush:([^;]+)/); + lang = match && match[1] ? match[1] : ''; + return false; + } + }); + return lang; + } + }; + + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('pre'),function(pre){ + var brs = pre.getNodesByTagName('br'); + if(brs.length){ + browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs,function(br){ + var txt = UE.uNode.createText('\n'); + br.parentNode.insertBefore(txt,br); + br.parentNode.removeChild(br); + }); + return; + } + if(browser.ie && browser.ie11below && browser.version > 8) + return; + var code = pre.innerText().split(/\n/); + pre.innerHTML(''); + utils.each(code,function(c){ + if(c.length){ + pre.appendChild(UE.uNode.createText(c)); + } + pre.appendChild(UE.uNode.createElement('br')) + }) + }) + }); + me.addOutputRule(function(root){ + utils.each(root.getNodesByTagName('pre'),function(pre){ + var code = ''; + utils.each(pre.children,function(n){ + if(n.type == 'text'){ + //在ie下文本内容有可能末尾带有\n要去掉 + //trace:3396 + code += n.data.replace(/[ ]/g,' ').replace(/\n$/,''); + }else{ + if(n.tagName == 'br'){ + code += '\n' + }else{ + code += (!dtd.$empty[n.tagName] ? '' : n.innerText()); + } + + } + + }); + + pre.innerText(code.replace(/( |\n)+$/,'')) + }) + }); + //不需要判断highlight的command列表 + me.notNeedCodeQuery ={ + help:1, + undo:1, + redo:1, + source:1, + print:1, + searchreplace:1, + fullscreen:1, + preview:1, + insertparagraph:1, + elementpath:1, + insertcode:1, + inserthtml:1, + selectall:1 + }; + //将queyCommamndState重置 + var orgQuery = me.queryCommandState; + me.queryCommandState = function(cmd){ + var me = this; + + if(!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')){ + return -1; + } + return UE.Editor.prototype.queryCommandState.apply(this,arguments) + }; + me.addListener('beforeenterkeydown',function(){ + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + me.fireEvent('saveScene'); + if(!rng.collapsed){ + rng.deleteContents(); + } + if(!browser.ie || browser.ie9above){ + var tmpNode = me.document.createElement('br'),pre; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); + var next = tmpNode.nextSibling; + if(!next && (!browser.ie || browser.version > 10)){ + rng.insertNode(tmpNode.cloneNode(false)); + }else{ + rng.setStartAfter(tmpNode); + } + pre = tmpNode.previousSibling; + var tmp; + while(pre ){ + tmp = pre; + pre = pre.previousSibling; + if(!pre || pre.nodeName == 'BR'){ + pre = tmp; + break; + } + } + if(pre){ + var str = ''; + while(pre && pre.nodeName != 'BR' && new RegExp('^[\\s'+domUtils.fillChar+']*$').test(pre.nodeValue)){ + str += pre.nodeValue; + pre = pre.nextSibling; + } + if(pre.nodeName != 'BR'){ + var match = pre.nodeValue.match(new RegExp('^([\\s'+domUtils.fillChar+']+)')); + if(match && match[1]){ + str += match[1] + } + + } + if(str){ + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + } + rng.collapse(true).select(true); + }else{ + if(browser.version > 8){ + + var txt = me.document.createTextNode('\n'); + var start = rng.startContainer; + if(rng.startOffset == 0){ + var preNode = start.previousSibling; + if(preNode){ + rng.insertNode(txt); + var fillchar = me.document.createTextNode(' '); + rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) + } + }else{ + rng.insertNode(txt).setStartAfter(txt); + var fillchar = me.document.createTextNode(' '); + start = rng.startContainer.childNodes[rng.startOffset]; + if(start && !/^\n/.test(start.nodeValue)){ + rng.setStartBefore(txt) + } + rng.insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) + } + + }else{ + var tmpNode = me.document.createElement('br'); + rng.insertNode(tmpNode); + rng.insertNode(me.document.createTextNode(domUtils.fillChar)); + rng.setStartAfter(tmpNode); + pre = tmpNode.previousSibling; + var tmp; + while(pre ){ + tmp = pre; + pre = pre.previousSibling; + if(!pre || pre.nodeName == 'BR'){ + pre = tmp; + break; + } + } + if(pre){ + var str = ''; + while(pre && pre.nodeName != 'BR' && new RegExp('^[ '+domUtils.fillChar+']*$').test(pre.nodeValue)){ + str += pre.nodeValue; + pre = pre.nextSibling; + } + if(pre.nodeName != 'BR'){ + var match = pre.nodeValue.match(new RegExp('^([ '+domUtils.fillChar+']+)')); + if(match && match[1]){ + str += match[1] + } + + } + + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + rng.collapse(true).select(); + } + + + } + me.fireEvent('saveScene'); + return true; + } + + + }); + + me.addListener('tabkeydown',function(cmd,evt){ + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + me.fireEvent('saveScene'); + if(evt.shiftKey){ + + }else{ + if(!rng.collapsed){ + var bk = rng.createBookmark(); + var start = bk.start.previousSibling; + + while(start){ + if(pre.firstChild === start && !domUtils.isBr(start)){ + pre.insertBefore(me.document.createTextNode(' '),start); + + break; + } + if(domUtils.isBr(start)){ + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling); + + break; + } + start = start.previousSibling; + } + var end = bk.end; + start = bk.start.nextSibling; + if(pre.firstChild === bk.start){ + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) + + } + while(start && start !== end){ + if(domUtils.isBr(start) && start.nextSibling){ + if(start.nextSibling === end){ + break; + } + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) + } + + start = start.nextSibling; + } + rng.moveToBookmark(bk).select(); + }else{ + var tmpNode = me.document.createTextNode(' '); + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true); + } + } + + + me.fireEvent('saveScene'); + return true; + } + + + }); + + + me.addListener('beforeinserthtml',function(evtName,html){ + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + if(!rng.collapsed){ + rng.deleteContents() + } + var htmlstr = ''; + if(browser.ie && browser.version > 8){ + + utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ + if(node.type =='element'){ + if(node.tagName == 'br'){ + htmlstr += '\n' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + htmlstr += '\n' + }else if(!dtd.$empty[node.tagName]){ + htmlstr += cn.innerText(); + } + }else{ + htmlstr += cn.data + } + }) + if(!/\n$/.test(htmlstr)){ + htmlstr += '\n'; + } + } + }else{ + htmlstr += node.data + '\n' + } + if(!node.nextSibling() && /\n$/.test(htmlstr)){ + htmlstr = htmlstr.replace(/\n$/,''); + } + }); + var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g,' '))); + rng.insertNode(tmpNode).selectNode(tmpNode).select(); + }else{ + var frag = me.document.createDocumentFragment(); + + utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ + if(node.type =='element'){ + if(node.tagName == 'br'){ + frag.appendChild(me.document.createElement('br')) + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + + frag.appendChild(me.document.createElement('br')) + }else if(!dtd.$empty[node.tagName]){ + frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g,' ')))); + + } + }else{ + frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/ /g,' ')))); + + } + }) + if(frag.lastChild.nodeName != 'BR'){ + frag.appendChild(me.document.createElement('br')) + } + } + }else{ + frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/ /g,' ')))); + } + if(!node.nextSibling() && frag.lastChild.nodeName == 'BR'){ + frag.removeChild(frag.lastChild) + } + + + }); + rng.insertNode(frag).select(); + + } + + return true; + } + }); + //方向键的处理 + me.addListener('keydown',function(cmd,evt){ + var me = this,keyCode = evt.keyCode || evt.which; + if(keyCode == 40){ + var rng = me.selection.getRange(),pre,start = rng.startContainer; + if(rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer,'pre',true)) && !pre.nextSibling){ + var last = pre.lastChild + while(last && last.nodeName == 'BR'){ + last = last.previousSibling; + } + if(last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length){ + me.execCommand('insertparagraph'); + domUtils.preventDefault(evt) + } + + } + } + }); + //trace:3395 + me.addListener('delkeydown',function(type,evt){ + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + var start = rng.startContainer; + if(domUtils.isTagNode(start,'pre') && rng.collapsed && domUtils.isStartInblock(rng)){ + var p = me.document.createElement('p'); + domUtils.fillNode(me.document,p); + start.parentNode.insertBefore(p,start); + domUtils.remove(start); + rng.setStart(p,0).setCursor(false,true); + domUtils.preventDefault(evt); + return true; + } + }) +}; + + +// plugins/cleardoc.js +/** + * 清空文档插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 清空文档 + * @command cleardoc + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('cleardoc'); + * ``` + */ + +UE.commands['cleardoc'] = { + execCommand : function( cmdName) { + var me = this, + enterTag = me.options.enterTag, + range = me.selection.getRange(); + if(enterTag == "br"){ + me.body.innerHTML = "
      "; + range.setStart(me.body,0).setCursor(); + }else{ + me.body.innerHTML = "

      "+(ie ? "" : "
      ")+"

      "; + range.setStart(me.body.firstChild,0).setCursor(false,true); + } + setTimeout(function(){ + me.fireEvent("clearDoc"); + },0); + + } +}; + + + +// plugins/anchor.js +/** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('anchor', function (){ + + return { + bindEvents:{ + 'ready':function(){ + utils.cssRule('anchor', + '.anchorclass{background: url(\'' + + this.options.themePath + + this.options.theme +'/images/anchor.gif\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}', + this.document); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(a){ + var val; + if(val = a.getAttr('anchorname')){ + a.tagName = 'a'; + a.setAttr({ + anchorname : '', + name : val, + 'class' : '' + }) + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('a'),function(a){ + var val; + if((val = a.getAttr('name')) && !a.getAttr('href')){ + a.tagName = 'img'; + a.setAttr({ + anchorname :a.getAttr('name'), + 'class' : 'anchorclass' + }); + a.setAttr('name') + + } + }) + + }, + commands:{ + /** + * 插入锚点 + * @command anchor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } name 锚点名称字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('anchor', 'anchor1'); + * ``` + */ + 'anchor':{ + execCommand:function (cmd, name) { + var range = this.selection.getRange(),img = range.getClosedNode(); + if (img && img.getAttribute('anchorname')) { + if (name) { + img.setAttribute('anchorname', name); + } else { + range.setStartBefore(img).setCursor(); + domUtils.remove(img); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = this.document.createElement('img'); + range.collapse(true); + domUtils.setAttributes(anchor,{ + 'anchorname':name, + 'class':'anchorclass' + }); + range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true); + } + } + } + } + } + } +}); + + +// plugins/wordcount.js +///import core +///commands 字数统计 +///commandsName WordCount,wordCount +///commandsTitle 字数统计 +/* + * Created by JetBrains WebStorm. + * User: taoqili + * Date: 11-9-7 + * Time: 下午8:18 + * To change this template use File | Settings | File Templates. + */ + +UE.plugins['wordcount'] = function(){ + var me = this; + me.setOpt('wordCount',true); + me.addListener('contentchange',function(){ + me.fireEvent('wordcount'); + }); + var timer; + me.addListener('ready',function(){ + var me = this; + domUtils.on(me.body,"keyup",function(evt){ + var code = evt.keyCode||evt.which, + //忽略的按键,ctr,alt,shift,方向键 + ignores = {"16":1,"18":1,"20":1,"37":1,"38":1,"39":1,"40":1}; + if(code in ignores) return; + clearTimeout(timer); + timer = setTimeout(function(){ + me.fireEvent('wordcount'); + },200) + }) + }); +}; + + +// plugins/pagebreak.js +/** + * 分页功能插件 + * @file + * @since 1.2.6.1 + */ +UE.plugins['pagebreak'] = function () { + var me = this, + notBreakTags = ['td']; + me.setOpt('pageBreakTag','_ueditor_page_break_tag_'); + + function fillNode(node){ + if(domUtils.isEmptyBlock(node)){ + var firstChild = node.firstChild,tmpNode; + + while(firstChild && firstChild.nodeType == 1 && domUtils.isEmptyBlock(firstChild)){ + tmpNode = firstChild; + firstChild = firstChild.firstChild; + } + !tmpNode && (tmpNode = node); + domUtils.fillNode(me.document,tmpNode); + } + } + //分页符样式添加 + + me.ready(function(){ + utils.cssRule('pagebreak','.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}',me.document); + }); + function isHr(node){ + return node && node.nodeType == 1 && node.tagName == 'HR' && node.className == 'pagebreak'; + } + me.addInputRule(function(root){ + root.traversal(function(node){ + if(node.type == 'text' && node.data == me.options.pageBreakTag){ + var hr = UE.uNode.createElement('
      '); + node.parentNode.insertBefore(hr,node); + node.parentNode.removeChild(node) + } + }) + }); + me.addOutputRule(function(node){ + utils.each(node.getNodesByTagName('hr'),function(n){ + if(n.getAttr('class') == 'pagebreak'){ + var txt = UE.uNode.createText(me.options.pageBreakTag); + n.parentNode.insertBefore(txt,n); + n.parentNode.removeChild(n); + } + }) + + }); + + /** + * 插入分页符 + * @command pagebreak + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 在表格中插入分页符会把表格切分成两部分 + * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, + * 以便于提交数据到服务器端后处理分页。 + * @example + * ```javascript + * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak + * ``` + */ + + me.commands['pagebreak'] = { + execCommand:function () { + var range = me.selection.getRange(),hr = me.document.createElement('hr'); + domUtils.setAttributes(hr,{ + 'class' : 'pagebreak', + noshade:"noshade", + size:"5" + }); + domUtils.unSelectable(hr); + //table单独处理 + var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true), + + parents = [], pN; + if (node) { + switch (node.tagName) { + case 'TD': + pN = node.parentNode; + if (!pN.previousSibling) { + var table = domUtils.findParentByTagName(pN, 'table'); +// var tableWrapDiv = table.parentNode; +// if(tableWrapDiv && tableWrapDiv.nodeType == 1 +// && tableWrapDiv.tagName == 'DIV' +// && tableWrapDiv.getAttribute('dropdrag') +// ){ +// domUtils.remove(tableWrapDiv,true); +// } + table.parentNode.insertBefore(hr, table); + parents = domUtils.findParents(hr, true); + + } else { + pN.parentNode.insertBefore(hr, pN); + parents = domUtils.findParents(hr); + + } + pN = parents[1]; + if (hr !== pN) { + domUtils.breakParent(hr, pN); + + } + //table要重写绑定一下拖拽 + me.fireEvent('afteradjusttable',me.document); + } + + } else { + + if (!range.collapsed) { + range.deleteContents(); + var start = range.startContainer; + while ( !domUtils.isBody(start) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start)) { + range.setStartBefore(start).collapse(true); + domUtils.remove(start); + start = range.startContainer; + } + + } + range.insertNode(hr); + + var pN = hr.parentNode, nextNode; + while (!domUtils.isBody(pN)) { + domUtils.breakParent(hr, pN); + nextNode = hr.nextSibling; + if (nextNode && domUtils.isEmptyBlock(nextNode)) { + domUtils.remove(nextNode); + } + pN = hr.parentNode; + } + nextNode = hr.nextSibling; + var pre = hr.previousSibling; + if(isHr(pre)){ + domUtils.remove(pre); + }else{ + pre && fillNode(pre); + } + + if(!nextNode){ + var p = me.document.createElement('p'); + + hr.parentNode.appendChild(p); + domUtils.fillNode(me.document,p); + range.setStart(p,0).collapse(true); + }else{ + if(isHr(nextNode)){ + domUtils.remove(nextNode); + }else{ + fillNode(nextNode); + } + range.setEndAfter(hr).collapse(false); + } + + range.select(true); + + } + + } + }; +}; + +// plugins/wordimage.js +///import core +///commands 本地图片引导上传 +///commandsName WordImage +///commandsTitle 本地图片引导上传 +///commandsDialog dialogs\wordimage + +UE.plugin.register('wordimage',function(){ + var me = this, + images = []; + return { + commands : { + 'wordimage':{ + execCommand:function () { + var images = domUtils.getElementsByTagName(me.body, "img"); + var urlList = []; + for (var i = 0, ci; ci = images[i++];) { + var url = ci.getAttribute("word_img"); + url && urlList.push(url); + } + return urlList; + }, + queryCommandState:function () { + images = domUtils.getElementsByTagName(me.body, "img"); + for (var i = 0, ci; ci = images[i++];) { + if (ci.getAttribute("word_img")) { + return 1; + } + } + return -1; + }, + notNeedUndo:true + } + }, + inputRule : function (root) { + utils.each(root.getNodesByTagName('img'), function (img) { + var attrs = img.attrs, + flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, + opt = me.options, + src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'; + if (attrs['src'] && /^(?:(file:\/+))/.test(attrs['src'])) { + img.setAttr({ + width:attrs.width, + height:attrs.height, + alt:attrs.alt, + word_img: attrs.src, + src:src, + 'style':'background:url(' + ( flag ? opt.themePath + opt.theme + '/images/word.gif' : opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd' + }) + } + }) + } + } +}); + +// plugins/dragdrop.js +UE.plugins['dragdrop'] = function (){ + + var me = this; + me.ready(function(){ + domUtils.on(this.body,'dragend',function(){ + var rng = me.selection.getRange(); + var node = rng.getClosedNode()||me.selection.getStart(); + + if(node && node.tagName == 'IMG'){ + + var pre = node.previousSibling,next; + while(next = node.nextSibling){ + if(next.nodeType == 1 && next.tagName == 'SPAN' && !next.firstChild){ + domUtils.remove(next) + }else{ + break; + } + } + + + if((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre) || !pre) && (!next || next && !domUtils.isEmptyBlock(next))){ + if(pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)){ + pre.appendChild(node); + domUtils.moveChild(next,pre); + domUtils.remove(next); + }else if(next && next.tagName == 'P' && !domUtils.isEmptyBlock(next)){ + next.insertBefore(node,next.firstChild); + } + + if(pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)){ + domUtils.remove(pre) + } + if(next && next.tagName == 'P' && domUtils.isEmptyBlock(next)){ + domUtils.remove(next) + } + rng.selectNode(node).select(); + me.fireEvent('saveScene'); + + } + + } + + }) + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var rng = me.selection.getRange(),node; + if(node = domUtils.findParentByTagName(rng.startContainer,'p',true)){ + if(domUtils.getComputedStyle(node,'text-align') == 'center'){ + domUtils.removeStyle(node,'text-align') + } + } + } + }) +}; + + +// plugins/undo.js +/** + * undo redo + * @file + * @since 1.2.6.1 + */ + +/** + * 撤销上一次执行的命令 + * @command undo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'undo' ); + * ``` + */ + +/** + * 重做上一次执行的命令 + * @command redo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'redo' ); + * ``` + */ + +UE.plugins['undo'] = function () { + var saveSceneTimer; + var me = this, + maxUndoCount = me.options.maxUndoCount || 20, + maxInputCount = me.options.maxInputCount || 20, + fillchar = new RegExp(domUtils.fillChar + '|<\/hr>', 'gi');// ie会产生多余的 + var noNeedFillCharTags = { + ol:1,ul:1,table:1,tbody:1,tr:1,body:1 + }; + var orgState = me.options.autoClearEmptyNode; + function compareAddr(indexA, indexB) { + if (indexA.length != indexB.length) + return 0; + for (var i = 0, l = indexA.length; i < l; i++) { + if (indexA[i] != indexB[i]) + return 0 + } + return 1; + } + + function compareRangeAddress(rngAddrA, rngAddrB) { + if (rngAddrA.collapsed != rngAddrB.collapsed) { + return 0; + } + if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) { + return 0; + } + return 1; + } + + function UndoManager() { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.undo = function () { + if (this.hasUndo) { + if (!this.list[this.index - 1] && this.list.length == 1) { + this.reset(); + return; + } + while (this.list[this.index].content == this.list[this.index - 1].content) { + this.index--; + if (this.index == 0) { + return this.restore(0); + } + } + this.restore(--this.index); + } + }; + this.redo = function () { + if (this.hasRedo) { + while (this.list[this.index].content == this.list[this.index + 1].content) { + this.index++; + if (this.index == this.list.length - 1) { + return this.restore(this.index); + } + } + this.restore(++this.index); + } + }; + + this.restore = function () { + var me = this.editor; + var scene = this.list[this.index]; + var root = UE.htmlparser(scene.content.replace(fillchar, '')); + me.options.autoClearEmptyNode = false; + me.filterInputRule(root); + me.options.autoClearEmptyNode = orgState; + //trace:873 + //去掉展位符 + me.document.body.innerHTML = root.toHtml(); + me.fireEvent('afterscencerestore'); + //处理undo后空格不展位的问题 + if (browser.ie) { + utils.each(domUtils.getElementsByTagName(me.document,'td th caption p'),function(node){ + if(domUtils.isEmptyNode(node)){ + domUtils.fillNode(me.document, node); + } + }) + } + + try{ + var rng = new dom.Range(me.document).moveToAddress(scene.address); + rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); + }catch(e){} + + this.update(); + this.clearKey(); + //不能把自己reset了 + me.fireEvent('reset', true); + }; + + this.getScene = function () { + var me = this.editor; + var rng = me.selection.getRange(), + rngAddress = rng.createAddress(false,true); + me.fireEvent('beforegetscene'); + var root = UE.htmlparser(me.body.innerHTML); + me.options.autoClearEmptyNode = false; + me.filterOutputRule(root); + me.options.autoClearEmptyNode = orgState; + var cont = root.toHtml(); + //trace:3461 + //这个会引起回退时导致空格丢失的情况 +// browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); + me.fireEvent('aftergetscene'); + + return { + address:rngAddress, + content:cont + } + }; + this.save = function (notCompareRange,notSetCursor) { + clearTimeout(saveSceneTimer); + var currentScene = this.getScene(notSetCursor), + lastScene = this.list[this.index]; + + if(lastScene && lastScene.content != currentScene.content){ + me.trigger('contentchange') + } + //内容相同位置相同不存 + if (lastScene && lastScene.content == currentScene.content && + ( notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address) ) + ) { + return; + } + this.list = this.list.slice(0, this.index + 1); + this.list.push(currentScene); + //如果大于最大数量了,就把最前的剔除 + if (this.list.length > maxUndoCount) { + this.list.shift(); + } + this.index = this.list.length - 1; + this.clearKey(); + //跟新undo/redo状态 + this.update(); + + }; + this.update = function () { + this.hasRedo = !!this.list[this.index + 1]; + this.hasUndo = !!this.list[this.index - 1]; + }; + this.reset = function () { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.clearKey(); + }; + this.clearKey = function () { + keycont = 0; + lastKeyCode = null; + }; + } + + me.undoManger = new UndoManager(); + me.undoManger.editor = me; + function saveScene() { + this.undoManger.save(); + } + + me.addListener('saveScene', function () { + var args = Array.prototype.splice.call(arguments,1); + this.undoManger.save.apply(this.undoManger,args); + }); + +// me.addListener('beforeexeccommand', saveScene); +// me.addListener('afterexeccommand', saveScene); + + me.addListener('reset', function (type, exclude) { + if (!exclude) { + this.undoManger.reset(); + } + }); + me.commands['redo'] = me.commands['undo'] = { + execCommand:function (cmdName) { + this.undoManger[cmdName](); + }, + queryCommandState:function (cmdName) { + return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1; + }, + notNeedUndo:1 + }; + + var keys = { + // /*Backspace*/ 8:1, /*Delete*/ 46:1, + /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1, + 37:1, 38:1, 39:1, 40:1 + + }, + keycont = 0, + lastKeyCode; + //输入法状态下不计算字符数 + var inputType = false; + me.addListener('ready', function () { + domUtils.on(this.body, 'compositionstart', function () { + inputType = true; + }); + domUtils.on(this.body, 'compositionend', function () { + inputType = false; + }) + }); + //快捷键 + me.addshortcutkey({ + "Undo":"ctrl+90", //undo + "Redo":"ctrl+89" //redo + + }); + var isCollapsed = true; + me.addListener('keydown', function (type, evt) { + + var me = this; + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + + if(!me.selection.getRange().collapsed){ + me.undoManger.save(false,true); + isCollapsed = false; + return; + } + if (me.undoManger.list.length == 0) { + me.undoManger.save(true); + } + clearTimeout(saveSceneTimer); + function save(cont){ + cont.undoManger.save(false,true); + cont.fireEvent('selectionchange'); + } + saveSceneTimer = setTimeout(function(){ + if(inputType){ + var interalTimer = setInterval(function(){ + if(!inputType){ + save(me); + clearInterval(interalTimer) + } + },300) + return; + } + save(me); + },200); + + lastKeyCode = keyCode; + keycont++; + if (keycont >= maxInputCount ) { + save(me) + } + } + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + if(!isCollapsed){ + this.undoManger.save(false,true); + isCollapsed = true; + } + } + }); + //扩展实例,添加关闭和开启命令undo + me.stopCmdUndo = function(){ + me.__hasEnterExecCommand = true; + }; + me.startCmdUndo = function(){ + me.__hasEnterExecCommand = false; + } +}; + + +// plugins/copy.js +UE.plugin.register('copy', function () { + + var me = this; + + function initZeroClipboard() { + + ZeroClipboard.config({ + debug: false, + swfPath: me.options.UEDITOR_HOME_URL + 'third-party/zeroclipboard/ZeroClipboard.swf' + }); + + var client = me.zeroclipboard = new ZeroClipboard(); + + // 复制内容 + client.on('copy', function (e) { + var client = e.client, + rng = me.selection.getRange(), + div = document.createElement('div'); + + div.appendChild(rng.cloneContents()); + client.setText(div.innerText || div.textContent); + client.setHtml(div.innerHTML); + rng.select(); + }); + // hover事件传递到target + client.on('mouseover mouseout', function (e) { + var target = e.target; + if (e.type == 'mouseover') { + domUtils.addClass(target, 'edui-state-hover'); + } else if (e.type == 'mouseout') { + domUtils.removeClasses(target, 'edui-state-hover'); + } + }); + // flash加载不成功 + client.on('wrongflash noflash', function () { + ZeroClipboard.destroy(); + }); + } + + return { + bindEvents: { + 'ready': function () { + if (!browser.ie) { + if (window.ZeroClipboard) { + initZeroClipboard(); + } else { + utils.loadFile(document, { + src: me.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + initZeroClipboard(); + }); + } + } + } + }, + commands: { + 'copy': { + execCommand: function (cmd) { + if (!me.document.execCommand('copy')) { + alert(me.getLang('copymsg')); + } + } + } + } + } +}); + + +// plugins/paste.js +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 +/** + * @description 粘贴 + * @author zhanyi + */ +UE.plugins['paste'] = function () { + function getClipboardData(callback) { + var doc = this.document; + if (doc.getElementById('baidu_pastebin')) { + return; + } + var range = this.selection.getRange(), + bk = range.createBookmark(), + //创建剪贴的容器div + pastebin = doc.createElement('div'); + pastebin.id = 'baidu_pastebin'; + // Safari 要求div必须有内容,才能粘贴内容进来 + browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar)); + doc.body.appendChild(pastebin); + //trace:717 隐藏的span不能得到top + //bk.start.innerHTML = ' '; + bk.start.style.display = ''; + pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + + //要在现在光标平行的位置加入,否则会出现跳动的问题 + domUtils.getXY(bk.start).y + 'px'; + + range.selectNodeContents(pastebin).select(true); + + setTimeout(function () { + if (browser.webkit) { + for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) { + if (domUtils.isEmptyNode(pi)) { + domUtils.remove(pi); + } else { + pastebin = pi; + break; + } + } + } + try { + pastebin.parentNode.removeChild(pastebin); + } catch (e) { + } + range.moveToBookmark(bk).select(true); + callback(pastebin); + }, 0); + } + + var me = this; + + me.setOpt({ + retainOnlyLabelPasted : false + }); + + var txtContent, htmlContent, address; + + function getPureHtml(html){ + return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function (a, b, tagName, attrs) { + tagName = tagName.toLowerCase(); + if ({img: 1}[tagName]) { + return a; + } + attrs = attrs.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, function (str, atr, val) { + if ({ + 'src': 1, + 'href': 1, + 'name': 1 + }[atr.toLowerCase()]) { + return atr + '=' + val + ' ' + } + return '' + }); + if ({ + 'span': 1, + 'div': 1 + }[tagName]) { + return '' + } else { + + return '<' + b + tagName + ' ' + utils.trim(attrs) + '>' + } + + }); + } + function filter(div) { + var html; + if (div.firstChild) { + //去掉cut中添加的边界值 + var nodes = domUtils.getElementsByTagName(div, 'span'); + for (var i = 0, ni; ni = nodes[i++];) { + if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') { + domUtils.remove(ni); + } + } + + if (browser.webkit) { + + var brs = div.querySelectorAll('div br'); + for (var i = 0, bi; bi = brs[i++];) { + var pN = bi.parentNode; + if (pN.tagName == 'DIV' && pN.childNodes.length == 1) { + pN.innerHTML = '


      '; + domUtils.remove(pN); + } + } + var divs = div.querySelectorAll('#baidu_pastebin'); + for (var i = 0, di; di = divs[i++];) { + var tmpP = me.document.createElement('p'); + di.parentNode.insertBefore(tmpP, di); + while (di.firstChild) { + tmpP.appendChild(di.firstChild); + } + domUtils.remove(di); + } + + var metas = div.querySelectorAll('meta'); + for (var i = 0, ci; ci = metas[i++];) { + domUtils.remove(ci); + } + + var brs = div.querySelectorAll('br'); + for (i = 0; ci = brs[i++];) { + if (/^apple-/i.test(ci.className)) { + domUtils.remove(ci); + } + } + } + if (browser.gecko) { + var dirtyNodes = div.querySelectorAll('[_moz_dirty]'); + for (i = 0; ci = dirtyNodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + } + if (!browser.ie) { + var spans = div.querySelectorAll('span.Apple-style-span'); + for (var i = 0, ci; ci = spans[i++];) { + domUtils.remove(ci, true); + } + } + + //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 + html = div.innerHTML;//.replace(/>(?:(\s| )*?)<'); + + //过滤word粘贴过来的冗余属性 + html = UE.filterWord(html); + //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + //针对chrome的处理 + if (browser.webkit) { + var br = root.lastChild(); + if (br && br.type == 'element' && br.tagName == 'br') { + root.removeChild(br) + } + utils.each(me.body.querySelectorAll('div'), function (node) { + if (domUtils.isEmptyBlock(node)) { + domUtils.remove(node,true) + } + }) + } + html = {'html': root.toHtml()}; + me.fireEvent('beforepaste', html, root); + //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 + if(!html.html){ + return; + } + root = UE.htmlparser(html.html,true); + //如果开启了纯文本模式 + if (me.queryCommandState('pasteplain') === 1) { + me.execCommand('insertHtml', UE.filterNode(root, me.options.filterTxtRules).toHtml(), true); + } else { + //文本模式 + UE.filterNode(root, me.options.filterTxtRules); + txtContent = root.toHtml(); + //完全模式 + htmlContent = html.html; + + address = me.selection.getRange().createAddress(true); + me.execCommand('insertHtml', me.getOpt('retainOnlyLabelPasted') === true ? getPureHtml(htmlContent) : htmlContent, true); + } + me.fireEvent("afterpaste", html); + } + } + + me.addListener('pasteTransfer', function (cmd, plainType) { + + if (address && txtContent && htmlContent && txtContent != htmlContent) { + var range = me.selection.getRange(); + range.moveToAddress(address, true); + + if (!range.collapsed) { + + while (!domUtils.isBody(range.startContainer) + ) { + var start = range.startContainer; + if(start.nodeType == 1){ + start = start.childNodes[range.startOffset]; + if(!start){ + range.setStartBefore(range.startContainer); + continue; + } + var pre = start.previousSibling; + + if(pre && pre.nodeType == 3 && new RegExp('^[\n\r\t '+domUtils.fillChar+']*$').test(pre.nodeValue)){ + range.setStartBefore(pre) + } + } + if(range.startOffset == 0){ + range.setStartBefore(range.startContainer); + }else{ + break; + } + + } + while (!domUtils.isBody(range.endContainer) + ) { + var end = range.endContainer; + if(end.nodeType == 1){ + end = end.childNodes[range.endOffset]; + if(!end){ + range.setEndAfter(range.endContainer); + continue; + } + var next = end.nextSibling; + if(next && next.nodeType == 3 && new RegExp('^[\n\r\t'+domUtils.fillChar+']*$').test(next.nodeValue)){ + range.setEndAfter(next) + } + } + if(range.endOffset == range.endContainer[range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length){ + range.setEndAfter(range.endContainer); + }else{ + break; + } + + } + + } + + range.deleteContents(); + range.select(true); + me.__hasEnterExecCommand = true; + var html = htmlContent; + if (plainType === 2 ) { + html = getPureHtml(html); + } else if (plainType) { + html = txtContent; + } + me.execCommand('inserthtml', html, true); + me.__hasEnterExecCommand = false; + var rng = me.selection.getRange(); + while (!domUtils.isBody(rng.startContainer) && !rng.startOffset && + rng.startContainer[rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + rng.setStartBefore(rng.startContainer); + } + var tmpAddress = rng.createAddress(true); + address.endAddress = tmpAddress.startAddress; + } + }); + + me.addListener('ready', function () { + domUtils.on(me.body, 'cut', function () { + var range = me.selection.getRange(); + if (!range.collapsed && me.undoManger) { + me.undoManger.save(); + } + }); + + //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 + domUtils.on(me.body, browser.ie || browser.opera ? 'keydown' : 'paste', function (e) { + if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) { + return; + } + getClipboardData.call(me, function (div) { + filter(div); + }); + }); + + }); + + me.commands['paste'] = { + execCommand: function (cmd) { + if (browser.ie) { + getClipboardData.call(me, function (div) { + filter(div); + }); + me.document.execCommand('paste'); + } else { + alert(me.getLang('pastemsg')); + } + } + } +}; + + + +// plugins/puretxtpaste.js +/** + * 纯文本粘贴插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['pasteplain'] = function(){ + var me = this; + me.setOpt({ + 'pasteplain':false, + 'filterTxtRules' : function(){ + function transP(node){ + node.tagName = 'p'; + node.setStyle(); + } + function removeNode(node){ + node.parentNode.removeChild(node,true) + } + return { + //直接删除及其字节点内容 + '-' : 'script style object iframe embed input select', + 'p': {$:{}}, + 'br':{$:{}}, + div: function (node) { + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + }, + ol: removeNode, + ul: removeNode, + dl:removeNode, + dt:removeNode, + dd:removeNode, + 'li':removeNode, + 'caption':transP, + 'th':transP, + 'tr':transP, + 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + 'td':function(node){ + //没有内容的td直接删掉 + var txt = !!node.innerText(); + if(txt){ + node.parentNode.insertAfter(UE.uNode.createText('    '),node); + } + node.parentNode.removeChild(node,node.innerText()) + } + } + }() + }); + //暂时这里支持一下老版本的属性 + var pasteplain = me.options.pasteplain; + + /** + * 启用或取消纯文本粘贴模式 + * @command pasteplain + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + + /** + * 查询当前是否处于纯文本粘贴模式 + * @command pasteplain + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果处于纯文本模式,返回1,否则,返回0 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + me.commands['pasteplain'] = { + queryCommandState: function (){ + return pasteplain ? 1 : 0; + }, + execCommand: function (){ + pasteplain = !pasteplain|0; + }, + notNeedUndo : 1 + }; +}; + +// plugins/list.js +/** + * 有序列表,无序列表插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['list'] = function () { + var me = this, + notExchange = { + 'TD':1, + 'PRE':1, + 'BLOCKQUOTE':1 + }; + var customStyle = { + 'cn' : 'cn-1-', + 'cn1' : 'cn-2-', + 'cn2' : 'cn-3-', + 'num': 'num-1-', + 'num1' : 'num-2-', + 'num2' : 'num-3-', + 'dash' : 'dash', + 'dot':'dot' + }; + + me.setOpt( { + 'autoTransWordToList':false, + 'insertorderedlist':{ + 'num':'', + 'num1':'', + 'num2':'', + 'cn':'', + 'cn1':'', + 'cn2':'', + 'decimal':'', + 'lower-alpha':'', + 'lower-roman':'', + 'upper-alpha':'', + 'upper-roman':'' + }, + 'insertunorderedlist':{ + 'circle':'', + 'disc':'', + 'square':'', + 'dash' : '', + 'dot':'' + }, + listDefaultPaddingLeft : '30', + listiconpath : 'http://bs.baidu.com/listicon/', + maxListLevel : -1,//-1不限制 + disablePInList:false + } ); + function listToArray(list){ + var arr = []; + for(var p in list){ + arr.push(p) + } + return arr; + } + var listStyle = { + 'OL':listToArray(me.options.insertorderedlist), + 'UL':listToArray(me.options.insertunorderedlist) + }; + var liiconpath = me.options.listiconpath; + + //根据用户配置,调整customStyle + for(var s in customStyle){ + if(!me.options.insertorderedlist.hasOwnProperty(s) && !me.options.insertunorderedlist.hasOwnProperty(s)){ + delete customStyle[s]; + } + } + + me.ready(function () { + var customCss = []; + for(var p in customStyle){ + if(p == 'dash' || p == 'dot'){ + customCss.push('li.list-' + customStyle[p] + '{background-image:url(' + liiconpath +customStyle[p]+'.gif)}'); + customCss.push('ul.custom_'+p+'{list-style:none;}ul.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); + }else{ + for(var i= 0;i<99;i++){ + customCss.push('li.list-' + customStyle[p] + i + '{background-image:url(' + liiconpath + 'list-'+customStyle[p] + i + '.gif)}') + } + customCss.push('ol.custom_'+p+'{list-style:none;}ol.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch(p){ + case 'cn': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:30px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:55px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:35px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + customCss.push('li.list-'+p+'-paddingleft{padding-left:35px}'); + break; + case 'dot': + customCss.push('li.list-'+p+'-paddingleft{padding-left:20px}'); + } + } + customCss.push('.list-paddingleft-1{padding-left:0}'); + customCss.push('.list-paddingleft-2{padding-left:'+me.options.listDefaultPaddingLeft+'px}'); + customCss.push('.list-paddingleft-3{padding-left:'+me.options.listDefaultPaddingLeft*2+'px}'); + //如果不给宽度会在自定应样式里出现滚动条 + utils.cssRule('list', 'ol,ul{margin:0;pading:0;'+(browser.ie ? '' : 'width:95%')+'}li{clear:both;}'+customCss.join('\n'), me.document); + }); + //单独处理剪切的问题 + me.ready(function(){ + domUtils.on(me.body,'cut',function(){ + setTimeout(function(){ + var rng = me.selection.getRange(),li; + //trace:3416 + if(!rng.collapsed){ + if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ + if(!li.nextSibling && domUtils.isEmptyBlock(li)){ + var pn = li.parentNode,node; + if(node = pn.previousSibling){ + domUtils.remove(pn); + rng.setStartAtLast(node).collapse(true); + rng.select(true); + }else if(node = pn.nextSibling){ + domUtils.remove(pn); + rng.setStartAtFirst(node).collapse(true); + rng.select(true); + }else{ + var tmpNode = me.document.createElement('p'); + domUtils.fillNode(me.document,tmpNode); + pn.parentNode.insertBefore(tmpNode,pn); + domUtils.remove(pn); + rng.setStart(tmpNode,0).collapse(true); + rng.select(true); + } + } + } + } + + }) + }) + }); + + function getStyle(node){ + var cls = node.className; + if(domUtils.hasClass(node,/custom_/)){ + return cls.match(/custom_(\w+)/)[1] + } + return domUtils.getStyle(node, 'list-style-type') + + } + + me.addListener('beforepaste',function(type,html){ + var me = this, + rng = me.selection.getRange(),li; + var root = UE.htmlparser(html.html,true); + if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ + var list = li.parentNode,tagName = list.tagName == 'OL' ? 'ul':'ol'; + utils.each(root.getNodesByTagName(tagName),function(n){ + n.tagName = list.tagName; + n.setAttr(); + if(n.parentNode === root){ + type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc') + }else{ + var className = n.parentNode.getAttr('class'); + if(className && /custom_/.test(className)){ + type = className.match(/custom_(\w+)/)[1] + }else{ + type = n.parentNode.getStyle('list-style-type'); + } + if(!type){ + type = list.tagName == 'OL' ? 'decimal' : 'disc'; + } + } + var index = utils.indexOf(listStyle[list.tagName], type); + if(n.parentNode !== root) + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + if(customStyle[currentStyle]){ + n.setAttr('class', 'custom_' + currentStyle) + + }else{ + n.setStyle('list-style-type',currentStyle) + } + }) + + } + + html.html = root.toHtml(); + }); + //导出时,去掉p标签 + me.getOpt('disablePInList') === true && me.addOutputRule(function(root){ + utils.each(root.getNodesByTagName('li'),function(li){ + var newChildrens = [],index=0; + utils.each(li.children,function(n){ + if(n.tagName == 'p'){ + var tmpNode; + while(tmpNode = n.children.pop()) { + newChildrens.splice(index,0,tmpNode); + tmpNode.parentNode = li; + lastNode = tmpNode; + } + tmpNode = newChildrens[newChildrens.length-1]; + if(!tmpNode || tmpNode.type != 'element' || tmpNode.tagName != 'br'){ + var br = UE.uNode.createElement('br'); + br.parentNode = li; + newChildrens.push(br); + } + + index = newChildrens.length; + } + }); + if(newChildrens.length){ + li.children = newChildrens; + } + }); + }); + //进入编辑器的li要套p标签 + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('li'),function(li){ + var tmpP = UE.uNode.createElement('p'); + for(var i= 0,ci;ci=li.children[i];){ + if(ci.type == 'text' || dtd.p[ci.tagName]){ + tmpP.appendChild(ci); + }else{ + if(tmpP.firstChild()){ + li.insertBefore(tmpP,ci); + tmpP = UE.uNode.createElement('p'); + i = i + 2; + }else{ + i++; + } + + } + } + if(tmpP.firstChild() && !tmpP.parentNode || !li.firstChild()){ + li.appendChild(tmpP); + } + //trace:3357 + //p不能为空 + if (!tmpP.firstChild()) { + tmpP.innerHTML(browser.ie ? ' ' : '
      ') + } + //去掉末尾的空白 + var p = li.firstChild(); + var lastChild = p.lastChild(); + if(lastChild && lastChild.type == 'text' && /^\s*$/.test(lastChild.data)){ + p.removeChild(lastChild) + } + }); + if(me.options.autoTransWordToList){ + var orderlisttype = { + 'num1':/^\d+\)/, + 'decimal':/^\d+\./, + 'lower-alpha':/^[a-z]+\)/, + 'upper-alpha':/^[A-Z]+\./, + 'cn':/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, + 'cn2':/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ + }, + unorderlisttype = { + 'square':'n' + }; + function checkListType(content,container){ + var span = container.firstChild(); + if(span && span.type == 'element' && span.tagName == 'span' && /Wingdings|Symbol/.test(span.getStyle('font-family'))){ + for(var p in unorderlisttype){ + if(unorderlisttype[p] == span.data){ + return p + } + } + return 'disc' + } + for(var p in orderlisttype){ + if(orderlisttype[p].test(content)){ + return p; + } + } + + } + utils.each(root.getNodesByTagName('p'),function(node){ + if(node.getAttr('class') != 'MsoListParagraph'){ + return + } + + //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 + node.setStyle('margin',''); + node.setStyle('margin-left',''); + node.setAttr('class',''); + + function appendLi(list,p,type){ + if(list.tagName == 'ol'){ + if(browser.ie){ + var first = p.firstChild(); + if(first.type =='element' && first.tagName == 'span' && orderlisttype[type].test(first.innerText())){ + p.removeChild(first); + } + }else{ + p.innerHTML(p.innerHTML().replace(orderlisttype[type],'')); + } + }else{ + p.removeChild(p.firstChild()) + } + + var li = UE.uNode.createElement('li'); + li.appendChild(p); + list.appendChild(li); + } + var tmp = node,type,cacheNode = node; + + if(node.parentNode.tagName != 'li' && (type = checkListType(node.innerText(),node))){ + + var list = UE.uNode.createElement(me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul'); + if(customStyle[type]){ + list.setAttr('class','custom_'+type) + }else{ + list.setStyle('list-style-type',type) + } + while(node && node.parentNode.tagName != 'li' && checkListType(node.innerText(),node)){ + tmp = node.nextSibling(); + if(!tmp){ + node.parentNode.insertBefore(list,node) + } + appendLi(list,node,type); + node = tmp; + } + if(!list.parentNode && node && node.parentNode){ + node.parentNode.insertBefore(list,node) + } + } + var span = cacheNode.firstChild(); + if(span && span.type == 'element' && span.tagName == 'span' && /^\s*( )+\s*$/.test(span.innerText())){ + span.parentNode.removeChild(span) + } + }) + } + + }); + + //调整索引标签 + me.addListener('contentchange',function(){ + adjustListStyle(me.document) + }); + + function adjustListStyle(doc,ignore){ + utils.each(domUtils.getElementsByTagName(doc,'ol ul'),function(node){ + + if(!domUtils.inDoc(node,doc)) + return; + + var parent = node.parentNode; + if(parent.tagName == node.tagName){ + var nodeStyleType = getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'), + parentStyleType = getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc'); + if(nodeStyleType == parentStyleType){ + var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType); + styleIndex = styleIndex + 1 == listStyle[node.tagName].length ? 0 : styleIndex + 1; + setListStyle(node,listStyle[node.tagName][styleIndex]) + } + + } + var index = 0,type = 2; + if( domUtils.hasClass(node,/custom_/)){ + if(!(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/))){ + type = 1; + } + }else{ + if(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/)){ + type = 3; + } + } + + var style = domUtils.getStyle(node, 'list-style-type'); + style && (node.style.cssText = 'list-style-type:' + style); + node.className = utils.trim(node.className.replace(/list-paddingleft-\w+/,'')) + ' list-paddingleft-' + type; + utils.each(domUtils.getElementsByTagName(node,'li'),function(li){ + li.style.cssText && (li.style.cssText = ''); + if(!li.firstChild){ + domUtils.remove(li); + return; + } + if(li.parentNode !== node){ + return; + } + index++; + if(domUtils.hasClass(node,/custom_/) ){ + var paddingLeft = 1,currentStyle = getStyle(node); + if(node.tagName == 'OL'){ + if(currentStyle){ + switch(currentStyle){ + case 'cn' : + case 'cn1': + case 'cn2': + if(index > 10 && (index % 10 == 0 || index > 10 && index < 20)){ + paddingLeft = 2 + }else if(index > 20){ + paddingLeft = 3 + } + break; + case 'num2' : + if(index > 9){ + paddingLeft = 2 + } + } + } + li.className = 'list-'+customStyle[currentStyle]+ index + ' ' + 'list-'+currentStyle+'-paddingleft-' + paddingLeft; + }else{ + li.className = 'list-'+customStyle[currentStyle] + ' ' + 'list-'+currentStyle+'-paddingleft'; + } + }else{ + li.className = li.className.replace(/list-[\w\-]+/gi,''); + } + var className = li.getAttribute('class'); + if(className !== null && !className.replace(/\s/g,'')){ + domUtils.removeAttributes(li,'class') + } + }); + !ignore && adjustList(node,node.tagName.toLowerCase(),getStyle(node)||domUtils.getStyle(node, 'list-style-type'),true); + }) + } + function adjustList(list, tag, style,ignoreEmpty) { + var nextList = list.nextSibling; + if (nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (getStyle(nextList) || domUtils.getStyle(nextList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(nextList, list); + if (nextList.childNodes.length == 0) { + domUtils.remove(nextList); + } + } + if(nextList && domUtils.isFillChar(nextList)){ + domUtils.remove(nextList); + } + var preList = list.previousSibling; + if (preList && preList.nodeType == 1 && preList.tagName.toLowerCase() == tag && (getStyle(preList) || domUtils.getStyle(preList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(list, preList); + } + if(preList && domUtils.isFillChar(preList)){ + domUtils.remove(preList); + } + !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); + if(getStyle(list)){ + adjustListStyle(list.ownerDocument,true) + } + } + + function setListStyle(list,style){ + if(customStyle[style]){ + list.className = 'custom_' + style; + } + try{ + domUtils.setStyle(list, 'list-style-type', style); + }catch(e){} + } + function clearEmptySibling(node) { + var tmpNode = node.previousSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + tmpNode = node.nextSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + } + + me.addListener('keydown', function (type, evt) { + function preventAndSave() { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + me.fireEvent('contentchange'); + me.undoManger && me.undoManger.save(); + } + function findList(node,filterFn){ + while(node && !domUtils.isBody(node)){ + if(filterFn(node)){ + return null + } + if(node.nodeType == 1 && /[ou]l/i.test(node.tagName)){ + return node; + } + node = node.parentNode; + } + return null; + } + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13 && !evt.shiftKey) {//回车 + var rng = me.selection.getRange(), + parent = domUtils.findParent(rng.startContainer,function(node){return domUtils.isBlockElm(node)},true), + li = domUtils.findParentByTagName(rng.startContainer,'li',true); + if(parent && parent.tagName != 'PRE' && !li){ + var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, 'g'),''); + if(/^\s*1\s*\.[^\d]/.test(html)){ + parent.innerHTML = html.replace(/^\s*1\s*\./,''); + rng.setStartAtLast(parent).collapse(true).select(); + me.__hasEnterExecCommand = true; + me.execCommand('insertorderedlist'); + me.__hasEnterExecCommand = false; + } + } + var range = me.selection.getRange(), + start = findList(range.startContainer,function (node) { + return node.tagName == 'TABLE'; + }), + end = range.collapsed ? start : findList(range.endContainer,function (node) { + return node.tagName == 'TABLE'; + }); + + if (start && end && start === end) { + + if (!range.collapsed) { + start = domUtils.findParentByTagName(range.startContainer, 'li', true); + end = domUtils.findParentByTagName(range.endContainer, 'li', true); + if (start && end && start === end) { + range.deleteContents(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (li && domUtils.isEmptyBlock(li)) { + + pre = li.previousSibling; + next = li.nextSibling; + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + parentList = li.parentNode; + if (pre && next) { + range.setStart(next, 0).collapse(true).select(true); + domUtils.remove(li); + + } else { + if (!pre && !next || !pre) { + + parentList.parentNode.insertBefore(p, parentList); + + + } else { + li.parentNode.parentNode.insertBefore(p, parentList.nextSibling); + } + domUtils.remove(li); + if (!parentList.firstChild) { + domUtils.remove(parentList); + } + range.setStart(p, 0).setCursor(); + + + } + preventAndSave(); + return; + + } + } else { + var tmpRange = range.cloneRange(), + bk = tmpRange.collapse(false).createBookmark(); + + range.deleteContents(); + tmpRange.moveToBookmark(bk); + var li = domUtils.findParentByTagName(tmpRange.startContainer, 'li', true); + + clearEmptySibling(li); + tmpRange.select(); + preventAndSave(); + return; + } + } + + + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + + if (li) { + if (domUtils.isEmptyBlock(li)) { + bk = range.createBookmark(); + var parentList = li.parentNode; + if (li !== parentList.lastChild) { + domUtils.breakParent(li, parentList); + clearEmptySibling(li); + } else { + + parentList.parentNode.insertBefore(li, parentList.nextSibling); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } + //嵌套不处理 + if (!dtd.$list[li.parentNode.tagName]) { + + if (!domUtils.isBlockElm(li.firstChild)) { + p = me.document.createElement('p'); + li.parentNode.insertBefore(p, li); + while (li.firstChild) { + p.appendChild(li.firstChild); + } + domUtils.remove(li); + } else { + domUtils.remove(li, true); + } + } + range.moveToBookmark(bk).select(); + + + } else { + var first = li.firstChild; + if (!first || !domUtils.isBlockElm(first)) { + var p = me.document.createElement('p'); + + !li.firstChild && domUtils.fillNode(me.document, p); + while (li.firstChild) { + + p.appendChild(li.firstChild); + } + li.appendChild(p); + first = p; + } + + var span = me.document.createElement('span'); + + range.insertNode(span); + domUtils.breakParent(span, li); + + var nextLi = span.nextSibling; + first = nextLi.firstChild; + + if (!first) { + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + nextLi.appendChild(p); + first = p; + } + if (domUtils.isEmptyNode(first)) { + first.innerHTML = ''; + domUtils.fillNode(me.document, first); + } + + range.setStart(first, 0).collapse(true).shrinkBoundary().select(); + domUtils.remove(span); + var pre = nextLi.previousSibling; + if (pre && domUtils.isEmptyBlock(pre)) { + pre.innerHTML = '

      '; + domUtils.fillNode(me.document, pre.firstChild); + } + + } +// } + preventAndSave(); + } + + + } + + + } + if (keyCode == 8) { + //修中ie中li下的问题 + range = me.selection.getRange(); + if (range.collapsed && domUtils.isStartInblock(range)) { + tmpRange = range.cloneRange().trimBoundary(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + //要在li的最左边,才能处理 + if (li && domUtils.isStartInblock(tmpRange)) { + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + if (start && start !== li.firstChild) { + var parentList = domUtils.findParentByTagName(start,['ol','ul']); + domUtils.breakParent(start,parentList); + clearEmptySibling(start); + me.fireEvent('contentchange'); + range.setStart(start,0).setCursor(false,true); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + + if (li && (pre = li.previousSibling)) { + if (keyCode == 46 && li.childNodes.length) { + return; + } + //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li + if (dtd.$list[pre.tagName]) { + pre = pre.lastChild; + } + me.undoManger && me.undoManger.save(); + first = li.firstChild; + if (domUtils.isBlockElm(first)) { + if (domUtils.isEmptyNode(first)) { +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + pre.appendChild(first); + range.setStart(first, 0).setCursor(false, true); + //first不是唯一的节点 + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } else { + + span = me.document.createElement('span'); + range.insertNode(span); + //判断pre是否是空的节点,如果是


      类型的空节点,干掉p标签防止它占位 + if (domUtils.isEmptyBlock(pre)) { + pre.innerHTML = ''; + } + domUtils.moveChild(li, pre); + range.setStartBefore(span).collapse(true).select(true); + + domUtils.remove(span); + + } + } else { + if (domUtils.isEmptyNode(li)) { + var p = me.document.createElement('p'); + pre.appendChild(p); + range.setStart(p, 0).setCursor(); +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + } else { + range.setEnd(pre, pre.childNodes.length).collapse().select(true); + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } + } + domUtils.remove(li); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + //trace:980 + + if (li && !li.previousSibling) { + var parentList = li.parentNode; + var bk = range.createBookmark(); + if(domUtils.isTagNode(parentList.parentNode,'ol ul')){ + parentList.parentNode.insertBefore(li,parentList); + if(domUtils.isEmptyNode(parentList)){ + domUtils.remove(parentList) + } + }else{ + + while(li.firstChild){ + parentList.parentNode.insertBefore(li.firstChild,parentList); + } + + domUtils.remove(li); + if(domUtils.isEmptyNode(parentList)){ + domUtils.remove(parentList) + } + + } + range.moveToBookmark(bk).setCursor(false,true); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + + + } + + + } + + } + }); + + me.addListener('keyup',function(type, evt){ + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8) { + var rng = me.selection.getRange(),list; + if(list = domUtils.findParentByTagName(rng.startContainer,['ol', 'ul'],true)){ + adjustList(list,list.tagName.toLowerCase(),getStyle(list)||domUtils.getComputedStyle(list,'list-style-type'),true) + } + } + }); + //处理tab键 + me.addListener('tabkeydown',function(){ + + var range = me.selection.getRange(); + + //控制级数 + function checkLevel(li){ + if(me.options.maxListLevel != -1){ + var level = li.parentNode,levelNum = 0; + while(/[ou]l/i.test(level.tagName)){ + levelNum++; + level = level.parentNode; + } + if(levelNum >= me.options.maxListLevel){ + return true; + } + } + } + //只以开始为准 + //todo 后续改进 + var li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if(li){ + + var bk; + if(range.collapsed){ + if(checkLevel(li)) + return true; + var parentLi = li.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + setListStyle(list,currentStyle); + if(domUtils.isStartInblock(range)){ + me.fireEvent('saveScene'); + bk = range.createBookmark(); + parentLi.insertBefore(list, li); + list.appendChild(li); + adjustList(list,list.tagName.toLowerCase(),currentStyle); + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(true); + return true; + } + }else{ + me.fireEvent('saveScene'); + bk = range.createBookmark(); + for(var i= 0,closeList,parents = domUtils.findParents(li),ci;ci=parents[i++];){ + if(domUtils.isTagNode(ci,'ol ul')){ + closeList = ci; + break; + } + } + var current = li; + if(bk.end){ + while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ + if(checkLevel(current)){ + current = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); + continue; + } + var parentLi = current.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); + var currentIndex = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][currentIndex]; + setListStyle(list,currentStyle); + parentLi.insertBefore(list, current); + while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ + li = current.nextSibling; + list.appendChild(current); + if(!li || domUtils.isTagNode(li,'ol ul')){ + if(li){ + while(li = li.firstChild){ + if(li.tagName == 'LI'){ + break; + } + } + }else{ + li = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); + } + break; + } + current = li; + } + adjustList(list,list.tagName.toLowerCase(),currentStyle); + current = li; + } + } + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(); + return true; + } + } + + }); + function getLi(start){ + while(start && !domUtils.isBody(start)){ + if(start.nodeName == 'TABLE'){ + return null; + } + if(start.nodeName == 'LI'){ + return start + } + start = start.parentNode; + } + } + + /** + * 有序列表,与“insertunorderedlist”命令互斥 + * @command insertorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.execCommand( 'insertorderedlist','decimal'); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前选区是有序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.queryCommandValue( 'insertorderedlist' ); + * ``` + */ + + /** + * 无序列表,与“insertorderedlist”命令互斥 + * @command insertunorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot + * @example + * ```javascript + * editor.execCommand( 'insertunorderedlist','circle'); + * ``` + */ + /** + * 查询当前是否有word文档粘贴进来的图片 + * @command insertunorderedlist + * @method insertunorderedlist + * @param { String } command 命令字符串 + * @return { int } 如果当前选区是无序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertunorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertunorderedlist + * @method queryCommandValue + * @param { String } command 命令字符串 + * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot + * @example + * ```javascript + * editor.queryCommandValue( 'insertunorderedlist' ); + * ``` + */ + + me.commands['insertorderedlist'] = + me.commands['insertunorderedlist'] = { + execCommand:function (command, style) { + + if (!style) { + style = command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'; + } + var me = this, + range = this.selection.getRange(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul', + frag = me.document.createDocumentFragment(); + //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 + //range.shrinkBoundary();//.adjustmentBoundary(); + range.adjustmentBoundary().shrinkBoundary(); + var bko = range.createBookmark(true), + start = getLi(me.document.getElementById(bko.start)), + modifyStart = 0, + end = getLi(me.document.getElementById(bko.end)), + modifyEnd = 0, + startParent, endParent, + list, tmp; + + if (start || end) { + start && (startParent = start.parentNode); + if (!bko.end) { + end = start; + } + end && (endParent = end.parentNode); + + if (startParent === endParent) { + while (start !== end) { + tmp = start; + start = start.nextSibling; + if (!domUtils.isBlockElm(tmp.firstChild)) { + var p = me.document.createElement('p'); + while (tmp.firstChild) { + p.appendChild(tmp.firstChild); + } + tmp.appendChild(p); + } + frag.appendChild(tmp); + } + tmp = me.document.createElement('span'); + startParent.insertBefore(tmp, end); + if (!domUtils.isBlockElm(end.firstChild)) { + p = me.document.createElement('p'); + while (end.firstChild) { + p.appendChild(end.firstChild); + } + end.appendChild(p); + } + frag.appendChild(end); + domUtils.breakParent(tmp, startParent); + if (domUtils.isEmptyNode(tmp.previousSibling)) { + domUtils.remove(tmp.previousSibling); + } + if (domUtils.isEmptyNode(tmp.nextSibling)) { + domUtils.remove(tmp.nextSibling) + } + var nodeStyle = getStyle(startParent) || domUtils.getComputedStyle(startParent, 'list-style-type') || (command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'); + if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { + for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); ci = frag.firstChild;) { + if(domUtils.isTagNode(ci,'ol ul')){ +// 删除时,子列表不处理 +// utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ +// while(li.firstChild){ +// tmpFrag.appendChild(li.firstChild); +// } +// +// }); + tmpFrag.appendChild(ci); + }else{ + while (ci.firstChild) { + + tmpFrag.appendChild(ci.firstChild); + domUtils.remove(ci); + } + } + + } + tmp.parentNode.insertBefore(tmpFrag, tmp); + } else { + list = me.document.createElement(tag); + setListStyle(list,style); + list.appendChild(frag); + tmp.parentNode.insertBefore(list, tmp); + } + + domUtils.remove(tmp); + list && adjustList(list, tag, style); + range.moveToBookmark(bko).select(); + return; + } + //开始 + if (start) { + while (start) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + var tmpfrag = me.document.createDocumentFragment(), + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + var tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + + start = tmp; + } + startParent.parentNode.insertBefore(frag, startParent.nextSibling); + if (domUtils.isEmptyNode(startParent)) { + range.setStartBefore(startParent); + domUtils.remove(startParent); + } else { + range.setStartAfter(startParent); + } + modifyStart = 1; + } + + if (end && domUtils.inDoc(endParent, me.document)) { + //结束 + start = endParent.firstChild; + while (start && start !== end) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + tmpfrag = me.document.createDocumentFragment(); + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + start = tmp; + } + var tmpDiv = domUtils.createElement(me.document, 'div', { + 'tmpDiv':1 + }); + domUtils.moveChild(end, tmpDiv); + + frag.appendChild(tmpDiv); + domUtils.remove(end); + endParent.parentNode.insertBefore(frag, endParent); + range.setEndBefore(endParent); + if (domUtils.isEmptyNode(endParent)) { + domUtils.remove(endParent); + } + + modifyEnd = 1; + } + + + } + + if (!modifyStart) { + range.setStartBefore(me.document.getElementById(bko.start)); + } + if (bko.end && !modifyEnd) { + range.setEndAfter(me.document.getElementById(bko.end)); + } + range.enlarge(true, function (node) { + return notExchange[node.tagName]; + }); + + frag = me.document.createDocumentFragment(); + + var bk = range.createBookmark(), + current = domUtils.getNextDomNode(bk.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode, + block = domUtils.isBlockElm; + + while (current && current !== bk.end && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING)) { + + if (current.nodeType == 3 || dtd.li[current.tagName]) { + if (current.nodeType == 1 && dtd.$list[current.tagName]) { + while (current.firstChild) { + frag.appendChild(current.firstChild); + } + tmpNode = domUtils.getNextDomNode(current, false, filterFn); + domUtils.remove(current); + current = tmpNode; + continue; + + } + tmpNode = current; + tmpRange.setStartBefore(current); + + while (current && current !== bk.end && (!block(current) || domUtils.isBookmarkNode(current) )) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !notExchange[node.tagName]; + }); + } + + if (current && block(current)) { + tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); + if (tmp && domUtils.isBookmarkNode(tmp)) { + current = domUtils.getNextDomNode(tmp, false, filterFn); + tmpNode = tmp; + } + } + tmpRange.setEndAfter(tmpNode); + + current = domUtils.getNextDomNode(tmpNode, false, filterFn); + + var li = range.document.createElement('li'); + + li.appendChild(tmpRange.extractContents()); + if(domUtils.isEmptyNode(li)){ + var tmpNode = range.document.createElement('p'); + while(li.firstChild){ + tmpNode.appendChild(li.firstChild) + } + li.appendChild(tmpNode); + } + frag.appendChild(li); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + range.moveToBookmark(bk).collapse(true); + list = me.document.createElement(tag); + setListStyle(list,style); + list.appendChild(frag); + range.insertNode(list); + //当前list上下看能否合并 + adjustList(list, tag, style); + //去掉冗余的tmpDiv + for (var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div'); ci = tmpDivs[i++];) { + if (ci.getAttribute('tmpDiv')) { + domUtils.remove(ci, true) + } + } + range.moveToBookmark(bko).select(); + + }, + queryCommandState:function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(); + for(var i= 0,ci;ci = path[i++];){ + if(ci.nodeName == 'TABLE'){ + return 0 + } + if(tag == ci.nodeName.toLowerCase()){ + return 1 + }; + } + return 0; + + }, + queryCommandValue:function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(), + node; + for(var i= 0,ci;ci = path[i++];){ + if(ci.nodeName == 'TABLE'){ + node = null; + break; + } + if(tag == ci.nodeName.toLowerCase()){ + node = ci; + break; + }; + } + return node ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type') : null; + } + }; +}; + + + +// plugins/source.js +/** + * 源码编辑插件 + * @file + * @since 1.2.6.1 + */ + +(function (){ + var sourceEditors = { + textarea: function (editor, holder){ + var textarea = holder.ownerDocument.createElement('textarea'); + textarea.style.cssText = 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;'; + // todo: IE下只有onresize属性可用... 很纠结 + if (browser.ie && browser.version < 8) { + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + holder.onresize = function (){ + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + }; + } + holder.appendChild(textarea); + return { + setContent: function (content){ + textarea.value = content; + }, + getContent: function (){ + return textarea.value; + }, + select: function (){ + var range; + if (browser.ie) { + range = textarea.createTextRange(); + range.collapse(true); + range.select(); + } else { + //todo: chrome下无法设置焦点 + textarea.setSelectionRange(0, 0); + textarea.focus(); + } + }, + dispose: function (){ + holder.removeChild(textarea); + // todo + holder.onresize = null; + textarea = null; + holder = null; + } + }; + }, + codemirror: function (editor, holder){ + + var codeEditor = window.CodeMirror(holder, { + mode: "text/html", + tabMode: "indent", + lineNumbers: true, + lineWrapping:true + }); + var dom = codeEditor.getWrapperElement(); + dom.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; + codeEditor.getScrollerElement().style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;'; + codeEditor.refresh(); + return { + getCodeMirror:function(){ + return codeEditor; + }, + setContent: function (content){ + codeEditor.setValue(content); + }, + getContent: function (){ + return codeEditor.getValue(); + }, + select: function (){ + codeEditor.focus(); + }, + dispose: function (){ + holder.removeChild(dom); + dom = null; + codeEditor = null; + } + }; + } + }; + + UE.plugins['source'] = function (){ + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + var orgSetContent; + opt.sourceEditor = browser.ie ? 'textarea' : (opt.sourceEditor || 'codemirror'); + + me.setOpt({ + sourceEditorFirst:false + }); + function createSourceEditor(holder){ + return sourceEditors[opt.sourceEditor == 'codemirror' && window.CodeMirror ? 'codemirror' : 'textarea'](me, holder); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, + bakAddress; + + /** + * 切换源码模式和编辑模式 + * @command source + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'source'); + * ``` + */ + + /** + * 查询当前编辑区域的状态是源码模式还是可视化模式 + * @command source + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'source' ); + * ``` + */ + + me.commands['source'] = { + execCommand: function (){ + + sourceMode = !sourceMode; + if (sourceMode) { + bakAddress = me.selection.getRange().createAddress(false,true); + me.undoManger && me.undoManger.save(true); + if(browser.gecko){ + me.body.contentEditable = false; + } + + bakCssText = me.iframe.style.cssText; + me.iframe.style.cssText += 'position:absolute;left:-32768px;top:-32768px;'; + + + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML); + me.filterOutputRule(root); + root.traversal(function (node) { + if (node.type == 'element') { + switch (node.tagName) { + case 'td': + case 'th': + case 'caption': + if(node.children && node.children.length == 1){ + if(node.firstChild().tagName == 'br' ){ + node.removeChild(node.firstChild()) + } + }; + break; + case 'pre': + node.innerText(node.innerText().replace(/ /g,' ')) + + } + } + }); + + me.fireEvent('aftergetcontent'); + + var content = root.toHtml(true); + + sourceEditor = createSourceEditor(me.iframe.parentNode); + + sourceEditor.setContent(content); + + orgSetContent = me.setContent; + + me.setContent = function(html){ + //这里暂时不触发事件,防止报错 + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + sourceEditor.setContent(html); + }; + + setTimeout(function (){ + sourceEditor.select(); + me.addListener('fullscreenchanged', function(){ + try{ + sourceEditor.getCodeMirror().refresh() + }catch(e){} + }); + }); + + //重置getContent,源码模式下取值也能是最新的数据 + oldGetContent = me.getContent; + me.getContent = function (){ + return sourceEditor.getContent() || '

      ' + (browser.ie ? '' : '
      ')+'

      '; + }; + } else { + me.iframe.style.cssText = bakCssText; + var cont = sourceEditor.getContent() || '

      ' + (browser.ie ? '' : '
      ')+'

      '; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>','g'), function(a,b){ + if(b && !dtd.$inlineWithA[b.toLowerCase()]){ + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,''); + } + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,'') + }); + + me.setContent = orgSetContent; + + me.setContent(cont); + sourceEditor.dispose(); + sourceEditor = null; + //还原getContent方法 + me.getContent = oldGetContent; + var first = me.body.firstChild; + //trace:1106 都删除空了,下边会报错,所以补充一个p占位 + if(!first){ + me.body.innerHTML = '

      '+(browser.ie?'':'
      ')+'

      '; + first = me.body.firstChild; + } + + + //要在ifm为显示时ff才能取到selection,否则报错 + //这里不能比较位置了 + me.undoManger && me.undoManger.save(true); + + if(browser.gecko){ + + var input = document.createElement('input'); + input.style.cssText = 'position:absolute;left:0;top:-32768px'; + + document.body.appendChild(input); + + me.body.contentEditable = false; + setTimeout(function(){ + domUtils.setViewportOffset(input, { left: -32768, top: 0 }); + input.focus(); + setTimeout(function(){ + me.body.contentEditable = true; + me.selection.getRange().moveToAddress(bakAddress).select(true); + domUtils.remove(input); + }); + + }); + }else{ + //ie下有可能报错,比如在代码顶头的情况 + try{ + me.selection.getRange().moveToAddress(bakAddress).select(true); + }catch(e){} + + } + } + this.fireEvent('sourcemodechanged', sourceMode); + }, + queryCommandState: function (){ + return sourceMode|0; + }, + notNeedUndo : 1 + }; + var oldQueryCommandState = me.queryCommandState; + + me.queryCommandState = function (cmdName){ + cmdName = cmdName.toLowerCase(); + if (sourceMode) { + //源码模式下可以开启的命令 + return cmdName in { + 'source' : 1, + 'fullscreen' : 1 + } ? 1 : -1 + } + return oldQueryCommandState.apply(this, arguments); + }; + + if(opt.sourceEditor == "codemirror"){ + + me.addListener("ready",function(){ + utils.loadFile(document,{ + src : opt.codeMirrorJsUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + if(opt.sourceEditorFirst){ + setTimeout(function(){ + me.execCommand("source"); + },0); + } + }); + utils.loadFile(document,{ + tag : "link", + rel : "stylesheet", + type : "text/css", + href : opt.codeMirrorCssUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css" + }); + + }); + } + + }; + +})(); + +// plugins/enterkey.js +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br +/** + * @description 处理回车 + * @author zhanyi + */ +UE.plugins['enterkey'] = function() { + var hTag, + me = this, + tag = me.options.enterTag; + me.addListener('keyup', function(type, evt) { + + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var range = me.selection.getRange(), + start = range.startContainer, + doSave; + + //修正在h1-h6里边回车后不能嵌套p的问题 + if (!browser.ie) { + + if (/h\d/i.test(hTag)) { + if (browser.gecko) { + var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true); + if (!h) { + me.document.execCommand('formatBlock', false, '

      '); + doSave = 1; + } + } else { + //chrome remove div + if (start.nodeType == 1) { + var tmp = me.document.createTextNode(''),div; + range.insertNode(tmp); + div = domUtils.findParentByTagName(tmp, 'div', true); + if (div) { + var p = me.document.createElement('p'); + while (div.firstChild) { + p.appendChild(div.firstChild); + } + div.parentNode.insertBefore(p, div); + domUtils.remove(div); + range.setStartBefore(tmp).setCursor(); + doSave = 1; + } + domUtils.remove(tmp); + + } + } + + if (me.undoManger && doSave) { + me.undoManger.save(); + } + } + //没有站位符,会出现多行的问题 + browser.opera && range.select(); + }else{ + me.fireEvent('saveScene',true,true) + } + } + }); + + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) {//回车 + if(me.fireEvent('beforeenterkeydown')){ + domUtils.preventDefault(evt); + return; + } + me.fireEvent('saveScene',true,true); + hTag = ''; + + + var range = me.selection.getRange(); + + if (!range.collapsed) { + //跨td不能删 + var start = range.startContainer, + end = range.endContainer, + startTd = domUtils.findParentByTagName(start, 'td', true), + endTd = domUtils.findParentByTagName(end, 'td', true); + if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + return; + } + } + if (tag == 'p') { + + + if (!browser.ie) { + + start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true); + + //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command + //trace:2431 + if (!start && !browser.opera) { + + me.document.execCommand('formatBlock', false, '

      '); + + if (browser.gecko) { + range = me.selection.getRange(); + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + start && domUtils.removeDirtyAttr(start); + } + + + } else { + hTag = start.tagName; + start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start); + } + + } + + } else { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + + if (!range.collapsed) { + range.deleteContents(); + start = range.startContainer; + if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) { + while (start.nodeType == 1) { + if (dtd.$empty[start.tagName]) { + range.setStartBefore(start).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + if (!start.firstChild) { + var br = range.document.createElement('br'); + start.appendChild(br); + range.setStart(start, 0).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + start = start.firstChild; + } + if (start === range.startContainer.childNodes[range.startOffset]) { + br = range.document.createElement('br'); + range.insertNode(br).setCursor(); + + } else { + range.setStart(start, 0).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br).setStartAfter(br).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br); + var parent = br.parentNode; + if (parent.lastChild === br) { + br.parentNode.insertBefore(br.cloneNode(true), br); + range.setStartBefore(br); + } else { + range.setStartAfter(br); + } + range.setCursor(); + + } + + } + + } + }); +}; + + +// plugins/keystrokes.js +/* 处理特殊键的兼容性问题 */ +UE.plugins['keystrokes'] = function() { + var me = this; + var collapsed = true; + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng = me.selection.getRange(); + + //处理全选的情况 + if(!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <=90 + || keyCode >= 48 && keyCode <= 57 || + keyCode >= 96 && keyCode <= 111 || { + 13:1, + 8:1, + 46:1 + }[keyCode]) + ){ + + var tmpNode = rng.startContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setStartBefore(tmpNode) + } + tmpNode = rng.endContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setEndAfter(tmpNode) + } + rng.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
      + if(rng.endContainer && rng.endContainer.nodeType == 1){ + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + rng.setEndAfter(tmpNode); + } + } + if(rng.startOffset == 0){ + tmpNode = rng.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = rng.endContainer; + if(rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.fireEvent('saveScene'); + me.body.innerHTML = '

      '+(browser.ie ? '' : '
      ')+'

      '; + rng.setStart(me.body.firstChild,0).setCursor(false,true); + me._selectionChange(); + return; + } + } + } + } + + //处理backspace + if (keyCode == keymap.Backspace) { + rng = me.selection.getRange(); + collapsed = rng.collapsed; + if(me.fireEvent('delkeydown',evt)){ + return; + } + var start,end; + //避免按两次删除才能生效的问题 + if(rng.collapsed && rng.inFillChar()){ + start = rng.startContainer; + + if(domUtils.isFillChar(start)){ + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + domUtils.remove(start) + }else{ + start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar ),''); + rng.startOffset--; + rng.collapse(true).select(true) + } + } + + //解决选中control元素不能删除的问题 + if (start = rng.getClosedNode()) { + me.fireEvent('saveScene'); + rng.setStartBefore(start); + domUtils.remove(start); + rng.setCursor(); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + //阻止在table上的删除 + if (!browser.ie) { + start = domUtils.findParentByTagName(rng.startContainer, 'table', true); + end = domUtils.findParentByTagName(rng.endContainer, 'table', true); + if (start && !end || !start && end || start !== end) { + evt.preventDefault(); + return; + } + } + + } + //处理tab键的逻辑 + if (keyCode == keymap.Tab) { + //不处理以下标签 + var excludeTagNameForTabKey = { + 'ol' : 1, + 'ul' : 1, + 'table':1 + }; + //处理组件里的tab按下事件 + if(me.fireEvent('tabkeydown',evt)){ + domUtils.preventDefault(evt); + return; + } + var range = me.selection.getRange(); + me.fireEvent('saveScene'); + for (var i = 0,txt = '',tabSize = me.options.tabSize|| 4,tabNode = me.options.tabNode || ' '; i < tabSize; i++) { + txt += tabNode; + } + var span = me.document.createElement('span'); + span.innerHTML = txt + domUtils.fillChar; + if (range.collapsed) { + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var filterFn = function(node) { + return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()] + + }; + //普通的情况 + start = domUtils.findParent(range.startContainer, filterFn,true); + end = domUtils.findParent(range.endContainer, filterFn,true); + if (start && end && start === end) { + range.deleteContents(); + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); + current = domUtils.getNextDomNode(current, false, filterFn); + } + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } + } + domUtils.preventDefault(evt) + } + //trace:1634 + //ff的del键在容器空的时候,也会删除 + if(browser.gecko && keyCode == 46){ + range = me.selection.getRange(); + if(range.collapsed){ + start = range.startContainer; + if(domUtils.isEmptyBlock(start)){ + var parent = start.parentNode; + while(domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)){ + start = parent; + parent = parent.parentNode; + } + if(start === parent.lastChild) + evt.preventDefault(); + return; + } + } + } + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng,me = this; + if(keyCode == keymap.Backspace){ + if(me.fireEvent('delkeyup')){ + return; + } + rng = me.selection.getRange(); + if(rng.collapsed){ + var tmpNode, + autoClearTagName = ['h1','h2','h3','h4','h5','h6']; + if(tmpNode = domUtils.findParentByTagName(rng.startContainer,autoClearTagName,true)){ + if(domUtils.isEmptyBlock(tmpNode)){ + var pre = tmpNode.previousSibling; + if(pre && pre.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtLast(pre).setCursor(false,true); + return; + }else{ + var next = tmpNode.nextSibling; + if(next && next.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtFirst(next).setCursor(false,true); + return; + } + } + } + } + //处理当删除到body时,要重新给p标签展位 + if(domUtils.isBody(rng.startContainer)){ + var tmpNode = domUtils.createElement(me.document,'p',{ + 'innerHTML' : browser.ie ? domUtils.fillChar : '
      ' + }); + rng.insertNode(tmpNode).setStart(tmpNode,0).setCursor(false,true); + } + } + + + //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 + if( !collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))){ + if(browser.ie){ + var span = rng.document.createElement('span'); + rng.insertNode(span).setStartBefore(span).collapse(true); + rng.select(); + domUtils.remove(span) + }else{ + rng.select() + } + + } + } + + + }) +}; + +// plugins/fiximgclick.js +///import core +///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 +///commandsName FixImgClick +///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小 +//修复chrome下图片不能点击的问题,出现八个角可改变大小 + +UE.plugins['fiximgclick'] = (function () { + + var elementUpdated = false; + function Scale() { + this.editor = null; + this.resizer = null; + this.cover = null; + this.doc = document; + this.prePos = {x: 0, y: 0}; + this.startPos = {x: 0, y: 0}; + } + + (function () { + var rect = [ + //[left, top, width, height] + [0, 0, -1, -1], + [0, 0, 0, -1], + [0, 0, 1, -1], + [0, 0, -1, 0], + [0, 0, 1, 0], + [0, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + + Scale.prototype = { + init: function (editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = {x: 0, y: 0}; + me.dragId = -1; + + var hands = [], + cover = me.cover = document.createElement('div'), + resizer = me.resizer = document.createElement('div'); + + cover.id = me.editor.ui.id + '_imagescale_cover'; + cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;'; + domUtils.on(cover, 'mousedown click', function () { + me.hide(); + }); + + for (i = 0; i < 8; i++) { + hands.push(''); + } + resizer.id = me.editor.ui.id + '_imagescale'; + resizer.className = 'edui-editor-imagescale'; + resizer.innerHTML = hands.join(''); + resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';'; + + me.editor.ui.getDom().appendChild(cover); + me.editor.ui.getDom().appendChild(resizer); + + me.initStyle(); + me.initEvents(); + }, + initStyle: function () { + utils.cssRule('imagescale', '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' + + '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'); + }, + initEvents: function () { + var me = this; + + me.startPos.x = me.startPos.y = 0; + me.isDraging = false; + }, + _eventHandler: function (e) { + var me = this; + switch (e.type) { + case 'mousedown': + var hand = e.target || e.srcElement, hand; + if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) { + me.dragId = hand.className.slice(-1); + me.startPos.x = me.prePos.x = e.clientX; + me.startPos.y = me.prePos.y = e.clientY; + domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me)); + } + break; + case 'mousemove': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.prePos.x = e.clientX; + me.prePos.y = e.clientY; + elementUpdated = true; + me.updateTargetElement(); + + } + break; + case 'mouseup': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.updateTargetElement(); + if (me.target.parentNode) me.attachTo(me.target); + me.dragId = -1; + } + domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me)); + //修复只是点击挪动点,但没有改变大小,不应该触发contentchange + if(elementUpdated){ + elementUpdated = false; + me.editor.fireEvent('contentchange'); + } + + break; + default: + break; + } + }, + updateTargetElement: function () { + var me = this; + domUtils.setStyles(me.target, { + 'width': me.resizer.style.width, + 'height': me.resizer.style.height + }); + me.target.width = parseInt(me.resizer.style.width); + me.target.height = parseInt(me.resizer.style.height); + me.attachTo(me.target); + }, + updateContainerStyle: function (dir, offset) { + var me = this, + dom = me.resizer, tmp; + + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + }, + _validScaledProp: function (prop, value) { + var ele = this.resizer, + wrap = document; + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + }, + hideCover: function () { + this.cover.style.display = 'none'; + }, + showCover: function () { + var me = this, + editorPos = domUtils.getXY(me.editor.ui.getDom()), + iframePos = domUtils.getXY(me.editor.iframe); + + domUtils.setStyles(me.cover, { + 'width': me.editor.iframe.offsetWidth + 'px', + 'height': me.editor.iframe.offsetHeight + 'px', + 'top': iframePos.y - editorPos.y + 'px', + 'left': iframePos.x - editorPos.x + 'px', + 'position': 'absolute', + 'display': '' + }) + }, + show: function (targetObj) { + var me = this; + me.resizer.style.display = 'block'; + if(targetObj) me.attachTo(targetObj); + + domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + + me.showCover(); + me.editor.fireEvent('afterscaleshow', me); + me.editor.fireEvent('saveScene'); + }, + hide: function () { + var me = this; + me.hideCover(); + me.resizer.style.display = 'none'; + + domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + me.editor.fireEvent('afterscalehide', me); + }, + proxy: function( fn, context ) { + return function(e) { + return fn.apply( context || this, arguments); + }; + }, + attachTo: function (targetObj) { + var me = this, + target = me.target = targetObj, + resizer = this.resizer, + imgPos = domUtils.getXY(target), + iframePos = domUtils.getXY(me.editor.iframe), + editorPos = domUtils.getXY(resizer.parentNode); + + domUtils.setStyles(resizer, { + 'width': target.width + 'px', + 'height': target.height + 'px', + 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px', + 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px' + }); + } + } + })(); + + return function () { + var me = this, + imageScale; + + me.setOpt('imageScaleEnabled', true); + + if ( !browser.ie && me.options.imageScaleEnabled) { + me.addListener('click', function (type, e) { + + var range = me.selection.getRange(), + img = range.getClosedNode(); + + if (img && img.tagName == 'IMG' && me.body.contentEditable!="false") { + + if (img.className.indexOf("edui-faked-music") != -1 || + img.getAttribute("anchorname") || + domUtils.hasClass(img, 'loadingclass') || + domUtils.hasClass(img, 'loaderrorclass')) { return } + + if (!imageScale) { + imageScale = new Scale(); + imageScale.init(me); + me.ui.getDom().appendChild(imageScale.resizer); + + var _keyDownHandler = function (e) { + imageScale.hide(); + if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select(); + }, _mouseDownHandler = function (e) { + var ele = e.target || e.srcElement; + if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) { + _keyDownHandler(e); + } + }, timer; + + me.addListener('afterscaleshow', function (e) { + me.addListener('beforekeydown', _keyDownHandler); + me.addListener('beforemousedown', _mouseDownHandler); + domUtils.on(document, 'keydown', _keyDownHandler); + domUtils.on(document,'mousedown', _mouseDownHandler); + me.selection.getNative().removeAllRanges(); + }); + me.addListener('afterscalehide', function (e) { + me.removeListener('beforekeydown', _keyDownHandler); + me.removeListener('beforemousedown', _mouseDownHandler); + domUtils.un(document, 'keydown', _keyDownHandler); + domUtils.un(document,'mousedown', _mouseDownHandler); + var target = imageScale.target; + if (target.parentNode) { + me.selection.getRange().selectNode(target).select(); + } + }); + //TODO 有iframe的情况,mousedown不能往下传。。 + domUtils.on(imageScale.resizer, 'mousedown', function (e) { + me.selection.getNative().removeAllRanges(); + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + timer = setTimeout(function () { + imageScale.hide(); + if(imageScale.target) me.selection.getRange().selectNode(ele).select(); + }, 200); + } + }); + domUtils.on(imageScale.resizer, 'mouseup', function (e) { + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + clearTimeout(timer); + } + }); + } + imageScale.show(img); + } else { + if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide(); + } + }); + } + + if (browser.webkit) { + me.addListener('click', function (type, e) { + if (e.target.tagName == 'IMG' && me.body.contentEditable!="false") { + var range = new dom.Range(me.document); + range.selectNode(e.target).select(); + } + }); + } + } +})(); + +// plugins/autolink.js +///import core +///commands 为非ie浏览器自动添加a标签 +///commandsName AutoLink +///commandsTitle 自动增加链接 +/** + * @description 为非ie浏览器自动添加a标签 + * @author zhanyi + */ + +UE.plugin.register('autolink',function(){ + var cont = 0; + + return !browser.ie ? { + + bindEvents:{ + 'reset' : function(){ + cont = 0; + }, + 'keydown':function(type, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + + var sel = me.selection.getNative(), + range = sel.getRangeAt(0).cloneRange(), + offset, + charCode; + + var start = range.startContainer; + while (start.nodeType == 1 && range.startOffset > 0) { + start = range.startContainer.childNodes[range.startOffset - 1]; + if (!start){ + break; + } + range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length); + range.collapse(true); + start = range.startContainer; + } + + do{ + if (range.startOffset == 0) { + start = range.startContainer.previousSibling; + + while (start && start.nodeType == 1) { + start = start.lastChild; + } + if (!start || domUtils.isFillChar(start)){ + break; + } + offset = start.nodeValue.length; + } else { + start = range.startContainer; + offset = range.startOffset; + } + range.setStart(start, offset - 1); + charCode = range.toString().charCodeAt(0); + } while (charCode != 160 && charCode != 32); + + if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) { + while(range.toString().length){ + if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){ + break; + } + try{ + range.setStart(range.startContainer,range.startOffset+1); + }catch(e){ + //trace:2121 + var start = range.startContainer; + while(!(next = start.nextSibling)){ + if(domUtils.isBody(start)){ + return; + } + start = start.parentNode; + + } + range.setStart(next,0); + + } + + } + //range的开始边界已经在a标签里的不再处理 + if(domUtils.findParentByTagName(range.startContainer,'a',true)){ + return; + } + var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href; + + me.undoManger && me.undoManger.save(); + a.appendChild(range.extractContents()); + a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,''); + href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),''); + href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href; + a.setAttribute('_src',utils.html(href)); + a.href = utils.html(href); + + range.insertNode(a); + a.parentNode.insertBefore(text, a.nextSibling); + range.setStart(text, 0); + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + me.undoManger && me.undoManger.save(); + } + } + } + } + }:{} + },function(){ + var keyCodes = { + 37:1, 38:1, 39:1, 40:1, + 13:1,32:1 + }; + function checkIsCludeLink(node){ + if(node.nodeType == 3){ + return null + } + if(node.nodeName == 'A'){ + return node; + } + var lastChild = node.lastChild; + + while(lastChild){ + if(lastChild.nodeName == 'A'){ + return lastChild; + } + if(lastChild.nodeType == 3){ + if(domUtils.isWhitespace(lastChild)){ + lastChild = lastChild.previousSibling; + continue; + } + return null + } + lastChild = lastChild.lastChild; + } + } + browser.ie && this.addListener('keyup',function(cmd,evt){ + var me = this,keyCode = evt.keyCode; + if(keyCodes[keyCode]){ + var rng = me.selection.getRange(); + var start = rng.startContainer; + + if(keyCode == 13){ + while(start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)){ + start = start.parentNode; + } + if(start && !domUtils.isBody(start) && start.nodeName == 'P'){ + var pre = start.previousSibling; + if(pre && pre.nodeType == 1){ + var pre = checkIsCludeLink(pre); + if(pre && !pre.getAttribute('_href')){ + domUtils.remove(pre,true); + } + } + } + }else if(keyCode == 32 ){ + if(start.nodeType == 3 && /^\s$/.test(start.nodeValue)){ + start = start.previousSibling; + if(start && start.nodeName == 'A' && !start.getAttribute('_href')){ + domUtils.remove(start,true); + } + } + }else { + start = domUtils.findParentByTagName(start,'a',true); + if(start && !start.getAttribute('_href')){ + var bk = rng.createBookmark(); + + domUtils.remove(start,true); + rng.moveToBookmark(bk).select(true) + } + } + + } + + + }); + } +); + +// plugins/autoheight.js +///import core +///commands 当输入内容超过编辑器高度时,编辑器自动增高 +///commandsName AutoHeight,autoHeightEnabled +///commandsTitle 自动增高 +/** + * @description 自动伸展 + * @author zhanyi + */ +UE.plugins['autoheight'] = function () { + var me = this; + //提供开关,就算加载也可以关闭 + me.autoHeightEnabled = me.options.autoHeightEnabled !== false; + if (!me.autoHeightEnabled) { + return; + } + + var bakOverflow, + lastHeight = 0, + options = me.options, + currentHeight, + timer; + + function adjustHeight() { + var me = this; + clearTimeout(timer); + if(isFullscreen)return; + if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) { + timer = setTimeout(function(){ + + var node = me.body.lastChild; + while(node && node.nodeType != 1){ + node = node.previousSibling; + } + if(node && node.nodeType == 1){ + node.style.clear = 'both'; + currentHeight = Math.max(domUtils.getXY(node).y + node.offsetHeight + 25 ,Math.max(options.minFrameHeight, options.initialFrameHeight)) ; + if (currentHeight != lastHeight) { + if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { + me.iframe.parentNode.style.height = currentHeight + 'px'; + } + me.body.style.height = currentHeight + 'px'; + lastHeight = currentHeight; + } + domUtils.removeStyle(node,'clear'); + } + + + },50) + } + } + var isFullscreen; + me.addListener('fullscreenchanged',function(cmd,f){ + isFullscreen = f + }); + me.addListener('destroy', function () { + me.removeListener('contentchange afterinserthtml keyup mouseup',adjustHeight) + }); + me.enableAutoHeight = function () { + var me = this; + if (!me.autoHeightEnabled) { + return; + } + var doc = me.document; + me.autoHeightEnabled = true; + bakOverflow = doc.body.style.overflowY; + doc.body.style.overflowY = 'hidden'; + me.addListener('contentchange afterinserthtml keyup mouseup',adjustHeight); + //ff不给事件算得不对 + + setTimeout(function () { + adjustHeight.call(me); + }, browser.gecko ? 100 : 0); + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + me.disableAutoHeight = function () { + + me.body.style.overflowY = bakOverflow || ''; + + me.removeListener('contentchange', adjustHeight); + me.removeListener('keyup', adjustHeight); + me.removeListener('mouseup', adjustHeight); + me.autoHeightEnabled = false; + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + + me.on('setHeight',function(){ + me.disableAutoHeight() + }); + me.addListener('ready', function () { + me.enableAutoHeight(); + //trace:1764 + var timer; + domUtils.on(browser.ie ? me.body : me.document, browser.webkit ? 'dragover' : 'drop', function () { + clearTimeout(timer); + timer = setTimeout(function () { + //trace:3681 + adjustHeight.call(me); + }, 100); + + }); + //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 + var lastScrollY; + window.onscroll = function(){ + if(lastScrollY === null){ + lastScrollY = this.scrollY + }else if(this.scrollY == 0 && lastScrollY != 0){ + me.window.scrollTo(0,0); + lastScrollY = null; + } + } + }); + + +}; + + + +// plugins/autofloat.js +///import core +///commands 悬浮工具栏 +///commandsName AutoFloat,autoFloatEnabled +///commandsTitle 悬浮工具栏 +/** + * modified by chengchao01 + * 注意: 引入此功能后,在IE6下会将body的背景图片覆盖掉! + */ +UE.plugins['autofloat'] = function() { + var me = this, + lang = me.getLang(); + me.setOpt({ + topOffset:0 + }); + var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, + topOffset = me.options.topOffset; + + + //如果不固定toolbar的位置,则直接退出 + if(!optsAutoFloatEnabled){ + return; + } + var uiUtils = UE.ui.uiUtils, + LteIE6 = browser.ie && browser.version <= 6, + quirks = browser.quirks; + + function checkHasUI(){ + if(!UE.ui){ + alert(lang.autofloatMsg); + return 0; + } + return 1; + } + function fixIE6FixedPos(){ + var docStyle = document.body.style; + docStyle.backgroundImage = 'url("about:blank")'; + docStyle.backgroundAttachment = 'fixed'; + } + var bakCssText, + placeHolder = document.createElement('div'), + toolbarBox,orgTop, + getPosition, + flag =true; //ie7模式下需要偏移 + function setFloating(){ + var toobarBoxPos = domUtils.getXY(toolbarBox), + origalFloat = domUtils.getComputedStyle(toolbarBox,'position'), + origalLeft = domUtils.getComputedStyle(toolbarBox,'left'); + toolbarBox.style.width = toolbarBox.offsetWidth + 'px'; + toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; + toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); + if (LteIE6 || (quirks && browser.ie)) { + if(toolbarBox.style.position != 'absolute'){ + toolbarBox.style.position = 'absolute'; + } + toolbarBox.style.top = (document.body.scrollTop||document.documentElement.scrollTop) - orgTop + topOffset + 'px'; + } else { + if (browser.ie7Compat && flag) { + flag = false; + toolbarBox.style.left = domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left+2 + 'px'; + } + if(toolbarBox.style.position != 'fixed'){ + toolbarBox.style.position = 'fixed'; + toolbarBox.style.top = topOffset +"px"; + ((origalFloat == 'absolute' || origalFloat == 'relative') && parseFloat(origalLeft)) && (toolbarBox.style.left = toobarBoxPos.x + 'px'); + } + } + } + function unsetFloating(){ + flag = true; + if(placeHolder.parentNode){ + placeHolder.parentNode.removeChild(placeHolder); + } + + toolbarBox.style.cssText = bakCssText; + } + + function updateFloating(){ + var rect3 = getPosition(me.container); + var offset=me.options.toolbarTopOffset||0; + if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { + setFloating(); + }else{ + unsetFloating(); + } + } + var defer_updateFloating = utils.defer(function(){ + updateFloating(); + },browser.ie ? 200 : 100,true); + + me.addListener('destroy',function(){ + domUtils.un(window, ['scroll','resize'], updateFloating); + me.removeListener('keydown', defer_updateFloating); + }); + + me.addListener('ready', function(){ + if(checkHasUI(me)){ + //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 + if(!me.ui){ + return; + } + getPosition = uiUtils.getClientRect; + toolbarBox = me.ui.getDom('toolbarbox'); + orgTop = getPosition(toolbarBox).top; + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + if(LteIE6){ + fixIE6FixedPos(); + } + domUtils.on(window, ['scroll','resize'], updateFloating); + me.addListener('keydown', defer_updateFloating); + + me.addListener('beforefullscreenchange', function (t, enabled){ + if (enabled) { + unsetFloating(); + } + }); + me.addListener('fullscreenchanged', function (t, enabled){ + if (!enabled) { + updateFloating(); + } + }); + me.addListener('sourcemodechanged', function (t, enabled){ + setTimeout(function (){ + updateFloating(); + },0); + }); + me.addListener("clearDoc",function(){ + setTimeout(function(){ + updateFloating(); + },0); + + }) + } + }); +}; + + +// plugins/video.js +/** + * video插件, 为UEditor提供视频插入支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['video'] = function (){ + var me =this; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url,width,height,id,align,classname,type){ + + url = utils.unhtmlForUrl(url); + align = utils.unhtml(align); + classname = utils.unhtml(classname); + + width = parseInt(width, 10) || 0; + height = parseInt(height, 10) || 0; + + var str; + switch (type){ + case 'image': + str = '' + break; + case 'embed': + str = ''; + break; + case 'video': + var ext = url.substr(url.lastIndexOf('.') + 1); + if(ext == 'ogv') ext = 'ogg'; + str = '' + + ''; + break; + } + return str; + } + + function switchImgAndVideo(root,img2video){ + utils.each(root.getNodesByTagName(img2video ? 'img' : 'embed video'),function(node){ + var className = node.getAttr('class'); + if(className && className.indexOf('edui-faked-video') != -1){ + var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'embed':'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html),node); + } + if(className && className.indexOf('edui-upload-video') != -1){ + var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'video':'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html),node); + } + }) + } + + me.addOutputRule(function(root){ + switchImgAndVideo(root,true) + }); + me.addInputRule(function(root){ + switchImgAndVideo(root) + }); + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }; + * + * //editor 是编辑器实例 + * //向编辑器插入单个视频 + * editor.execCommand( 'insertvideo', videoAttr ); + * ``` + */ + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr1 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }, + * videoAttr2 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * } + * + * //editor 是编辑器实例 + * //该方法将会向编辑器内插入两个视频 + * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); + * ``` + */ + + /** + * 查询当前光标所在处是否是一个视频 + * @command insertvideo + * @method queryCommandState + * @param { String } cmd 需要查询的命令字符串 + * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 + * @example + * ```javascript + * + * //editor 是编辑器实例 + * editor.queryCommandState( 'insertvideo' ); + * ``` + */ + me.commands["insertvideo"] = { + execCommand: function (cmd, videoObjs, type){ + videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs]; + var html = [],id = 'tmpVedio', cl; + for(var i=0,vi,len = videoObjs.length;i 0) { + return 0; + } + for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) { + if (node.getElementsByTagName(i).length) { + return 0; + } + } + return 1; + }; + UETable.getWidth = function (cell) { + if (!cell)return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + }; + + /** + * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 + * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; + * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 + * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null + */ + UETable.getTableCellAlignState = function ( cells ) { + + !utils.isArray( cells ) && ( cells = [cells] ); + + var result = {}, + status = ['align', 'valign'], + tempStatus = null, + isSame = true;//状态是否相同 + + utils.each( cells, function( cellNode ){ + + utils.each( status, function( currentState ){ + + tempStatus = cellNode.getAttribute( currentState ); + + if( !result[ currentState ] && tempStatus ) { + result[ currentState ] = tempStatus; + } else if( !result[ currentState ] || ( tempStatus !== result[ currentState ] ) ) { + isSame = false; + return false; + } + + } ); + + return isSame; + + }); + + return isSame ? result : null; + + }; + + /** + * 根据当前选区获取相关的table信息 + * @return {Object} + */ + UETable.getTableItemsByRange = function (editor) { + var start = editor.selection.getStart(); + + //ff下会选中bookmark + if( start && start.id && start.id.indexOf('_baidu_bookmark_start_') === 0 && start.nextSibling) { + start = start.nextSibling; + } + + //在table或者td边缘有可能存在选中tr的情况 + var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), + tr = cell && cell.parentNode, + caption = start && domUtils.findParentByTagName(start, 'caption', true), + table = caption ? caption.parentNode : tr && tr.parentNode.parentNode; + + return { + cell:cell, + tr:tr, + table:table, + caption:caption + } + }; + UETable.getUETableBySelected = function (editor) { + var table = UETable.getTableItemsByRange(editor).table; + if (table && table.ueTable && table.ueTable.selectedTds.length) { + return table.ueTable; + } + return null; + }; + + UETable.getDefaultValue = function (editor, table) { + var borderMap = { + thin:'0px', + medium:'1px', + thick:'2px' + }, + tableBorder, tdPadding, tdBorder, tmpValue; + if (!table) { + table = editor.document.createElement('table'); + table.insertRow(0).insertCell(0).innerHTML = 'xxx'; + editor.body.appendChild(table); + var td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + domUtils.remove(table); + return { + tableBorder:tableBorder, + tdPadding:tdPadding, + tdBorder:tdBorder + }; + } else { + td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + return { + tableBorder:tableBorder, + tdPadding:tdPadding, + tdBorder:tdBorder + }; + } + }; + /** + * 根据当前点击的td或者table获取索引对象 + * @param tdOrTable + */ + UETable.getUETable = function (tdOrTable) { + var tag = tdOrTable.tagName.toLowerCase(); + tdOrTable = (tag == "td" || tag == "th" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, "table", true) : tdOrTable; + if (!tdOrTable.ueTable) { + tdOrTable.ueTable = new UETable(tdOrTable); + } + return tdOrTable.ueTable; + }; + + UETable.cloneCell = function(cell,ignoreMerge,keepPro){ + if (!cell || utils.isString(cell)) { + return this.table.ownerDocument.createElement(cell || 'td'); + } + var flag = domUtils.hasClass(cell, "selectTdClass"); + flag && domUtils.removeClasses(cell, "selectTdClass"); + var tmpCell = cell.cloneNode(true); + if (ignoreMerge) { + tmpCell.rowSpan = tmpCell.colSpan = 1; + } + //去掉宽高 + !keepPro && domUtils.removeAttributes(tmpCell,'width height'); + !keepPro && domUtils.removeAttributes(tmpCell,'style'); + + tmpCell.style.borderLeftStyle = ""; + tmpCell.style.borderTopStyle = ""; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + flag && domUtils.addClass(cell, "selectTdClass"); + return tmpCell; + } + + UETable.prototype = { + getMaxRows:function () { + var rows = this.table.rows, maxLen = 1; + for (var i = 0, row; row = rows[i]; i++) { + var currentMax = 1; + for (var j = 0, cj; cj = row.cells[j++];) { + currentMax = Math.max(cj.rowSpan || 1, currentMax); + } + maxLen = Math.max(currentMax + i, maxLen); + } + return maxLen; + }, + /** + * 获取当前表格的最大列数 + */ + getMaxCols:function () { + var rows = this.table.rows, maxLen = 0, cellRows = {}; + for (var i = 0, row; row = rows[i]; i++) { + var cellsNum = 0; + for (var j = 0, cj; cj = row.cells[j++];) { + cellsNum += (cj.colSpan || 1); + if (cj.rowSpan && cj.rowSpan > 1) { + for (var k = 1; k < cj.rowSpan; k++) { + if (!cellRows['row_' + (i + k)]) { + cellRows['row_' + (i + k)] = (cj.colSpan || 1); + } else { + cellRows['row_' + (i + k)]++ + } + } + + } + } + cellsNum += cellRows['row_' + i] || 0; + maxLen = Math.max(cellsNum, maxLen); + } + return maxLen; + }, + getCellColIndex:function (cell) { + + }, + /** + * 获取当前cell旁边的单元格, + * @param cell + * @param right + */ + getHSideCell:function (cell, right) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (right && (!len ? (cellInfo.colIndex == (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; + previewColIndex = !right ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : ( !len ? cellInfo.colIndex + 1 : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getTabNextCell:function (cell, preRowIndex) { + var cellInfo = this.getCellInfo(cell), + rowIndex = preRowIndex || cellInfo.rowIndex, + colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), + nextCell; + try { + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + try { + rowIndex = rowIndex * 1 + 1; + colIndex = 0; + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + } + } + return nextCell; + + }, + /** + * 获取视觉上的后置单元格 + * @param cell + * @param bottom + */ + getVSideCell:function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 + */ + getSameEndPosCells:function (cell, xOrY) { + try { + var flag = (xOrY.toLowerCase() === "x"), + end = domUtils.getXY(cell)[flag ? 'x' : 'y'] + cell["offset" + (flag ? 'Width' : 'Height')], + rows = this.table.rows, + cells = null, returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpEnd = domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] + tmpCell["offset" + (flag ? 'Width' : 'Height')]; + //对应行的td已经被上面行rowSpan了 + if (tmpEnd > end && flag) break; + if (cell == tmpCell || end == tmpEnd) { + //只获取单一的单元格 + //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 + if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { + returns.push(tmpCell); + } + if (flag) break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + setCellContent:function (cell, content) { + cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
      "); + }, + cloneCell:UETable.cloneCell, + /** + * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 + */ + getSameStartPosXCells:function (cell) { + try { + var start = domUtils.getXY(cell).x + cell.offsetWidth, + rows = this.table.rows, cells , returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpStart = domUtils.getXY(tmpCell).x; + if (tmpStart > start) break; + if (tmpStart == start && tmpCell.colSpan == 1) { + returns.push(tmpCell); + break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + /** + * 更新table对应的索引表 + */ + update:function (table) { + this.table = table || this.table; + this.selectedTds = []; + this.cellsRange = {}; + this.indexTable = []; + var rows = this.table.rows, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, + colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } + this.rowsNum = rowsNum; + this.colsNum = colsNum; + for (var i = 0, len = rows.length; i < len; i++) { + this.indexTable[i] = new Array(colsNum); + } + //填充索引表 + for (var rowIndex = 0, row; row = rows[rowIndex]; rowIndex++) { + for (var cellIndex = 0, cell, cells = row.cells; cell = cells[cellIndex]; cellIndex++) { + //修正整行被rowSpan时导致的行数计算错误 + if (cell.rowSpan > rowsNum) { + cell.rowSpan = rowsNum; + } + var colIndex = cellIndex, + rowSpan = cell.rowSpan || 1, + colSpan = cell.colSpan || 1; + //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 + while (this.indexTable[rowIndex][colIndex]) colIndex++; + for (var j = 0; j < rowSpan; j++) { + for (var k = 0; k < colSpan; k++) { + this.indexTable[rowIndex + j][colIndex + k] = { + rowIndex:rowIndex, + cellIndex:cellIndex, + colIndex:colIndex, + rowSpan:rowSpan, + colSpan:colSpan + } + } + } + } + } + //修复残缺td + for (j = 0; j < rowsNum; j++) { + for (k = 0; k < colsNum; k++) { + if (this.indexTable[j][k] === undefined) { + row = rows[j]; + cell = row.cells[row.cells.length - 1]; + cell = cell ? cell.cloneNode(true) : this.table.ownerDocument.createElement("td"); + this.setCellContent(cell); + if (cell.colSpan !== 1)cell.colSpan = 1; + if (cell.rowSpan !== 1)cell.rowSpan = 1; + row.appendChild(cell); + this.indexTable[j][k] = { + rowIndex:j, + cellIndex:cell.cellIndex, + colIndex:k, + rowSpan:1, + colSpan:1 + } + } + } + } + //当框选后删除行或者列后撤销,需要重建选区。 + var tds = domUtils.getElementsByTagName(this.table, "td"), + selectTds = []; + utils.each(tds, function (td) { + if (domUtils.hasClass(td, "selectTdClass")) { + selectTds.push(td); + } + }); + if (selectTds.length) { + var start = selectTds[0], + end = selectTds[selectTds.length - 1], + startInfo = this.getCellInfo(start), + endInfo = this.getCellInfo(end); + this.selectedTds = selectTds; + this.cellsRange = { + beginRowIndex:startInfo.rowIndex, + beginColIndex:startInfo.colIndex, + endRowIndex:endInfo.rowIndex + endInfo.rowSpan - 1, + endColIndex:endInfo.colIndex + endInfo.colSpan - 1 + }; + } + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if(!domUtils.hasClass(this.table.rows[0], "firstRow")) { + domUtils.addClass(this.table.rows[0], "firstRow"); + for(var i = 1; i< this.table.rows.length; i++) { + domUtils.removeClasses(this.table.rows[i], "firstRow"); + } + } + }, + /** + * 获取单元格的索引信息 + */ + getCellInfo:function (cell) { + if (!cell) return; + var cellIndex = cell.cellIndex, + rowIndex = cell.parentNode.rowIndex, + rowInfo = this.indexTable[rowIndex], + numCols = this.colsNum; + for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { + var cellInfo = rowInfo[colIndex]; + if (cellInfo.rowIndex === rowIndex && cellInfo.cellIndex === cellIndex) { + return cellInfo; + } + } + }, + /** + * 根据行列号获取单元格 + */ + getCell:function (rowIndex, cellIndex) { + return rowIndex < this.rowsNum && this.table.rows[rowIndex].cells[cellIndex] || null; + }, + /** + * 删除单元格 + */ + deleteCell:function (cell, rowIndex) { + rowIndex = typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex; + var row = this.table.rows[rowIndex]; + row.deleteCell(cell.cellIndex); + }, + /** + * 根据始末两个单元格获取被框选的所有单元格范围 + */ + getCellsRange:function (cellA, cellB) { + function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) { + var tmpBeginRowIndex = beginRowIndex, + tmpBeginColIndex = beginColIndex, + tmpEndRowIndex = endRowIndex, + tmpEndColIndex = endColIndex, + cellInfo, colIndex, rowIndex; + // 通过indexTable检查是否存在超出TableRange上边界的情况 + if (beginRowIndex > 0) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[beginRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex; + if (rowIndex < beginRowIndex) { + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } + } + } + // 通过indexTable检查是否存在超出TableRange右边界的情况 + if (endColIndex < me.colsNum) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][endColIndex]; + colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; + if (colIndex > endColIndex) { + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } + } + } + // 检查是否有超出TableRange下边界的情况 + if (endRowIndex < me.rowsNum) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[endRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; + if (rowIndex > endRowIndex) { + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } + } + } + // 检查是否有超出TableRange左边界的情况 + if (beginColIndex > 0) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][beginColIndex]; + colIndex = cellInfo.colIndex; + if (colIndex < beginColIndex) { + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } + } + } + //递归调用直至所有完成所有框选单元格的扩展 + if (tmpBeginRowIndex != beginRowIndex || tmpBeginColIndex != beginColIndex || tmpEndRowIndex != endRowIndex || tmpEndColIndex != endColIndex) { + return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex); + } else { + // 不需要扩展TableRange的情况 + return { + beginRowIndex:beginRowIndex, + beginColIndex:beginColIndex, + endRowIndex:endRowIndex, + endColIndex:endColIndex + }; + } + } + + try { + var me = this, + cellAInfo = me.getCellInfo(cellA); + if (cellA === cellB) { + return { + beginRowIndex:cellAInfo.rowIndex, + beginColIndex:cellAInfo.colIndex, + endRowIndex:cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + endColIndex:cellAInfo.colIndex + cellAInfo.colSpan - 1 + }; + } + var cellBInfo = me.getCellInfo(cellB); + // 计算TableRange的四个边 + var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), + beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), + endRowIndex = Math.max(cellAInfo.rowIndex + cellAInfo.rowSpan - 1, cellBInfo.rowIndex + cellBInfo.rowSpan - 1), + endColIndex = Math.max(cellAInfo.colIndex + cellAInfo.colSpan - 1, cellBInfo.colIndex + cellBInfo.colSpan - 1); + + return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex); + } catch (e) { + //throw e; + } + }, + /** + * 依据cellsRange获取对应的单元格集合 + */ + getCells:function (range) { + //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 + this.clearSelected(); + var beginRowIndex = range.beginRowIndex, + beginColIndex = range.beginColIndex, + endRowIndex = range.endRowIndex, + endColIndex = range.endColIndex, + cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = []; + for (var i = beginRowIndex; i <= endRowIndex; i++) { + for (var j = beginColIndex; j <= endColIndex; j++) { + cellInfo = this.indexTable[i][j]; + rowIndex = cellInfo.rowIndex; + colIndex = cellInfo.colIndex; + // 如果Cells里已经包含了此Cell则跳过 + var key = rowIndex + '|' + colIndex; + if (tdHash[key]) continue; + tdHash[key] = 1; + if (rowIndex < i || colIndex < j || rowIndex + cellInfo.rowSpan - 1 > endRowIndex || colIndex + cellInfo.colSpan - 1 > endColIndex) { + return null; + } + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); + } + } + return returnTds; + }, + /** + * 清理已经选中的单元格 + */ + clearSelected:function () { + UETable.removeSelectedClass(this.selectedTds); + this.selectedTds = []; + this.cellsRange = {}; + }, + /** + * 根据range设置已经选中的单元格 + */ + setSelected:function (range) { + var cells = this.getCells(range); + UETable.addSelectedClass(cells); + this.selectedTds = cells; + this.cellsRange = range; + }, + isFullRow:function () { + var range = this.cellsRange; + return (range.endColIndex - range.beginColIndex + 1) == this.colsNum; + }, + isFullCol:function () { + var range = this.cellsRange, + table = this.table, + ths = table.getElementsByTagName("th"), + rows = range.endRowIndex - range.beginRowIndex + 1; + return !ths.length ? rows == this.rowsNum : rows == this.rowsNum || (rows == this.rowsNum - 1); + + }, + /** + * 获取视觉上的前置单元格,默认是左边,top传入时 + * @param cell + * @param top + */ + getNextCell:function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getPreviewCell:function (cell, top) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (top && (!len ? (cellInfo.rowIndex > (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !top ? ( !len ? cellInfo.rowIndex : range.beginRowIndex ) + : ( !len ? (cellInfo.rowIndex < 1 ? 0 : (cellInfo.rowIndex - 1)) : range.beginRowIndex); + previewColIndex = !top ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : ( !len ? cellInfo.colIndex : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 移动单元格中的内容 + */ + moveContent:function (cellTo, cellFrom) { + if (UETable.isEmptyBlock(cellFrom)) return; + if (UETable.isEmptyBlock(cellTo)) { + cellTo.innerHTML = cellFrom.innerHTML; + return; + } + var child = cellTo.lastChild; + if (child.nodeType == 3 || !dtd.$block[child.tagName]) { + cellTo.appendChild(cellTo.ownerDocument.createElement('br')) + } + while (child = cellFrom.firstChild) { + cellTo.appendChild(child); + } + }, + /** + * 向右合并单元格 + */ + mergeRight:function (cell) { + var cellInfo = this.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan, + rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex); + //合并 + cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; + //被合并的单元格不应存在宽度属性 + cell.removeAttribute("width"); + //移动内容 + this.moveContent(cell, rightCell); + //删掉被合并的Cell + this.deleteCell(rightCell, rightCellInfo.rowIndex); + this.update(); + }, + /** + * 向下合并单元格 + */ + mergeDown:function (cell) { + var cellInfo = this.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, + downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], + downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; + cell.removeAttribute("height"); + this.moveContent(cell, downCell); + this.deleteCell(downCell, downCellInfo.rowIndex); + this.update(); + }, + /** + * 合并整个range中的内容 + */ + mergeRange:function () { + //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 + var range = this.cellsRange, + leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex); + + if (leftTopCell.tagName == "TH" && range.endRowIndex !== range.beginRowIndex) { + var index = this.indexTable, + info = this.getCellInfo(leftTopCell); + leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + range = this.getCellsRange(leftTopCell, this.getCell(index[this.rowsNum - 1][info.colIndex].rowIndex, index[this.rowsNum - 1][info.colIndex].cellIndex)); + } + + // 删除剩余的Cells + var cells = this.getCells(range); + for(var i= 0,ci;ci=cells[i++];){ + if (ci !== leftTopCell) { + this.moveContent(leftTopCell, ci); + this.deleteCell(ci); + } + } + // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 + leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; + leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); + leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; + leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); + if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { + leftTopCell.colSpan = 1; + } + + if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { + var rowIndex = leftTopCell.parentNode.rowIndex; + //解决IE下的表格操作问题 + if( this.table.deleteRow ) { + for (var i = rowIndex+ 1, curIndex=rowIndex+ 1, len=leftTopCell.rowSpan; i < len; i++) { + this.table.deleteRow(curIndex); + } + } else { + for (var i = 0, len=leftTopCell.rowSpan - 1; i < len; i++) { + var row = this.table.rows[rowIndex + 1]; + row.parentNode.removeChild(row); + } + } + leftTopCell.rowSpan = 1; + } + this.update(); + }, + /** + * 插入一行单元格 + */ + insertRow:function (rowIndex, sourceCell) { + var numCols = this.colsNum, + table = this.table, + row = table.insertRow(rowIndex), cell, + isInsertTitle = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(colIndex, cell, tableRow) { + if (colIndex == 0) { + var tr = tableRow.nextSibling || tableRow.previousSibling, + th = tr.cells[colIndex]; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + }else{ + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + //首行直接插入,无需考虑部分单元格被rowspan的情况 + if (rowIndex == 0 || rowIndex == this.rowsNum) { + for (var colIndex = 0; colIndex < numCols; colIndex++) { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + cell.getAttribute('vAlign') && cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + row.appendChild(cell); + if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } else { + var infoRow = this.indexTable[rowIndex], + cellIndex = 0; + for (colIndex = 0; colIndex < numCols; colIndex++) { + var cellInfo = infoRow[colIndex]; + //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 + if (cellInfo.rowIndex < rowIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + 1; + } else { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + row.appendChild(cell); + } + if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } + //框选时插入不触发contentchange,需要手动更新索引。 + this.update(); + return row; + }, + /** + * 删除一行单元格 + * @param rowIndex + */ + deleteRow:function (rowIndex) { + var row = this.table.rows[rowIndex], + infoRow = this.indexTable[rowIndex], + colsNum = this.colsNum, + count = 0; //处理计数 + for (var colIndex = 0; colIndex < colsNum;) { + var cellInfo = infoRow[colIndex], + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (cell.rowSpan > 1) { + if (cellInfo.rowIndex == rowIndex) { + var clone = cell.cloneNode(true); + clone.rowSpan = cell.rowSpan - 1; + clone.innerHTML = ""; + cell.rowSpan = 1; + var nextRowIndex = rowIndex + 1, + nextRow = this.table.rows[nextRowIndex], + insertCellIndex, + preMerged = this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; + if (preMerged < colIndex) { + insertCellIndex = colIndex - preMerged - 1; + //nextRow.insertCell(insertCellIndex); + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } else { + if (nextRow.cells.length) nextRow.insertBefore(clone, nextRow.cells[0]) + } + count += 1; + //cell.parentNode.removeChild(cell); + } + } + colIndex += cell.colSpan || 1; + } + var deleteTds = [], cacheMap = {}; + for (colIndex = 0; colIndex < colsNum; colIndex++) { + var tmpRowIndex = infoRow[colIndex].rowIndex, + tmpCellIndex = infoRow[colIndex].cellIndex, + key = tmpRowIndex + "_" + tmpCellIndex; + if (cacheMap[key])continue; + cacheMap[key] = 1; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + deleteTds.push(cell); + } + var mergeTds = []; + utils.each(deleteTds, function (td) { + if (td.rowSpan == 1) { + td.parentNode.removeChild(td); + } else { + mergeTds.push(td); + } + }); + utils.each(mergeTds, function (td) { + td.rowSpan--; + }); + row.parentNode.removeChild(row); + //浏览器方法本身存在bug,采用自定义方法删除 + //this.table.deleteRow(rowIndex); + this.update(); + }, + insertCol:function (colIndex, sourceCell, defaultValue) { + var rowsNum = this.rowsNum, + rowIndex = 0, + tableRow, cell, + backWidth = parseInt((this.table.offsetWidth - (this.colsNum + 1) * 20 - (this.colsNum + 1)) / (this.colsNum + 1), 10), + isInsertTitleCol = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(rowIndex, cell, tableRow) { + if (rowIndex == 0) { + var th = cell.nextSibling || cell.previousSibling; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + }else{ + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + var preCell; + if (colIndex == 0 || colIndex == this.colsNum) { + for (; rowIndex < rowsNum; rowIndex++) { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + if (!colIndex) { + tableRow.insertBefore(cell, tableRow.cells[0]); + } else { + domUtils.insertAfter(tableRow.cells[tableRow.cells.length - 1], cell); + } + if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow) + } + } else { + for (; rowIndex < rowsNum; rowIndex++) { + var cellInfo = this.indexTable[rowIndex][colIndex]; + if (cellInfo.colIndex < colIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.colSpan = cellInfo.colSpan + 1; + } else { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[cellInfo.cellIndex]; + + cell = this.cloneCell(sourceCell, true);//tableRow.insertCell(cellInfo.cellIndex); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + //防止IE下报错 + preCell ? tableRow.insertBefore(cell, preCell) : tableRow.appendChild(cell); + } + if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } + //框选时插入不触发contentchange,需要手动更新索引 + this.update(); + this.updateWidth(backWidth, defaultValue || {tdPadding:10, tdBorder:1}); + }, + updateWidth:function (width, defaultValue) { + var table = this.table, + tmpWidth = UETable.getWidth(table) - defaultValue.tdPadding * 2 - defaultValue.tdBorder + width; + if (tmpWidth < table.ownerDocument.body.offsetWidth) { + table.setAttribute("width", tmpWidth); + return; + } + var tds = domUtils.getElementsByTagName(this.table, "td th"); + utils.each(tds, function (td) { + td.setAttribute("width", width); + }) + }, + deleteCol:function (colIndex) { + var indexTable = this.indexTable, + tableRows = this.table.rows, + backTableWidth = this.table.getAttribute("width"), + backTdWidth = 0, + rowsNum = this.rowsNum, + cacheMap = {}; + for (var rowIndex = 0; rowIndex < rowsNum;) { + var infoRow = indexTable[rowIndex], + cellInfo = infoRow[colIndex], + key = cellInfo.rowIndex + '_' + cellInfo.colIndex; + // 跳过已经处理过的Cell + if (cacheMap[key])continue; + cacheMap[key] = 1; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (!backTdWidth) backTdWidth = cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); + // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell + if (cell.colSpan > 1) { + cell.colSpan--; + } else { + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + rowIndex += cellInfo.rowSpan || 1; + } + this.table.setAttribute("width", backTableWidth - backTdWidth); + this.update(); + }, + splitToCells:function (cell) { + var me = this, + cells = this.splitToRows(cell); + utils.each(cells, function (cell) { + me.splitToCols(cell); + }) + }, + splitToRows:function (cell) { + var cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.rowSpan = 1; + results.push(cell); + // 补齐单元格 + for (var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; i < endRow; i++) { + if (i == rowIndex)continue; + var tableRow = this.table.rows[i], + tmpCell = tableRow.insertCell(colIndex - this.getPreviewMergedCellsNum(i, colIndex)); + tmpCell.colSpan = cellInfo.colSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + results.push(tmpCell); + } + this.update(); + return results; + }, + getPreviewMergedCellsNum:function (rowIndex, colIndex) { + var indexRow = this.indexTable[rowIndex], + num = 0; + for (var i = 0; i < colIndex;) { + var colSpan = indexRow[i].colSpan, + tmpRowIndex = indexRow[i].rowIndex; + num += (colSpan - (tmpRowIndex == rowIndex ? 1 : 0)); + i += colSpan; + } + return num; + }, + splitToCols:function (cell) { + var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), + + cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.colSpan = 1; + cell.setAttribute("width", backWidth); + results.push(cell); + // 补齐单元格 + for (var j = colIndex, endCol = colIndex + cellInfo.colSpan; j < endCol; j++) { + if (j == colIndex)continue; + var tableRow = this.table.rows[rowIndex], + tmpCell = tableRow.insertCell(this.indexTable[rowIndex][j].cellIndex + 1); + tmpCell.rowSpan = cellInfo.rowSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + tmpCell.setAttribute('width', backWidth); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + //处理th的情况 + if (cell.tagName == 'TH') { + var th = cell.ownerDocument.createElement('th'); + th.appendChild(tmpCell.firstChild); + th.setAttribute('vAlign', cell.getAttribute('vAlign')); + th.rowSpan = tmpCell.rowSpan; + tableRow.insertBefore(th, tmpCell); + domUtils.remove(tmpCell); + } + results.push(tmpCell); + } + this.update(); + return results; + }, + isLastCell:function (cell, rowsNum, colsNum) { + rowsNum = rowsNum || this.rowsNum; + colsNum = colsNum || this.colsNum; + var cellInfo = this.getCellInfo(cell); + return ((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) && + ((cellInfo.colIndex + cellInfo.colSpan) == colsNum); + }, + getLastCell:function (cells) { + cells = cells || this.table.getElementsByTagName("td"); + var firstInfo = this.getCellInfo(cells[0]); + var me = this, last = cells[0], + tr = last.parentNode, + cellsNum = 0, cols = 0, rows; + utils.each(cells, function (cell) { + if (cell.parentNode == tr)cols += cell.colSpan || 1; + cellsNum += cell.rowSpan * cell.colSpan || 1; + }); + rows = cellsNum / cols; + utils.each(cells, function (cell) { + if (me.isLastCell(cell, rows, cols)) { + last = cell; + return false; + } + }); + return last; + + }, + selectRow:function (rowIndex) { + var indexRow = this.indexTable[rowIndex], + start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), + end = this.getCell(indexRow[this.colsNum - 1].rowIndex, indexRow[this.colsNum - 1].cellIndex), + range = this.getCellsRange(start, end); + this.setSelected(range); + }, + selectTable:function () { + var tds = this.table.getElementsByTagName("td"), + range = this.getCellsRange(tds[0], tds[tds.length - 1]); + this.setSelected(range); + }, + setBackground:function (cells, value) { + if (typeof value === "string") { + utils.each(cells, function (cell) { + cell.style.backgroundColor = value; + }) + } else if (typeof value === "object") { + value = utils.extend({ + repeat:true, + colorList:["#ddd", "#fff"] + }, value); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function (list, index, repeat) { + return list[index] ? list[index] : repeat ? list[index % list.length] : ""; + }; + for (var i = 0, cell; cell = cells[i++];) { + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor(colors, ((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat); + } + } + }, + removeBackground:function (cells) { + utils.each(cells, function (cell) { + cell.style.backgroundColor = ""; + }) + } + + + }; + function showError(e) { + } +})(); + +// plugins/table.cmds.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-20 + * Time: 下午6:25 + * To change this template use File | Settings | File Templates. + */ +; +(function () { + var UT = UE.UETable, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor) + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }; + + + UE.commands['inserttable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? -1 : 0; + }, + execCommand: function (cmd, opt) { + function createTable(opt, tdWidth) { + var html = [], + rowsNum = opt.numRows, + colsNum = opt.numCols; + for (var r = 0; r < rowsNum; r++) { + html.push(''); + for (var c = 0; c < colsNum; c++) { + html.push('
    • ' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '
      ') + '
      ' + html.join('') + '
      ' + } + + if (!opt) { + opt = utils.extend({}, { + numCols: this.options.defaultCols, + numRows: this.options.defaultRows, + tdvalign: this.options.tdvalign + }) + } + var me = this; + var range = this.selection.getRange(), + start = range.startContainer, + firstParentBlock = domUtils.findParent(start, function (node) { + return domUtils.isBlockElm(node); + }, true) || me.body; + + var defaultValue = getDefaultValue(me), + tableWidth = firstParentBlock.offsetWidth, + tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder); + + //todo其他属性 + !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); + me.execCommand("inserthtml", createTable(opt, tdWidth)); + } + }; + + UE.commands['insertparagraphbeforetable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).cell ? 0 : -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var p = this.document.createElement("p"); + p.innerHTML = browser.ie ? ' ' : '
      '; + table.parentNode.insertBefore(p, table); + this.selection.getRange().setStart(p, 0).setCursor(); + } + } + }; + + UE.commands['deletetable'] = { + queryCommandState: function () { + var rng = this.selection.getRange(); + return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1; + }, + execCommand: function (cmd, table) { + var rng = this.selection.getRange(); + table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true); + if (table) { + var next = table.nextSibling; + if (!next) { + next = domUtils.createElement(this.document, 'p', { + 'innerHTML': browser.ie ? domUtils.fillChar : '
      ' + }); + table.parentNode.insertBefore(next, table); + } + domUtils.remove(table); + rng = this.selection.getRange(); + if (next.nodeType == 3) { + rng.setStartBefore(next) + } else { + rng.setStart(next, 0) + } + rng.setCursor(false, true) + this.fireEvent("tablehasdeleted") + + } + + } + }; + UE.commands['cellalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1 + }, + execCommand: function (cmd, align) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('align', align); + } + } + } + }; + UE.commands['cellvalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function (cmd, valign) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('vAlign', valign); + } + } + } + }; + UE.commands['insertcaption'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + return table.getElementsByTagName('caption').length == 0 ? 1 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var caption = this.document.createElement('caption'); + caption.innerHTML = browser.ie ? domUtils.fillChar : '
      '; + table.insertBefore(caption, table.firstChild); + var range = this.selection.getRange(); + range.setStart(caption, 0).setCursor(); + } + + } + }; + UE.commands['deletecaption'] = { + queryCommandState: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + return table.getElementsByTagName('caption').length == 0 ? -1 : 1; + } + return -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + domUtils.remove(table.getElementsByTagName('caption')[0]); + var range = this.selection.getRange(); + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } + + } + }; + UE.commands['inserttitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() != 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertRow(0, 'th'); + } + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() == 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + domUtils.remove(table.rows[0]) + } + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + UE.commands['inserttitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length-1]; + return lastRow.getElementsByTagName('th').length ? -1 : 0; + } + return -1; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertCol(0, 'th'); + } + resetTdWidth(table, this); + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length-1]; + return lastRow.getElementsByTagName('th').length ? 0 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + for(var i = 0; i< table.rows.length; i++ ){ + domUtils.remove(table.rows[i].children[0]) + } + } + resetTdWidth(table, this); + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + + UE.commands["mergeright"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan; + if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 + + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; + if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeRight(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergedown"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length)return -1; + + var cellInfo = ut.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; + if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 + + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], + downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; + if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeDown(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergecells"] = { + queryCommandState: function () { + return getUETableBySelected(this) ? 0 : -1; + }, + execCommand: function () { + var ut = getUETableBySelected(this); + if (ut && ut.selectedTds.length) { + var cell = ut.selectedTds[0]; + ut.mergeRange(); + var rng = this.selection.getRange(); + if (domUtils.isEmptyBlock(cell)) { + rng.setStart(cell, 0).collapse(true) + } else { + rng.selectNodeContents(cell) + } + rng.select(); + } + + + } + }; + UE.commands["insertrow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.beginRowIndex, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + //后插入行 + UE.commands["insertrownext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.endRowIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + UE.commands["deleterow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellsRange = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getVSideCell(cell), + nextCell = ut.getVSideCell(cell, true), + rng = this.selection.getRange(); + if (utils.isEmptyObject(cellsRange)) { + ut.deleteRow(cellInfo.rowIndex); + } else { + for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) { + ut.deleteRow(cellsRange.beginRowIndex); + } + } + var table = ut.table; + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) { + if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true); + } else { + var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex); + if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); + } + } + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + UE.commands["insertcol"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) && + getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + if (this.queryCommandState(cmd) == -1)return; + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.beginColIndex, cell); + } + } + rng.moveToBookmark(bk).select(true); + } + }; + UE.commands["insertcolnext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.endColIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["deletecol"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + range = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getHSideCell(cell), + nextCell = ut.getHSideCell(cell, true); + if (utils.isEmptyObject(range)) { + ut.deleteCol(cellInfo.colIndex); + } else { + for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { + ut.deleteCol(range.beginColIndex); + } + } + var table = ut.table, + rng = this.selection.getRange(); + + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (domUtils.inDoc(cell, this.document)) { + rng.setStart(cell, 0).setCursor(false, true); + } else { + if (nextCell && domUtils.inDoc(nextCell, this.document)) { + rng.selectNodeContents(nextCell).setCursor(false, true); + } else { + if (preCell && domUtils.inDoc(preCell, this.document)) { + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } + } + }; + UE.commands["splittocells"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCells(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittorows"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.rowSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToRows(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittocols"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.colSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCols(cell); + rng.moveToBookmark(bk).select(); + + } + }; + + UE.commands["adaptbytext"] = + UE.commands["adaptbywindow"] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table; + if (table) { + if (cmd == 'adaptbywindow') { + resetTdWidth(table, this); + } else { + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function (cell) { + cell.removeAttribute("width"); + }); + table.removeAttribute("width"); + } + } + } + }; + + //平均分配各列 + UE.commands['averagedistributecol'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageWidth() { + var tb = ut.table, + averageWidth, sumWidth = 0, colsNum = 0, + tbAttr = getDefaultValue(me, tb); + + if (ut.isFullRow()) { + sumWidth = tb.offsetWidth; + colsNum = ut.colsNum; + } else { + var begin = ut.cellsRange.beginColIndex, + end = ut.cellsRange.endColIndex, + node; + for (var i = begin; i <= end;) { + node = ut.selectedTds[i]; + sumWidth += node.offsetWidth; + i += node.colSpan; + colsNum += 1; + } + } + averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2; + return averageWidth; + } + + function setAverageWidth(averageWidth) { + utils.each(domUtils.getElementsByTagName(ut.table, "th"), function (node) { + node.setAttribute("width", ""); + }); + var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + + utils.each(cells, function (node) { + if (node.colSpan == 1) { + node.setAttribute("width", averageWidth); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageWidth(getAverageWidth()); + } + } + }; + //平均分配各行 + UE.commands['averagedistributerow'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageHeight() { + var averageHeight, rowNum, sumHeight = 0, + tb = ut.table, + tbAttr = getDefaultValue(me, tb), + tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], "padding-top")); + + if (ut.isFullCol()) { + var captionArr = domUtils.getElementsByTagName(tb, "caption"), + thArr = domUtils.getElementsByTagName(tb, "th"), + captionHeight, thHeight; + + if (captionArr.length > 0) { + captionHeight = captionArr[0].offsetHeight; + } + if (thArr.length > 0) { + thHeight = thArr[0].offsetHeight; + } + + sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); + rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1); + } else { + var begin = ut.cellsRange.beginRowIndex, + end = ut.cellsRange.endRowIndex, + count = 0, + trs = domUtils.getElementsByTagName(tb, "tr"); + for (var i = begin; i <= end; i++) { + sumHeight += trs[i].offsetHeight; + count += 1; + } + rowNum = count; + } + //ie8下是混杂模式 + if (browser.ie && browser.version < 9) { + averageHeight = Math.ceil(sumHeight / rowNum); + } else { + averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; + } + return averageHeight; + } + + function setAverageHeight(averageHeight) { + var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + utils.each(cells, function (node) { + if (node.rowSpan == 1) { + node.setAttribute("height", averageHeight); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageHeight(getAverageHeight()); + } + } + }; + + //单元格对齐方式 + UE.commands['cellalignment'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, data) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (!/caption/ig.test(cell.tagName)) { + domUtils.setAttributes(cell, data); + } else { + cell.style.textAlign = data.align; + cell.style.verticalAlign = data.vAlign; + } + me.selection.getRange().setCursor(true); + } else { + utils.each(ut.selectedTds, function (cell) { + domUtils.setAttributes(cell, data); + }); + } + }, + /** + * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 + * @see UE.UETable.getTableCellAlignState + */ + queryCommandValue: function (cmd) { + + var activeMenuCell = getTableItemsByRange( this).cell; + + if( !activeMenuCell ) { + activeMenuCell = getSelectedArr(this)[0]; + } + + if (!activeMenuCell) { + + return null; + + } else { + + //获取同时选中的其他单元格 + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + + !cells.length && ( cells = activeMenuCell ); + + return UE.UETable.getTableCellAlignState(cells); + + } + + } + }; + //表格对齐方式 + UE.commands['tablealignment'] = { + queryCommandState: function () { + if (browser.ie && browser.version < 8) { + return -1; + } + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, value) { + var me = this, + start = me.selection.getStart(), + table = start && domUtils.findParentByTagName(start, ["table"], true); + + if (table) { + table.setAttribute("align",value); + } + } + }; + + //表格属性 + UE.commands['edittable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, color) { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var arr = domUtils.getElementsByTagName(table, "td").concat( + domUtils.getElementsByTagName(table, "th"), + domUtils.getElementsByTagName(table, "caption") + ); + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + } + } + }; + //单元格属性 + UE.commands['edittd'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, bkColor) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (cell) { + cell.style.backgroundColor = bkColor; + } + } else { + utils.each(ut.selectedTds, function (cell) { + cell.style.backgroundColor = bkColor; + }); + } + } + }; + + UE.commands["settablebackground"] = { + queryCommandState: function () { + return getSelectedArr(this).length > 1 ? 0 : -1; + }, + execCommand: function (cmd, value) { + var cells, ut; + cells = getSelectedArr(this); + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + queryCommandState: function () { + var cells = getSelectedArr(this); + if (!cells.length)return -1; + for (var i = 0, cell; cell = cells[i++];) { + if (cell.style.backgroundColor !== "") return 0; + } + return -1; + }, + execCommand: function () { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + var interlaced = table.getAttribute("interlaced"); + if (cmd == "interlacetable") { + //TODO 待定 + //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 + return (interlaced === "enabled") ? -1 : 0; + } else { + return (!interlaced || interlaced === "disabled") ? -1 : 0; + } + }, + execCommand: function (cmd, classList) { + var table = getTableItemsByRange(this).table; + if (cmd == "interlacetable") { + table.setAttribute("interlaced", "enabled"); + this.fireEvent("interlacetable", table, classList); + } else { + table.setAttribute("interlaced", "disabled"); + this.fireEvent("uninterlacetable", table); + } + } + }; + UE.commands["setbordervisible"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + return 0; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + utils.each(domUtils.getElementsByTagName(table,'td'),function(td){ + td.style.borderWidth = '1px'; + td.style.borderStyle = 'solid'; + }) + } + }; + function resetTdWidth(table, editor) { + var tds = domUtils.getElementsByTagName(table,'td th'); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table))); + var tdsWidths = []; + setTimeout(function () { + utils.each(tds, function (td) { + (td.colSpan == 1) && tdsWidths.push(td.offsetWidth) + }) + utils.each(tds, function (td,i) { + (td.colSpan == 1) && td.setAttribute("width", tdsWidths[i] + ""); + }) + }, 0); + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + function getSelectedArr(editor) { + var cell = getTableItemsByRange(editor).cell; + if (cell) { + var ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; + } else { + return []; + } + } +})(); + + +// plugins/table.action.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-10-12 + * Time: 上午10:05 + * To change this template use File | Settings | File Templates. + */ +UE.plugins['table'] = function () { + var me = this, + tabTimer = null, + //拖动计时器 + tableDragTimer = null, + //双击计时器 + tableResizeTimer = null, + //单元格最小宽度 + cellMinWidth = 5, + isInResizeBuffer = false, + //单元格边框大小 + cellBorderWidth = 5, + //鼠标偏移距离 + offsetOfTableCell = 10, + //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 + singleClickState = 0, + userActionStatus = null, + //双击允许的时间范围 + dblclickTime = 360, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + removeSelectedClass = function (cells) { + return UT.removeSelectedClass(cells); + }; + + function showError(e) { +// throw e; + } + me.ready(function(){ + var me = this; + var orgGetText = me.selection.getText; + me.selection.getText = function(){ + var table = getUETableBySelected(me); + if(table){ + var str = ''; + utils.each(table.selectedTds,function(td){ + str += td[browser.ie?'innerText':'textContent']; + }) + return str; + }else{ + return orgGetText.call(me.selection) + } + + } + }) + + //处理拖动及框选相关方法 + var startTd = null, //鼠标按下时的锚点td + currentTd = null, //当前鼠标经过时的td + onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 + onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 + dragButton = null, + dragOver = false, + dragLine = null, //模拟的拖动线 + dragTd = null; //发生拖动的目标td + + var mousedown = false, + //todo 判断混乱模式 + needIEHack = true; + + me.setOpt({ + 'maxColNum':20, + 'maxRowNum':100, + 'defaultCols':5, + 'defaultRows':5, + 'tdvalign':'top', + 'cursorpath':me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_", + 'tableDragable':false, + 'classList':["ue-table-interlace-color-single","ue-table-interlace-color-double"] + }); + me.getUETable = getUETable; + var commands = { + 'deletetable':1, + 'inserttable':1, + 'cellvalign':1, + 'insertcaption':1, + 'deletecaption':1, + 'inserttitle':1, + 'deletetitle':1, + "mergeright":1, + "mergedown":1, + "mergecells":1, + "insertrow":1, + "insertrownext":1, + "deleterow":1, + "insertcol":1, + "insertcolnext":1, + "deletecol":1, + "splittocells":1, + "splittorows":1, + "splittocols":1, + "adaptbytext":1, + "adaptbywindow":1, + "adaptbycustomer":1, + "insertparagraph":1, + "insertparagraphbeforetable":1, + "averagedistributecol":1, + "averagedistributerow":1 + }; + me.ready(function () { + utils.cssRule('table', + //选中的td上的样式 + '.selectTdClass{background-color:#edf5fa !important}' + + 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' + + //插入的表格的默认样式 + 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' + + 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + 'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' + + 'table tr.firstRow th{border-top-width:2px;}' + + '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' + + 'td p{margin:0;padding:0;}', me.document); + + var tableCopyList, isFullCol, isFullRow; + //注册del/backspace事件 + me.addListener('keydown', function (cmd, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 8) { + + var ut = getUETableBySelected(me); + if (ut && ut.selectedTds.length) { + + if (ut.isFullCol()) { + me.execCommand('deletecol') + } else if (ut.isFullRow()) { + me.execCommand('deleterow') + } else { + me.fireEvent('delcells'); + } + domUtils.preventDefault(evt); + } + + var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true), + range = me.selection.getRange(); + if (range.collapsed && caption && isEmptyBlock(caption)) { + me.fireEvent('saveScene'); + var table = caption.parentNode; + domUtils.remove(caption); + if (table) { + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + me.fireEvent('saveScene'); + } + + } + + if (keyCode == 46) { + + ut = getUETableBySelected(me); + if (ut) { + me.fireEvent('saveScene'); + for (var i = 0, ci; ci = ut.selectedTds[i++];) { + domUtils.fillNode(me.document, ci) + } + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + + } + + } + if (keyCode == 13) { + + var rng = me.selection.getRange(), + caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true); + if (caption) { + var table = domUtils.findParentByTagName(caption, 'table'); + if (!rng.collapsed) { + + rng.deleteContents(); + me.fireEvent('saveScene'); + } else { + if (caption) { + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + domUtils.preventDefault(evt); + return; + } + if (rng.collapsed) { + var table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var cell = table.rows[0].cells[0], + start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true), + preNode = table.previousSibling; + if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE' ) && domUtils.isStartInblock(rng)) { + var first = domUtils.findParent(me.selection.getStart(), function(n){return domUtils.isBlockElm(n)}, true); + if(first && ( /t(h|d)/i.test(first.tagName) || first === start.firstChild )){ + me.execCommand('insertparagraphbeforetable'); + domUtils.preventDefault(evt); + } + + } + } + } + } + + if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') { + tableCopyList = null; + var ut = getUETableBySelected(me); + if (ut) { + var tds = ut.selectedTds; + isFullCol = ut.isFullCol(); + isFullRow = ut.isFullRow(); + tableCopyList = [ + [ut.cloneCell(tds[0],null,true)] + ]; + for (var i = 1, ci; ci = tds[i]; i++) { + if (ci.parentNode !== tds[i - 1].parentNode) { + tableCopyList.push([ut.cloneCell(ci,null,true)]); + } else { + tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci,null,true)); + } + + } + } + } + }); + me.addListener("tablehasdeleted",function(){ + toggleDraggableState(this, false, "", null); + if (dragButton)domUtils.remove(dragButton); + }); + + me.addListener('beforepaste', function (cmd, html) { + var me = this; + var rng = me.selection.getRange(); + if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) { + var div = me.document.createElement("div"); + div.innerHTML = html.html; + //trace:3729 + html.html = div[browser.ie9below ? 'innerText' : 'textContent']; + return; + } + var table = getUETableBySelected(me); + if (tableCopyList) { + me.fireEvent('saveScene'); + var rng = me.selection.getRange(); + var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode; + if (td) { + var ut = getUETable(td); + if (isFullRow) { + var rowIndex = ut.getCellInfo(td).rowIndex; + if (td.tagName == 'TH') { + rowIndex++; + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = ut.insertRow(rowIndex++, "td"); + for (var j = 0, cj; cj = ci[j]; j++) { + var cell = tr.cells[j]; + if (!cell) { + cell = tr.insertCell(j) + } + cell.innerHTML = cj.innerHTML; + cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (cell.style.cssText = cj.style.cssText) + } + for (var j = 0, cj; cj = tr.cells[j]; j++) { + if (!ci[j]) + break; + cj.innerHTML = ci[j].innerHTML; + ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width')); + ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign')); + ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align')); + ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText) + } + } + } else { + if (isFullCol) { + cellInfo = ut.getCellInfo(td); + var maxColNum = 0; + for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) { + maxColNum += cj.colSpan || 1; + } + me.__hasEnterExecCommand = true; + for (i = 0; i < maxColNum; i++) { + me.execCommand('insertcol'); + } + me.__hasEnterExecCommand = false; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + if (td.tagName == 'TH') { + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + tmpNode = td; + for (var j = 0, cj; cj = ci[j++];) { + if (td) { + td.innerHTML = cj.innerHTML; + //todo 定制处理 + cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (td.style.cssText = cj.style.cssText); + preNode = td; + td = td.nextSibling; + } else { + var cloneTd = cj.cloneNode(true); + domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']); + + preNode.parentNode.appendChild(cloneTd) + } + } + td = ut.getNextCell(tmpNode, true, true); + if (!tableCopyList[i]) + break; + if (!td) { + var cellInfo = ut.getCellInfo(tmpNode); + ut.table.insertRow(ut.table.rows.length); + ut.update(); + td = ut.getVSideCell(tmpNode, true); + } + } + } + ut.update(); + } else { + table = me.document.createElement('table'); + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = table.insertRow(table.rows.length); + for (var j = 0, cj; cj = ci[j++];) { + cloneTd = UT.cloneCell(cj,null,true); + domUtils.removeAttributes(cloneTd, ['class']); + tr.appendChild(cloneTd) + } + if (j == 2 && cloneTd.rowSpan > 1) { + cloneTd.rowSpan = 1; + } + } + + var defaultValue = getDefaultValue(me), + width = me.body.offsetWidth - + (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0); + me.execCommand('insertHTML', '' + table.innerHTML.replace(/>\s*<').replace(/\bth\b/gi, "td") + '
      ') + } + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + html.html = ''; + return true; + } else { + var div = me.document.createElement("div"), tables; + div.innerHTML = html.html; + tables = div.getElementsByTagName("table"); + if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) { + utils.each(tables, function (t) { + domUtils.remove(t) + }); + if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) { + div.innerHTML = div[browser.ie ? 'innerText' : 'textContent']; + } + } else { + utils.each(tables, function (table) { + removeStyleSize(table, true); + domUtils.removeAttributes(table, ['style', 'border']); + utils.each(domUtils.getElementsByTagName(table, "td"), function (td) { + if (isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + removeStyleSize(td, true); +// domUtils.removeAttributes(td, ['style']) + }); + }); + } + html.html = div.innerHTML; + } + }); + + me.addListener('afterpaste', function () { + utils.each(domUtils.getElementsByTagName(me.body, "table"), function (table) { + if (table.offsetWidth > me.body.offsetWidth) { + var defaultValue = getDefaultValue(me, table); + table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px' + } + }) + }); + me.addListener('blur', function () { + tableCopyList = null; + }); + var timer; + me.addListener('keydown', function () { + clearTimeout(timer); + timer = setTimeout(function () { + var rng = me.selection.getRange(), + cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true); + if (cell) { + var table = cell.parentNode.parentNode.parentNode; + if (table.offsetWidth > table.getAttribute("width")) { + cell.style.wordBreak = "break-all"; + } + } + + }, 100); + }); + me.addListener("selectionchange", function () { + toggleDraggableState(me, false, "", null); + }); + + + //内容变化时触发索引更新 + //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 + me.addListener("contentchange", function () { + var me = this; + //尽可能排除一些不需要更新的状况 + hideDragLine(me); + if (getUETableBySelected(me))return; + var rng = me.selection.getRange(); + var start = rng.startContainer; + start = domUtils.findParentByTagName(start, ['td', 'th'], true); + utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) { + if (me.fireEvent("excludetable", table) === true) return; + table.ueTable = new UT(table); + //trace:3742 +// utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { +// +// if (domUtils.isEmptyBlock(td) && td !== start) { +// domUtils.fillNode(me.document, td); +// if (browser.ie && browser.version == 6) { +// td.innerHTML = ' ' +// } +// } +// }); +// utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { +// if (domUtils.isEmptyBlock(th) && th !== start) { +// domUtils.fillNode(me.document, th); +// if (browser.ie && browser.version == 6) { +// th.innerHTML = ' ' +// } +// } +// }); + table.onmouseover = function () { + me.fireEvent('tablemouseover', table); + }; + table.onmousemove = function () { + me.fireEvent('tablemousemove', table); + me.options.tableDragable && toggleDragButton(true, this, me); + utils.defer(function(){ + me.fireEvent('contentchange',50) + },true) + }; + table.onmouseout = function () { + me.fireEvent('tablemouseout', table); + toggleDraggableState(me, false, "", null); + hideDragLine(me); + }; + table.onclick = function (evt) { + evt = me.window.event || evt; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (!target)return; + var ut = getUETable(target), + table = ut.table, + cellInfo = ut.getCellInfo(target), + cellsRange, + rng = me.selection.getRange(); +// if ("topLeft" == inPosition(table, mouseCoords(evt))) { +// cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); +// ut.setSelected(cellsRange); +// return; +// } +// if ("bottomRight" == inPosition(table, mouseCoords(evt))) { +// +// return; +// } + if (inTableSide(table, target, evt, true)) { + var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdCol) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } else { + if (target !== endTdCol) { + cellsRange = ut.getCellsRange(target, endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } + return; + } + if (inTableSide(table, target, evt)) { + var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdRow) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } else { + if (target !== endTdRow) { + cellsRange = ut.getCellsRange(target, endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } + } + }; + }); + + switchBorderColor(me, true); + }); + + domUtils.on(me.document, "mousemove", mouseMoveEvent); + + domUtils.on(me.document, "mouseout", function (evt) { + var target = evt.target || evt.srcElement; + if (target.tagName == "TABLE") { + toggleDraggableState(me, false, "", null); + } + }); + /** + * 表格隔行变色 + */ + me.addListener("interlacetable",function(type,table,classList){ + if(!table) return; + var me = this, + rows = table.rows, + len = rows.length, + getClass = function(list,index,repeat){ + return list[index] ? list[index] : repeat ? list[index % list.length]: ""; + }; + for(var i = 0;i 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + if (nextCell) { + if (isEmptyBlock(nextCell)) { + range.setStart(nextCell, 0).setCursor(false, true) + } else { + range.selectNodeContents(nextCell).select() + } + } else { + me.fireEvent('saveScene'); + me.__hasEnterExecCommand = true; + this.execCommand('insertrownext'); + me.__hasEnterExecCommand = false; + range = this.selection.getRange(); + range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor(); + me.fireEvent('saveScene'); + } + } + return true; + } + + }); + browser.ie && me.addListener('selectionchange', function () { + toggleDraggableState(this, false, "", null); + }); + me.addListener("keydown", function (type, evt) { + var me = this; + //处理在表格的最后一个输入tab产生新的表格 + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8 || keyCode == 46) { + return; + } + var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; + notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); + var ut = getUETableBySelected(me); + if (!ut) return; + notCtrlKey && ut.clearSelected(); + }); + + me.addListener("beforegetcontent", function () { + switchBorderColor(this, false); + browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) { + if (domUtils.isEmptyNode(ci)) { + ci.innerHTML = ' ' + } + }); + }); + me.addListener("aftergetcontent", function () { + switchBorderColor(this, true); + }); + me.addListener("getAllHtml", function () { + removeSelectedClass(me.document.getElementsByTagName("td")); + }); + //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 + me.addListener("fullscreenchanged", function (type, fullscreen) { + if (!fullscreen) { + var ratio = this.body.offsetWidth / document.body.offsetWidth, + tables = domUtils.getElementsByTagName(this.body, "table"); + utils.each(tables, function (table) { + if (table.offsetWidth < me.body.offsetWidth) return false; + var tds = domUtils.getElementsByTagName(table, "td"), + backWidths = []; + utils.each(tds, function (td) { + backWidths.push(td.offsetWidth); + }); + for (var i = 0, td; td = tds[i]; i++) { + td.setAttribute("width", Math.floor(backWidths[i] * ratio)); + } + table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))) + }); + } + }); + + //重写execCommand命令,用于处理框选时的处理 + var oldExecCommand = me.execCommand; + me.execCommand = function (cmd, datatat) { + + var me = this, + args = arguments; + + cmd = cmd.toLowerCase(); + var ut = getUETableBySelected(me), tds, + range = new dom.Range(me.document), + cmdFun = me.commands[cmd] || UE.commands[cmd], + result; + if (!cmdFun) return; + if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + me.fireEvent("beforeexeccommand", cmd); + tds = ut.selectedTds; + var lastState = -2, lastValue = -2, value, state; + for (var i = 0, td; td = tds[i]; i++) { + if (isEmptyBlock(td)) { + range.setStart(td, 0).setCursor(false, true) + } else { + range.selectNode(td).select(true); + } + state = me.queryCommandState(cmd); + value = me.queryCommandValue(cmd); + if (state != -1) { + if (lastState !== state || lastValue !== value) { + me._ignoreContentChange = true; + result = oldExecCommand.apply(me, arguments); + me._ignoreContentChange = false; + + } + lastState = me.queryCommandState(cmd); + lastValue = me.queryCommandValue(cmd); + if (domUtils.isEmptyBlock(td)) { + domUtils.fillNode(me.document, td) + } + } + } + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + me.fireEvent('contentchange'); + me.fireEvent("afterexeccommand", cmd); + me.__hasEnterExecCommand = false; + me._selectionChange(); + } else { + result = oldExecCommand.apply(me, arguments); + } + return result; + }; + + + }); + /** + * 删除obj的宽高style,改成属性宽高 + * @param obj + * @param replaceToProperty + */ + function removeStyleSize(obj, replaceToProperty) { + removeStyle(obj, "width", true); + removeStyle(obj, "height", true); + } + + function removeStyle(obj, styleName, replaceToProperty) { + if (obj.style[styleName]) { + replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); + obj.style[styleName] = ""; + } + } + + function getParentTdOrTh(ele) { + if (ele.tagName == "TD" || ele.tagName == "TH") return ele; + var td; + if (td = domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)) return td; + return null; + } + + function isEmptyBlock(node) { + var reg = new RegExp(domUtils.fillChar, 'g'); + if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + } + + + function mouseCoords(evt) { + if (evt.pageX || evt.pageY) { + return { x:evt.pageX, y:evt.pageY }; + } + return { + x:evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, + y:evt.clientY + me.document.body.scrollTop - me.document.body.clientTop + }; + } + + function mouseMoveEvent(evt) { + + if( isEditorDisabled() ) { + return; + } + + try { + + //普通状态下鼠标移动 + var target = getParentTdOrTh(evt.target || evt.srcElement), + pos; + + //区分用户的行为是拖动还是双击 + if( isInResizeBuffer ) { + + me.body.style.webkitUserSelect = 'none'; + + if( Math.abs( userActionStatus.x - evt.clientX ) > offsetOfTableCell || Math.abs( userActionStatus.y - evt.clientY ) > offsetOfTableCell ) { + clearTableDragTimer(); + isInResizeBuffer = false; + singleClickState = 0; + //drag action + tableBorderDrag(evt); + } + } + + //修改单元格大小时的鼠标移动 + if (onDrag && dragTd) { + singleClickState = 0; + me.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + pos = mouseCoords(evt); + toggleDraggableState(me, true, onDrag, pos, target); + if (onDrag == "h") { + dragLine.style.left = getPermissionX(dragTd, evt) + "px"; + } else if (onDrag == "v") { + dragLine.style.top = getPermissionY(dragTd, evt) + "px"; + } + return; + } + //当鼠标处于table上时,修改移动过程中的光标状态 + if (target) { + //针对使用table作为容器的组件不触发拖拽效果 + if (me.fireEvent('excludetable', target) === true) + return; + pos = mouseCoords(evt); + var state = getRelation(target, pos), + table = domUtils.findParentByTagName(target, "table", true); + + if (inTableSide(table, target, evt, true)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "h.png),pointer"; + } else if (inTableSide(table, target, evt)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "v.png),pointer"; + } else { + me.body.style.cursor = "text"; + var curCell = target; + if (/\d/.test(state)) { + state = state.replace(/\d/, ''); + target = getUETable(target).getPreviewCell(target, state == "v"); + } + //位于第一行的顶部或者第一列的左边时不可拖动 + toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target); + + } + } else { + toggleDragButton(false, table, me); + } + + } catch (e) { + showError(e); + } + } + + var dragButtonTimer; + + function toggleDragButton(show, table, editor) { + if (!show) { + if (dragOver)return; + dragButtonTimer = setTimeout(function () { + !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton); + }, 2000); + } else { + createDragButton(table, editor); + } + } + + function createDragButton(table, editor) { + var pos = domUtils.getXY(table), + doc = table.ownerDocument; + if (dragButton && dragButton.parentNode)return dragButton; + dragButton = doc.createElement("div"); + dragButton.contentEditable = false; + dragButton.innerHTML = ""; + dragButton.style.cssText = "width:15px;height:15px;background-image:url(" + editor.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (pos.y - 15) + "px;left:" + (pos.x) + "px;"; + domUtils.unSelectable(dragButton); + dragButton.onmouseover = function (evt) { + dragOver = true; + }; + dragButton.onmouseout = function (evt) { + dragOver = false; + }; + domUtils.on(dragButton, 'click', function (type, evt) { + doClick(evt, this); + }); + domUtils.on(dragButton, 'dblclick', function (type, evt) { + doDblClick(evt); + }); + domUtils.on(dragButton, 'dragstart', function (type, evt) { + domUtils.preventDefault(evt); + }); + var timer; + + function doClick(evt, button) { + // 部分浏览器下需要清理 + clearTimeout(timer); + timer = setTimeout(function () { + editor.fireEvent("tableClicked", table, button); + }, 300); + } + + function doDblClick(evt) { + clearTimeout(timer); + var ut = getUETable(table), + start = table.rows[0].cells[0], + end = ut.getLastCell(), + range = ut.getCellsRange(start, end); + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + ut.setSelected(range); + } + + doc.body.appendChild(dragButton); + } + + +// function inPosition(table, pos) { +// var tablePos = domUtils.getXY(table), +// width = table.offsetWidth, +// height = table.offsetHeight; +// if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { +// return "topLeft"; +// } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { +// return "bottomRight"; +// } +// } + + function inTableSide(table, cell, evt, top) { + var pos = mouseCoords(evt), + state = getRelation(cell, pos); + + if (top) { + var caption = table.getElementsByTagName("caption")[0], + capHeight = caption ? caption.offsetHeight : 0; + return (state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8); + } else { + return (state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8); + } + } + + /** + * 获取拖动时允许的X轴坐标 + * @param dragTd + * @param evt + */ + function getPermissionX(dragTd, evt) { + var ut = getUETable(dragTd); + if (ut) { + var preTd = ut.getSameEndPosCells(dragTd, "x")[0], + nextTd = ut.getSameStartPosXCells(dragTd)[0], + mouseX = mouseCoords(evt).x, + left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20 , + right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, "width"), 10)); + + left += cellMinWidth; + right -= cellMinWidth; + + return mouseX < left ? left : mouseX > right ? right : mouseX; + } + } + + /** + * 获取拖动时允许的Y轴坐标 + */ + function getPermissionY(dragTd, evt) { + try { + var top = domUtils.getXY(dragTd).y, + mousePosY = mouseCoords(evt).y; + return mousePosY < top ? top : mousePosY; + } catch (e) { + showError(e); + } + } + + /** + * 移动状态切换 + */ + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + try { + editor.body.style.cursor = dir == "h" ? "col-resize" : dir == "v" ? "row-resize" : "text"; + if (browser.ie) { + if (dir && !mousedown && !getUETableBySelected(editor)) { + getDragLine(editor, editor.document); + showDragLineAt(dir, cell); + } else { + hideDragLine(editor) + } + } + onBorder = draggable; + } catch (e) { + showError(e); + } + } + + /** + * 获取与UETable相关的resize line + * @param uetable UETable对象 + */ + function getResizeLineByUETable() { + + var lineId = '_UETableResizeLine', + line = this.document.getElementById( lineId ); + + if( !line ) { + line = this.document.createElement("div"); + line.id = lineId; + line.contnetEditable = false; + line.setAttribute("unselectable", "on"); + + var styles = { + width: 2*cellBorderWidth + 1 + 'px', + position: 'absolute', + 'z-index': 100000, + cursor: 'col-resize', + background: 'red', + display: 'none' + }; + + //切换状态 + line.onmouseout = function(){ + this.style.display = 'none'; + }; + + utils.extend( line.style, styles ); + + this.document.body.appendChild( line ); + + } + + return line; + + } + + /** + * 更新resize-line + */ + function updateResizeLine( cell, uetable ) { + + var line = getResizeLineByUETable.call( this ), + table = uetable.table, + styles = { + top: domUtils.getXY( table ).y + 'px', + left: domUtils.getXY( cell).x + cell.offsetWidth - cellBorderWidth + 'px', + display: 'block', + height: table.offsetHeight + 'px' + }; + + utils.extend( line.style, styles ); + + } + + /** + * 显示resize-line + */ + function showResizeLine( cell ) { + + var uetable = getUETable( cell ); + + updateResizeLine.call( this, cell, uetable ); + + } + + /** + * 获取鼠标与当前单元格的相对位置 + * @param ele + * @param mousePos + */ + function getRelation(ele, mousePos) { + var elePos = domUtils.getXY(ele); + + if( !elePos ) { + return ''; + } + + if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { + return "h"; + } + if (mousePos.x - elePos.x < cellBorderWidth) { + return 'h1' + } + if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { + return "v"; + } + if (mousePos.y - elePos.y < cellBorderWidth) { + return 'v1' + } + return ''; + } + + function mouseDownEvent(type, evt) { + + if( isEditorDisabled() ) { + return ; + } + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + //右键菜单单独处理 + if (evt.button == 2) { + var ut = getUETableBySelected(me), + flag = false; + + if (ut) { + var td = getTargetTd(me, evt); + utils.each(ut.selectedTds, function (ti) { + if (ti === td) { + flag = true; + } + }); + if (!flag) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + ut.clearSelected() + } else { + td = ut.selectedTds[0]; + setTimeout(function () { + me.selection.getRange().setStart(td, 0).setCursor(false, true); + }, 0); + + } + } + } else { + tableClickHander( evt ); + } + + } + + //清除表格的计时器 + function clearTableTimer() { + tabTimer && clearTimeout( tabTimer ); + tabTimer = null; + } + + //双击收缩 + function tableDbclickHandler(evt) { + singleClickState = 0; + evt = evt || me.window.event; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (target) { + var h; + if (h = getRelation(target, mouseCoords(evt))) { + + hideDragLine( me ); + + if (h == 'h1') { + h = 'h'; + if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) { + me.execCommand('adaptbywindow'); + } else { + target = getUETable(target).getPreviewCell(target); + if (target) { + var rng = me.selection.getRange(); + rng.selectNodeContents(target).setCursor(true, true) + } + } + } + if (h == 'h') { + var ut = getUETable(target), + table = ut.table, + cells = getCellsByMoveBorder( target, table, true ); + + cells = extractArray( cells, 'left' ); + + ut.width = ut.offsetWidth; + + var oldWidth = [], + newWidth = []; + + utils.each( cells, function( cell ){ + + oldWidth.push( cell.offsetWidth ); + + } ); + + utils.each( cells, function( cell ){ + + cell.removeAttribute("width"); + + } ); + + window.setTimeout( function(){ + + //是否允许改变 + var changeable = true; + + utils.each( cells, function( cell, index ){ + + var width = cell.offsetWidth; + + if( width > oldWidth[index] ) { + changeable = false; + return false; + } + + newWidth.push( width ); + + } ); + + var change = changeable ? newWidth : oldWidth; + + utils.each( cells, function( cell, index ){ + + cell.width = change[index] - getTabcellSpace(); + + } ); + + + }, 0 ); + +// minWidth -= cellMinWidth; +// +// table.removeAttribute("width"); +// utils.each(cells, function (cell) { +// cell.style.width = ""; +// cell.width -= minWidth; +// }); + + } + } + } + } + + function tableClickHander( evt ) { + + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + //trace:3113 + //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 + utils.each(me.document.getElementsByTagName('table'), function (t) { + t.ueTable = null; + }); + startTd = getTargetTd(me, evt); + if( !startTd ) return; + var table = domUtils.findParentByTagName(startTd, "table", true); + ut = getUETable(table); + ut && ut.clearSelected(); + + //判断当前鼠标状态 + if (!onBorder) { + me.document.body.style.webkitUserSelect = ''; + mousedown = true; + me.addListener('mouseover', mouseOverEvent); + } else { + //边框上的动作处理 + borderActionHandler( evt ); + } + + + } + + //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 + function borderActionHandler( evt ) { + + if ( browser.ie ) { + evt = reconstruct(evt ); + } + + clearTableDragTimer(); + + //是否正在等待resize的缓冲中 + isInResizeBuffer = true; + + tableDragTimer = setTimeout(function(){ + tableBorderDrag( evt ); + }, dblclickTime); + + } + + function extractArray( originArr, key ) { + + var result = [], + tmp = null; + + for( var i = 0, len = originArr.length; i 0 && singleClickState--; + }, dblclickTime ); + + if( singleClickState === 2 ) { + + singleClickState = 0; + tableDbclickHandler(evt); + return; + + } + + } + + if (evt.button == 2)return; + var me = this; + //清除表格上原生跨选问题 + var range = me.selection.getRange(), + start = domUtils.findParentByTagName(range.startContainer, 'table', true), + end = domUtils.findParentByTagName(range.endContainer, 'table', true); + + if (start || end) { + if (start === end) { + start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true); + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true); + if (start !== end) { + me.selection.clearRange() + } + } else { + me.selection.clearRange() + } + } + mousedown = false; + me.document.body.style.webkitUserSelect = ''; + //拖拽状态下的mouseUP + if ( onDrag && dragTd ) { + + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + + singleClickState = 0; + dragLine = me.document.getElementById('ue_tableDragLine'); + + // trace 3973 + if (dragLine) { + var dragTdPos = domUtils.getXY(dragTd), + dragLinePos = domUtils.getXY(dragLine); + + switch (onDrag) { + case "h": + changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); + break; + case "v": + changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight); + break; + default: + } + onDrag = ""; + dragTd = null; + + hideDragLine(me); + me.fireEvent('saveScene'); + return; + } + } + //正常状态下的mouseup + if (!startTd) { + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, "td", true); + if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, "th", true); + if (target && (target.tagName == "TD" || target.tagName == "TH")) { + if (me.fireEvent("excludetable", target) === true) return; + range = new dom.Range(me.document); + range.setStart(target, 0).setCursor(false, true); + } + } else { + var ut = getUETable(startTd), + cell = ut ? ut.selectedTds[0] : null; + if (cell) { + range = new dom.Range(me.document); + if (domUtils.isEmptyBlock(cell)) { + range.setStart(cell, 0).setCursor(false, true); + } else { + range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true); + } + } else { + range = me.selection.getRange().shrinkBoundary(); + if (!range.collapsed) { + var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true), + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true); + //在table里边的不能清除 + if (start && !end || !start && end || start && end && start !== end) { + range.setCursor(false, true); + } + } + } + startTd = null; + me.removeListener('mouseover', mouseOverEvent); + } + me._selectionChange(250, evt); + } + + function mouseOverEvent(type, evt) { + + if( isEditorDisabled() ) { + return; + } + + var me = this, + tar = evt.target || evt.srcElement; + currentTd = domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true); + //需要判断两个TD是否位于同一个表格内 + if (startTd && currentTd && + ((startTd.tagName == "TD" && currentTd.tagName == "TD") || (startTd.tagName == "TH" && currentTd.tagName == "TH")) && + domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) { + var ut = getUETable(currentTd); + if (startTd != currentTd) { + me.document.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + var range = ut.getCellsRange(startTd, currentTd); + ut.setSelected(range); + } else { + me.document.body.style.webkitUserSelect = ''; + ut.clearSelected(); + } + + } + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + } + + function setCellHeight(cell, height, backHeight) { + var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10), + tmpHeight = backHeight + height; + height = tmpHeight < lineHight ? lineHight : tmpHeight; + if (cell.style.height) cell.style.height = ""; + cell.rowSpan == 1 ? cell.setAttribute("height", height) : (cell.removeAttribute && cell.removeAttribute("height")); + } + + function getWidth(cell) { + if (!cell)return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + } + + function changeColWidth(cell, changeValue) { + + var ut = getUETable(cell); + if (ut) { + + //根据当前移动的边框获取相关的单元格 + var table = ut.table, + cells = getCellsByMoveBorder( cell, table ); + + table.style.width = ""; + table.removeAttribute("width"); + + //修正改变量 + changeValue = correctChangeValue( changeValue, cell, cells ); + + if (cell.nextSibling) { + + var i=0; + + utils.each( cells, function( cellGroup ){ + + cellGroup.left.width = (+cellGroup.left.width)+changeValue; + cellGroup.right && ( cellGroup.right.width = (+cellGroup.right.width)-changeValue ); + + } ); + + } else { + + utils.each( cells, function( cellGroup ){ + cellGroup.left.width -= -changeValue; + } ); + + } + } + + } + + function isEditorDisabled() { + return me.body.contentEditable === "false"; + } + + function changeRowHeight(td, changeValue) { + if (Math.abs(changeValue) < 10) return; + var ut = getUETable(td); + if (ut) { + var cells = ut.getSameEndPosCells(td, "y"), + //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 + backHeight = cells[0] ? cells[0].offsetHeight : 0; + for (var i = 0, cell; cell = cells[i++];) { + setCellHeight(cell, changeValue, backHeight); + } + } + + } + + /** + * 获取调整单元格大小的相关单元格 + * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 + */ + function getCellsByMoveBorder( cell, table, isContainMergeCell ) { + + if( !table ) { + table = domUtils.findParentByTagName( cell, 'table' ); + } + + if( !table ) { + return null; + } + + //获取到该单元格所在行的序列号 + var index = domUtils.getNodeIndex( cell ), + temp = cell, + rows = table.rows, + colIndex = 0; + + while( temp ) { + //获取到当前单元格在未发生单元格合并时的序列 + if( temp.nodeType === 1 ) { + colIndex += (temp.colSpan || 1); + } + temp = temp.previousSibling; + } + + temp = null; + + //记录想关的单元格 + var borderCells = []; + + utils.each(rows, function( tabRow ){ + + var cells = tabRow.cells, + currIndex = 0; + + utils.each( cells, function( tabCell ){ + + currIndex += (tabCell.colSpan || 1); + + if( currIndex === colIndex ) { + + borderCells.push({ + left: tabCell, + right: tabCell.nextSibling || null + }); + + return false; + + } else if( currIndex > colIndex ) { + + if( isContainMergeCell ) { + borderCells.push({ + left: tabCell + }); + } + + return false; + } + + + } ); + + }); + + return borderCells; + + } + + + /** + * 通过给定的单元格集合获取最小的单元格width + */ + function getMinWidthByTableCells( cells ) { + + var minWidth = Number.MAX_VALUE; + + for( var i = 0, curCell; curCell = cells[ i ] ; i++ ) { + + minWidth = Math.min( minWidth, curCell.width || getTableCellWidth( curCell ) ); + + } + + return minWidth; + + } + + function correctChangeValue( changeValue, relatedCell, cells ) { + + //为单元格的paading预留空间 + changeValue -= getTabcellSpace(); + + if( changeValue < 0 ) { + return 0; + } + + changeValue -= getTableCellWidth( relatedCell ); + + //确定方向 + var direction = changeValue < 0 ? 'left':'right'; + + changeValue = Math.abs(changeValue); + + //只关心非最后一个单元格就可以 + utils.each( cells, function( cellGroup ){ + + var curCell = cellGroup[direction]; + + //为单元格保留最小空间 + if( curCell ) { + changeValue = Math.min( changeValue, getTableCellWidth( curCell )-cellMinWidth ); + } + + + } ); + + + //修正越界 + changeValue = changeValue < 0 ? 0 : changeValue; + + return direction === 'left' ? -changeValue : changeValue; + + } + + function getTableCellWidth( cell ) { + + var width = 0, + //偏移纠正量 + offset = 0, + width = cell.offsetWidth - getTabcellSpace(); + + //最后一个节点纠正一下 + if( !cell.nextSibling ) { + + width -= getTableCellOffset( cell ); + + } + + width = width < 0 ? 0 : width; + + try { + cell.width = width; + } catch(e) { + } + + return width; + + } + + /** + * 获取单元格所在表格的最末单元格的偏移量 + */ + function getTableCellOffset( cell ) { + + tab = domUtils.findParentByTagName( cell, "table", false); + + if( tab.offsetVal === undefined ) { + + var prev = cell.previousSibling; + + if( prev ) { + + //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 + tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0; + + } else { + tab.offsetVal = 0; + } + + } + + return tab.offsetVal; + + } + + function getTabcellSpace() { + + if( UT.tabcellSpace === undefined ) { + + var cell = null, + tab = me.document.createElement("table"), + tbody = me.document.createElement("tbody"), + trow = me.document.createElement("tr"), + tabcell = me.document.createElement("td"), + mirror = null; + + tabcell.style.cssText = 'border: 0;'; + tabcell.width = 1; + + trow.appendChild( tabcell ); + trow.appendChild( mirror = tabcell.cloneNode( false ) ); + + tbody.appendChild( trow ); + + tab.appendChild( tbody ); + + tab.style.cssText = "visibility: hidden;"; + + me.body.appendChild( tab ); + + UT.paddingSpace = tabcell.offsetWidth - 1; + + var tmpTabWidth = tab.offsetWidth; + + tabcell.style.cssText = ''; + mirror.style.cssText = ''; + + UT.borderWidth = ( tab.offsetWidth - tmpTabWidth ) / 3; + + UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; + + me.body.removeChild( tab ); + + } + + getTabcellSpace = function(){ return UT.tabcellSpace; }; + + return UT.tabcellSpace; + + } + + function getDragLine(editor, doc) { + if (mousedown)return; + dragLine = editor.document.createElement("div"); + domUtils.setAttributes(dragLine, { + id:"ue_tableDragLine", + unselectable:'on', + contenteditable:false, + 'onresizestart':'return false', + 'ondragstart':'return false', + 'onselectstart':'return false', + style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" + }); + editor.body.appendChild(dragLine); + } + + function hideDragLine(editor) { + if (mousedown)return; + var line; + while (line = editor.document.getElementById('ue_tableDragLine')) { + domUtils.remove(line) + } + } + + /** + * 依据state(v|h)在cell位置显示横线 + * @param state + * @param cell + */ + function showDragLineAt(state, cell) { + if (!cell) return; + var table = domUtils.findParentByTagName(cell, "table"), + caption = table.getElementsByTagName('caption'), + width = table.offsetWidth, + height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), + tablePos = domUtils.getXY(table), + cellPos = domUtils.getXY(cell), css; + switch (state) { + case "h": + css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth); + dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)'; + break; + case "v": + css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight ); + //必须加上border:0和color:blue,否则低版ie不支持背景色显示 + dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)'; + break; + default: + } + } + + /** + * 当表格边框颜色为白色时设置为虚线,true为添加虚线 + * @param editor + * @param flag + */ + function switchBorderColor(editor, flag) { + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color; + for (var i = 0, node; node = tableArr[i++];) { + var td = domUtils.getElementsByTagName(node, "td"); + if (td[0]) { + if (flag) { + color = (td[0].style.borderColor).replace(/\s/g, ""); + if (/(#ffffff)|(rgb\(255,255,255\))/ig.test(color)) + domUtils.addClass(node, "noBorderTable") + } else { + domUtils.removeClasses(node, "noBorderTable") + } + } + + } + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + /** + * 获取当前拖动的单元格 + */ + function getTargetTd(editor, evt) { + + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, ["td", "th"], true), + dir = null; + + if( !target ) { + return null; + } + + dir = getRelation( target, mouseCoords( evt ) ); + + //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td + + if( !target ) { + return null; + } + + if( dir === 'h1' && target.previousSibling ) { + + var position = domUtils.getXY( target), + cellWidth = target.offsetWidth; + + if( Math.abs( position.x + cellWidth - evt.clientX ) > cellWidth / 3 ) { + target = target.previousSibling; + } + + } else if( dir === 'v1' && target.parentNode.previousSibling ) { + + var position = domUtils.getXY( target), + cellHeight = target.offsetHeight; + + if( Math.abs( position.y + cellHeight - evt.clientY ) > cellHeight / 3 ) { + target = target.parentNode.previousSibling.firstChild; + } + + } + + + //排除了非td内部以及用于代码高亮部分的td + return target && !(editor.fireEvent("excludetable", target) === true) ? target : null; + } + +}; + + +// plugins/table.sort.js +/** + * Created with JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-12 + * Time: 上午10:20 + * To change this template use File | Settings | File Templates. + */ + +UE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) { + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + if(this.selectedTds.length){ + var range = this.cellsRange, + len = range.endRowIndex + 1; + for (var i = range.beginRowIndex; i < len; i++) { + trArray[i] = rows[i]; + } + trArray.splice(0,range.beginRowIndex); + lastRowIndex = (range.endRowIndex +1) === this.rowsNum ? 0 : range.endRowIndex +1; + }else{ + for (var i = 0,len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + } + + var Fn = { + 'reversecurrent': function(td1,td2){ + return 1; + }, + 'orderbyasc': function(td1,td2){ + var value1 = td1.innerText||td1.textContent, + value2 = td2.innerText||td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function(td1,td2){ + var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value1||0) - (value2||0); + }, + 'reversebynum': function(td1,td2){ + var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value2||0) - (value1||0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = utils.sort(trArray,function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if(!lastRowIndex){ + tbody.appendChild(fragment); + }else{ + tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) + } +}; + +UE.plugins['tablesort'] = function () { + var me = this, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }; + + + me.ready(function () { + //添加表格可排序的样式 + utils.cssRule('tablesort', + 'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' + + ' background-image:url(' + me.options.themePath + me.options.theme + '/images/sortable.png);}', + me.document); + + //做单元格合并操作时,清除可排序标识 + me.addListener("afterexeccommand", function (type, cmd) { + if( cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') { + this.execCommand('disablesort'); + } + }); + }); + + + + //表格排序 + UE.commands['sorttable'] = { + queryCommandState: function () { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; cell = cells[i++];) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand: function (cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellInfo = ut.getCellInfo(cell); + ut.sortTable(cellInfo.cellIndex, fn); + range.moveToBookmark(bk); + try{ + range.select(); + }catch(e){} + } + }; + + //设置表格可排序,清除表格可排序 + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if(table && cmd=='enablesort') { + var cells = domUtils.getElementsByTagName(table, 'th td'); + for(var i = 0; i1 || cells[i].getAttribute('rowspan')>1) return -1; + } + } + + return !table ? -1: cmd=='enablesort' ^ table.getAttribute('data-sort')!='sortEnabled' ? -1:0; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled"); + cmd == "enablesort" ? domUtils.addClass(table,"sortEnabled"):domUtils.removeClasses(table,"sortEnabled"); + } + }; +}; + + +// plugins/contextmenu.js +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 +/** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + +UE.plugins['contextmenu'] = function () { + var me = this; + me.setOpt('enableContextMenu',true); + if(me.getOpt('enableContextMenu') === false){ + return; + } + var lang = me.getLang( "contextMenu" ), + menu, + items = me.options.contextMenu || [ + {label:lang['selectall'], cmdName:'selectall'}, + { + label:lang.cleardoc, + cmdName:'cleardoc', + exec:function () { + if ( confirm( lang.confirmclear ) ) { + this.execCommand( 'cleardoc' ); + } + } + }, + '-', + { + label:lang.unlink, + cmdName:'unlink' + }, + '-', + { + group:lang.paragraph, + icon:'justifyjustify', + subMenu:[ + { + label:lang.justifyleft, + cmdName:'justify', + value:'left' + }, + { + label:lang.justifyright, + cmdName:'justify', + value:'right' + }, + { + label:lang.justifycenter, + cmdName:'justify', + value:'center' + }, + { + label:lang.justifyjustify, + cmdName:'justify', + value:'justify' + } + ] + }, + '-', + { + group:lang.table, + icon:'table', + subMenu:[ + { + label:lang.inserttable, + cmdName:'inserttable' + }, + { + label:lang.deletetable, + cmdName:'deletetable' + }, + '-', + { + label:lang.deleterow, + cmdName:'deleterow' + }, + { + label:lang.deletecol, + cmdName:'deletecol' + }, + { + label:lang.insertcol, + cmdName:'insertcol' + }, + { + label:lang.insertcolnext, + cmdName:'insertcolnext' + }, + { + label:lang.insertrow, + cmdName:'insertrow' + }, + { + label:lang.insertrownext, + cmdName:'insertrownext' + }, + '-', + { + label:lang.insertcaption, + cmdName:'insertcaption' + }, + { + label:lang.deletecaption, + cmdName:'deletecaption' + }, + { + label:lang.inserttitle, + cmdName:'inserttitle' + }, + { + label:lang.deletetitle, + cmdName:'deletetitle' + }, + { + label:lang.inserttitlecol, + cmdName:'inserttitlecol' + }, + { + label:lang.deletetitlecol, + cmdName:'deletetitlecol' + }, + '-', + { + label:lang.mergecells, + cmdName:'mergecells' + }, + { + label:lang.mergeright, + cmdName:'mergeright' + }, + { + label:lang.mergedown, + cmdName:'mergedown' + }, + '-', + { + label:lang.splittorows, + cmdName:'splittorows' + }, + { + label:lang.splittocols, + cmdName:'splittocols' + }, + { + label:lang.splittocells, + cmdName:'splittocells' + }, + '-', + { + label:lang.averageDiseRow, + cmdName:'averagedistributerow' + }, + { + label:lang.averageDisCol, + cmdName:'averagedistributecol' + }, + '-', + { + label:lang.edittd, + cmdName:'edittd', + exec:function () { + if ( UE.ui['edittd'] ) { + new UE.ui['edittd']( this ); + } + this.getDialog('edittd').open(); + } + }, + { + label:lang.edittable, + cmdName:'edittable', + exec:function () { + if ( UE.ui['edittable'] ) { + new UE.ui['edittable']( this ); + } + this.getDialog('edittable').open(); + } + }, + { + label:lang.setbordervisible, + cmdName:'setbordervisible' + } + ] + }, + { + group:lang.tablesort, + icon:'tablesort', + subMenu:[ + { + label:lang.enablesort, + cmdName:'enablesort' + }, + { + label:lang.disablesort, + cmdName:'disablesort' + }, + '-', + { + label:lang.reversecurrent, + cmdName:'sorttable', + value:'reversecurrent' + }, + { + label:lang.orderbyasc, + cmdName:'sorttable', + value:'orderbyasc' + }, + { + label:lang.reversebyasc, + cmdName:'sorttable', + value:'reversebyasc' + }, + { + label:lang.orderbynum, + cmdName:'sorttable', + value:'orderbynum' + }, + { + label:lang.reversebynum, + cmdName:'sorttable', + value:'reversebynum' + } + ] + }, + { + group:lang.borderbk, + icon:'borderBack', + subMenu:[ + { + label:lang.setcolor, + cmdName:"interlacetable", + exec:function(){ + this.execCommand("interlacetable"); + } + }, + { + label:lang.unsetcolor, + cmdName:"uninterlacetable", + exec:function(){ + this.execCommand("uninterlacetable"); + } + }, + { + label:lang.setbackground, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]}); + } + }, + { + label:lang.unsetbackground, + cmdName:"cleartablebackground", + exec:function(){ + this.execCommand("cleartablebackground"); + } + }, + { + label:lang.redandblue, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["red","blue"]}); + } + }, + { + label:lang.threecolorgradient, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#aaa","#bbb","#ccc"]}); + } + } + ] + }, + { + group:lang.aligntd, + icon:'aligntd', + subMenu:[ + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'bottom'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'bottom'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'bottom'} + } + ] + }, + { + group:lang.aligntable, + icon:'aligntable', + subMenu:[ + { + cmdName:'tablealignment', + className: 'left', + label:lang.tableleft, + value:"left" + }, + { + cmdName:'tablealignment', + className: 'center', + label:lang.tablecenter, + value:"center" + }, + { + cmdName:'tablealignment', + className: 'right', + label:lang.tableright, + value:"right" + } + ] + }, + '-', + { + label:lang.insertparagraphbefore, + cmdName:'insertparagraph', + value:true + }, + { + label:lang.insertparagraphafter, + cmdName:'insertparagraph' + }, + { + label:lang['copy'], + cmdName:'copy' + }, + { + label:lang['paste'], + cmdName:'paste' + } + ]; + if ( !items.length ) { + return; + } + var uiUtils = UE.ui.uiUtils; + + me.addListener( 'contextmenu', function ( type, evt ) { + + var offset = uiUtils.getViewportOffsetByEvent( evt ); + me.fireEvent( 'beforeselectionchange' ); + if ( menu ) { + menu.destroy(); + } + for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) { + var last; + (function ( item ) { + if ( item == '-' ) { + if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) { + contextItems.push( '-' ); + } + } else if ( item.hasOwnProperty( "group" ) ) { + for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) { + (function ( subItem ) { + if ( subItem == '-' ) { + if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) { + subMenu.push( '-' ); + }else{ + subMenu.splice(subMenu.length-1); + } + } else { + if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) && + (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) { + subMenu.push( { + 'label':subItem.label || me.getLang( "contextMenu." + subItem.cmdName + (subItem.value || '') )||"", + 'className':'edui-for-' +subItem.cmdName + ( subItem.className ? ( ' edui-for-' + subItem.cmdName + '-' + subItem.className ) : '' ), + onclick:subItem.exec ? function () { + subItem.exec.call( me ); + } : function () { + me.execCommand( subItem.cmdName, subItem.value ); + } + } ); + } + } + })( cj ); + } + if ( subMenu.length ) { + function getLabel(){ + switch (item.icon){ + case "table": + return me.getLang( "contextMenu.table" ); + case "justifyjustify": + return me.getLang( "contextMenu.paragraph" ); + case "aligntd": + return me.getLang("contextMenu.aligntd"); + case "aligntable": + return me.getLang("contextMenu.aligntable"); + case "tablesort": + return lang.tablesort; + case "borderBack": + return lang.borderbk; + default : + return ''; + } + } + contextItems.push( { + //todo 修正成自动获取方式 + 'label':getLabel(), + className:'edui-for-' + item.icon, + 'subMenu':{ + items:subMenu, + editor:me + } + } ); + } + + } else { + //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 + if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) && + (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) { + + contextItems.push( { + 'label':item.label || me.getLang( "contextMenu." + item.cmdName ), + className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')), + onclick:item.exec ? function () { + item.exec.call( me ); + } : function () { + me.execCommand( item.cmdName, item.value ); + } + } ); + } + + } + + })( ti ); + } + if ( contextItems[contextItems.length - 1] == '-' ) { + contextItems.pop(); + } + + menu = new UE.ui.Menu( { + items:contextItems, + className:"edui-contextmenu", + editor:me + } ); + menu.render(); + menu.showAt( offset ); + + me.fireEvent("aftershowcontextmenu",menu); + + domUtils.preventDefault( evt ); + if ( browser.ie ) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch ( e ) { + return; + } + if ( ieRange.item ) { + var range = new dom.Range( me.document ); + range.selectNode( ieRange.item( 0 ) ).select( true, true ); + } + } + }); + + // 添加复制的flash按钮 + me.addListener('aftershowcontextmenu', function(type, menu) { + if (me.zeroclipboard) { + var items = menu.items; + for (var key in items) { + if (items[key].className == 'edui-for-copy') { + me.zeroclipboard.clip(items[key].getDom()); + } + } + } + }); + +}; + + +// plugins/shortcutmenu.js +///import core +///commands 弹出菜单 +// commandsName popupmenu +///commandsTitle 弹出菜单 +/** + * 弹出菜单 + * @function + * @name baidu.editor.plugins.popupmenu + * @author xuheng + */ + +UE.plugins['shortcutmenu'] = function () { + var me = this, + menu, + items = me.options.shortcutMenu || []; + + if (!items.length) { + return; + } + + me.addListener ('contextmenu mouseup' , function (type , e) { + var me = this, + customEvt = { + type : type , + target : e.target || e.srcElement , + screenX : e.screenX , + screenY : e.screenY , + clientX : e.clientX , + clientY : e.clientY + }; + + setTimeout (function () { + var rng = me.selection.getRange (); + if (rng.collapsed === false || type == "contextmenu") { + + if (!menu) { + menu = new baidu.editor.ui.ShortCutMenu ({ + editor : me , + items : items , + theme : me.options.theme , + className : 'edui-shortcutmenu' + }); + + menu.render (); + me.fireEvent ("afterrendershortcutmenu" , menu); + } + + menu.show (customEvt , !!UE.plugins['contextmenu']); + } + }); + + if (type == 'contextmenu') { + domUtils.preventDefault (e); + if (browser.ie9below) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range (me.document); + range.selectNode (ieRange.item (0)).select (true , true); + + } + } + } + }); + + me.addListener ('keydown' , function (type) { + if (type == "keydown") { + menu && !menu.isHidden && menu.hide (); + } + + }); + +}; + + + + +// plugins/basestyle.js +/** + * B、I、sub、super命令支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['basestyle'] = function(){ + + /** + * 字体加粗 + * @command bold + * @param { String } cmd 命令字符串 + * @remind 对已加粗的文本内容执行该命令, 将取消加粗 + * @method execCommand + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行加粗操作 + * //第一次执行, 文本内容加粗 + * editor.execCommand( 'bold' ); + * + * //第二次执行, 文本内容取消加粗 + * editor.execCommand( 'bold' ); + * ``` + */ + + + /** + * 字体倾斜 + * @command italic + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行斜体操作 + * //第一次操作, 文本内容将变成斜体 + * editor.execCommand( 'italic' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'italic' ); + * ``` + */ + + /** + * 下标文本,与“superscript”命令互斥 + * @command subscript + * @method execCommand + * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行下标操作 + * //第一次操作, 文本内容将变成下标文本 + * editor.execCommand( 'subscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'subscript' ); + * ``` + */ + + /** + * 上标文本,与“subscript”命令互斥 + * @command superscript + * @method execCommand + * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行上标操作 + * //第一次操作, 文本内容将变成上标文本 + * editor.execCommand( 'superscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'superscript' ); + * ``` + */ + var basestyles = { + 'bold':['strong','b'], + 'italic':['em','i'], + 'subscript':['sub'], + 'superscript':['sup'] + }, + getObj = function(editor,tagNames){ + return domUtils.filterNodeList(editor.selection.getStartElementPath(),tagNames); + }, + me = this; + //添加快捷键 + me.addshortcutkey({ + "Bold" : "ctrl+66",//^B + "Italic" : "ctrl+73", //^I + "Underline" : "ctrl+85"//^U + }); + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('b i'),function(node){ + switch (node.tagName){ + case 'b': + node.tagName = 'strong'; + break; + case 'i': + node.tagName = 'em'; + } + }); + }); + for ( var style in basestyles ) { + (function( cmd, tagNames ) { + me.commands[cmd] = { + execCommand : function( cmdName ) { + var range = me.selection.getRange(),obj = getObj(this,tagNames); + if ( range.collapsed ) { + if ( obj ) { + var tmpText = me.document.createTextNode(''); + range.insertNode( tmpText ).removeInlineStyle( tagNames ); + range.setStartBefore(tmpText); + domUtils.remove(tmpText); + } else { + var tmpNode = range.document.createElement( tagNames[0] ); + if(cmdName == 'superscript' || cmdName == 'subscript'){ + tmpText = me.document.createTextNode(''); + range.insertNode(tmpText) + .removeInlineStyle(['sub','sup']) + .setStartBefore(tmpText) + .collapse(true); + } + range.insertNode( tmpNode ).setStart( tmpNode, 0 ); + } + range.collapse( true ); + } else { + if(cmdName == 'superscript' || cmdName == 'subscript'){ + if(!obj || obj.tagName.toLowerCase() != cmdName){ + range.removeInlineStyle(['sub','sup']); + } + } + obj ? range.removeInlineStyle( tagNames ) : range.applyInlineStyle( tagNames[0] ); + } + range.select(); + }, + queryCommandState : function() { + return getObj(this,tagNames) ? 1 : 0; + } + }; + })( style, basestyles[style] ); + } +}; + + + +// plugins/elementpath.js +/** + * 选取路径命令 + * @file + */ +UE.plugins['elementpath'] = function(){ + var currentLevel, + tagNames, + me = this; + me.setOpt('elementPathEnabled',true); + if(!me.options.elementPathEnabled){ + return; + } + me.commands['elementpath'] = { + execCommand : function( cmdName, level ) { + var start = tagNames[level], + range = me.selection.getRange(); + currentLevel = level*1; + range.selectNode(start).select(); + }, + queryCommandValue : function() { + //产生一个副本,不能修改原来的startElementPath; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), + names = []; + tagNames = parents; + for(var i=0,ci;ci=parents[i];i++){ + if(ci.nodeType == 3) { + continue; + } + var name = ci.tagName.toLowerCase(); + if(name == 'img' && ci.getAttribute('anchorname')){ + name = 'anchor'; + } + names[i] = name; + if(currentLevel == i){ + currentLevel = -1; + break; + } + } + return names; + } + }; +}; + + + +// plugins/formatmatch.js +/** + * 格式刷,只格式inline的 + * @file + * @since 1.2.6.1 + */ + +/** + * 格式刷 + * @command formatmatch + * @method execCommand + * @remind 该操作不能复制段落格式 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //获取格式刷 + * editor.execCommand( 'formatmatch' ); + * ``` + */ +UE.plugins['formatmatch'] = function(){ + + var me = this, + list = [],img, + flag = 0; + + me.addListener('reset',function(){ + list = []; + flag = 0; + }); + + function addList(type,evt){ + + if(browser.webkit){ + var target = evt.target.tagName == 'IMG' ? evt.target : null; + } + + function addFormat(range){ + + if(text){ + range.selectNode(text); + } + return range.applyInlineStyle(list[list.length-1].tagName,null,list); + + } + + me.undoManger && me.undoManger.save(); + + var range = me.selection.getRange(), + imgT = target || range.getClosedNode(); + if(img && imgT && imgT.tagName == 'IMG'){ + //trace:964 + + imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat ||'none') + ';display:' + (img.style.display||'inline'); + + img = null; + }else{ + if(!img){ + var collapsed = range.collapsed; + if(collapsed){ + var text = me.document.createTextNode('match'); + range.insertNode(text).select(); + + + } + me.__hasEnterExecCommand = true; + //不能把block上的属性干掉 + //trace:1553 + var removeFormatAttributes = me.options.removeFormatAttributes; + me.options.removeFormatAttributes = ''; + me.execCommand('removeformat'); + me.options.removeFormatAttributes = removeFormatAttributes; + me.__hasEnterExecCommand = false; + //trace:969 + range = me.selection.getRange(); + if(list.length){ + addFormat(range); + } + if(text){ + range.setStartBefore(text).collapse(true); + + } + range.select(); + text && domUtils.remove(text); + } + + } + + + + + me.undoManger && me.undoManger.save(); + me.removeListener('mouseup',addList); + flag = 0; + } + + me.commands['formatmatch'] = { + execCommand : function( cmdName ) { + + if(flag){ + flag = 0; + list = []; + me.removeListener('mouseup',addList); + return; + } + + + + var range = me.selection.getRange(); + img = range.getClosedNode(); + if(!img || img.tagName != 'IMG'){ + range.collapse(true).shrinkBoundary(); + var start = range.startContainer; + list = domUtils.findParents(start,true,function(node){ + return !domUtils.isBlockElm(node) && node.nodeType == 1; + }); + //a不能加入格式刷, 并且克隆节点 + for(var i=0,ci;ci=list[i];i++){ + if(ci.tagName == 'A'){ + list.splice(i,1); + break; + } + } + + } + + me.addListener('mouseup',addList); + flag = 1; + + + }, + queryCommandState : function() { + return flag; + }, + notNeedUndo : 1 + }; +}; + + + +// plugins/searchreplace.js +///import core +///commands 查找替换 +///commandsName SearchReplace +///commandsTitle 查询替换 +///commandsDialog dialogs\searchreplace +/** + * @description 查找替换 + * @author zhanyi + */ + +UE.plugin.register('searchreplace',function(){ + var me = this; + + var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1}; + + function findTextInString(textContent,opt,currentIndex){ + var str = opt.searchStr; + if(opt.dir == -1){ + textContent = textContent.split('').reverse().join(''); + str = str.split('').reverse().join(''); + currentIndex = textContent.length - currentIndex; + + } + var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match; + + while(match = reg.exec(textContent)){ + if(match.index >= currentIndex){ + return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index; + } + } + return -1 + } + function findTextBlockElm(node,currentIndex,opt){ + var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode'; + if(domUtils.isBody(node)){ + node = node.firstChild; + } + var first = 1; + while(node){ + textContent = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']; + index = findTextInString(textContent,opt,currentIndex ); + first = 0; + if(index!=-1){ + return { + 'node':node, + 'index':index + } + } + node = domUtils[methodName](node); + while(node && _blockElm[node.nodeName.toLowerCase()]){ + node = domUtils[methodName](node,true); + } + if(node){ + currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0; + } + + } + } + function findNTextInBlockElm(node,index,str){ + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while(currentNode){ + if(currentNode.nodeType == 3){ + currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length; + currentIndex += currentNodeLength; + if(currentIndex >= index){ + return { + 'node':currentNode, + 'index': currentNodeLength - (currentIndex - index) + } + } + }else if(!dtd.$empty[currentNode.tagName]){ + currentNodeLength = currentNode[browser.ie ? 'innerText' : 'textContent'].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length + currentIndex += currentNodeLength; + if(currentIndex >= index){ + result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str); + if(result){ + return result; + } + } + } + currentNode = domUtils.getNextDomNode(currentNode); + + } + } + + function searchReplace(me,opt){ + + var rng = me.selection.getRange(), + startBlockNode, + searchStr = opt.searchStr, + span = me.document.createElement('span'); + span.innerHTML = '$$ueditor_searchreplace_key$$'; + + rng.shrinkBoundary(true); + + //判断是不是第一次选中 + if(!rng.collapsed){ + rng.select(); + var rngText = me.selection.getText(); + if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){ + if(opt.replaceStr != undefined){ + replaceText(rng,opt.replaceStr); + rng.select(); + return true; + }else{ + rng.collapse(opt.dir == -1) + } + + } + } + + + rng.insertNode(span); + rng.enlargeToBlockElm(true); + startBlockNode = rng.startContainer; + var currentIndex = startBlockNode[browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$'); + rng.setStartBefore(span); + domUtils.remove(span); + var result = findTextBlockElm(startBlockNode,currentIndex,opt); + if(result){ + var rngStart = findNTextInBlockElm(result.node,result.index,searchStr); + var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr); + rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index); + + if(opt.replaceStr !== undefined){ + replaceText(rng,opt.replaceStr) + } + rng.select(); + return true; + }else{ + rng.setCursor() + } + + } + function replaceText(rng,str){ + + str = me.document.createTextNode(str); + rng.deleteContents().insertNode(str); + + } + return { + commands:{ + 'searchreplace':{ + execCommand:function(cmdName,opt){ + utils.extend(opt,{ + all : false, + casesensitive : false, + dir : 1 + },true); + var num = 0; + if(opt.all){ + + var rng = me.selection.getRange(), + first = me.body.firstChild; + if(first && first.nodeType == 1){ + rng.setStart(first,0); + rng.shrinkBoundary(true); + }else if(first.nodeType == 3){ + rng.setStartBefore(first) + } + rng.collapse(true).select(true); + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + while(searchReplace(this,opt)){ + num++; + } + if(num){ + me.fireEvent('saveScene'); + } + }else{ + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + if(searchReplace(this,opt)){ + num++ + } + if(num){ + me.fireEvent('saveScene'); + } + + } + + return num; + }, + notNeedUndo:1 + } + } + } +}); + +// plugins/customstyle.js +/** + * 自定义样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 + * @command customstyle + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'customstyle' ); + * ``` + */ +UE.plugins['customstyle'] = function() { + var me = this; + me.setOpt({ 'customstyle':[ + {tag:'h1',name:'tc', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + {tag:'h1',name:'tl', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;'}, + {tag:'span',name:'im', style:'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'}, + {tag:'span',name:'hi', style:'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;'} + ]}); + me.commands['customstyle'] = { + execCommand : function(cmdName, obj) { + var me = this, + tagName = obj.tag, + node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label'); + }, true), + range,bk,tmpObj = {}; + for (var p in obj) { + if(obj[p]!==undefined) + tmpObj[p] = obj[p]; + } + delete tmpObj.tag; + if (node && node.getAttribute('label') == obj.label) { + range = this.selection.getRange(); + bk = range.createBookmark(); + if (range.collapsed) { + //trace:1732 删掉自定义标签,要有p来回填站位 + if(dtd.$block[node.tagName]){ + var fillNode = me.document.createElement('p'); + domUtils.moveChild(node, fillNode); + node.parentNode.insertBefore(fillNode, node); + domUtils.remove(node); + }else{ + domUtils.remove(node,true); + } + + } else { + + var common = domUtils.getCommonAncestor(bk.start, bk.end), + nodes = domUtils.getElementsByTagName(common, tagName); + if(new RegExp(tagName,'i').test(common.tagName)){ + nodes.push(common); + } + for (var i = 0,ni; ni = nodes[i++];) { + if (ni.getAttribute('label') == obj.label) { + var ps = domUtils.getPosition(ni, bk.start),pe = domUtils.getPosition(ni, bk.end); + if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) + if (dtd.$block[tagName]) { + var fillNode = me.document.createElement('p'); + domUtils.moveChild(ni, fillNode); + ni.parentNode.insertBefore(fillNode, ni); + } + domUtils.remove(ni, true); + } + } + node = domUtils.findParent(common, function(node) { + return node.getAttribute('label') == obj.label; + }, true); + if (node) { + + domUtils.remove(node, true); + + } + + } + range.moveToBookmark(bk).select(); + } else { + if (dtd.$block[tagName]) { + this.execCommand('paragraph', tagName, tmpObj,'customstyle'); + range = me.selection.getRange(); + if (!range.collapsed) { + range.collapse(); + node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label') == obj.label; + }, true); + var pNode = me.document.createElement('p'); + domUtils.insertAfter(node, pNode); + domUtils.fillNode(me.document, pNode); + range.setStart(pNode, 0).setCursor(); + } + } else { + + range = me.selection.getRange(); + if (range.collapsed) { + node = me.document.createElement(tagName); + domUtils.setAttributes(node, tmpObj); + range.insertNode(node).setStart(node, 0).setCursor(); + + return; + } + + bk = range.createBookmark(); + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } + + }, + queryCommandValue : function() { + var parent = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function(node){return node.getAttribute('label')} + ); + return parent ? parent.getAttribute('label') : ''; + } + }; + //当去掉customstyle是,如果是块元素,用p代替 + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + var range = me.selection.getRange(); + if (range.collapsed) { + var node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label'); + }, true); + if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { + var p = me.document.createElement('p'); + domUtils.insertAfter(node, p); + domUtils.fillNode(me.document, p); + domUtils.remove(node); + range.setStart(p, 0).setCursor(); + + + } + } + } + }); +}; + +// plugins/catchremoteimage.js +///import core +///commands 远程图片抓取 +///commandsName catchRemoteImage,catchremoteimageenable +///commandsTitle 远程图片抓取 +/** + * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 + */ +UE.plugins['catchremoteimage'] = function () { + var me = this, + ajax = UE.ajax; + + /* 设置默认值 */ + if (me.options.catchRemoteImageEnable === false) return; + me.setOpt({ + catchRemoteImageEnable: false + }); + + me.addListener("afterpaste", function () { + me.fireEvent("catchRemoteImage"); + }); + + me.addListener("catchRemoteImage", function () { + + var catcherLocalDomain = me.getOpt('catcherLocalDomain'), + catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')), + catcherUrlPrefix = me.getOpt('catcherUrlPrefix'), + catcherFieldName = me.getOpt('catcherFieldName'); + + var remoteImages = [], + imgs = domUtils.getElementsByTagName(me.document, "img"), + test = function (src, urls) { + if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { + return true; + } + if (urls) { + for (var j = 0, url; url = urls[j++];) { + if (src.indexOf(url) !== -1) { + return true; + } + } + } + return false; + }; + + for (var i = 0, ci; ci = imgs[i++];) { + if (ci.getAttribute("word_img")) { + continue; + } + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + } + } + + if (remoteImages.length) { + catchremoteimage(remoteImages, { + //成功抓取 + success: function (r) { + try { + var info = r.state !== undefined ? r:eval("(" + r.responseText + ")"); + } catch (e) { + return; + } + + /* 获取源路径和新路径 */ + var i, j, ci, cj, oldSrc, newSrc, list = info.list; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { //抓取失败时不做替换处理 + newSrc = catcherUrlPrefix + cj.url; + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc + }); + break; + } + } + } + me.fireEvent('catchremotesuccess') + }, + //回调失败,本次请求超时 + error: function () { + me.fireEvent("catchremoteerror"); + } + }); + } + + function catchremoteimage(imgs, callbacks) { + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?':'&') + params), + isJsonp = utils.isCrossDomainUrl(url), + opt = { + 'method': 'POST', + 'dataType': isJsonp ? 'jsonp':'', + 'timeout': 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 + 'onsuccess': callbacks["success"], + 'onerror': callbacks["error"] + }; + opt[catcherFieldName] = imgs; + ajax.request(url, opt); + } + + }); +}; + +// plugins/snapscreen.js +/** + * 截屏插件,为UEditor提供插入支持 + * @file + * @since 1.4.2 + */ +UE.plugin.register('snapscreen', function (){ + + var me = this; + var snapplugin; + + function getLocation(url){ + var search, + a = document.createElement('a'), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + a.href = url; + if (browser.ie) { + a.href = a.href; + } + + + search = a.search; + if (params) { + search = search + (search.indexOf('?') == -1 ? '?':'&')+ params; + search = search.replace(/[&]+/ig, '&'); + } + return { + 'port': a.port, + 'hostname': a.hostname, + 'path': a.pathname + search || + a.hash + } + } + + return { + commands:{ + /** + * 字体背景颜色 + * @command snapscreen + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('snapscreen'); + * ``` + */ + 'snapscreen':{ + execCommand:function (cmd) { + var url, local, res; + var lang = me.getLang("snapScreen_plugin"); + + if(!snapplugin){ + var container = me.container; + var doc = me.container.ownerDocument || me.container.document; + snapplugin = doc.createElement("object"); + try{snapplugin.type = "application/x-pluginbaidusnap";}catch(e){ + return; + } + snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;"; + snapplugin.setAttribute("width","0"); + snapplugin.setAttribute("height","0"); + container.appendChild(snapplugin); + } + + function onSuccess(rs){ + try{ + rs = eval("("+ rs +")"); + if(rs.state == 'SUCCESS'){ + var opt = me.options; + me.execCommand('insertimage', { + src: opt.snapscreenUrlPrefix + rs.url, + _src: opt.snapscreenUrlPrefix + rs.url, + alt: rs.title || '', + floatStyle: opt.snapscreenImgAlign + }); + } else { + alert(rs.state); + } + }catch(e){ + alert(lang.callBackErrorMsg); + } + } + url = me.getActionUrl(me.getOpt('snapscreenActionName')); + local = getLocation(url); + setTimeout(function () { + try{ + res =snapplugin.saveSnapshot(local.hostname, local.path, local.port); + }catch(e){ + me.ui._dialogs['snapscreenDialog'].open(); + return; + } + + onSuccess(res); + }, 50); + }, + queryCommandState: function(){ + return (navigator.userAgent.indexOf("Windows",0) != -1) ? 0:-1; + } + } + } + } +}); + + +// plugins/insertparagraph.js +/** + * 插入段落 + * @file + * @since 1.2.6.1 + */ + + +/** + * 插入段落 + * @command insertparagraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * editor.execCommand( 'insertparagraph' ); + * ``` + */ + +UE.commands['insertparagraph'] = { + execCommand : function( cmdName,front) { + var me = this, + range = me.selection.getRange(), + start = range.startContainer,tmpNode; + while(start ){ + if(domUtils.isBody(start)){ + break; + } + tmpNode = start; + start = start.parentNode; + } + if(tmpNode){ + var p = me.document.createElement('p'); + if(front){ + tmpNode.parentNode.insertBefore(p,tmpNode) + }else{ + tmpNode.parentNode.insertBefore(p,tmpNode.nextSibling) + } + domUtils.fillNode(me.document,p); + range.setStart(p,0).setCursor(false,true); + } + } +}; + + + +// plugins/webapp.js +/** + * 百度应用 + * @file + * @since 1.2.6.1 + */ + + +/** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + +//UE.plugins['webapp'] = function () { +// var me = this; +// function createInsertStr( obj, toIframe, addParagraph ) { +// return !toIframe ? +// (addParagraph ? '

      ' : '') + '' + +// (addParagraph ? '

      ' : '') +// : +// ''; +// } +// +// function switchImgAndIframe( img2frame ) { +// var tmpdiv, +// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); +// for ( var i = 0, node; node = nodes[i++]; ) { +// if ( node.className != "edui-faked-webapp" ){ +// continue; +// } +// tmpdiv = me.document.createElement( "div" ); +// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); +// node.parentNode.replaceChild( tmpdiv.firstChild, node ); +// } +// } +// +// me.addListener( "beforegetcontent", function () { +// switchImgAndIframe( true ); +// } ); +// me.addListener( 'aftersetcontent', function () { +// switchImgAndIframe( false ); +// } ); +// me.addListener( 'aftergetcontent', function ( cmdName ) { +// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ +// return; +// } +// switchImgAndIframe( false ); +// } ); +// +// me.commands['webapp'] = { +// execCommand:function ( cmd, obj ) { +// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); +// } +// }; +//}; + +UE.plugin.register('webapp', function (){ + var me = this; + function createInsertStr(obj,toEmbed){ + return !toEmbed ? + '' + : + '' + + } + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(node){ + var html; + if(node.getAttr('class') == 'edui-faked-webapp'){ + html = createInsertStr({ + title:node.getAttr('title'), + 'width':node.getAttr('width'), + 'height':node.getAttr('height'), + 'align':node.getAttr('align'), + 'cssfloat':node.getStyle('float'), + 'url':node.getAttr("_url"), + 'logo':node.getAttr('_logo_url') + },true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed,node); + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('iframe'),function(node){ + if(node.getAttr('class') == 'edui-faked-webapp'){ + var img = UE.uNode.createElement(createInsertStr({ + title:node.getAttr('title'), + 'width':node.getAttr('width'), + 'height':node.getAttr('height'), + 'align':node.getAttr('align'), + 'cssfloat':node.getStyle('float'), + 'url':node.getAttr("src"), + 'logo':node.getAttr('logo_url') + })); + node.parentNode.replaceChild(img,node); + } + }) + + }, + commands:{ + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + 'webapp':{ + execCommand:function (cmd, obj) { + + var me = this, + str = createInsertStr(utils.extend(obj,{ + align:'none' + }), false); + me.execCommand("inserthtml",str); + }, + queryCommandState:function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-webapp"); + return flag ? 1 : 0; + } + } + } + } +}); + +// plugins/template.js +///import core +///import plugins\inserthtml.js +///import plugins\cleardoc.js +///commands 模板 +///commandsName template +///commandsTitle 模板 +///commandsDialog dialogs\template +UE.plugins['template'] = function () { + UE.commands['template'] = { + execCommand:function (cmd, obj) { + obj.html && this.execCommand("inserthtml", obj.html); + } + }; + this.addListener("click", function (type, evt) { + var el = evt.target || evt.srcElement, + range = this.selection.getRange(); + var tnode = domUtils.findParent(el, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + tnode && range.selectNode(tnode).shrinkBoundary().select(); + }); + this.addListener("keydown", function (type, evt) { + var range = this.selection.getRange(); + if (!range.collapsed) { + if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + var tnode = domUtils.findParent(range.startContainer, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + if (tnode) { + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } + }); +}; + + +// plugins/music.js +/** + * 插入音乐命令 + * @file + */ +UE.plugin.register('music', function (){ + var me = this; + function creatInsertStr(url,width,height,align,cssfloat,toEmbed){ + return !toEmbed ? + '' + : + ''; + } + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(node){ + var html; + if(node.getAttr('class') == 'edui-faked-music'){ + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("_url"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed,node); + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('embed'),function(node){ + if(node.getAttr('class') == 'edui-faked-music'){ + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("src"), node.getAttr('width'), node.getAttr('height'), align, cssfloat,false); + var img = UE.uNode.createElement(html); + node.parentNode.replaceChild(img,node); + } + }) + + }, + commands:{ + /** + * 插入音乐 + * @command music + * @method execCommand + * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; + * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'music' , { + * width: 400, + * height: 95, + * align: "center", + * url: "音乐地址" + * } ); + * ``` + */ + 'music':{ + execCommand:function (cmd, musicObj) { + var me = this, + str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, "none", false); + me.execCommand("inserthtml",str); + }, + queryCommandState:function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-music"); + return flag ? 1 : 0; + } + } + } + } +}); + +// plugins/autoupload.js +/** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ +UE.plugin.register('autoupload', function (){ + + function sendAndInsertFile(file, editor) { + var me = editor; + //模拟数据 + var fieldName, urlPrefix, maxSize, allowFiles, actionUrl, + loadingHtml, errorHandler, successHandler, + filetype = /image\/\w+/i.test(file.type) ? 'image':'file', + loadingId = 'loading_' + (+new Date()).toString(36); + + fieldName = me.getOpt(filetype + 'FieldName'); + urlPrefix = me.getOpt(filetype + 'UrlPrefix'); + maxSize = me.getOpt(filetype + 'MaxSize'); + allowFiles = me.getOpt(filetype + 'AllowFiles'); + actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName')); + errorHandler = function(title) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + }; + + if (filetype == 'image') { + loadingHtml = ''; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + if (loader) { + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', data.title || ''); + loader.setAttribute('alt', data.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } + }; + } else { + loadingHtml = '

      ' + + '' + + '

      '; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + + var rng = me.selection.getRange(), + bk = rng.createBookmark(); + rng.selectNode(loader).select(); + me.execCommand('insertfile', {'url': link}); + rng.moveToBookmark(bk).select(); + }; + } + + /* 插入loading的占位符 */ + me.execCommand('inserthtml', loadingHtml); + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt(filetype + 'ActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + /* 判断文件大小是否超出限制 */ + if(file.size > maxSize) { + errorHandler(me.getLang('autoupload.exceedSizeError')); + return; + } + /* 判断文件格式是否超出允许 */ + var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')):''; + if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + errorHandler(me.getLang('autoupload.exceedTypeError')); + return; + } + + /* 创建Ajax并提交 */ + var xhr = new XMLHttpRequest(), + fd = new FormData(), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + + fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length))); + fd.append('type', 'ajax'); + xhr.open("post", url, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener('load', function (e) { + try{ + var json = (new Function("return " + utils.trim(e.target.response)))(); + if (json.state == 'SUCCESS' && json.url) { + successHandler(json); + } else { + errorHandler(json.state); + } + }catch(er){ + errorHandler(me.getLang('autoupload.loadError')); + } + }); + xhr.send(fd); + } + + function getPasteImage(e){ + return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null; + } + function getDropImage(e){ + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null; + } + + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(n){ + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + utils.each(root.getNodesByTagName('p'),function(n){ + if (/\bloadpara\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + bindEvents:{ + //插入粘贴板的图片,拖放插入图片 + 'ready':function(e){ + var me = this; + if(window.FormData && window.FileReader) { + domUtils.on(me.body, 'paste drop', function(e){ + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == 'paste' ? getPasteImage(e):getDropImage(e); + if(items){ + var len = items.length, + file; + while (len--){ + file = items[len]; + if(file.getAsFile) file = file.getAsFile(); + if(file && file.size > 0) { + sendAndInsertFile(file, me); + hasImg = true; + } + } + hasImg && e.preventDefault(); + } + + }); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, 'dragover', function (e) { + if(e.dataTransfer.types[0] == 'Files') { + e.preventDefault(); + } + }); + + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + } + } + } + } +}); + +// plugins/autosave.js +UE.plugin.register('autosave', function (){ + + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + function save ( editor ) { + + var saveData; + + if ( new Date() - lastSaveTime < MIN_TIME ) { + return; + } + + if ( !editor.hasContents() ) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && me.removePreferences( saveKey ); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if ( editor.fireEvent( "beforeautosave", { + content: saveData + } ) === false ) { + return; + } + + me.setPreferences( saveKey, saveData ); + + editor.fireEvent( "afterautosave", { + content: saveData + } ); + + } + + return { + defaultOptions: { + //默认间隔时间 + saveInterval: 500 + }, + bindEvents:{ + 'ready':function(){ + + var _suffix = "-drafts-data", + key = null; + + if ( me.key ) { + key = me.key + _suffix; + } else { + key = ( me.container.parentNode.id || 'ue-common' ) + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = ( location.protocol + location.host + location.pathname ).replace( /[.:\/]/g, '_' ) + key; + + }, + + 'contentchange': function () { + + if ( !saveKey ) { + return; + } + + if ( me._saveFlag ) { + window.clearTimeout( me._saveFlag ); + } + + if ( me.options.saveInterval > 0 ) { + + me._saveFlag = window.setTimeout( function () { + + save( me ); + + }, me.options.saveInterval ); + + } else { + + save(me); + + } + + + } + }, + commands:{ + 'clearlocaldata':{ + execCommand:function (cmd, name) { + if ( saveKey && me.getPreferences( saveKey ) ) { + me.removePreferences( saveKey ) + } + }, + notNeedUndo: true, + ignoreContentChange:true + }, + + 'getlocaldata':{ + execCommand:function (cmd, name) { + return saveKey ? me.getPreferences( saveKey ) || '' : ''; + }, + notNeedUndo: true, + ignoreContentChange:true + }, + + 'drafts':{ + execCommand:function (cmd, name) { + if ( saveKey ) { + me.body.innerHTML = me.getPreferences( saveKey ) || '

      '+domUtils.fillHtml+'

      '; + me.focus(true); + } + }, + queryCommandState: function () { + return saveKey ? ( me.getPreferences( saveKey ) === null ? -1 : 0 ) : -1; + }, + notNeedUndo: true, + ignoreContentChange:true + } + } + } + +}); + +// plugins/charts.js +UE.plugin.register('charts', function (){ + + var me = this; + + return { + bindEvents: { + 'chartserror': function () { + } + }, + commands:{ + 'charts': { + execCommand: function ( cmd, data ) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true), + flagText = [], + config = {}; + + if ( !tableNode ) { + return false; + } + + if ( !validData( tableNode ) ) { + me.fireEvent( "chartserror" ); + return false; + } + + config.title = data.title || ''; + config.subTitle = data.subTitle || ''; + config.xTitle = data.xTitle || ''; + config.yTitle = data.yTitle || ''; + config.suffix = data.suffix || ''; + config.tip = data.tip || ''; + //数据对齐方式 + config.dataFormat = data.tableDataFormat || ''; + //图表类型 + config.chartType = data.chartType || 0; + + for ( var key in config ) { + + if ( !config.hasOwnProperty( key ) ) { + continue; + } + + flagText.push( key+":"+config[ key ] ); + + } + + tableNode.setAttribute( "data-chart", flagText.join( ";" ) ); + domUtils.addClass( tableNode, "edui-charts-table" ); + + + + }, + queryCommandState: function ( cmd, name ) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true); + return tableNode && validData( tableNode ) ? 0 : -1; + + } + } + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('table'),function( tableNode ){ + + if ( tableNode.getAttr("data-chart") !== undefined ) { + tableNode.setAttr("style"); + } + + }) + + }, + outputRule:function(root){ + utils.each(root.getNodesByTagName('table'),function( tableNode ){ + + if ( tableNode.getAttr("data-chart") !== undefined ) { + tableNode.setAttr("style", "display: none;"); + } + + }) + + } + } + + function validData ( table ) { + + var firstRows = null, + cellCount = 0; + + //行数不够 + if ( table.rows.length < 2 ) { + return false; + } + + //列数不够 + if ( table.rows[0].cells.length < 2 ) { + return false; + } + + //第一行所有cell必须是th + firstRows = table.rows[ 0 ].cells; + cellCount = firstRows.length; + + for ( var i = 0, cell; cell = firstRows[ i ]; i++ ) { + + if ( cell.tagName.toLowerCase() !== 'th' ) { + return false; + } + + } + + for ( var i = 1, row; row = table.rows[ i ]; i++ ) { + + //每行单元格数不匹配, 返回false + if ( row.cells.length != cellCount ) { + return false; + } + + //第一列不是th也返回false + if ( row.cells[0].tagName.toLowerCase() !== 'th' ) { + return false; + } + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + value = value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + + //必须是数字 + if ( !/^\d*\.?\d+$/.test( value ) ) { + return false; + } + + } + + } + + return true; + + } + +}); + +// plugins/section.js +/** + * 目录大纲支持插件 + * @file + * @since 1.3.0 + */ +UE.plugin.register('section', function (){ + /* 目录节点对象 */ + function Section(option){ + this.tag = ''; + this.level = -1, + this.dom = null; + this.nextSection = null; + this.previousSection = null; + this.parentSection = null; + this.startAddress = []; + this.endAddress = []; + this.children = []; + } + function getSection(option) { + var section = new Section(); + return utils.extend(section, option); + } + function getNodeFromAddress(startAddress, root) { + var current = root; + for(var i = 0;i < startAddress.length; i++) { + if(!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var me = this; + + return { + bindMultiEvents:{ + type: 'aftersetcontent afterscencerestore', + handler: function(){ + me.fireEvent('updateSections'); + } + }, + bindEvents:{ + /* 初始化、拖拽、粘贴、执行setcontent之后 */ + 'ready': function (){ + me.fireEvent('updateSections'); + domUtils.on(me.body, 'drop paste', function(){ + me.fireEvent('updateSections'); + }); + }, + /* 执行paragraph命令之后 */ + 'afterexeccommand': function (type, cmd) { + if(cmd == 'paragraph') { + me.fireEvent('updateSections'); + } + }, + /* 部分键盘操作,触发updateSections事件 */ + 'keyup': function (type, e) { + var me = this, + range = me.selection.getRange(); + if(range.collapsed != true) { + me.fireEvent('updateSections'); + } else { + var keyCode = e.keyCode || e.which; + if(keyCode == 13 || keyCode == 8 || keyCode == 46) { + me.fireEvent('updateSections'); + } + } + } + }, + commands:{ + 'getsections': { + execCommand: function (cmd, levels) { + var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + + for (var i = 0; i < levelFn.length; i++) { + if (typeof levelFn[i] == 'string') { + levelFn[i] = function(fn){ + return function(node){ + return node.tagName == fn.toUpperCase() + }; + }(levelFn[i]); + } else if (typeof levelFn[i] != 'function') { + levelFn[i] = function (node) { + return null; + } + } + } + function getSectionLevel(node) { + for (var i = 0; i < levelFn.length; i++) { + if (levelFn[i](node)) return i; + } + return -1; + } + + var me = this, + Directory = getSection({'level':-1, 'title':'root'}), + previous = Directory; + + function traversal(node, Directory) { + var level, + tmpSection = null, + parent, + child, + children = node.childNodes; + for (var i = 0, len = children.length; i < len; i++) { + child = children[i]; + level = getSectionLevel(child); + if (level >= 0) { + var address = me.selection.getRange().selectNode(child).createAddress(true).startAddress, + current = getSection({ + 'tag': child.tagName, + 'title': child.innerText || child.textContent || '', + 'level': level, + 'dom': child, + 'startAddress': utils.clone(address, []), + 'endAddress': utils.clone(address, []), + 'children': [] + }); + previous.nextSection = current; + current.previousSection = previous; + parent = previous; + while(level <= parent.level){ + parent = parent.parentSection; + } + current.parentSection = parent; + parent.children.push(current); + tmpSection = previous = current; + } else { + child.nodeType === 1 && traversal(child, Directory); + tmpSection && tmpSection.endAddress[tmpSection.endAddress.length - 1] ++; + } + } + } + traversal(me.body, Directory); + return Directory; + }, + notNeedUndo: true + }, + 'movesection': { + execCommand: function (cmd, sourceSection, targetSection, isAfter) { + + var me = this, + targetAddress, + target; + + if(!sourceSection || !targetSection || targetSection.level == -1) return; + + targetAddress = isAfter ? targetSection.endAddress:targetSection.startAddress; + target = getNodeFromAddress(targetAddress, me.body); + + /* 判断目标地址是否被源章节包含 */ + if(!targetAddress || !target || isContainsAddress(sourceSection.startAddress, sourceSection.endAddress, targetAddress)) return; + + var startNode = getNodeFromAddress(sourceSection.startAddress, me.body), + endNode = getNodeFromAddress(sourceSection.endAddress, me.body), + current, + nextNode; + + if(isAfter) { + current = endNode; + while ( current && !(domUtils.getPosition( startNode, current ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.previousSibling; + domUtils.insertAfter(target, current); + if(current == startNode) break; + current = nextNode; + } + } else { + current = startNode; + while ( current && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.nextSibling; + target.parentNode.insertBefore(current, target); + if(current == endNode) break; + current = nextNode; + } + } + + me.fireEvent('updateSections'); + + /* 获取地址的包含关系 */ + function isContainsAddress(startAddress, endAddress, addressTarget){ + var isAfterStartAddress = false, + isBeforeEndAddress = false; + for(var i = 0; i< startAddress.length; i++){ + if(i >= addressTarget.length) break; + if(addressTarget[i] > startAddress[i]) { + isAfterStartAddress = true; + break; + } else if(addressTarget[i] < startAddress[i]) { + break; + } + } + for(var i = 0; i< endAddress.length; i++){ + if(i >= addressTarget.length) break; + if(addressTarget[i] < startAddress[i]) { + isBeforeEndAddress = true; + break; + } else if(addressTarget[i] > startAddress[i]) { + break; + } + } + return isAfterStartAddress && isBeforeEndAddress; + } + } + }, + 'deletesection': { + execCommand: function (cmd, section, keepChildren) { + var me = this; + + if(!section) return; + + function getNodeFromAddress(startAddress) { + var current = me.body; + for(var i = 0;i < startAddress.length; i++) { + if(!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var startNode = getNodeFromAddress(section.startAddress), + endNode = getNodeFromAddress(section.endAddress), + current = startNode, + nextNode; + + if(!keepChildren) { + while ( current && domUtils.inDoc(endNode, me.document) && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.nextSibling; + domUtils.remove(current); + current = nextNode; + } + } else { + domUtils.remove(current); + } + + me.fireEvent('updateSections'); + } + }, + 'selectsection': { + execCommand: function (cmd, section) { + if(!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress':utils.clone(section.startAddress, []), + 'endAddress':utils.clone(section.endAddress, []) + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).select().scrollToView(); + return true; + }, + notNeedUndo: true + }, + 'scrolltosection': { + execCommand: function (cmd, section) { + if(!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress':section.startAddress, + 'endAddress':section.endAddress + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).scrollToView(); + return true; + }, + notNeedUndo: true + } + } + } +}); + +// plugins/simpleupload.js +/** + * @description + * 简单上传:点击按钮,直接选择文件上传 + * @author Jinqn + * @date 2014-03-31 + */ +UE.plugin.register('simpleupload', function (){ + var me = this, + isLoaded = false, + containerBtn; + + function initUploadBtn(){ + var w = containerBtn.offsetWidth || 20, + h = containerBtn.offsetHeight || 20, + btnIframe = document.createElement('iframe'), + btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;'; + + domUtils.on(btnIframe, 'load', function(){ + + var timestrap = (+new Date()).toString(36), + wrapper, + btnIframeDoc, + btnIframeBody; + + btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document); + btnIframeBody = btnIframeDoc.body; + wrapper = btnIframeDoc.createElement('div'); + + wrapper.innerHTML = '
      ' + + '' + + '
      ' + + ''; + + wrapper.className = 'edui-' + me.options.theme; + wrapper.id = me.ui.id + '_iframeupload'; + btnIframeBody.style.cssText = btnStyle; + btnIframeBody.style.width = w + 'px'; + btnIframeBody.style.height = h + 'px'; + btnIframeBody.appendChild(wrapper); + + if (btnIframeBody.parentNode) { + btnIframeBody.parentNode.style.width = w + 'px'; + btnIframeBody.parentNode.style.height = w + 'px'; + } + + var form = btnIframeDoc.getElementById('edui_form_' + timestrap); + var input = btnIframeDoc.getElementById('edui_input_' + timestrap); + var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap); + + domUtils.on(input, 'change', function(){ + if(!input.value) return; + var loadingId = 'loading_' + (+new Date()).toString(36); + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName')); + var allowFiles = me.getOpt('imageAllowFiles'); + + me.focus(); + me.execCommand('inserthtml', ''); + + function callback(){ + try{ + var link, json, loader, + body = (iframe.contentDocument || iframe.contentWindow.document).body, + result = body.innerText || body.textContent || ''; + json = (new Function("return " + result))(); + link = me.options.imageUrlPrefix + json.url; + if(json.state == 'SUCCESS' && json.url) { + loader = me.document.getElementById(loadingId); + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', json.title || ''); + loader.setAttribute('alt', json.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } else { + showErrorLoader && showErrorLoader(json.state); + } + }catch(er){ + showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError')); + } + form.reset(); + domUtils.un(iframe, 'load', callback); + } + function showErrorLoader(title){ + if(loadingId) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + } + } + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt('imageActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + // 判断文件格式是否错误 + var filename = input.value, + fileext = filename ? filename.substr(filename.lastIndexOf('.')):''; + if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + showErrorLoader(me.getLang('simpleupload.exceedTypeError')); + return; + } + + domUtils.on(iframe, 'load', callback); + form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params); + form.submit(); + }); + + var stateTimer; + me.addListener('selectionchange', function () { + clearTimeout(stateTimer); + stateTimer = setTimeout(function() { + var state = me.queryCommandState('simpleupload'); + if (state == -1) { + input.disabled = 'disabled'; + } else { + input.disabled = false; + } + }, 400); + }); + isLoaded = true; + }); + + btnIframe.style.cssText = btnStyle; + containerBtn.appendChild(btnIframe); + } + + return { + bindEvents:{ + 'ready': function() { + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + }, + /* 初始化简单上传按钮 */ + 'simpleuploadbtnready': function(type, container) { + containerBtn = container; + me.afterConfigReady(initUploadBtn); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(n){ + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + commands: { + 'simpleupload': { + queryCommandState: function () { + return isLoaded ? 0:-1; + } + } + } + } +}); + +// plugins/serverparam.js +/** + * 服务器提交的额外参数列表设置插件 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('serverparam', function (){ + + var me = this, + serverParam = {}; + + return { + commands:{ + /** + * 修改服务器提交的额外参数列表,清除所有项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('serverparam'); + * editor.queryCommandValue('serverparam'); //返回空 + * ``` + */ + /** + * 修改服务器提交的额外参数列表,删除指定项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要清除的属性 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name'); //删除属性name + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用键值添加项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要添加的属性 + * @param { String } value 要添加属性的值 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name', 'hello'); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,传入键值对对象添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } key 传入的键值对对象 + * @example + * ```javascript + * editor.execCommand('serverparam', {'name': 'hello'}); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用自定义函数添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Function } key 自定义获取参数的函数 + * @example + * ```javascript + * editor.execCommand('serverparam', function(editor){ + * return {'key': 'value'}; + * }); + * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} + * ``` + */ + + /** + * 获取服务器提交的额外参数列表 + * @command serverparam + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'} + * ``` + */ + 'serverparam':{ + execCommand:function (cmd, key, value) { + if (key === undefined || key === null) { //不传参数,清空列表 + serverParam = {}; + } else if (utils.isString(key)) { //传入键值 + if(value === undefined || value === null) { + delete serverParam[key]; + } else { + serverParam[key] = value; + } + } else if (utils.isObject(key)) { //传入对象,覆盖列表项 + utils.extend(serverParam, key, true); + } else if (utils.isFunction(key)){ //传入函数,添加列表项 + utils.extend(serverParam, key(), true); + } + }, + queryCommandValue: function(){ + return serverParam || {}; + } + } + } + } +}); + + +// plugins/insertfile.js +/** + * 插入附件 + */ +UE.plugin.register('insertfile', function (){ + + var me = this; + + function getFileIcon(url){ + var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(), + maps = { + "rar":"icon_rar.gif", + "zip":"icon_rar.gif", + "tar":"icon_rar.gif", + "gz":"icon_rar.gif", + "bz2":"icon_rar.gif", + "doc":"icon_doc.gif", + "docx":"icon_doc.gif", + "pdf":"icon_pdf.gif", + "mp3":"icon_mp3.gif", + "xls":"icon_xls.gif", + "chm":"icon_chm.gif", + "ppt":"icon_ppt.gif", + "pptx":"icon_ppt.gif", + "avi":"icon_mv.gif", + "rmvb":"icon_mv.gif", + "wmv":"icon_mv.gif", + "flv":"icon_mv.gif", + "swf":"icon_mv.gif", + "rm":"icon_mv.gif", + "exe":"icon_exe.gif", + "psd":"icon_psd.gif", + "txt":"icon_txt.gif", + "jpg":"icon_jpg.gif", + "png":"icon_jpg.gif", + "jpeg":"icon_jpg.gif", + "gif":"icon_jpg.gif", + "ico":"icon_jpg.gif", + "bmp":"icon_jpg.gif" + }; + return maps[ext] ? maps[ext]:maps['txt']; + } + + return { + commands:{ + 'insertfile': { + execCommand: function (command, filelist){ + filelist = utils.isArray(filelist) ? filelist : [filelist]; + + var i, item, icon, title, + html = '', + URL = me.getOpt('UEDITOR_HOME_URL'), + iconDir = URL + (URL.substr(URL.length - 1) == '/' ? '':'/') + 'dialogs/attachment/fileTypeImages/'; + for (i = 0; i < filelist.length; i++) { + item = filelist[i]; + icon = iconDir + getFileIcon(item.url); + title = item.title || item.url.substr(item.url.lastIndexOf('/') + 1); + html += '

      ' + + '' + + '' + title + '' + + '

      '; + } + me.execCommand('insertHtml', html); + } + } + } + } +}); + + + + +// plugins/xssFilter.js +/** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + +UE.plugins.xssFilter = function() { + + var config = UEDITOR_CONFIG; + var whitList = config.whitList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whitList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UE.utils.each(attrs, function (val, key) { + + if (whitList[tagName].indexOf(key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whitList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UE.utils.each(whitList, function(val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UE.utils.each(whitList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whitList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whitList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + +}; + + +// ui/ui.js +var baidu = baidu || {}; +baidu.editor = baidu.editor || {}; +UE.ui = baidu.editor.ui = {}; + +// ui/uiutils.js +(function (){ + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils; + + var magic = '$EDITORUI'; + var root = window[magic] = {}; + var uidMagic = 'ID' + magic; + var uidCount = 0; + + var uiUtils = baidu.editor.ui.uiUtils = { + uid: function (obj){ + return (obj ? obj[uidMagic] || (obj[uidMagic] = ++ uidCount) : ++ uidCount); + }, + hook: function ( fn, callback ) { + var dg; + if (fn && fn._callbacks) { + dg = fn; + } else { + dg = function (){ + var q; + if (fn) { + q = fn.apply(this, arguments); + } + var callbacks = dg._callbacks; + var k = callbacks.length; + while (k --) { + var r = callbacks[k].apply(this, arguments); + if (q === undefined) { + q = r; + } + } + return q; + }; + dg._callbacks = []; + } + dg._callbacks.push(callback); + return dg; + }, + createElementByHtml: function (html){ + var el = document.createElement('div'); + el.innerHTML = html; + el = el.firstChild; + el.parentNode.removeChild(el); + return el; + }, + getViewportElement: function (){ + return (browser.ie && browser.quirks) ? + document.body : document.documentElement; + }, + getClientRect: function (element){ + var bcr; + //trace IE6下在控制编辑器显隐时可能会报错,catch一下 + try{ + bcr = element.getBoundingClientRect(); + }catch(e){ + bcr={left:0,top:0,height:0,width:0} + } + var rect = { + left: Math.round(bcr.left), + top: Math.round(bcr.top), + height: Math.round(bcr.bottom - bcr.top), + width: Math.round(bcr.right - bcr.left) + }; + var doc; + while ((doc = element.ownerDocument) !== document && + (element = domUtils.getWindow(doc).frameElement)) { + bcr = element.getBoundingClientRect(); + rect.left += bcr.left; + rect.top += bcr.top; + } + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; + }, + getViewportRect: function (){ + var viewportEl = uiUtils.getViewportElement(); + var width = (window.innerWidth || viewportEl.clientWidth) | 0; + var height = (window.innerHeight ||viewportEl.clientHeight) | 0; + return { + left: 0, + top: 0, + height: height, + width: width, + bottom: height, + right: width + }; + }, + setViewportOffset: function (element, offset){ + var rect; + var fixedLayer = uiUtils.getFixedLayer(); + if (element.parentNode === fixedLayer) { + element.style.left = offset.left + 'px'; + element.style.top = offset.top + 'px'; + } else { + domUtils.setViewportOffset(element, offset); + } + }, + getEventOffset: function (evt){ + var el = evt.target || evt.srcElement; + var rect = uiUtils.getClientRect(el); + var offset = uiUtils.getViewportOffsetByEvent(evt); + return { + left: offset.left - rect.left, + top: offset.top - rect.top + }; + }, + getViewportOffsetByEvent: function (evt){ + var el = evt.target || evt.srcElement; + var frameEl = domUtils.getWindow(el).frameElement; + var offset = { + left: evt.clientX, + top: evt.clientY + }; + if (frameEl && el.ownerDocument !== document) { + var rect = uiUtils.getClientRect(frameEl); + offset.left += rect.left; + offset.top += rect.top; + } + return offset; + }, + setGlobal: function (id, obj){ + root[id] = obj; + return magic + '["' + id + '"]'; + }, + unsetGlobal: function (id){ + delete root[id]; + }, + copyAttributes: function (tgt, src){ + var attributes = src.attributes; + var k = attributes.length; + while (k --) { + var attrNode = attributes[k]; + if ( attrNode.nodeName != 'style' && attrNode.nodeName != 'class' && (!browser.ie || attrNode.specified) ) { + tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); + } + } + if (src.className) { + domUtils.addClass(tgt,src.className); + } + if (src.style.cssText) { + tgt.style.cssText += ';' + src.style.cssText; + } + }, + removeStyle: function (el, styleName){ + if (el.style.removeProperty) { + el.style.removeProperty(styleName); + } else if (el.style.removeAttribute) { + el.style.removeAttribute(styleName); + } else throw ''; + }, + contains: function (elA, elB){ + return elA && elB && (elA === elB ? false : ( + elA.contains ? elA.contains(elB) : + elA.compareDocumentPosition(elB) & 16 + )); + }, + startDrag: function (evt, callbacks,doc){ + var doc = doc || document; + var startX = evt.clientX; + var startY = evt.clientY; + function handleMouseMove(evt){ + var x = evt.clientX - startX; + var y = evt.clientY - startY; + callbacks.ondragmove(x, y,evt); + if (evt.stopPropagation) { + evt.stopPropagation(); + } else { + evt.cancelBubble = true; + } + } + if (doc.addEventListener) { + function handleMouseUp(evt){ + doc.removeEventListener('mousemove', handleMouseMove, true); + doc.removeEventListener('mouseup', handleMouseUp, true); + window.removeEventListener('mouseup', handleMouseUp, true); + callbacks.ondragstop(); + } + doc.addEventListener('mousemove', handleMouseMove, true); + doc.addEventListener('mouseup', handleMouseUp, true); + window.addEventListener('mouseup', handleMouseUp, true); + + evt.preventDefault(); + } else { + var elm = evt.srcElement; + elm.setCapture(); + function releaseCaptrue(){ + elm.releaseCapture(); + elm.detachEvent('onmousemove', handleMouseMove); + elm.detachEvent('onmouseup', releaseCaptrue); + elm.detachEvent('onlosecaptrue', releaseCaptrue); + callbacks.ondragstop(); + } + elm.attachEvent('onmousemove', handleMouseMove); + elm.attachEvent('onmouseup', releaseCaptrue); + elm.attachEvent('onlosecaptrue', releaseCaptrue); + evt.returnValue = false; + } + callbacks.ondragstart(); + }, + getFixedLayer: function (){ + var layer = document.getElementById('edui_fixedlayer'); + if (layer == null) { + layer = document.createElement('div'); + layer.id = 'edui_fixedlayer'; + document.body.appendChild(layer); + if (browser.ie && browser.version <= 8) { + layer.style.position = 'absolute'; + bindFixedLayer(); + setTimeout(updateFixedOffset); + } else { + layer.style.position = 'fixed'; + } + layer.style.left = '0'; + layer.style.top = '0'; + layer.style.width = '0'; + layer.style.height = '0'; + } + return layer; + }, + makeUnselectable: function (element){ + if (browser.opera || (browser.ie && browser.version < 9)) { + element.unselectable = 'on'; + if (element.hasChildNodes()) { + for (var i=0; i
      '; + } + }; + utils.inherits(Separator, UIBase); + +})(); + + +// ui/mask.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + uiUtils = baidu.editor.ui.uiUtils; + + var Mask = baidu.editor.ui.Mask = function (options){ + this.initOptions(options); + this.initUIBase(); + }; + Mask.prototype = { + getHtmlTpl: function (){ + return '
      '; + }, + postRender: function (){ + var me = this; + domUtils.on(window, 'resize', function (){ + setTimeout(function (){ + if (!me.isHidden()) { + me._fill(); + } + }); + }); + }, + show: function (zIndex){ + this._fill(); + this.getDom().style.display = ''; + this.getDom().style.zIndex = zIndex; + }, + hide: function (){ + this.getDom().style.display = 'none'; + this.getDom().style.zIndex = ''; + }, + isHidden: function (){ + return this.getDom().style.display == 'none'; + }, + _onMouseDown: function (){ + return false; + }, + _onClick: function (e, target){ + this.fireEvent('click', e, target); + }, + _fill: function (){ + var el = this.getDom(); + var vpRect = uiUtils.getViewportRect(); + el.style.width = vpRect.width + 'px'; + el.style.height = vpRect.height + 'px'; + } + }; + utils.inherits(Mask, UIBase); +})(); + + +// ui/popup.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup = function (options){ + this.initOptions(options); + this.initPopup(); + }; + + var allPopups = []; + function closeAllPopup( evt,el ){ + for ( var i = 0; i < allPopups.length; i++ ) { + var pop = allPopups[i]; + if (!pop.isHidden()) { + if (pop.queryAutoHide(el) !== false) { + if(evt&&/scroll/ig.test(evt.type)&&pop.className=="edui-wordpastepop") return; + pop.hide(); + } + } + } + + if(allPopups.length) + pop.editor.fireEvent("afterhidepop"); + } + + Popup.postHide = closeAllPopup; + + var ANCHOR_CLASSES = ['edui-anchor-topleft','edui-anchor-topright', + 'edui-anchor-bottomleft','edui-anchor-bottomright']; + Popup.prototype = { + SHADOW_RADIUS: 5, + content: null, + _hidden: false, + autoRender: true, + canSideLeft: true, + canSideUp: true, + initPopup: function (){ + this.initUIBase(); + allPopups.push( this ); + }, + getHtmlTpl: function (){ + return '
      ' + + '
      ' + + ' ' + + '
      ' + + '
      ' + + this.getContentHtmlTpl() + + '
      ' + + '
      ' + + '
      '; + }, + getContentHtmlTpl: function (){ + if(this.content){ + if (typeof this.content == 'string') { + return this.content; + } + return this.content.renderHtml(); + }else{ + return '' + } + + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function (){ + + + if (this.content instanceof UIBase) { + this.content.postRender(); + } + + //捕获鼠标滚轮 + if( this.captureWheel && !this.captured ) { + + this.captured = true; + + var winHeight = ( document.documentElement.clientHeight || document.body.clientHeight ) - 80, + _height = this.getDom().offsetHeight, + _top = uiUtils.getClientRect( this.combox.getDom() ).top, + content = this.getDom('content'), + ifr = this.getDom('body').getElementsByTagName('iframe'), + me = this; + + ifr.length && ( ifr = ifr[0] ); + + while( _top + _height > winHeight ) { + _height -= 30; + } + content.style.height = _height + 'px'; + //同步更改iframe高度 + ifr && ( ifr.style.height = _height + 'px' ); + + //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 + if( window.XMLHttpRequest ) { + + domUtils.on( content, ( 'onmousewheel' in document.body ) ? 'mousewheel' :'DOMMouseScroll' , function(e){ + + if(e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + + if( e.wheelDelta ) { + + content.scrollTop -= ( e.wheelDelta / 120 )*60; + + } else { + + content.scrollTop -= ( e.detail / -3 )*60; + + } + + }); + + } else { + + //ie6 + domUtils.on( this.getDom(), 'mousewheel' , function(e){ + + e.returnValue = false; + + me.getDom('content').scrollTop -= ( e.wheelDelta / 120 )*60; + + }); + + } + + } + this.fireEvent('postRenderAfter'); + this.hide(true); + this._UIBase_postRender(); + }, + _doAutoRender: function (){ + if (!this.getDom() && this.autoRender) { + this.render(); + } + }, + mesureSize: function (){ + var box = this.getDom('content'); + return uiUtils.getClientRect(box); + }, + fitSize: function (){ + if( this.captureWheel && this.sized ) { + return this.__size; + } + this.sized = true; + var popBodyEl = this.getDom('body'); + popBodyEl.style.width = ''; + popBodyEl.style.height = ''; + var size = this.mesureSize(); + if( this.captureWheel ) { + popBodyEl.style.width = -(-20 -size.width) + 'px'; + var height = parseInt( this.getDom('content').style.height, 10 ); + !window.isNaN( height ) && ( size.height = height ); + } else { + popBodyEl.style.width = size.width + 'px'; + } + popBodyEl.style.height = size.height + 'px'; + this.__size = size; + this.captureWheel && (this.getDom('content').style.overflow = 'auto'); + return size; + }, + showAnchor: function ( element, hoz ){ + this.showAnchorRect( uiUtils.getClientRect( element ), hoz ); + }, + showAnchorRect: function ( rect, hoz, adj ){ + this._doAutoRender(); + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.visibility = 'hidden'; + this._show(); + var popSize = this.fitSize(); + + var sideLeft, sideUp, left, top; + if (hoz) { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.left - popSize.width : rect.right); + top = (sideUp ? rect.bottom - popSize.height : rect.top); + } else { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.right - popSize.width : rect.left); + top = (sideUp ? rect.top - popSize.height : rect.bottom); + } + + var popEl = this.getDom(); + uiUtils.setViewportOffset(popEl, { + left: left, + top: top + }); + domUtils.removeClasses(popEl, ANCHOR_CLASSES); + popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; + if(this.editor){ + popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1; + } + this.getDom().style.visibility = 'visible'; + + }, + showAt: function (offset) { + var left = offset.left; + var top = offset.top; + var rect = { + left: left, + top: top, + right: left, + bottom: top, + height: 0, + width: 0 + }; + this.showAnchorRect(rect, false, true); + }, + _show: function (){ + if (this._hidden) { + var box = this.getDom(); + box.style.display = ''; + this._hidden = false; +// if (box.setActive) { +// box.setActive(); +// } + this.fireEvent('show'); + } + }, + isHidden: function (){ + return this._hidden; + }, + show: function (){ + this._doAutoRender(); + this._show(); + }, + hide: function (notNofity){ + if (!this._hidden && this.getDom()) { + this.getDom().style.display = 'none'; + this._hidden = true; + if (!notNofity) { + this.fireEvent('hide'); + } + } + }, + queryAutoHide: function (el){ + return !el || !uiUtils.contains(this.getDom(), el); + } + }; + utils.inherits(Popup, UIBase); + + domUtils.on( document, 'mousedown', function ( evt ) { + var el = evt.target || evt.srcElement; + closeAllPopup( evt,el ); + } ); + domUtils.on( window, 'scroll', function (evt,el) { + closeAllPopup( evt,el ); + } ); + +})(); + + +// ui/colorpicker.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + ColorPicker = baidu.editor.ui.ColorPicker = function (options){ + this.initOptions(options); + this.noColorText = this.noColorText || this.editor.getLang("clearColor"); + this.initUIBase(); + }; + + ColorPicker.prototype = { + getHtmlTpl: function (){ + return genColorPicker(this.noColorText,this.editor); + }, + _onTableClick: function (evt){ + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.fireEvent('pickcolor', color); + } + }, + _onTableOver: function (evt){ + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.getDom('preview').style.backgroundColor = color; + } + }, + _onTableOut: function (){ + this.getDom('preview').style.backgroundColor = ''; + }, + _onPickNoColor: function (){ + this.fireEvent('picknocolor'); + } + }; + utils.inherits(ColorPicker, UIBase); + + var COLORS = ( + 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' + + 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' + + 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' + + 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' + + 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' + + '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' + + 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(','); + + function genColorPicker(noColorText,editor){ + var html = '
      ' + + '
      ' + + '
      ' + + '
      '+ noColorText +'
      ' + + '
      ' + + '' + + ''+ + ''; + for (var i=0; i':'')+''; + } + html += i<70 ? '':''; + } + html += '
      '+editor.getLang("themeColor")+'
      '+editor.getLang("standardColor")+'
      '; + return html; + } +})(); + + +// ui/tablepicker.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var TablePicker = baidu.editor.ui.TablePicker = function (options){ + this.initOptions(options); + this.initTablePicker(); + }; + TablePicker.prototype = { + defaultNumRows: 10, + defaultNumCols: 10, + maxNumRows: 20, + maxNumCols: 20, + numRows: 10, + numCols: 10, + lengthOfCellSide: 22, + initTablePicker: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + var me = this; + return '
      ' + + '
      ' + + '
      ' + + '' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + }, + _UIBase_render: UIBase.prototype.render, + render: function (holder){ + this._UIBase_render(holder); + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_row")+' x 0'+this.editor.getLang("t_col"); + }, + _track: function (numCols, numRows){ + var style = this.getDom('overlay').style; + var sideLen = this.lengthOfCellSide; + style.width = numCols * sideLen + 'px'; + style.height = numRows * sideLen + 'px'; + var label = this.getDom('label'); + label.innerHTML = numCols +this.editor.getLang("t_col")+' x ' + numRows + this.editor.getLang("t_row"); + this.numCols = numCols; + this.numRows = numRows; + }, + _onMouseOver: function (evt, el){ + var rel = evt.relatedTarget || evt.fromElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = ''; + } + }, + _onMouseOut: function (evt, el){ + var rel = evt.relatedTarget || evt.toElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = 'hidden'; + } + }, + _onMouseMove: function (evt, el){ + var style = this.getDom('overlay').style; + var offset = uiUtils.getEventOffset(evt); + var sideLen = this.lengthOfCellSide; + var numCols = Math.ceil(offset.left / sideLen); + var numRows = Math.ceil(offset.top / sideLen); + this._track(numCols, numRows); + }, + _onClick: function (){ + this.fireEvent('picktable', this.numCols, this.numRows); + } + }; + utils.inherits(TablePicker, UIBase); +})(); + + +// ui/stateful.js +(function (){ + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils; + + var TPL_STATEFUL = 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + + ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + + ( browser.ie ? ( + ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + + ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"' ) + : ( + ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + + ' onmouseout="$$.Stateful_onMouseOut(event, this);"' )); + + baidu.editor.ui.Stateful = { + alwalysHoverable: false, + target:null,//目标元素和this指向dom不一样 + Stateful_init: function (){ + this._Stateful_dGetHtmlTpl = this.getHtmlTpl; + this.getHtmlTpl = this.Stateful_getHtmlTpl; + }, + Stateful_getHtmlTpl: function (){ + var tpl = this._Stateful_dGetHtmlTpl(); + // 使用function避免$转义 + return tpl.replace(/stateful/g, function (){ return TPL_STATEFUL; }); + }, + Stateful_onMouseEnter: function (evt, el){ + this.target=el; + if (!this.isDisabled() || this.alwalysHoverable) { + this.addState('hover'); + this.fireEvent('over'); + } + }, + Stateful_onMouseLeave: function (evt, el){ + if (!this.isDisabled() || this.alwalysHoverable) { + this.removeState('hover'); + this.removeState('active'); + this.fireEvent('out'); + } + }, + Stateful_onMouseOver: function (evt, el){ + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseEnter(evt, el); + } + }, + Stateful_onMouseOut: function (evt, el){ + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseLeave(evt, el); + } + }, + Stateful_onMouseDown: function (evt, el){ + if (!this.isDisabled()) { + this.addState('active'); + } + }, + Stateful_onMouseUp: function (evt, el){ + if (!this.isDisabled()) { + this.removeState('active'); + } + }, + Stateful_postRender: function (){ + if (this.disabled && !this.hasState('disabled')) { + this.addState('disabled'); + } + }, + hasState: function (state){ + return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state); + }, + addState: function (state){ + if (!this.hasState(state)) { + this.getStateDom().className += ' edui-state-' + state; + } + }, + removeState: function (state){ + if (this.hasState(state)) { + domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state]); + } + }, + getStateDom: function (){ + return this.getDom('state'); + }, + isChecked: function (){ + return this.hasState('checked'); + }, + setChecked: function (checked){ + if (!this.isDisabled() && checked) { + this.addState('checked'); + } else { + this.removeState('checked'); + } + }, + isDisabled: function (){ + return this.hasState('disabled'); + }, + setDisabled: function (disabled){ + if (disabled) { + this.removeState('hover'); + this.removeState('checked'); + this.removeState('active'); + this.addState('disabled'); + } else { + this.removeState('disabled'); + } + } + }; +})(); + + +// ui/button.js +///import core +///import uicore +///import ui/stateful.js +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + Button = baidu.editor.ui.Button = function (options){ + if(options.name){ + var btnName = options.name; + var cssRules = options.cssRules; + if(!options.className){ + options.className = 'edui-for-' + btnName; + } + options.cssRules = '.edui-default .edui-for-'+ btnName +' .edui-icon {'+ cssRules +'}' + } + this.initOptions(options); + this.initButton(); + }; + Button.prototype = { + uiName: 'button', + label: '', + title: '', + showIcon: true, + showText: true, + cssRules:'', + initButton: function (){ + this.initUIBase(); + this.Stateful_init(); + if(this.cssRules){ + utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules); + } + }, + getHtmlTpl: function (){ + return '
      ' + + '
      ' + + '
      ' + + (this.showIcon ? '
      ' : '') + + (this.showText ? '
      ' + this.label + '
      ' : '') + + '
      ' + + '
      ' + + '
      '; + }, + postRender: function (){ + this.Stateful_postRender(); + this.setDisabled(this.disabled) + }, + _onMouseDown: function (e){ + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == 'input' || tagName == 'object' || tagName == 'object') { + return false; + } + }, + _onClick: function (){ + if (!this.isDisabled()) { + this.fireEvent('click'); + } + }, + setTitle: function(text){ + var label = this.getDom('label'); + label.innerHTML = text; + } + }; + utils.inherits(Button, UIBase); + utils.extend(Button.prototype, Stateful); + +})(); + + +// ui/splitbutton.js +///import core +///import uicore +///import ui/stateful.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + SplitButton = baidu.editor.ui.SplitButton = function (options){ + this.initOptions(options); + this.initSplitButton(); + }; + SplitButton.prototype = { + popup: null, + uiName: 'splitbutton', + title: '', + initSplitButton: function (){ + this.initUIBase(); + this.Stateful_init(); + var me = this; + if (this.popup != null) { + var popup = this.popup; + this.popup = null; + this.setPopup(popup); + } + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function (){ + this.Stateful_postRender(); + this._UIBase_postRender(); + }, + setPopup: function (popup){ + if (this.popup === popup) return; + if (this.popup != null) { + this.popup.dispose(); + } + popup.addListener('show', utils.bind(this._onPopupShow, this)); + popup.addListener('hide', utils.bind(this._onPopupHide, this)); + popup.addListener('postrender', utils.bind(function (){ + popup.getDom('body').appendChild( + uiUtils.createElementByHtml('
      ') + ); + popup.getDom().className += ' ' + this.className; + }, this)); + this.popup = popup; + }, + _onPopupShow: function (){ + this.addState('opened'); + }, + _onPopupHide: function (){ + this.removeState('opened'); + }, + getHtmlTpl: function (){ + return '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + }, + showPopup: function (){ + // 当popup往上弹出的时候,做特殊处理 + var rect = uiUtils.getClientRect(this.getDom()); + rect.top -= this.popup.SHADOW_RADIUS; + rect.height += this.popup.SHADOW_RADIUS; + this.popup.showAnchorRect(rect); + }, + _onArrowClick: function (event, el){ + if (!this.isDisabled()) { + this.showPopup(); + } + }, + _onButtonClick: function (){ + if (!this.isDisabled()) { + this.fireEvent('buttonclick'); + } + } + }; + utils.inherits(SplitButton, UIBase); + utils.extend(SplitButton.prototype, Stateful, true); + +})(); + + +// ui/colorbutton.js +///import core +///import uicore +///import ui/colorpicker.js +///import ui/popup.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + ColorPicker = baidu.editor.ui.ColorPicker, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + ColorButton = baidu.editor.ui.ColorButton = function (options){ + this.initOptions(options); + this.initColorButton(); + }; + ColorButton.prototype = { + initColorButton: function (){ + var me = this; + this.popup = new Popup({ + content: new ColorPicker({ + noColorText: me.editor.getLang("clearColor"), + editor:me.editor, + onpickcolor: function (t, color){ + me._onPickColor(color); + }, + onpicknocolor: function (t, color){ + me._onPickNoColor(color); + } + }), + editor:me.editor + }); + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function (){ + this._SplitButton_postRender(); + this.getDom('button_body').appendChild( + uiUtils.createElementByHtml('
      ') + ); + this.getDom().className += ' edui-colorbutton'; + }, + setColor: function (color){ + this.getDom('colorlump').style.backgroundColor = color; + this.color = color; + }, + _onPickColor: function (color){ + if (this.fireEvent('pickcolor', color) !== false) { + this.setColor(color); + this.popup.hide(); + } + }, + _onPickNoColor: function (color){ + if (this.fireEvent('picknocolor') !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(ColorButton, SplitButton); + +})(); + + +// ui/tablebutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/tablepicker.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + TablePicker = baidu.editor.ui.TablePicker, + SplitButton = baidu.editor.ui.SplitButton, + TableButton = baidu.editor.ui.TableButton = function (options){ + this.initOptions(options); + this.initTableButton(); + }; + TableButton.prototype = { + initTableButton: function (){ + var me = this; + this.popup = new Popup({ + content: new TablePicker({ + editor:me.editor, + onpicktable: function (t, numCols, numRows){ + me._onPickTable(numCols, numRows); + } + }), + 'editor':me.editor + }); + this.initSplitButton(); + }, + _onPickTable: function (numCols, numRows){ + if (this.fireEvent('picktable', numCols, numRows) !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(TableButton, SplitButton); + +})(); + + +// ui/autotypesetpicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase; + + var AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker = function (options) { + this.initOptions(options); + this.initAutoTypeSetPicker(); + }; + AutoTypeSetPicker.prototype = { + initAutoTypeSetPicker:function () { + this.initUIBase(); + }, + getHtmlTpl:function () { + var me = this.editor, + opt = me.options.autotypeset, + lang = me.getLang("autoTypeSet"); + + var textAlignInputName = 'textAlignValue' + me.uid, + imageBlockInputName = 'imageBlockLineValue' + me.uid, + symbolConverInputName = 'symbolConverValue' + me.uid; + + return '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + lang.mergeLine + '' + lang.delLine + '
      ' + lang.removeFormat + '' + lang.indent + '
      ' + lang.alignment + '' + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
      ' + lang.imageFloat + '' + + '' + me.getLang("default") + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
      ' + lang.removeFontsize + '' + lang.removeFontFamily + '
      ' + lang.removeHtml + '
      ' + lang.pasteFilter + '
      ' + lang.symbol + '' + + '' + lang.bdc2sb + + '' + lang.tobdc + '' + + '
      ' + + '
      ' + + '
      '; + + + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(AutoTypeSetPicker, UIBase); +})(); + + +// ui/autotypesetbutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/autotypesetpicker.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, + SplitButton = baidu.editor.ui.SplitButton, + AutoTypeSetButton = baidu.editor.ui.AutoTypeSetButton = function (options){ + this.initOptions(options); + this.initAutoTypeSetButton(); + }; + function getPara(me){ + + var opt = {}, + cont = me.getDom(), + editorId = me.editor.uid, + inputType = null, + attrName = null, + ipts = domUtils.getElementsByTagName(cont,"input"); + for(var i=ipts.length-1,ipt;ipt=ipts[i--];){ + inputType = ipt.getAttribute("type"); + if(inputType=="checkbox"){ + attrName = ipt.getAttribute("name"); + opt[attrName] && delete opt[attrName]; + if(ipt.checked){ + var attrValue = document.getElementById( attrName + "Value" + editorId ); + if(attrValue){ + if(/input/ig.test(attrValue.tagName)){ + opt[attrName] = attrValue.value; + } else { + var iptChilds = attrValue.getElementsByTagName("input"); + for(var j=iptChilds.length-1,iptchild;iptchild=iptChilds[j--];){ + if(iptchild.checked){ + opt[attrName] = iptchild.value; + break; + } + } + } + } else { + opt[attrName] = true; + } + } else { + opt[attrName] = false; + } + } else { + opt[ipt.getAttribute("value")] = ipt.checked; + } + + } + + var selects = domUtils.getElementsByTagName(cont,"select"); + for(var i=0,si;si=selects[i++];){ + var attr = si.getAttribute('name'); + opt[attr] = opt[attr] ? si.value : ''; + } + + utils.extend(me.editor.options.autotypeset,opt); + + me.editor.setPreferences('autotypeset', opt); + } + + AutoTypeSetButton.prototype = { + initAutoTypeSetButton: function (){ + + var me = this; + this.popup = new Popup({ + //传入配置参数 + content: new AutoTypeSetPicker({editor:me.editor}), + 'editor':me.editor, + hide : function(){ + if (!this._hidden && this.getDom()) { + getPara(this); + this.getDom().style.display = 'none'; + this._hidden = true; + this.fireEvent('hide'); + } + } + }); + var flag = 0; + this.popup.addListener('postRenderAfter',function(){ + var popupUI = this; + if(flag)return; + var cont = this.getDom(), + btn = cont.getElementsByTagName('button')[0]; + + btn.onclick = function(){ + getPara(popupUI); + me.editor.execCommand('autotypeset'); + popupUI.hide() + }; + + domUtils.on(cont, 'click', function(e) { + var target = e.target || e.srcElement, + editorId = me.editor.uid; + if (target && target.tagName == 'INPUT') { + + // 点击图片浮动的checkbox,去除对应的radio + if (target.name == 'imageBlockLine' || target.name == 'textAlign' || target.name == 'symbolConver') { + var checked = target.checked, + radioTd = document.getElementById( target.name + 'Value' + editorId), + radios = radioTd.getElementsByTagName('input'), + defalutSelect = { + 'imageBlockLine': 'none', + 'textAlign': 'left', + 'symbolConver': 'tobdc' + }; + + for (var i = 0; i < radios.length; i++) { + if (checked) { + if (radios[i].value == defalutSelect[target.name]) { + radios[i].checked = 'checked'; + } + } else { + radios[i].checked = false; + } + } + } + // 点击radio,选中对应的checkbox + if (target.name == ('imageBlockLineValue' + editorId) || target.name == ('textAlignValue' + editorId) || target.name == 'bdc') { + var checkboxs = target.parentNode.previousSibling.getElementsByTagName('input'); + checkboxs && (checkboxs[0].checked = true); + } + + getPara(popupUI); + } + }); + + flag = 1; + }); + this.initSplitButton(); + } + }; + utils.inherits(AutoTypeSetButton, SplitButton); + +})(); + + +// ui/cellalignpicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + UIBase = baidu.editor.ui.UIBase; + + /** + * 该参数将新增一个参数: selected, 参数类型为一个Object, 形如{ 'align': 'center', 'valign': 'top' }, 表示单元格的初始 + * 对齐状态为: 竖直居上,水平居中; 其中 align的取值为:'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom' + * @update 2013/4/2 hancong03@baidu.com + */ + var CellAlignPicker = baidu.editor.ui.CellAlignPicker = function (options) { + this.initOptions(options); + this.initSelected(); + this.initCellAlignPicker(); + }; + CellAlignPicker.prototype = { + //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 + initSelected: function(){ + + var status = { + + valign: { + top: 0, + middle: 1, + bottom: 2 + }, + align: { + left: 0, + center: 1, + right: 2 + }, + count: 3 + + }, + result = -1; + + if( this.selected ) { + this.selectedIndex = status.valign[ this.selected.valign ] * status.count + status.align[ this.selected.align ]; + } + + }, + initCellAlignPicker:function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl:function () { + + var alignType = [ 'left', 'center', 'right' ], + COUNT = 9, + tempClassName = null, + tempIndex = -1, + tmpl = []; + + + for( var i= 0; i'); + + tmpl.push( '
      ' ); + + tempIndex === 2 && tmpl.push(''); + + } + + return '
      ' + + '
      ' + + '' + + tmpl.join('') + + '
      ' + + '
      ' + + '
      '; + }, + getStateDom: function (){ + return this.target; + }, + _onClick: function (evt){ + var target= evt.target || evt.srcElement; + if(/icon/.test(target.className)){ + this.items[target.parentNode.getAttribute("index")].onclick(); + Popup.postHide(evt); + } + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(CellAlignPicker, UIBase); + utils.extend(CellAlignPicker.prototype, Stateful,true); +})(); + + + + + +// ui/pastepicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + Stateful = baidu.editor.ui.Stateful, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var PastePicker = baidu.editor.ui.PastePicker = function (options) { + this.initOptions(options); + this.initPastePicker(); + }; + PastePicker.prototype = { + initPastePicker:function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl:function () { + return '
      ' + + '
      ' + + '
      ' + this.editor.getLang("pasteOpt") + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + }, + getStateDom:function () { + return this.target; + }, + format:function (param) { + this.editor.ui._isTransfer = true; + this.editor.fireEvent('pasteTransfer', param); + }, + _onClick:function (cur) { + var node = domUtils.getNextDomNode(cur), + screenHt = uiUtils.getViewportRect().height, + subPop = uiUtils.getClientRect(node); + + if ((subPop.top + subPop.height) > screenHt) + node.style.top = (-subPop.height - cur.offsetHeight) + "px"; + else + node.style.top = ""; + + if (/hidden/ig.test(domUtils.getComputedStyle(node, "visibility"))) { + node.style.visibility = "visible"; + domUtils.addClass(cur, "edui-state-opened"); + } else { + node.style.visibility = "hidden"; + domUtils.removeClasses(cur, "edui-state-opened") + } + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(PastePicker, UIBase); + utils.extend(PastePicker.prototype, Stateful, true); +})(); + + + + + + +// ui/toolbar.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Toolbar = baidu.editor.ui.Toolbar = function (options){ + this.initOptions(options); + this.initToolbar(); + }; + Toolbar.prototype = { + items: null, + initToolbar: function (){ + this.items = this.items || []; + this.initUIBase(); + }, + add: function (item,index){ + if(index === undefined){ + this.items.push(item); + }else{ + this.items.splice(index,0,item) + } + + }, + getHtmlTpl: function (){ + var buff = []; + for (var i=0; i' + + buff.join('') + + '
      ' + }, + postRender: function (){ + var box = this.getDom(); + for (var i=0; i
      '; + }, + postRender:function () { + }, + queryAutoHide:function () { + return true; + } + }; + Menu.prototype = { + items:null, + uiName:'menu', + initMenu:function () { + this.items = this.items || []; + this.initPopup(); + this.initItems(); + }, + initItems:function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item == '-') { + this.items[i] = this.getSeparator(); + } else if (!(item instanceof MenuItem)) { + item.editor = this.editor; + item.theme = this.editor.options.theme; + this.items[i] = this.createItem(item); + } + } + }, + getSeparator:function () { + return menuSeparator; + }, + createItem:function (item) { + //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + item.menu = this; + return new MenuItem(item); + }, + _Popup_getContentHtmlTpl:Popup.prototype.getContentHtmlTpl, + getContentHtmlTpl:function () { + if (this.items.length == 0) { + return this._Popup_getContentHtmlTpl(); + } + var buff = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + buff[i] = item.renderHtml(); + } + return ('
      ' + buff.join('') + '
      '); + }, + _Popup_postRender:Popup.prototype.postRender, + postRender:function () { + var me = this; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.ownerMenu = this; + item.postRender(); + } + domUtils.on(this.getDom(), 'mouseover', function (evt) { + evt = evt || event; + var rel = evt.relatedTarget || evt.fromElement; + var el = me.getDom(); + if (!uiUtils.contains(el, rel) && el !== rel) { + me.fireEvent('over'); + } + }); + this._Popup_postRender(); + }, + queryAutoHide:function (el) { + if (el) { + if (uiUtils.contains(this.getDom(), el)) { + return false; + } + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item.queryAutoHide(el) === false) { + return false; + } + } + } + }, + clearItems:function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + clearTimeout(item._showingTimer); + clearTimeout(item._closingTimer); + if (item.subMenu) { + item.subMenu.destroy(); + } + } + this.items = []; + }, + destroy:function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + this.clearItems(); + }, + dispose:function () { + this.destroy(); + } + }; + utils.inherits(Menu, Popup); + + /** + * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + * @type {Function} + */ + var MenuItem = baidu.editor.ui.MenuItem = function (options) { + this.initOptions(options); + this.initUIBase(); + this.Stateful_init(); + if (this.subMenu && !(this.subMenu instanceof Menu)) { + if (options.className && options.className.indexOf("aligntd") != -1) { + var me = this; + + //获取单元格对齐初始状态 + this.subMenu.selected = this.editor.queryCommandValue( 'cellalignment' ); + + this.subMenu = new Popup({ + content:new CellAlignPicker(this.subMenu), + parentMenu:me, + editor:me.editor, + destroy:function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + } + }); + this.subMenu.addListener("postRenderAfter", function () { + domUtils.on(this.getDom(), "mouseover", function () { + me.addState('opened'); + }); + }); + } else { + this.subMenu = new Menu(this.subMenu); + } + } + }; + MenuItem.prototype = { + label:'', + subMenu:null, + ownerMenu:null, + uiName:'menuitem', + alwalysHoverable:true, + getHtmlTpl:function () { + return '
      ' + + '
      ' + + this.renderLabelHtml() + + '
      ' + + '
      '; + }, + postRender:function () { + var me = this; + this.addListener('over', function () { + me.ownerMenu.fireEvent('submenuover', me); + if (me.subMenu) { + me.delayShowSubMenu(); + } + }); + if (this.subMenu) { + this.getDom().className += ' edui-hassubmenu'; + this.subMenu.render(); + this.addListener('out', function () { + me.delayHideSubMenu(); + }); + this.subMenu.addListener('over', function () { + clearTimeout(me._closingTimer); + me._closingTimer = null; + me.addState('opened'); + }); + this.ownerMenu.addListener('hide', function () { + me.hideSubMenu(); + }); + this.ownerMenu.addListener('submenuover', function (t, subMenu) { + if (subMenu !== me) { + me.delayHideSubMenu(); + } + }); + this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + this.subMenu.queryAutoHide = function (el) { + if (el && uiUtils.contains(me.getDom(), el)) { + return false; + } + return this._bakQueryAutoHide(el); + }; + } + this.getDom().style.tabIndex = '-1'; + uiUtils.makeUnselectable(this.getDom()); + this.Stateful_postRender(); + }, + delayShowSubMenu:function () { + var me = this; + if (!me.isDisabled()) { + me.addState('opened'); + clearTimeout(me._showingTimer); + clearTimeout(me._closingTimer); + me._closingTimer = null; + me._showingTimer = setTimeout(function () { + me.showSubMenu(); + }, 250); + } + }, + delayHideSubMenu:function () { + var me = this; + if (!me.isDisabled()) { + me.removeState('opened'); + clearTimeout(me._showingTimer); + if (!me._closingTimer) { + me._closingTimer = setTimeout(function () { + if (!me.hasState('opened')) { + me.hideSubMenu(); + } + me._closingTimer = null; + }, 400); + } + } + }, + renderLabelHtml:function () { + return '
      ' + + '
      ' + + '
      ' + (this.label || '') + '
      '; + }, + getStateDom:function () { + return this.getDom(); + }, + queryAutoHide:function (el) { + if (this.subMenu && this.hasState('opened')) { + return this.subMenu.queryAutoHide(el); + } + }, + _onClick:function (event, this_) { + if (this.hasState('disabled')) return; + if (this.fireEvent('click', event, this_) !== false) { + if (this.subMenu) { + this.showSubMenu(); + } else { + Popup.postHide(event); + } + } + }, + showSubMenu:function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.right -= 5; + rect.left += 2; + rect.width -= 7; + rect.top -= 4; + rect.bottom += 4; + rect.height += 8; + this.subMenu.showAnchorRect(rect, true, true); + }, + hideSubMenu:function () { + this.subMenu.hide(); + } + }; + utils.inherits(MenuItem, UIBase); + utils.extend(MenuItem.prototype, Stateful, true); +})(); + + +// ui/combox.js +///import core +///import uicore +///import ui/menu.js +///import ui/splitbutton.js +(function (){ + // todo: menu和item提成通用list + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + Combox = baidu.editor.ui.Combox = function (options){ + this.initOptions(options); + this.initCombox(); + }; + Combox.prototype = { + uiName: 'combox', + onbuttonclick:function () { + this.showPopup(); + }, + initCombox: function (){ + var me = this; + this.items = this.items || []; + for (var i=0; i vpRect.right) { + left = vpRect.right - rect.width; + } + var top = offset.top; + if (top + rect.height > vpRect.bottom) { + top = vpRect.bottom - rect.height; + } + el.style.left = Math.max(left, 0) + 'px'; + el.style.top = Math.max(top, 0) + 'px'; + }, + showAtCenter: function (){ + + var vpRect = uiUtils.getViewportRect(); + + if ( !this.fullscreen ) { + this.getDom().style.display = ''; + var popSize = this.fitSize(); + var titleHeight = this.getDom('titlebar').offsetHeight | 0; + var left = vpRect.width / 2 - popSize.width / 2; + var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; + var popEl = this.getDom(); + this.safeSetOffset({ + left: Math.max(left | 0, 0), + top: Math.max(top | 0, 0) + }); + if (!domUtils.hasClass(popEl, 'edui-state-centered')) { + popEl.className += ' edui-state-centered'; + } + } else { + var dialogWrapNode = this.getDom(), + contentNode = this.getDom('content'); + + dialogWrapNode.style.display = "block"; + + var wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ), + contentRect = UE.ui.uiUtils.getClientRect( contentNode ); + dialogWrapNode.style.left = "-100000px"; + + contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + "px"; + contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + dialogWrapNode.style.left = 0; + + //保存环境的overflow值 + this._originalContext = { + html: { + overflowX: document.documentElement.style.overflowX, + overflowY: document.documentElement.style.overflowY + }, + body: { + overflowX: document.body.style.overflowX, + overflowY: document.body.style.overflowY + } + }; + + document.documentElement.style.overflowX = 'hidden'; + document.documentElement.style.overflowY = 'hidden'; + document.body.style.overflowX = 'hidden'; + document.body.style.overflowY = 'hidden'; + + } + + this._show(); + }, + getContentHtml: function (){ + var contentHtml = ''; + if (typeof this.content == 'string') { + contentHtml = this.content; + } else if (this.iframeUrl) { + contentHtml = ''; + } + return contentHtml; + }, + getHtmlTpl: function (){ + var footHtml = ''; + + if (this.buttons) { + var buff = []; + for (var i=0; i' + buff.join('') + '
      ' + + '
      '; + } + + return '
      ' + + '
      ' + + '
      ' + + '
      ' + + '' + (this.title || '') + '' + + '
      ' + + this.closeButton.renderHtml() + + '
      ' + + '
      '+ ( this.autoReset ? '' : this.getContentHtml()) +'
      ' + + footHtml + + '
      '; + }, + postRender: function (){ + // todo: 保持居中/记住上次关闭位置选项 + if (!this.modalMask.getDom()) { + this.modalMask.render(); + this.modalMask.hide(); + } + if (!this.dragMask.getDom()) { + this.dragMask.render(); + this.dragMask.hide(); + } + var me = this; + this.addListener('show', function (){ + me.modalMask.show(this.getDom().style.zIndex - 2); + }); + this.addListener('hide', function (){ + me.modalMask.hide(); + }); + if (this.buttons) { + for (var i=0; i'; + me.editor.container.style.zIndex && (this.getDom().style.zIndex = me.editor.container.style.zIndex * 1 + 1); + } + } + // canSideUp:false, + // canSideLeft:false + }); + this.onbuttonclick = function(){ + this.showPopup(); + }; + this.initSplitButton(); + } + + }; + + utils.inherits(MultiMenuPop, SplitButton); +})(); + + +// ui/shortcutmenu.js +(function () { + var UI = baidu.editor.ui, + UIBase = UI.UIBase, + uiUtils = UI.uiUtils, + utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils; + + var allMenus = [],//存储所有快捷菜单 + timeID, + isSubMenuShow = false;//是否有子pop显示 + + var ShortCutMenu = UI.ShortCutMenu = function (options) { + this.initOptions (options); + this.initShortCutMenu (); + }; + + ShortCutMenu.postHide = hideAllMenu; + + ShortCutMenu.prototype = { + isHidden : true , + SPACE : 5 , + initShortCutMenu : function () { + this.items = this.items || []; + this.initUIBase (); + this.initItems (); + this.initEvent (); + allMenus.push (this); + } , + initEvent : function () { + var me = this, + doc = me.editor.document; + + domUtils.on (doc , "mousemove" , function (e) { + if (me.isHidden === false) { + //有pop显示就不隐藏快捷菜单 + if (me.getSubMenuMark () || me.eventType == "contextmenu") return; + + + var flag = true, + el = me.getDom (), + wt = el.offsetWidth, + ht = el.offsetHeight, + distanceX = wt / 2 + me.SPACE,//距离中心X标准 + distanceY = ht / 2,//距离中心Y标准 + x = Math.abs (e.screenX - me.left),//离中心距离横坐标 + y = Math.abs (e.screenY - me.top);//离中心距离纵坐标 + + clearTimeout (timeID); + timeID = setTimeout (function () { + if (y > 0 && y < distanceY) { + me.setOpacity (el , "1"); + } else if (y > distanceY && y < distanceY + 70) { + me.setOpacity (el , "0.5"); + flag = false; + } else if (y > distanceY + 70 && y < distanceY + 140) { + me.hide (); + } + + if (flag && x > 0 && x < distanceX) { + me.setOpacity (el , "1") + } else if (x > distanceX && x < distanceX + 70) { + me.setOpacity (el , "0.5") + } else if (x > distanceX + 70 && x < distanceX + 140) { + me.hide (); + } + }); + } + }); + + //ie\ff下 mouseout不准 + if (browser.chrome) { + domUtils.on (doc , "mouseout" , function (e) { + var relatedTgt = e.relatedTarget || e.toElement; + + if (relatedTgt == null || relatedTgt.tagName == "HTML") { + me.hide (); + } + }); + } + + me.editor.addListener ("afterhidepop" , function () { + if (!me.isHidden) { + isSubMenuShow = true; + } + }); + + } , + initItems : function () { + if (utils.isArray (this.items)) { + for (var i = 0, len = this.items.length ; i < len ; i++) { + var item = this.items[i].toLowerCase (); + + if (UI[item]) { + this.items[i] = new UI[item] (this.editor); + this.items[i].className += " edui-shortcutsubmenu "; + } + } + } + } , + setOpacity : function (el , value) { + if (browser.ie && browser.version < 9) { + el.style.filter = "alpha(opacity = " + parseFloat (value) * 100 + ");" + } else { + el.style.opacity = value; + } + } , + getSubMenuMark : function () { + isSubMenuShow = false; + var layerEle = uiUtils.getFixedLayer (); + var list = domUtils.getElementsByTagName (layerEle , "div" , function (node) { + return domUtils.hasClass (node , "edui-shortcutsubmenu edui-popup") + }); + + for (var i = 0, node ; node = list[i++] ;) { + if (node.style.display != "none") { + isSubMenuShow = true; + } + } + return isSubMenuShow; + } , + show : function (e , hasContextmenu) { + var me = this, + offset = {}, + el = this.getDom (), + fixedlayer = uiUtils.getFixedLayer (); + + function setPos (offset) { + if (offset.left < 0) { + offset.left = 0; + } + if (offset.top < 0) { + offset.top = 0; + } + el.style.cssText = "position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"; + } + + function setPosByCxtMenu (menu) { + if (!menu.tagName) { + menu = menu.getDom (); + } + offset.left = parseInt (menu.style.left); + offset.top = parseInt (menu.style.top); + offset.top -= el.offsetHeight + 15; + setPos (offset); + } + + + me.eventType = e.type; + el.style.cssText = "display:block;left:-9999px"; + + if (e.type == "contextmenu" && hasContextmenu) { + var menu = domUtils.getElementsByTagName (fixedlayer , "div" , "edui-contextmenu")[0]; + if (menu) { + setPosByCxtMenu (menu) + } else { + me.editor.addListener ("aftershowcontextmenu" , function (type , menu) { + setPosByCxtMenu (menu); + }); + } + } else { + offset = uiUtils.getViewportOffsetByEvent (e); + offset.top -= el.offsetHeight + me.SPACE; + offset.left += me.SPACE + 20; + setPos (offset); + me.setOpacity (el , 0.2); + } + + + me.isHidden = false; + me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; + me.top = e.screenY - (el.offsetHeight / 2) - me.SPACE; + + if (me.editor) { + el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; + fixedlayer.style.zIndex = el.style.zIndex - 1; + } + } , + hide : function () { + if (this.getDom ()) { + this.getDom ().style.display = "none"; + } + this.isHidden = true; + } , + postRender : function () { + if (utils.isArray (this.items)) { + for (var i = 0, item ; item = this.items[i++] ;) { + item.postRender (); + } + } + } , + getHtmlTpl : function () { + var buff; + if (utils.isArray (this.items)) { + buff = []; + for (var i = 0 ; i < this.items.length ; i++) { + buff[i] = this.items[i].renderHtml (); + } + buff = buff.join (""); + } else { + buff = this.items; + } + + return '
      ' + + buff + + '
      '; + } + }; + + utils.inherits (ShortCutMenu , UIBase); + + function hideAllMenu (e) { + var tgt = e.target || e.srcElement, + cur = domUtils.findParent (tgt , function (node) { + return domUtils.hasClass (node , "edui-shortcutmenu") || domUtils.hasClass (node , "edui-popup"); + } , true); + + if (!cur) { + for (var i = 0, menu ; menu = allMenus[i++] ;) { + menu.hide () + } + } + } + + domUtils.on (document , 'mousedown' , function (e) { + hideAllMenu (e); + }); + + domUtils.on (window , 'scroll' , function (e) { + hideAllMenu (e); + }); + +}) (); + + +// ui/breakline.js +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Breakline = baidu.editor.ui.Breakline = function (options){ + this.initOptions(options); + this.initSeparator(); + }; + Breakline.prototype = { + uiName: 'Breakline', + initSeparator: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + return '
      '; + } + }; + utils.inherits(Breakline, UIBase); + +})(); + + +// ui/message.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Message = baidu.editor.ui.Message = function (options){ + this.initOptions(options); + this.initMessage(); + }; + + Message.prototype = { + initMessage: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + return '
      ' + + '
      ×
      ' + + '
      ' + + ' ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      '; + }, + reset: function(opt){ + var me = this; + if (!opt.keepshow) { + clearTimeout(this.timer); + me.timer = setTimeout(function(){ + me.hide(); + }, opt.timeout || 4000); + } + + opt.content !== undefined && me.setContent(opt.content); + opt.type !== undefined && me.setType(opt.type); + + me.show(); + }, + postRender: function(){ + var me = this, + closer = this.getDom('closer'); + closer && domUtils.on(closer, 'click', function(){ + me.hide(); + }); + }, + setContent: function(content){ + this.getDom('content').innerHTML = content; + }, + setType: function(type){ + type = type || 'info'; + var body = this.getDom('body'); + body.className = body.className.replace(/edui-message-type-[\w-]+/, 'edui-message-type-' + type); + }, + getContent: function(){ + return this.getDom('content').innerHTML; + }, + getType: function(){ + var arr = this.getDom('body').match(/edui-message-type-([\w-]+)/); + return arr ? arr[1]:''; + }, + show: function (){ + this.getDom().style.display = 'block'; + }, + hide: function (){ + var dom = this.getDom(); + if (dom) { + dom.style.display = 'none'; + dom.parentNode && dom.parentNode.removeChild(dom); + } + } + }; + + utils.inherits(Message, UIBase); + +})(); + + +// adapter/editorui.js +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 +(function () { + var utils = baidu.editor.utils; + var editorui = baidu.editor.ui; + var _Dialog = editorui.Dialog; + editorui.buttons = {}; + + editorui.Dialog = function (options) { + var dialog = new _Dialog(options); + dialog.addListener('hide', function () { + + if (dialog.editor) { + var editor = dialog.editor; + try { + if (browser.gecko) { + var y = editor.window.scrollY, + x = editor.window.scrollX; + editor.body.focus(); + editor.window.scrollTo(x, y); + } else { + editor.focus(); + } + + + } catch (ex) { + } + } + }); + return dialog; + }; + + var iframeUrlMap = { + 'anchor':'~/dialogs/anchor/anchor.html', + 'insertimage':'~/dialogs/image/image.html', + 'link':'~/dialogs/link/link.html', + 'spechars':'~/dialogs/spechars/spechars.html', + 'searchreplace':'~/dialogs/searchreplace/searchreplace.html', + 'map':'~/dialogs/map/map.html', + 'gmap':'~/dialogs/gmap/gmap.html', + 'insertvideo':'~/dialogs/video/video.html', + 'help':'~/dialogs/help/help.html', + 'preview':'~/dialogs/preview/preview.html', + 'emotion':'~/dialogs/emotion/emotion.html', + 'wordimage':'~/dialogs/wordimage/wordimage.html', + 'attachment':'~/dialogs/attachment/attachment.html', + 'insertframe':'~/dialogs/insertframe/insertframe.html', + 'edittip':'~/dialogs/table/edittip.html', + 'edittable':'~/dialogs/table/edittable.html', + 'edittd':'~/dialogs/table/edittd.html', + 'webapp':'~/dialogs/webapp/webapp.html', + 'snapscreen':'~/dialogs/snapscreen/snapscreen.html', + 'scrawl':'~/dialogs/scrawl/scrawl.html', + 'music':'~/dialogs/music/music.html', + 'template':'~/dialogs/template/template.html', + 'background':'~/dialogs/background/background.html', + 'charts': '~/dialogs/charts/charts.html' + }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + var btnCmds = ['undo', 'redo', 'formatmatch', + 'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase', + 'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent', + 'blockquote', 'pasteplain', 'pagebreak', + 'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink', + 'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow', + 'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts']; + + for (var i = 0, ci; ci = btnCmds[i++];) { + ci = ci.toLowerCase(); + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.Button({ + className:'edui-for-' + cmd, + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + onclick:function () { + editor.execCommand(cmd); + }, + theme:editor.options.theme, + showText:false + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + }(ci); + } + + //清除文档 + editorui.cleardoc = function (editor) { + var ui = new editorui.Button({ + className:'edui-for-cleardoc', + title:editor.options.labelMap.cleardoc || editor.getLang("labelMap.cleardoc") || '', + theme:editor.options.theme, + onclick:function () { + if (confirm(editor.getLang("confirmClear"))) { + editor.execCommand('cleardoc'); + } + } + }); + editorui.buttons["cleardoc"] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('cleardoc') == -1); + }); + return ui; + }; + + //排版,图片排版,文字方向 + var typeset = { + 'justify':['left', 'right', 'center', 'justify'], + 'imagefloat':['none', 'left', 'center', 'right'], + 'directionality':['ltr', 'rtl'] + }; + + for (var p in typeset) { + + (function (cmd, val) { + for (var i = 0, ci; ci = val[i++];) { + (function (cmd2) { + editorui[cmd.replace('float', '') + cmd2] = function (editor) { + var ui = new editorui.Button({ + className:'edui-for-' + cmd.replace('float', '') + cmd2, + title:editor.options.labelMap[cmd.replace('float', '') + cmd2] || editor.getLang("labelMap." + cmd.replace('float', '') + cmd2) || '', + theme:editor.options.theme, + onclick:function () { + editor.execCommand(cmd, cmd2); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); + }); + return ui; + }; + })(ci) + } + })(p, typeset[p]) + } + + //字体颜色和背景颜色 + for (var i = 0, ci; ci = ['backcolor', 'forecolor'][i++];) { + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.ColorButton({ + className:'edui-for-' + cmd, + color:'default', + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + editor:editor, + onpickcolor:function (t, color) { + editor.execCommand(cmd, color); + }, + onpicknocolor:function () { + editor.execCommand(cmd, 'default'); + this.setColor('transparent'); + this.color = 'default'; + }, + onbuttonclick:function () { + editor.execCommand(cmd, this.color); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + }); + return ui; + }; + }(ci); + } + + + var dialogBtns = { + noOk:['searchreplace', 'help', 'spechars', 'webapp','preview'], + ok:['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage', + 'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background', 'charts'] + }; + + for (var p in dialogBtns) { + (function (type, vals) { + for (var i = 0, ci; ci = vals[i++];) { + //todo opera下存在问题 + if (browser.opera && ci === "searchreplace") { + continue; + } + (function (cmd) { + editorui[cmd] = function (editor, iframeUrl, title) { + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]; + title = editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || ''; + + var dialog; + //没有iframeUrl不创建dialog + if (iframeUrl) { + dialog = new editorui.Dialog(utils.extend({ + iframeUrl:editor.ui.mapUrl(iframeUrl), + editor:editor, + className:'edui-for-' + cmd, + title:title, + holdScroll: cmd === 'insertimage', + fullscreen: /charts|preview/.test(cmd), + closeDialog:editor.getLang("closeDialog") + }, type == 'ok' ? { + buttons:[ + { + className:'edui-okbutton', + label:editor.getLang("ok"), + editor:editor, + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:editor.getLang("cancel"), + editor:editor, + onclick:function () { + dialog.close(false); + } + } + ] + } : {})); + + editor.ui._dialogs[cmd + "Dialog"] = dialog; + } + + var ui = new editorui.Button({ + className:'edui-for-' + cmd, + title:title, + onclick:function () { + if (dialog) { + switch (cmd) { + case "wordimage": + var images = editor.execCommand("wordimage"); + if (images && images.length) { + dialog.render(); + dialog.open(); + } + break; + case "scrawl": + if (editor.queryCommandState("scrawl") != -1) { + dialog.render(); + dialog.open(); + } + + break; + default: + dialog.render(); + dialog.open(); + } + } + }, + theme:editor.options.theme, + disabled:(cmd == 'scrawl' && editor.queryCommandState("scrawl") == -1) || ( cmd == 'charts' ) + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 + var unNeedCheckState = {'edittable':1}; + if (cmd in unNeedCheckState)return; + + var state = editor.queryCommandState(cmd); + if (ui.getDom()) { + ui.setDisabled(state == -1); + ui.setChecked(state); + } + + }); + + return ui; + }; + })(ci.toLowerCase()) + } + })(p, dialogBtns[p]); + } + + editorui.snapscreen = function (editor, iframeUrl, title) { + title = editor.options.labelMap['snapscreen'] || editor.getLang("labelMap.snapscreen") || ''; + var ui = new editorui.Button({ + className:'edui-for-snapscreen', + title:title, + onclick:function () { + editor.execCommand("snapscreen"); + }, + theme:editor.options.theme + + }); + editorui.buttons['snapscreen'] = ui; + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})["snapscreen"] || iframeUrlMap["snapscreen"]; + if (iframeUrl) { + var dialog = new editorui.Dialog({ + iframeUrl:editor.ui.mapUrl(iframeUrl), + editor:editor, + className:'edui-for-snapscreen', + title:title, + buttons:[ + { + className:'edui-okbutton', + label:editor.getLang("ok"), + editor:editor, + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:editor.getLang("cancel"), + editor:editor, + onclick:function () { + dialog.close(false); + } + } + ] + + }); + dialog.render(); + editor.ui._dialogs["snapscreenDialog"] = dialog; + } + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('snapscreen') == -1); + }); + return ui; + }; + + editorui.insertcode = function (editor, list, title) { + list = editor.options['insertcode'] || []; + title = editor.options.labelMap['insertcode'] || editor.getLang("labelMap.insertcode") || ''; + // if (!list.length) return; + var items = []; + utils.each(list,function(key,val){ + items.push({ + label:key, + value:val, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
      ' + (this.label || '') + '
      '; + } + }); + }); + + var ui = new editorui.Combox({ + editor:editor, + items:items, + onselect:function (t, index) { + editor.execCommand('insertcode', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + title:title, + initValue:title, + className:'edui-for-insertcode', + indexByValue:function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['insertcode'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('insertcode'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('insertcode'); + if(!value){ + ui.setValue(title); + return; + } + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + editorui.fontfamily = function (editor, list, title) { + + list = editor.options['fontfamily'] || []; + title = editor.options.labelMap['fontfamily'] || editor.getLang("labelMap.fontfamily") || ''; + if (!list.length) return; + for (var i = 0, ci, items = []; ci = list[i]; i++) { + var langLabel = editor.getLang('fontfamily')[ci.name] || ""; + (function (key, val) { + items.push({ + label:key, + value:val, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
      ' + (this.label || '') + '
      '; + } + }); + })(ci.label || langLabel, ci.val) + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + onselect:function (t, index) { + editor.execCommand('FontFamily', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + title:title, + initValue:title, + className:'edui-for-fontfamily', + indexByValue:function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['fontfamily'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontFamily'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('FontFamily'); + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + + editorui.fontsize = function (editor, list, title) { + title = editor.options.labelMap['fontsize'] || editor.getLang("labelMap.fontsize") || ''; + list = list || editor.options['fontsize'] || []; + if (!list.length) return; + var items = []; + for (var i = 0; i < list.length; i++) { + var size = list[i] + 'px'; + items.push({ + label:size, + value:size, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
      ' + (this.label || '') + '
      '; + } + }); + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + onselect:function (t, index) { + editor.execCommand('FontSize', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + className:'edui-for-fontsize' + }); + editorui.buttons['fontsize'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontSize'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + ui.setValue(editor.queryCommandValue('FontSize')); + } + } + + }); + return ui; + }; + + editorui.paragraph = function (editor, list, title) { + title = editor.options.labelMap['paragraph'] || editor.getLang("labelMap.paragraph") || ''; + list = editor.options['paragraph'] || []; + if (utils.isEmptyObject(list)) return; + var items = []; + for (var i in list) { + items.push({ + value:i, + label:list[i] || editor.getLang("paragraph")[i], + theme:editor.options.theme, + renderLabelHtml:function () { + return '
      ' + (this.label || '') + '
      '; + } + }) + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + className:'edui-for-paragraph', + onselect:function (t, index) { + editor.execCommand('Paragraph', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + } + }); + editorui.buttons['paragraph'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('Paragraph'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('Paragraph'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + + + //自定义标题 + editorui.customstyle = function (editor) { + var list = editor.options['customstyle'] || [], + title = editor.options.labelMap['customstyle'] || editor.getLang("labelMap.customstyle") || ''; + if (!list.length)return; + var langCs = editor.getLang('customstyle'); + for (var i = 0, items = [], t; t = list[i++];) { + (function (t) { + var ck = {}; + ck.label = t.label ? t.label : langCs[t.name]; + ck.style = t.style; + ck.className = t.className; + ck.tag = t.tag; + items.push({ + label:ck.label, + value:ck, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
      ' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "") + + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">" + + '
      '; + } + }); + })(t); + } + + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + className:'edui-for-customstyle', + onselect:function (t, index) { + editor.execCommand('customstyle', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + indexByValue:function (value) { + for (var i = 0, ti; ti = this.items[i++];) { + if (ti.label == value) { + return i - 1 + } + } + return -1; + } + }); + editorui.buttons['customstyle'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('customstyle'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('customstyle'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + editorui.inserttable = function (editor, iframeUrl, title) { + title = editor.options.labelMap['inserttable'] || editor.getLang("labelMap.inserttable") || ''; + var ui = new editorui.TableButton({ + editor:editor, + title:title, + className:'edui-for-inserttable', + onpicktable:function (t, numCols, numRows) { + editor.execCommand('InsertTable', {numRows:numRows, numCols:numCols, border:1}); + }, + onbuttonclick:function () { + this.showPopup(); + } + }); + editorui.buttons['inserttable'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('inserttable') == -1); + }); + return ui; + }; + + editorui.lineheight = function (editor) { + var val = editor.options.lineheight || []; + if (!val.length)return; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + //todo:写死了 + label:ci, + value:ci, + theme:editor.options.theme, + onclick:function () { + editor.execCommand("lineheight", this.value); + } + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-lineheight', + title:editor.options.labelMap['lineheight'] || editor.getLang("labelMap.lineheight") || '', + items:items, + onbuttonclick:function () { + var value = editor.queryCommandValue('LineHeight') || this.value; + editor.execCommand("LineHeight", value); + } + }); + editorui.buttons['lineheight'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('LineHeight'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('LineHeight'); + value && ui.setValue((value + '').replace(/cm/, '')); + ui.setChecked(state) + } + }); + return ui; + }; + + var rowspacings = ['top', 'bottom']; + for (var r = 0, ri; ri = rowspacings[r++];) { + (function (cmd) { + editorui['rowspacing' + cmd] = function (editor) { + var val = editor.options['rowspacing' + cmd] || []; + if (!val.length) return null; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + label:ci, + value:ci, + theme:editor.options.theme, + onclick:function () { + editor.execCommand("rowspacing", this.value, cmd); + } + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-rowspacing' + cmd, + title:editor.options.labelMap['rowspacing' + cmd] || editor.getLang("labelMap.rowspacing" + cmd) || '', + items:items, + onbuttonclick:function () { + var value = editor.queryCommandValue('rowspacing', cmd) || this.value; + editor.execCommand("rowspacing", value, cmd); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('rowspacing', cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('rowspacing', cmd); + value && ui.setValue((value + '').replace(/%/, '')); + ui.setChecked(state) + } + }); + return ui; + } + })(ri) + } + //有序,无序列表 + var lists = ['insertorderedlist', 'insertunorderedlist']; + for (var l = 0, cl; cl = lists[l++];) { + (function (cmd) { + editorui[cmd] = function (editor) { + var vals = editor.options[cmd], + _onMenuClick = function () { + editor.execCommand(cmd, this.value); + }, items = []; + for (var i in vals) { + items.push({ + label:vals[i] || editor.getLang()[cmd][i] || "", + value:i, + theme:editor.options.theme, + onclick:_onMenuClick + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-' + cmd, + title:editor.getLang("labelMap." + cmd) || '', + 'items':items, + onbuttonclick:function () { + var value = editor.queryCommandValue(cmd) || this.value; + editor.execCommand(cmd, value); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue(cmd); + ui.setValue(value); + ui.setChecked(state) + } + }); + return ui; + }; + })(cl) + } + + editorui.fullscreen = function (editor, title) { + title = editor.options.labelMap['fullscreen'] || editor.getLang("labelMap.fullscreen") || ''; + var ui = new editorui.Button({ + className:'edui-for-fullscreen', + title:title, + theme:editor.options.theme, + onclick:function () { + if (editor.ui) { + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + } + this.setChecked(editor.ui.isFullScreen()); + } + }); + editorui.buttons['fullscreen'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('fullscreen'); + ui.setDisabled(state == -1); + ui.setChecked(editor.ui.isFullScreen()); + }); + return ui; + }; + + // 表情 + editorui["emotion"] = function (editor, iframeUrl) { + var cmd = "emotion"; + var ui = new editorui.MultiMenuPop({ + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd + "") || '', + editor:editor, + className:'edui-for-' + cmd, + iframeUrl:editor.ui.mapUrl(iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]) + }); + editorui.buttons[cmd] = ui; + + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1) + }); + return ui; + }; + + editorui.autotypeset = function (editor) { + var ui = new editorui.AutoTypeSetButton({ + editor:editor, + title:editor.options.labelMap['autotypeset'] || editor.getLang("labelMap.autotypeset") || '', + className:'edui-for-autotypeset', + onbuttonclick:function () { + editor.execCommand('autotypeset') + } + }); + editorui.buttons['autotypeset'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('autotypeset') == -1); + }); + return ui; + }; + + /* 简单上传插件 */ + editorui["simpleupload"] = function (editor) { + var name = 'simpleupload', + ui = new editorui.Button({ + className:'edui-for-' + name, + title:editor.options.labelMap[name] || editor.getLang("labelMap." + name) || '', + onclick:function () {}, + theme:editor.options.theme, + showText:false + }); + editorui.buttons[name] = ui; + editor.addListener('ready', function() { + var b = ui.getDom('body'), + iconSpan = b.children[0]; + editor.fireEvent('simpleuploadbtnready', iconSpan); + }); + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(name); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + +})(); + + +// adapter/editor.js +///import core +///commands 全屏 +///commandsName FullScreen +///commandsTitle 全屏 +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + domUtils = baidu.editor.dom.domUtils; + var nodeStack = []; + + function EditorUI(options) { + this.initOptions(options); + this.initEditorUI(); + } + + EditorUI.prototype = { + uiName:'editor', + initEditorUI:function () { + this.editor.ui = this; + this._dialogs = {}; + this.initUIBase(); + this._initToolbars(); + var editor = this.editor, + me = this; + + editor.addListener('ready', function () { + //提供getDialog方法 + editor.getDialog = function (name) { + return editor.ui._dialogs[name + "Dialog"]; + }; + domUtils.on(editor.window, 'scroll', function (evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + //提供编辑器实时宽高(全屏时宽高不变化) + editor.ui._actualFrameWidth = editor.options.initialFrameWidth; + + UE.browser.ie && UE.browser.version === 6 && editor.container.ownerDocument.execCommand("BackgroundImageCache", false, true); + + //display bottom-bar label based on config + if (editor.options.elementPathEnabled) { + editor.ui.getDom('elementpath').innerHTML = '
      ' + editor.getLang("elementPathTip") + ':
      '; + } + if (editor.options.wordCount) { + function countFn() { + setCount(editor,me); + domUtils.un(editor.document, "click", arguments.callee); + } + domUtils.on(editor.document, "click", countFn); + editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip"); + } + editor.ui._scale(); + if (editor.options.scaleEnabled) { + if (editor.autoHeightEnabled) { + editor.disableAutoHeight(); + } + me.enableScale(); + } else { + me.disableScale(); + } + if (!editor.options.elementPathEnabled && !editor.options.wordCount && !editor.options.scaleEnabled) { + editor.ui.getDom('elementpath').style.display = "none"; + editor.ui.getDom('wordcount').style.display = "none"; + editor.ui.getDom('scale').style.display = "none"; + } + + if (!editor.selection.isFocus())return; + editor.fireEvent('selectionchange', false, true); + + + }); + + editor.addListener('mousedown', function (t, evt) { + var el = evt.target || evt.srcElement; + baidu.editor.ui.Popup.postHide(evt, el); + baidu.editor.ui.ShortCutMenu.postHide(evt); + + }); + editor.addListener("delcells", function () { + if (UE.ui['edittip']) { + new UE.ui['edittip'](editor); + } + editor.getDialog('edittip').open(); + }); + + var pastePop, isPaste = false, timer; + editor.addListener("afterpaste", function () { + if(editor.queryCommandState('pasteplain')) + return; + if(baidu.editor.ui.PastePicker){ + pastePop = new baidu.editor.ui.Popup({ + content:new baidu.editor.ui.PastePicker({editor:editor}), + editor:editor, + className:'edui-wordpastepop' + }); + pastePop.render(); + } + isPaste = true; + }); + + editor.addListener("afterinserthtml", function () { + clearTimeout(timer); + timer = setTimeout(function () { + if (pastePop && (isPaste || editor.ui._isTransfer)) { + if(pastePop.isHidden()){ + var span = domUtils.createElement(editor.document, 'span', { + 'style':"line-height:0px;", + 'innerHTML':'\ufeff' + }), + range = editor.selection.getRange(); + range.insertNode(span); + var tmp= getDomNode(span, 'firstChild', 'previousSibling'); + tmp && pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); + domUtils.remove(span); + }else{ + pastePop.show(); + } + delete editor.ui._isTransfer; + isPaste = false; + } + }, 200) + }); + editor.addListener('contextmenu', function (t, evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + editor.addListener('keydown', function (t, evt) { + if (pastePop) pastePop.dispose(evt); + var keyCode = evt.keyCode || evt.which; + if(evt.altKey&&keyCode==90){ + UE.ui.buttons['fullscreen'].onclick(); + } + }); + editor.addListener('wordcount', function (type) { + setCount(this,me); + }); + function setCount(editor,ui) { + editor.setOpt({ + wordCount:true, + maximumWords:10000, + wordCountMsg:editor.options.wordCountMsg || editor.getLang("wordCountMsg"), + wordOverFlowMsg:editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") + }); + var opt = editor.options, + max = opt.maximumWords, + msg = opt.wordCountMsg , + errMsg = opt.wordOverFlowMsg, + countDom = ui.getDom('wordcount'); + if (!opt.wordCount) { + return; + } + var count = editor.getContentLength(true); + if (count > max) { + countDom.innerHTML = errMsg; + editor.fireEvent("wordcountoverflow"); + } else { + countDom.innerHTML = msg.replace("{#leave}", max - count).replace("{#count}", count); + } + } + + editor.addListener('selectionchange', function () { + if (editor.options.elementPathEnabled) { + me[(editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') + 'ableElementPath']() + } + if (editor.options.scaleEnabled) { + me[(editor.queryCommandState('scale') == -1 ? 'dis' : 'en') + 'ableScale'](); + + } + }); + var popup = new baidu.editor.ui.Popup({ + editor:editor, + content:'', + className:'edui-bubble', + _onEditButtonClick:function () { + this.hide(); + editor.ui._dialogs.linkDialog.open(); + }, + _onImgEditButtonClick:function (name) { + this.hide(); + editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); + + }, + _onImgSetFloat:function (value) { + this.hide(); + editor.execCommand("imagefloat", value); + + }, + _setIframeAlign:function (value) { + var frame = popup.anchorEl; + var newFrame = frame.cloneNode(true); + switch (value) { + case -2: + newFrame.setAttribute("align", ""); + break; + case -1: + newFrame.setAttribute("align", "left"); + break; + case 1: + newFrame.setAttribute("align", "right"); + break; + } + frame.parentNode.insertBefore(newFrame, frame); + domUtils.remove(frame); + popup.anchorEl = newFrame; + popup.showAnchor(popup.anchorEl); + }, + _updateIframe:function () { + var frame = editor._iframe = popup.anchorEl; + if(domUtils.hasClass(frame, 'ueditor_baidumap')) { + editor.selection.getRange().selectNode(frame).select(); + editor.ui._dialogs.mapDialog.open(); + popup.hide(); + } else { + editor.ui._dialogs.insertframeDialog.open(); + popup.hide(); + } + }, + _onRemoveButtonClick:function (cmdName) { + editor.execCommand(cmdName); + this.hide(); + }, + queryAutoHide:function (el) { + if (el && el.ownerDocument == editor.document) { + if (el.tagName.toLowerCase() == 'img' || domUtils.findParentByTagName(el, 'a', true)) { + return el !== popup.anchorEl; + } + } + return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); + } + }); + popup.render(); + if (editor.options.imagePopup) { + editor.addListener('mouseover', function (t, evt) { + evt = evt || window.event; + var el = evt.target || evt.srcElement; + if (editor.ui._dialogs.insertframeDialog && /iframe/ig.test(el.tagName)) { + var html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("default") + '  ' + editor.getLang("justifyleft") + '  ' + editor.getLang("justifyright") + '  ' + + ' ' + editor.getLang("modify") + ''); + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = el; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + } + }); + editor.addListener('selectionchange', function (t, causeByUi) { + if (!causeByUi) return; + var html = '', str = "", + img = editor.selection.getRange().getClosedNode(), + dialogs = editor.ui._dialogs; + if (img && img.tagName == 'IMG') { + var dialogName = 'insertimageDialog'; + if (img.className.indexOf("edui-faked-video") != -1 || img.className.indexOf("edui-upload-video") != -1) { + dialogName = "insertvideoDialog" + } + if (img.className.indexOf("edui-faked-webapp") != -1) { + dialogName = "webappDialog" + } + if (img.src.indexOf("http://api.map.baidu.com") != -1) { + dialogName = "mapDialog" + } + if (img.className.indexOf("edui-faked-music") != -1) { + dialogName = "musicDialog" + } + if (img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1) { + dialogName = "gmapDialog" + } + if (img.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("modify") + '  ' + + '' + editor.getLang("delete") + ''); + } + if (img.getAttribute("word_img")) { + //todo 放到dialog去做查询 + editor.word_img = [img.getAttribute("word_img")]; + dialogName = "wordimageDialog" + } + if(domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + str = '' + editor.getLang("property") + ': '+ + '' + editor.getLang("default") + '  ' + + '' + editor.getLang("justifyleft") + '  ' + + '' + editor.getLang("justifyright") + '  ' + + '' + editor.getLang("justifycenter") + '  '+ + '' + editor.getLang("modify") + ''; + + !html && (html = popup.formatHtml(str)) + + } + if (editor.ui._dialogs.linkDialog) { + var link = editor.queryCommandValue('link'); + var url; + if (link && (url = (link.getAttribute('_href') || link.getAttribute('href', 2)))) { + var txt = url; + if (url.length > 30) { + txt = url.substring(0, 20) + "..."; + } + if (html) { + html += '
      ' + } + html += popup.formatHtml( + '' + editor.getLang("anthorMsg") + ': ' + txt + '' + + ' ' + editor.getLang("modify") + '' + + ' ' + editor.getLang("clear") + ''); + popup.showAnchor(link); + } + } + + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = img || link; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + }); + } + + }, + _initToolbars:function () { + var editor = this.editor; + var toolbars = this.toolbars || []; + var toolbarUis = []; + for (var i = 0; i < toolbars.length; i++) { + var toolbar = toolbars[i]; + var toolbarUi = new baidu.editor.ui.Toolbar({theme:editor.options.theme}); + for (var j = 0; j < toolbar.length; j++) { + var toolbarItem = toolbar[j]; + var toolbarItemUi = null; + if (typeof toolbarItem == 'string') { + toolbarItem = toolbarItem.toLowerCase(); + if (toolbarItem == '|') { + toolbarItem = 'Separator'; + } + if(toolbarItem == '||'){ + toolbarItem = 'Breakline'; + } + if (baidu.editor.ui[toolbarItem]) { + toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); + } + + //fullscreen这里单独处理一下,放到首行去 + if (toolbarItem == 'fullscreen') { + if (toolbarUis && toolbarUis[0]) { + toolbarUis[0].items.splice(0, 0, toolbarItemUi); + } else { + toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); + } + + continue; + + + } + } else { + toolbarItemUi = toolbarItem; + } + if (toolbarItemUi && toolbarItemUi.id) { + + toolbarUi.add(toolbarItemUi); + } + } + toolbarUis[i] = toolbarUi; + } + + //接受外部定制的UI + + utils.each(UE._customizeUI,function(obj,key){ + var itemUI,index; + if(obj.id && obj.id != editor.key){ + return false; + } + itemUI = obj.execFn.call(editor,editor,key); + if(itemUI){ + index = obj.index; + if(index === undefined){ + index = toolbarUi.items.length; + } + toolbarUi.add(itemUI,index) + } + }); + + this.toolbars = toolbarUis; + }, + getHtmlTpl:function () { + return '
      ' + + '
      ' + + (this.toolbars.length ? + '
      ' + + this.renderToolbarBoxHtml() + + '
      ' : '') + + '' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + //modify wdcount by matao + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '
      '; + }, + showWordImageDialog:function () { + this._dialogs['wordimageDialog'].open(); + }, + renderToolbarBoxHtml:function () { + var buff = []; + for (var i = 0; i < this.toolbars.length; i++) { + buff.push(this.toolbars[i].renderHtml()); + } + return buff.join(''); + }, + setFullScreen:function (fullscreen) { + + var editor = this.editor, + container = editor.container.parentNode.parentNode; + if (this._fullscreen != fullscreen) { + this._fullscreen = fullscreen; + this.editor.fireEvent('beforefullscreenchange', fullscreen); + if (baidu.editor.browser.gecko) { + var bk = editor.selection.getRange().createBookmark(); + } + if (fullscreen) { + while (container.tagName != "BODY") { + var position = baidu.editor.dom.domUtils.getComputedStyle(container, "position"); + nodeStack.push(position); + container.style.position = "static"; + container = container.parentNode; + } + this._bakHtmlOverflow = document.documentElement.style.overflow; + this._bakBodyOverflow = document.body.style.overflow; + this._bakAutoHeight = this.editor.autoHeightEnabled; + this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); + + this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; + if (this._bakAutoHeight) { + //当全屏时不能执行自动长高 + editor.autoHeightEnabled = false; + this.editor.disableAutoHeight(); + } + + document.documentElement.style.overflow = 'hidden'; + //修复,滚动条不收起的问题 + + window.scrollTo(0,window.scrollY); + this._bakCssText = this.getDom().style.cssText; + this._bakCssText1 = this.getDom('iframeholder').style.cssText; + editor.iframe.parentNode.style.width = ''; + this._updateFullScreen(); + } else { + while (container.tagName != "BODY") { + container.style.position = nodeStack.shift(); + container = container.parentNode; + } + this.getDom().style.cssText = this._bakCssText; + this.getDom('iframeholder').style.cssText = this._bakCssText1; + if (this._bakAutoHeight) { + editor.autoHeightEnabled = true; + this.editor.enableAutoHeight(); + } + + document.documentElement.style.overflow = this._bakHtmlOverflow; + document.body.style.overflow = this._bakBodyOverflow; + editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + 'px'; + window.scrollTo(0, this._bakScrollTop); + } + if (browser.gecko && editor.body.contentEditable === 'true') { + var input = document.createElement('input'); + document.body.appendChild(input); + editor.body.contentEditable = false; + setTimeout(function () { + input.focus(); + setTimeout(function () { + editor.body.contentEditable = true; + editor.fireEvent('fullscreenchanged', fullscreen); + editor.selection.getRange().moveToBookmark(bk).select(true); + baidu.editor.dom.domUtils.remove(input); + fullscreen && window.scroll(0, 0); + }, 0) + }, 0) + } + + if(editor.body.contentEditable === 'true'){ + this.editor.fireEvent('fullscreenchanged', fullscreen); + this.triggerLayout(); + } + + } + }, + _updateFullScreen:function () { + if (this._fullscreen) { + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.cssText = 'border:0;position:absolute;left:0;top:' + (this.editor.options.topOffset || 0) + 'px;width:' + vpRect.width + 'px;height:' + vpRect.height + 'px;z-index:' + (this.getDom().style.zIndex * 1 + 100); + uiUtils.setViewportOffset(this.getDom(), { left:0, top:this.editor.options.topOffset || 0 }); + this.editor.setHeight(vpRect.height - this.getDom('toolbarbox').offsetHeight - this.getDom('bottombar').offsetHeight - (this.editor.options.topOffset || 0),true); + //不手动调一下,会导致全屏失效 + if(browser.gecko){ + try{ + window.onresize(); + }catch(e){ + + } + + } + } + }, + _updateElementPath:function () { + var bottom = this.getDom('elementpath'), list; + if (this.elementPathEnabled && (list = this.editor.queryCommandValue('elementpath'))) { + + var buff = []; + for (var i = 0, ci; ci = list[i]; i++) { + buff[i] = this.formatHtml('' + ci + ''); + } + bottom.innerHTML = '
      ' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' > ') + '
      '; + + } else { + bottom.style.display = 'none' + } + }, + disableElementPath:function () { + var bottom = this.getDom('elementpath'); + bottom.innerHTML = ''; + bottom.style.display = 'none'; + this.elementPathEnabled = false; + + }, + enableElementPath:function () { + var bottom = this.getDom('elementpath'); + bottom.style.display = ''; + this.elementPathEnabled = true; + this._updateElementPath(); + }, + _scale:function () { + var doc = document, + editor = this.editor, + editorHolder = editor.container, + editorDocument = editor.document, + toolbarBox = this.getDom("toolbarbox"), + bottombar = this.getDom("bottombar"), + scale = this.getDom("scale"), + scalelayer = this.getDom("scalelayer"); + + var isMouseMove = false, + position = null, + minEditorHeight = 0, + minEditorWidth = editor.options.minFrameWidth, + pageX = 0, + pageY = 0, + scaleWidth = 0, + scaleHeight = 0; + + function down() { + position = domUtils.getXY(editorHolder); + + if (!minEditorHeight) { + minEditorHeight = editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight; + } + + scalelayer.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + editorHolder.offsetWidth + "px;height:" + + editorHolder.offsetHeight + "px;z-index:" + (editor.options.zIndex + 1); + + domUtils.on(doc, "mousemove", move); + domUtils.on(editorDocument, "mouseup", up); + domUtils.on(doc, "mouseup", up); + } + + var me = this; + //by xuheng 全屏时关掉缩放 + this.editor.addListener('fullscreenchanged', function (e, fullScreen) { + if (fullScreen) { + me.disableScale(); + + } else { + if (me.editor.options.scaleEnabled) { + me.enableScale(); + var tmpNode = me.editor.document.createElement('span'); + me.editor.body.appendChild(tmpNode); + me.editor.body.style.height = Math.max(domUtils.getXY(tmpNode).y, me.editor.iframe.offsetHeight - 20) + 'px'; + domUtils.remove(tmpNode) + } + } + }); + function move(event) { + clearSelection(); + var e = event || window.event; + pageX = e.pageX || (doc.documentElement.scrollLeft + e.clientX); + pageY = e.pageY || (doc.documentElement.scrollTop + e.clientY); + scaleWidth = pageX - position.x; + scaleHeight = pageY - position.y; + + if (scaleWidth >= minEditorWidth) { + isMouseMove = true; + scalelayer.style.width = scaleWidth + 'px'; + } + if (scaleHeight >= minEditorHeight) { + isMouseMove = true; + scalelayer.style.height = scaleHeight + "px"; + } + } + + function up() { + if (isMouseMove) { + isMouseMove = false; + editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; + editorHolder.style.width = editor.ui._actualFrameWidth + 'px'; + + editor.setHeight(scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2,true); + } + if (scalelayer) { + scalelayer.style.display = "none"; + } + clearSelection(); + domUtils.un(doc, "mousemove", move); + domUtils.un(editorDocument, "mouseup", up); + domUtils.un(doc, "mouseup", up); + } + + function clearSelection() { + if (browser.ie) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + } + + this.enableScale = function () { + //trace:2868 + if (editor.queryCommandState("source") == 1) return; + scale.style.display = ""; + this.scaleEnabled = true; + domUtils.on(scale, "mousedown", down); + }; + this.disableScale = function () { + scale.style.display = "none"; + this.scaleEnabled = false; + domUtils.un(scale, "mousedown", down); + }; + }, + isFullScreen:function () { + return this._fullscreen; + }, + postRender:function () { + UIBase.prototype.postRender.call(this); + for (var i = 0; i < this.toolbars.length; i++) { + this.toolbars[i].postRender(); + } + var me = this; + var timerId, + domUtils = baidu.editor.dom.domUtils, + updateFullScreenTime = function () { + clearTimeout(timerId); + timerId = setTimeout(function () { + me._updateFullScreen(); + }); + }; + domUtils.on(window, 'resize', updateFullScreenTime); + + me.addListener('destroy', function () { + domUtils.un(window, 'resize', updateFullScreenTime); + clearTimeout(timerId); + }) + }, + showToolbarMsg:function (msg, flag) { + this.getDom('toolbarmsg_label').innerHTML = msg; + this.getDom('toolbarmsg').style.display = ''; + // + if (!flag) { + var w = this.getDom('upload_dialog'); + w.style.display = 'none'; + } + }, + hideToolbarMsg:function () { + this.getDom('toolbarmsg').style.display = 'none'; + }, + mapUrl:function (url) { + return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : '' + }, + triggerLayout:function () { + var dom = this.getDom(); + if (dom.style.zoom == '1') { + dom.style.zoom = '100%'; + } else { + dom.style.zoom = '1'; + } + } + }; + utils.inherits(EditorUI, baidu.editor.ui.UIBase); + + + var instances = {}; + + + UE.ui.Editor = function (options) { + var editor = new UE.Editor(options); + editor.options.editor = editor; + utils.loadFile(document, { + href:editor.options.themePath + editor.options.theme + "/css/ueditor.css", + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + + var oldRender = editor.render; + editor.render = function (holder) { + if (holder.constructor === String) { + editor.key = holder; + instances[holder] = editor; + } + utils.domReady(function () { + editor.langIsReady ? renderUI() : editor.addListener("langReady", renderUI); + function renderUI() { + editor.setOpt({ + labelMap:editor.options.labelMap || editor.getLang('labelMap') + }); + new EditorUI(editor.options); + if (holder) { + if (holder.constructor === String) { + holder = document.getElementById(holder); + } + holder && holder.getAttribute('name') && ( editor.options.textarea = holder.getAttribute('name')); + if (holder && /script|textarea/ig.test(holder.tagName)) { + var newDiv = document.createElement('div'); + holder.parentNode.insertBefore(newDiv, holder); + var cont = holder.value || holder.innerHTML; + editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) ? editor.options.initialContent : + cont.replace(/>[\n\r\t]+([ ]{4})+/g, '>') + .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<'); + holder.className && (newDiv.className = holder.className); + holder.style.cssText && (newDiv.style.cssText = holder.style.cssText); + if (/textarea/i.test(holder.tagName)) { + editor.textarea = holder; + editor.textarea.style.display = 'none'; + + + } else { + holder.parentNode.removeChild(holder); + + + } + if(holder.id){ + newDiv.id = holder.id; + domUtils.removeAttributes(holder,'id'); + } + holder = newDiv; + holder.innerHTML = ''; + } + + } + domUtils.addClass(holder, "edui-" + editor.options.theme); + editor.ui.render(holder); + var opt = editor.options; + //给实例添加一个编辑器的容器引用 + editor.container = editor.ui.getDom(); + var parents = domUtils.findParents(holder,true); + var displays = []; + for(var i = 0 ,ci;ci=parents[i];i++){ + displays[i] = ci.style.display; + ci.style.display = 'block' + } + if (opt.initialFrameWidth) { + opt.minFrameWidth = opt.initialFrameWidth; + } else { + opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; + var styleWidth = holder.style.width; + if(/%$/.test(styleWidth)) { + opt.initialFrameWidth = styleWidth; + } + } + if (opt.initialFrameHeight) { + opt.minFrameHeight = opt.initialFrameHeight; + } else { + opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; + } + for(var i = 0 ,ci;ci=parents[i];i++){ + ci.style.display = displays[i] + } + //编辑器最外容器设置了高度,会导致,编辑器不占位 + //todo 先去掉,没有找到原因 + if(holder.style.height){ + holder.style.height = '' + } + editor.container.style.width = opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth) ? '' : 'px'); + editor.container.style.zIndex = opt.zIndex; + oldRender.call(editor, editor.ui.getDom('iframeholder')); + editor.fireEvent("afteruiready"); + } + }) + }; + return editor; + }; + + + /** + * @file + * @name UE + * @short UE + * @desc UEditor的顶部命名空间 + */ + /** + * @name getEditor + * @since 1.2.4+ + * @grammar UE.getEditor(id,[opt]) => Editor实例 + * @desc 提供一个全局的方法得到编辑器实例 + * + * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 + * * ''opt'' 编辑器的可选参数 + * @example + * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 + * this.setContent('hello') + * }}); + * UE.getEditor('containerId'); //返回刚创建的实例 + * + */ + UE.getEditor = function (id, opt) { + var editor = instances[id]; + if (!editor) { + editor = instances[id] = new UE.ui.Editor(opt); + editor.render(id); + } + return editor; + }; + + + UE.delEditor = function (id) { + var editor; + if (editor = instances[id]) { + editor.key && editor.destroy(); + delete instances[id] + } + }; + + UE.registerUI = function(uiName,fn,index,editorId){ + utils.each(uiName.split(/\s+/), function (name) { + UE._customizeUI[name] = { + id : editorId, + execFn:fn, + index:index + }; + }) + + } + +})(); + +// adapter/message.js +UE.registerUI('message', function(editor) { + + var editorui = baidu.editor.ui; + var Message = editorui.Message; + var holder; + var _messageItems = []; + var me = editor; + + me.addListener('ready', function(){ + holder = document.getElementById(me.ui.id + '_message_holder'); + updateHolderPos(); + setTimeout(function(){ + updateHolderPos(); + }, 500); + }); + + me.addListener('showmessage', function(type, opt){ + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = new Message({ + 'timeout': opt.timeout, + 'type': opt.type, + 'content': opt.content, + 'keepshow': opt.keepshow, + 'editor': me + }), + mid = opt.id || ('msg_' + (+new Date()).toString(36)); + message.render(holder); + _messageItems[mid] = message; + message.reset(opt); + updateHolderPos(); + return mid; + }); + + me.addListener('updatemessage',function(type, id, opt){ + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = _messageItems[id]; + message.render(holder); + message && message.reset(opt); + }); + + me.addListener('hidemessage',function(type, id){ + var message = _messageItems[id]; + message && message.hide(); + }); + + function updateHolderPos(){ + var toolbarbox = me.ui.getDom('toolbarbox'); + if (toolbarbox) { + holder.style.top = toolbarbox.offsetHeight + 3 + 'px'; + } + holder.style.zIndex = Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; + } + +}); + + +// adapter/autosave.js +UE.registerUI('autosave', function(editor) { + var timer = null,uid = null; + editor.on('afterautosave',function(){ + clearTimeout(timer); + + timer = setTimeout(function(){ + if(uid){ + editor.trigger('hidemessage',uid); + } + uid = editor.trigger('showmessage',{ + content : editor.getLang('autosave.success'), + timeout : 2000 + }); + + },2000) + }) + +}); + + + +})(); diff --git a/member/editor/ueditor/ueditor.all.min.js b/member/editor/ueditor/ueditor.all.min.js new file mode 100644 index 0000000..af8f6ef --- /dev/null +++ b/member/editor/ueditor/ueditor.all.min.js @@ -0,0 +1,18 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) + */ + +!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor=window.UE||{},UE.plugins={},UE.commands={},UE.instants={},UE.I18N={},UE._customizeUI={},UE.version="1.4.3";var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},unhtmlForUrl:function(a,b){return a?a.replace(b||/[<">']/g,function(a){return{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file ueditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/,"").replace(/;([ \n\r\t]+)|\1;/g,";").replace(/(&((l|g)t|quot|#39))?;{2,}/g,function(a,b){return b?b+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":"
      "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode,domUtils.remove(c),c=g}}catch(d){} +}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("‍")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.textarea)if(utils.isString(b.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),d.loadServerConfig(),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?"":"")+(c.initialStyle?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      "),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?'':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?'':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.replace(/<(p|div)[^>]*>(| )<\/\1>/gi,"\n").replace(//gi,"\n").replace(/<[^>\/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return dtd.$block[c]?"\n":b?b:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML="

      "+(browser.ie?" ":"
      ")+"

      "+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="

      "+(ie?"":"
      ")+"

      ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='

      '+b+"

      ",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){ +var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=this.getOpt(a)||a,c=this.getOpt("imageUrl"),d=this.getOpt("serverUrl");return!d&&c&&(d=c.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2")),d?(d=d+(d.indexOf("?")==-1?"?":"&")+"action="+(b||""),utils.formatUrl(d)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"lang/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,configUrl&&UE.ajax.request(configUrl,{method:"GET",dataType:isJsonp?"jsonp":"",onsuccess:function(r){try{var config=isJsonp?r:eval("("+r.responseText+")");utils.extend(me.options,config),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return''}catch(f){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/

      ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

      $1

      ").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,function(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g,"  "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={td:"tr",tr:["tbody","thead","tfoot"],tbody:"table",th:"tr",thead:"table",tfoot:"table",caption:"table",li:["ul","ol"],dt:"dl",dd:"dl",option:"select"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b);break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      ",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:"
      "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('


      '))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){for(i=e.parentNode,domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",'

      '+i.innerHTML+"

      "),f=c.document.getElementById("_img_parent_tmp"),f.removeAttribute("id"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){function c(a){utils.each("width,height,border,hspace,vspace".split(","),function(b){a[b]&&(a[b]=parseInt(a[b],10)||0)}),utils.each("src,_src".split(","),function(b){a[b]&&(a[b]=utils.unhtmlForUrl(a[b]))}),utils.each("title,alt".split(","),function(b){a[b]&&(a[b]=utils.unhtml(a[b]))})}if(b=utils.isArray(b)?b:[b],b.length){var d=this,e=d.selection.getRange(),f=e.getClosedNode();if(d.fireEvent("beforeinsertimage",b)!==!0){if(!f||!/img/i.test(f.tagName)||"edui-faked-video"==f.className&&f.className.indexOf("edui-upload-video")==-1||f.getAttribute("word_img")){var g,h=[],i="";if(g=b[0],1==b.length)c(g),i=''+g.alt+'","center"==g.floatStyle&&(i='

      '+i+"

      "),h.push(i);else for(var j=0;g=b[j++];)c(g),i="

      ",h.push(i);d.execCommand("insertHtml",h.join(""))}else{var k=b.shift(),l=k.floatStyle;delete k.floatStyle,domUtils.setAttributes(f,k),d.execCommand("imagefloat",l),b.length>0&&(e.setStartAfter(f).setCursor(!1,!0),d.execCommand("insertimage",b))}d.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){if(g[b]&&(a.adjustmentBoundary(),!a.collapsed&&1==a.startContainer.nodeType)){var d=a.startContainer.childNodes[a.startOffset];if(d&&domUtils.isTagNode(d,"span")){var e=a.createBookmark();utils.each(domUtils.getElementsByTagName(d,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(e)}}}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.setOpt({fontfamily:[{name:"songti",val:"宋体,SimSun"},{name:"yahei",val:"微软雅黑,Microsoft YaHei"},{name:"kaiti",val:"楷体,楷体_GB2312, SimKai"},{name:"heiti",val:"黑体, SimHei"},{name:"lishu",val:"隶书, SimLi"},{name:"andaleMono",val:"andale mono"},{name:"arial",val:"arial, helvetica,sans-serif"},{name:"arialBlack",val:"arial black,avant garde"},{name:"comicSansMs",val:"comic sans ms"},{name:"impact",val:"impact,chicago"},{name:"timesNewRoman",val:"times new roman"}],fontsize:[10,11,12,14,16,18,20,24,36]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.setOpt({removeFormatTags:"b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",removeFormatAttributes:"class,style,lang,width,height,align,hspace,valign"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c
      "+this.getContent(null,null,!0)+"
      "),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml","
      ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.setOpt("insertcode",{as3:"ActionScript3",bash:"Bash/Shell",cpp:"C/C++",css:"Css",cf:"CodeFunction","c#":"C#",delphi:"Delphi",diff:"Diff",erlang:"Erlang",groovy:"Groovy",html:"Html",java:"Java",jfx:"JavaFx",js:"Javascript",pl:"Perl",php:"Php",plain:"Plain Text",ps:"PowerShell",python:"Python",ruby:"Ruby",scala:"Scala",sql:"Sql",vb:"Vb",xml:"Xml"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":"
      ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+="
      ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="
      ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="
      ")):f+=a.data+"
      ",!a.nextSibling()&&/
      $/.test(f)&&(f=f.replace(/
      $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="
      "}})}c.execCommand("inserthtml",'
      '+f+"
      ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.notNeedCodeQuery={help:1,undo:1,redo:1,source:1,print:1,searchreplace:1,fullscreen:1,preview:1,insertparagraph:1,elementpath:1,insertcode:1,inserthtml:1,selectall:1};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)), +c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML="
      ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="

      "+(ie?"":"
      ")+"

      ",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){return{bindEvents:{ready:function(){utils.cssRule("anchor",".anchorclass{background: url('"+this.options.themePath+this.options.theme+"/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;(b=a.getAttr("name"))&&!a.getAttr("href")&&(a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name"))})},commands:{anchor:{execCommand:function(a,b){var c=this.selection.getRange(),d=c.getClosedNode();if(d&&d.getAttribute("anchorname"))b?d.setAttribute("anchorname",b):(c.setStartBefore(d).setCursor(),domUtils.remove(d));else if(b){var e=this.document.createElement("img");c.collapse(!0),domUtils.setAttributes(e,{anchorname:b,"class":"anchorclass"}),c.insertNode(e).setStartAfter(e).setCursor(!1,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement('
      ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/default/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),this.update())},this.update=function(){this.hasRedo=!!this.list[this.index+1],this.hasUndo=!!this.list[this.index-1]},this.reset=function(){this.list=[],this.index=0,this.hasUndo=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;"mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover")}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()})}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="


      ",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText("    "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,insertorderedlist:{num:"",num1:"",num2:"",cn:"",cn1:"",cn2:"",decimal:"","lower-alpha":"","lower-roman":"","upper-alpha":"","upper-roman":""},insertunorderedlist:{circle:"",disc:"",square:"",dash:"",dot:""},listDefaultPaddingLeft:"30",listiconpath:"http://bs.baidu.com/listicon/",maxListLevel:-1,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":"
      ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={num1:/^\d+\)/,decimal:/^\d+\./,"lower-alpha":/^[a-z]+\)/,"upper-alpha":/^[A-Z]+\./,cn:/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,cn2:/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0),n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){ +if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="

      ",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==f.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](e,b)}var c,d,e=this,f=this.options,g=!1;f.sourceEditor=browser.ie?"textarea":f.sourceEditor||"codemirror",e.setOpt({sourceEditorFirst:!1});var h,i,j;e.commands.source={execCommand:function(){if(g=!g){j=e.selection.getRange().createAddress(!1,!0),e.undoManger&&e.undoManger.save(!0),browser.gecko&&(e.body.contentEditable=!1),h=e.iframe.style.cssText,e.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",e.fireEvent("beforegetcontent");var a=UE.htmlparser(e.body.innerHTML);e.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),e.fireEvent("aftergetcontent");var f=a.toHtml(!0);c=b(e.iframe.parentNode),c.setContent(f),d=e.setContent,e.setContent=function(a){var b=UE.htmlparser(a);e.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),e.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),i=e.getContent,e.getContent=function(){return c.getContent()||"

      "+(browser.ie?"":"
      ")+"

      "}}else{e.iframe.style.cssText=h;var k=c.getContent()||"

      "+(browser.ie?"":"
      ")+"

      ";k=k.replace(new RegExp("[\\r\\t\\n ]*]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),e.setContent=d,e.setContent(k),c.dispose(),c=null,e.getContent=i;var l=e.body.firstChild;if(l||(e.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      ",l=e.body.firstChild),e.undoManger&&e.undoManger.save(!0),browser.gecko){var m=document.createElement("input");m.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(m),e.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(m,{left:-32768,top:0}),m.focus(),setTimeout(function(){e.body.contentEditable=!0,e.selection.getRange().moveToAddress(j).select(!0),domUtils.remove(m)})})}else try{e.selection.getRange().moveToAddress(j).select(!0)}catch(n){}}this.fireEvent("sourcemodechanged",g)},queryCommandState:function(){return 0|g},notNeedUndo:1};var k=e.queryCommandState;e.queryCommandState=function(a){return a=a.toLowerCase(),g?a in{source:1,fullscreen:1}?1:-1:k.apply(this,arguments)},"codemirror"==f.sourceEditor&&e.addListener("ready",function(){utils.loadFile(document,{src:f.codeMirrorJsUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){f.sourceEditorFirst&&setTimeout(function(){e.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:f.codeMirrorCssUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,"

      "),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"

      "),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="

      "+(browser.ie?"":"
      ")+"

      ",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[0,0,-1,-1],[0,0,0,-1],[0,0,1,-1],[0,0,-1,0],[0,0,1,0],[0,0,-1,1],[0,0,0,1],[0,0,1,1]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push('');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.initEvents()},initStyle:function(){utils.cssRule("imagescale",".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")},initEvents:function(){var a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this;switch(a.type){case"mousedown":var d,d=a.target||a.srcElement;d.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=d.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode);domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-b.editor.document.body.scrollLeft-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-b.editor.document.body.scrollTop-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(e),f||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(e=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both",d=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(h.minFrameHeight,h.initialFrameHeight)),d!=g&&(d!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=d+"px"),a.body.style.height=d+"px",g=d),domUtils.removeStyle(b,"clear"))},50))}var b=this;if(b.autoHeightEnabled=b.options.autoHeightEnabled!==!1,b.autoHeightEnabled){var c,d,e,f,g=0,h=b.options;b.addListener("fullscreenchanged",function(a,b){f=b}),b.addListener("destroy",function(){b.removeListener("contentchange afterinserthtml keyup mouseup",a)}),b.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var d=b.document;b.autoHeightEnabled=!0,c=d.body.style.overflowY,d.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},b.disableAutoHeight=function(){b.body.style.overflowY=c||"",b.removeListener("contentchange",a),b.removeListener("keyup",a),b.removeListener("mouseup",a),b.autoHeightEnabled=!1,b.fireEvent("autoheightchanged",b.autoHeightEnabled)},b.on("setHeight",function(){b.disableAutoHeight()}),b.addListener("ready",function(){b.enableAutoHeight();var c;domUtils.on(browser.ie?b.body:b.document,browser.webkit?"dragover":"drop",function(){clearTimeout(c),c=setTimeout(function(){a.call(b)},100)});var d;window.onscroll=function(){ +null===d?d=this.scrollY:0==this.scrollY&&0!=d&&(b.window.scrollTo(0,0),d=null)}})}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=k.offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){a=utils.unhtmlForUrl(a),f=utils.unhtml(f),g=utils.unhtml(g),b=parseInt(b,10)||0,d=parseInt(d,10)||0;var i;switch(h){case"image":i="';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="'}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){d=utils.isArray(d)?d:[d];for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=b&&domUtils.findParentByTagName(b,"caption",!0),f=e?e.parentNode:d&&d.parentNode.parentNode;return{cell:c,tr:d,table:f,caption:e}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:"
      ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){var a=this.cellsRange,b=this.getCell(a.beginRowIndex,this.indexTable[a.beginRowIndex][a.beginColIndex].cellIndex);if("TH"==b.tagName&&a.endRowIndex!==a.beginRowIndex){var c=this.indexTable,d=this.getCellInfo(b);b=this.getCell(1,c[1][d.colIndex].cellIndex),a=this.getCellsRange(b,this.getCell(c[this.rowsNum-1][d.colIndex].rowIndex,c[this.rowsNum-1][d.colIndex].cellIndex))}for(var e,f=this.getCells(a),g=0;e=f[g++];)e!==b&&(this.moveContent(b,e),this.deleteCell(e));if(b.rowSpan=a.endRowIndex-a.beginRowIndex+1,b.rowSpan>1&&b.removeAttribute("height"),b.colSpan=a.endColIndex-a.beginColIndex+1,b.colSpan>1&&b.removeAttribute("width"),b.rowSpan==this.rowsNum&&1!=b.colSpan&&(b.colSpan=1),b.colSpan==this.colsNum&&1!=b.rowSpan){var h=b.parentNode.rowIndex;if(this.table.deleteRow)for(var g=h+1,i=h+1,j=b.rowSpan;g1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:"
      ")+"");c.push("")}return"
      "+c.join("")+"
      "}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":"
      ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"
      "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:"
      ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/default/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
      ")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a,b,c){var d=b.searchStr;b.dir==-1&&(a=a.split("").reverse().join(""),d=d.split("").reverse().join(""),c=a.length-c);for(var e,f=new RegExp(d,"g"+(b.casesensitive?"":"i"));e=f.exec(a);)if(e.index>=c)return b.dir==-1?a.length-e.index-b.searchStr.length:e.index;return-1}function b(b,c,d){var e,f,h=d.all||1==d.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(b)&&(b=b.firstChild);for(var i=1;b;){if(e=3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"],f=a(e,d,c),i=0,f!=-1)return{node:b,index:f};for(b=domUtils[h](b);b&&g[b.nodeName.toLowerCase()];)b=domUtils[h](b,!0);b&&(c=d.dir==-1?(3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"]).length:0)}}function c(a,b,d){for(var e,f=0,g=a.firstChild,h=0;g;){if(3==g.nodeType){if(h=g.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b)return{node:g,index:h-(f-b)}}else if(!dtd.$empty[g.tagName]&&(h=g[browser.ie?"innerText":"textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b&&(e=c(g,h-(f-b),d))))return e;g=domUtils.getNextDomNode(g)}}function d(a,d){var f,g=a.selection.getRange(),h=d.searchStr,i=a.document.createElement("span");if(i.innerHTML="$$ueditor_searchreplace_key$$",g.shrinkBoundary(!0),!g.collapsed){g.select();var j=a.selection.getText();if(new RegExp("^"+d.searchStr+"$",d.casesensitive?"":"i").test(j)){if(void 0!=d.replaceStr)return e(g,d.replaceStr),g.select(),!0;g.collapse(d.dir==-1)}}g.insertNode(i),g.enlargeToBlockElm(!0),f=g.startContainer;var k=f[browser.ie?"innerText":"textContent"].indexOf("$$ueditor_searchreplace_key$$");g.setStartBefore(i),domUtils.remove(i);var l=b(f,k,d);if(l){var m=c(l.node,l.index,h),n=c(l.node,l.index+h.length,h);return g.setStart(m.node,m.index).setEnd(n.node,n.index),void 0!==d.replaceStr&&e(g,d.replaceStr),g.select(),!0}g.setCursor()}function e(a,b){b=f.document.createTextNode(b),a.deleteContents().insertNode(b)}var f=this,g={table:1,tbody:1,tr:1,ol:1,ul:1};return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){var e=f.selection.getRange(),g=f.body.firstChild;for(g&&1==g.nodeType?(e.setStart(g,0),e.shrinkBoundary(!0)):3==g.nodeType&&e.setStartBefore(g),e.collapse(!0).select(!0),void 0!==b.replaceStr&&f.fireEvent("saveScene");d(this,b);)c++;c&&f.fireEvent("saveScene")}else void 0!==b.replaceStr&&f.fireEvent("saveScene"),d(this,b)&&c++,c&&f.fireEvent("saveScene");return c},notNeedUndo:1}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],imgs=domUtils.getElementsByTagName(me.document,"img"),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img")){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&remoteImages.push(src)}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list;for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",j=0;cj=list[j++];)if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.setAttributes(ci,{src:newSrc,_src:newSrc});break}me.fireEvent("catchremotesuccess")},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':'"}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':"'}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h='',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("title",a.title||""),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),domUtils.removeClasses(c,"loadingclass"))}):(h='

      ',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{ready:function(d){var e=this;window.FormData&&window.FileReader&&(domUtils.on(e.body,"paste drop",function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}}),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()}),utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document))}}}}),UE.plugin.register("autosave",function(){function a(a){var f;if(!(new Date-c0?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))}},commands:{clearlocaldata:{execCommand:function(a,c){e&&b.getPreferences(e)&&b.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,c){return e?b.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,c){e&&(b.body.innerHTML=b.getPreferences(e)||"

      "+domUtils.fillHtml+"

      ",b.focus(!0))},queryCommandState:function(){return e?null===b.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){ +var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f]a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("title",f.title||""),g.setAttribute("alt",f.original||""),g.removeAttribute("id"),domUtils.removeClasses(g,"loadingclass")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",''),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!0):utils.isFunction(c)&&utils.extend(a,c(),!0)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={rar:"icon_rar.gif",zip:"icon_rar.gif",tar:"icon_rar.gif",gz:"icon_rar.gif",bz2:"icon_rar.gif",doc:"icon_doc.gif",docx:"icon_doc.gif",pdf:"icon_pdf.gif",mp3:"icon_mp3.gif",xls:"icon_xls.gif",chm:"icon_chm.gif",ppt:"icon_ppt.gif",pptx:"icon_ppt.gif",avi:"icon_mv.gif",rmvb:"icon_mv.gif",wmv:"icon_mv.gif",flv:"icon_mv.gif",swf:"icon_mv.gif",rm:"icon_mv.gif",exe:"icon_exe.gif",psd:"icon_psd.gif",txt:"icon_txt.gif",jpg:"icon_jpg.gif",png:"icon_jpg.gif",jpeg:"icon_jpg.gif",gif:"icon_jpg.gif",ico:"icon_jpg.gif",bmp:"icon_jpg.gif"};return c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){d=utils.isArray(d)?d:[d];var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+"

      ";b.execCommand("insertHtml",i)}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b'}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
      '},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c
      '+this.getContentHtmlTpl()+"
      "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){if(this.content instanceof e&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var a=(document.documentElement.clientHeight||document.body.clientHeight)-80,b=this.getDom().offsetHeight,f=c.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),h=this.getDom("body").getElementsByTagName("iframe"),i=this;for(h.length&&(h=h[0]);f+b>a;)b-=30;g.style.height=b+"px",h&&(h.style.height=b+"px"),window.XMLHttpRequest?d.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.wheelDelta?g.scrollTop-=a.wheelDelta/120*60:g.scrollTop-=a.detail/-3*60}):d.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1,i.getDom("content").scrollTop-=a.wheelDelta/120*60})}this.fireEvent("postRenderAfter"),this.hide(!0),this._UIBase_postRender()},_doAutoRender:function(){!this.getDom()&&this.autoRender&&this.render()},mesureSize:function(){var a=this.getDom("content");return c.getClientRect(a)},fitSize:function(){if(this.captureWheel&&this.sized)return this.__size;this.sized=!0;var a=this.getDom("body");a.style.width="",a.style.height="";var b=this.mesureSize();if(this.captureWheel){a.style.width=-(-20-b.width)+"px";var c=parseInt(this.getDom("content").style.height,10);!window.isNaN(c)&&(b.height=c)}else a.style.width=b.width+"px";return a.style.height=b.height+"px",this.__size=b,this.captureWheel&&(this.getDom("content").style.overflow="auto"),b},showAnchor:function(a,b){this.showAnchorRect(c.getClientRect(a),b)},showAnchorRect:function(a,b,e){this._doAutoRender();var f=c.getViewportRect();this.getDom().style.visibility="hidden",this._show();var g,i,j,k,l=this.fitSize();b?(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.left-l.width:a.right,k=i?a.bottom-l.height:a.top):(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.right-l.width:a.left,k=i?a.top-l.height:a.bottom);var m=this.getDom();c.setViewportOffset(m,{left:j,top:k}),d.removeClasses(m,h),m.className+=" "+h[2*(i?1:0)+(g?1:0)],this.editor&&(m.style.zIndex=1*this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=m.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left,c=a.top,d={left:b,top:c,right:b,bottom:c,height:0,width:0};this.showAnchorRect(d,!1,!0)},_show:function(){if(this._hidden){var a=this.getDom();a.style.display="",this._hidden=!1,this.fireEvent("show")}},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(a){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,a||this.fireEvent("hide"))},queryAutoHide:function(a){return!a||!c.contains(this.getDom(),a)}},b.inherits(f,e),d.on(document,"mousedown",function(b){var c=b.target||b.srcElement;a(b,c)}),d.on(window,"scroll",function(b,c){a(b,c)})}(),function(){function a(a,b){for(var c='
      '+a+'
      ',d=0;d"+(60==d?'":"")+""),c+=d<70?'':"";return c+="
      '+b.getLang("themeColor")+'
      '+b.getLang("standardColor")+"
      =60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'">
      "}var b=baidu.editor.utils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.ColorPicker=function(a){this.initOptions(a),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};d.prototype={getHtmlTpl:function(){return a(this.noColorText,this.editor)},_onTableClick:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&this.fireEvent("pickcolor",c)},_onTableOver:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&(this.getDom("preview").style.backgroundColor=c)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}},b.inherits(d,c);var e="ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.TablePicker=function(a){this.initOptions(a),this.initTablePicker()};d.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
      '},_UIBase_render:c.prototype.render,render:function(a){this._UIBase_render(a),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(a,b){var c=this.getDom("overlay").style,d=this.lengthOfCellSide;c.width=a*d+"px",c.height=b*d+"px";var e=this.getDom("label");e.innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row"),this.numCols=a,this.numRows=b},_onMouseOver:function(a,c){var d=a.relatedTarget||a.fromElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(a,c){var d=a.relatedTarget||a.toElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="hidden")},_onMouseMove:function(a,c){var d=(this.getDom("overlay").style,b.getEventOffset(a)),e=this.lengthOfCellSide,f=Math.ceil(d.left/e),g=Math.ceil(d.top/e);this._track(f,g)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},a.inherits(d,c)}(),function(){var a=baidu.editor.browser,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(a.ie?' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"':' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"');baidu.editor.ui.Stateful={alwalysHoverable:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){var a=this._Stateful_dGetHtmlTpl();return a.replace(/stateful/g,function(){return d})},Stateful_onMouseEnter:function(a,b){this.target=b,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(a,b){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseEnter(a,b)},Stateful_onMouseOut:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseLeave(a,b)},Stateful_onMouseDown:function(a,b){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(a,b){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(a){return b.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&b.removeClasses(this.getStateDom(),["edui-state-"+a])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(a){!this.isDisabled()&&a?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(a){a?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.Button=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),a.cssRules=".edui-default .edui-for-"+b+" .edui-icon {"+c+"}"}this.initOptions(a),this.initButton()};d.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&a.cssRule("edui-customize-"+this.name+"-style",this.cssRules)},getHtmlTpl:function(){return'
      '+(this.showIcon?'
      ':"")+(this.showText?'
      '+this.label+"
      ":"")+"
      "},postRender:function(){this.Stateful_postRender(),this.setDisabled(this.disabled)},_onMouseDown:function(a){var b=a.target||a.srcElement,c=b&&b.tagName&&b.tagName.toLowerCase();if("input"==c||"object"==c||"object"==c)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){var b=this.getDom("label");b.innerHTML=a}},a.inherits(d,b),a.extend(d.prototype,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=(baidu.editor.dom.domUtils,baidu.editor.ui.UIBase),d=baidu.editor.ui.Stateful,e=baidu.editor.ui.SplitButton=function(a){this.initOptions(a),this.initSplitButton()};e.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){this.initUIBase(),this.Stateful_init();if(null!=this.popup){var a=this.popup;this.popup=null,this.setPopup(a)}},_UIBase_postRender:c.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(c){this.popup!==c&&(null!=this.popup&&this.popup.dispose(),c.addListener("show",a.bind(this._onPopupShow,this)),c.addListener("hide",a.bind(this._onPopupHide,this)),c.addListener("postrender",a.bind(function(){c.getDom("body").appendChild(b.createElementByHtml('
      ')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
      '},showPopup:function(){var a=b.getClientRect(this.getDom());a.top-=this.popup.SHADOW_RADIUS,a.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(a)},_onArrowClick:function(a,b){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},a.inherits(e,c),a.extend(e.prototype,d,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.ColorPicker,d=baidu.editor.ui.Popup,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.ColorButton=function(a){this.initOptions(a),this.initColorButton()};f.prototype={initColorButton:function(){var a=this;this.popup=new d({content:new c({noColorText:a.editor.getLang("clearColor"),editor:a.editor,onpickcolor:function(b,c){a._onPickColor(c)},onpicknocolor:function(b,c){a._onPickNoColor(c)}}),editor:a.editor}),this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(b.createElementByHtml('
      ')),this.getDom().className+=" edui-colorbutton"; +},setColor:function(a){this.getDom("colorlump").style.backgroundColor=a,this.color=a},_onPickColor:function(a){this.fireEvent("pickcolor",a)!==!1&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){this.fireEvent("picknocolor")!==!1&&this.popup.hide()}},a.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.TablePicker,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.TableButton=function(a){this.initOptions(a),this.initTableButton()};e.prototype={initTableButton:function(){var a=this;this.popup=new b({content:new c({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor}),this.initSplitButton()},_onPickTable:function(a,b){this.fireEvent("picktable",a,b)!==!1&&this.popup.hide()}},a.inherits(e,d)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a),this.initAutoTypeSetPicker()};c.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,e="imageBlockLineValue"+a.uid,f="symbolConverValue"+a.uid;return'
      "+c.mergeLine+'"+c.delLine+'
      "+c.removeFormat+'"+c.indent+'
      "+c.alignment+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
      "+c.imageFloat+'"+a.getLang("default")+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
      "+c.removeFontsize+'"+c.removeFontFamily+'
      "+c.removeHtml+'
      "+c.pasteFilter+'
      "+c.symbol+'"+c.bdc2sb+'"+c.tobdc+'
      "},_UIBase_render:b.prototype.render},a.inherits(c,b)}(),function(){function a(a){for(var c,d={},e=a.getDom(),f=a.editor.uid,g=null,h=null,i=domUtils.getElementsByTagName(e,"input"),j=i.length-1;c=i[j--];)if(g=c.getAttribute("type"),"checkbox"==g)if(h=c.getAttribute("name"),d[h]&&delete d[h],c.checked){var k=document.getElementById(h+"Value"+f);if(k){if(/input/gi.test(k.tagName))d[h]=k.value;else for(var l,m=k.getElementsByTagName("input"),n=m.length-1;l=m[n--];)if(l.checked){d[h]=l.value;break}}else d[h]=!0}else d[h]=!1;else d[c.getAttribute("value")]=c.checked;for(var o,p=domUtils.getElementsByTagName(e,"select"),j=0;o=p[j++];){var q=o.getAttribute("name");d[q]=d[q]?o.value:""}b.extend(a.editor.options.autotypeset,d),a.editor.setPreferences("autotypeset",d)}var b=baidu.editor.utils,c=baidu.editor.ui.Popup,d=baidu.editor.ui.AutoTypeSetPicker,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a),this.initAutoTypeSetButton()};f.prototype={initAutoTypeSetButton:function(){var b=this;this.popup=new c({content:new d({editor:b.editor}),editor:b.editor,hide:function(){!this._hidden&&this.getDom()&&(a(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;this.popup.addListener("postRenderAfter",function(){var c=this;if(!e){var d=this.getDom(),f=d.getElementsByTagName("button")[0];f.onclick=function(){a(c),b.editor.execCommand("autotypeset"),c.hide()},domUtils.on(d,"click",function(d){var e=d.target||d.srcElement,f=b.editor.uid;if(e&&"INPUT"==e.tagName){if("imageBlockLine"==e.name||"textAlign"==e.name||"symbolConver"==e.name)for(var g=e.checked,h=document.getElementById(e.name+"Value"+f),i=h.getElementsByTagName("input"),j={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},k=0;k"),e.push('
      '),2===d&&e.push("");return'
      '+e.join("")+"
      "},getStateDom:function(){return this.target},_onClick:function(a){var c=a.target||a.srcElement;/icon/.test(c.className)&&(this.items[c.parentNode.getAttribute("index")].onclick(),b.postHide(a))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,c,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Stateful,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.PastePicker=function(a){this.initOptions(a),this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
      '+this.editor.getLang("pasteOpt")+'
      '},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var b=domUtils.getNextDomNode(a),d=c.getViewportRect().height,e=c.getClientRect(b);e.top+e.height>d?b.style.top=-e.height-a.offsetHeight+"px":b.style.top="",/hidden/gi.test(domUtils.getComputedStyle(b,"visibility"))?(b.style.visibility="visible",domUtils.addClass(a,"edui-state-opened")):(b.style.visibility="hidden",domUtils.removeClasses(a,"edui-state-opened"))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,b,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Toolbar=function(a){this.initOptions(a),this.initToolbar()};d.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(a,b){void 0===b?this.items.push(a):this.items.splice(b,0,a)},getHtmlTpl:function(){for(var a=[],b=0;b'+a.join("")+""},postRender:function(){for(var a=this.getDom(),c=0;c
      '},postRender:function(){},queryAutoHide:function(){return!0}};h.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var a=0;a'+a.join("")+""},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d
      '+this.renderLabelHtml()+"
      "},postRender:function(){var a=this;this.addListener("over",function(){a.ownerMenu.fireEvent("submenuover",a),a.subMenu&&a.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){a.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(a._closingTimer),a._closingTimer=null,a.addState("opened")}),this.ownerMenu.addListener("hide",function(){a.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(b,c){c!==a&&a.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(b){return(!b||!c.contains(a.getDom(),b))&&this._bakQueryAutoHide(b)}),this.getDom().style.tabIndex="-1",c.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var a=this;a.isDisabled()||(a.addState("opened"),clearTimeout(a._showingTimer),clearTimeout(a._closingTimer),a._closingTimer=null,a._showingTimer=setTimeout(function(){a.showSubMenu()},250))},delayHideSubMenu:function(){var a=this;a.isDisabled()||(a.removeState("opened"),clearTimeout(a._showingTimer),a._closingTimer||(a._closingTimer=setTimeout(function(){a.hasState("opened")||a.hideSubMenu(),a._closingTimer=null},400)))},renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "},getStateDom:function(){return this.getDom()},queryAutoHide:function(a){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(a)},_onClick:function(a,b){this.hasState("disabled")||this.fireEvent("click",a,b)!==!1&&(this.subMenu?this.showSubMenu():e.postHide(a))},showSubMenu:function(){var a=c.getClientRect(this.getDom());a.right-=5,a.left+=2,a.width-=7,a.top-=4,a.bottom+=4,a.height+=8,this.subMenu.showAnchorRect(a,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},a.inherits(j,d),a.extend(j.prototype,f,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.Menu,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.Combox=function(a){this.initOptions(a),this.initCombox()};e.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var a=this;this.items=this.items||[];for(var b=0;bd.right&&(g=d.right-e.width);var h=a.top;h+e.height>d.bottom&&(h=d.bottom-e.height),c.style.left=Math.max(g,0)+"px",c.style.top=Math.max(h,0)+"px"},showAtCenter:function(){var a=f.getViewportRect();if(this.fullscreen){var b=this.getDom(),c=this.getDom("content");b.style.display="block";var d=UE.ui.uiUtils.getClientRect(b),g=UE.ui.uiUtils.getClientRect(c);b.style.left="-100000px",c.style.width=a.width-d.width+g.width+"px",c.style.height=a.height-d.height+g.height+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.left=0,this._originalContext={html:{overflowX:document.documentElement.style.overflowX,overflowY:document.documentElement.style.overflowY},body:{overflowX:document.body.style.overflowX,overflowY:document.body.style.overflowY}},document.documentElement.style.overflowX="hidden",document.documentElement.style.overflowY="hidden",document.body.style.overflowX="hidden",document.body.style.overflowY="hidden"}else{this.getDom().style.display="";var h=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,j=a.width/2-h.width/2,k=a.height/2-(h.height-i)/2-i,l=this.getDom();this.safeSetOffset({left:Math.max(0|j,0),top:Math.max(0|k,0)}),e.hasClass(l,"edui-state-centered")||(l.className+=" edui-state-centered")}this._show()},getContentHtml:function(){var a="";return"string"==typeof this.content?a=this.content:this.iframeUrl&&(a=''),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c
      '+b.join("")+"
      "}return'
      '+(this.title||"")+"
      "+this.closeButton.renderHtml()+'
      '+(this.autoReset?"":this.getContentHtml())+"
      "+a+"
      "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;if(this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){a.modalMask.hide()}),this.buttons)for(var b=0;b',a.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},a.inherits(d,c)}(),function(){function a(a){var b=a.target||a.srcElement,c=g.findParent(b,function(a){return g.hasClass(a,"edui-shortcutmenu")||g.hasClass(a,"edui-popup")},!0);if(!c)for(var d,e=0;d=h[e++];)d.hide()}var b,c=baidu.editor.ui,d=c.UIBase,e=c.uiUtils,f=baidu.editor.utils,g=baidu.editor.dom.domUtils,h=[],i=!1,j=c.ShortCutMenu=function(a){this.initOptions(a),this.initShortCutMenu()};j.postHide=a,j.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),h.push(this)},initEvent:function(){var a=this,c=a.editor.document;g.on(c,"mousemove",function(c){if(a.isHidden===!1){if(a.getSubMenuMark()||"contextmenu"==a.eventType)return;var d=!0,e=a.getDom(),f=e.offsetWidth,g=e.offsetHeight,h=f/2+a.SPACE,i=g/2,j=Math.abs(c.screenX-a.left),k=Math.abs(c.screenY-a.top);clearTimeout(b),b=setTimeout(function(){k>0&&ki&&ki+70&&k0&&jh&&jh+70&&j'+a+""}},f.inherits(j,d),g.on(document,"mousedown",function(b){a(b)}),g.on(window,"scroll",function(b){a(b)})}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Breakline=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
      "}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Message=function(a){this.initOptions(a),this.initMessage()};d.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
      ×
      '},reset:function(a){var b=this;a.keepshow||(clearTimeout(this.timer),b.timer=setTimeout(function(){b.hide()},a.timeout||4e3)),void 0!==a.content&&b.setContent(a.content),void 0!==a.type&&b.setType(a.type),b.show()},postRender:function(){var a=this,c=this.getDom("closer");c&&b.on(c,"click",function(){a.hide()})},setContent:function(a){this.getDom("content").innerHTML=a},setType:function(a){a=a||"info";var b=this.getDom("body");b.className=b.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+a)},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var a=this.getDom("body").match(/edui-message-type-([\w-]+)/);return a?a[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var a=this.getDom();a&&(a.style.display="none",a.parentNode&&a.parentNode.removeChild(a))}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui,c=b.Dialog;b.buttons={},b.Dialog=function(a){var b=new c(a);return b.addListener("hide",function(){if(b.editor){var a=b.editor;try{if(browser.gecko){var c=a.window.scrollY,d=a.window.scrollX;a.body.focus(),a.window.scrollTo(d,c)}else a.focus()}catch(e){}}}),b};for(var d,e={anchor:"~/dialogs/anchor/anchor.html",insertimage:"~/dialogs/image/image.html",link:"~/dialogs/link/link.html",spechars:"~/dialogs/spechars/spechars.html",searchreplace:"~/dialogs/searchreplace/searchreplace.html",map:"~/dialogs/map/map.html",gmap:"~/dialogs/gmap/gmap.html",insertvideo:"~/dialogs/video/video.html",help:"~/dialogs/help/help.html",preview:"~/dialogs/preview/preview.html",emotion:"~/dialogs/emotion/emotion.html",wordimage:"~/dialogs/wordimage/wordimage.html",attachment:"~/dialogs/attachment/attachment.html",insertframe:"~/dialogs/insertframe/insertframe.html",edittip:"~/dialogs/table/edittip.html",edittable:"~/dialogs/table/edittable.html",edittd:"~/dialogs/table/edittd.html",webapp:"~/dialogs/webapp/webapp.html",snapscreen:"~/dialogs/snapscreen/snapscreen.html",scrawl:"~/dialogs/scrawl/scrawl.html",music:"~/dialogs/music/music.html",template:"~/dialogs/template/template.html",background:"~/dialogs/background/background.html",charts:"~/dialogs/charts/charts.html"},f=["undo","redo","formatmatch","bold","italic","underline","fontborder","touppercase","tolowercase","strikethrough","subscript","superscript","source","indent","outdent","blockquote","pasteplain","pagebreak","selectall","print","horizontal","removeformat","time","date","unlink","insertparagraphbeforetable","insertrow","insertcol","mergeright","mergedown","deleterow","deletecol","splittorows","splittocols","splittocells","mergecells","deletetable","drafts"],g=0;d=f[g++];)d=d.toLowerCase(),b[d]=function(a){return function(c){var d=new b.Button({className:"edui-for-"+a,title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",onclick:function(){c.execCommand(a)},theme:c.options.theme,showText:!1});return b.buttons[a]=d,c.addListener("selectionchange",function(b,e,f){var g=c.queryCommandState(a);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(d);b.cleardoc=function(a){var c=new b.Button({className:"edui-for-cleardoc",title:a.options.labelMap.cleardoc||a.getLang("labelMap.cleardoc")||"",theme:a.options.theme,onclick:function(){confirm(a.getLang("confirmClear"))&&a.execCommand("cleardoc")}});return b.buttons.cleardoc=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("cleardoc")==-1)}),c};var h={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]};for(var i in h)!function(a,c){for(var d,e=0;d=c[e++];)!function(c){b[a.replace("float","")+c]=function(d){var e=new b.Button({ +className:"edui-for-"+a.replace("float","")+c,title:d.options.labelMap[a.replace("float","")+c]||d.getLang("labelMap."+a.replace("float","")+c)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,c)}});return b.buttons[a]=e,d.addListener("selectionchange",function(b,f,g){e.setDisabled(d.queryCommandState(a)==-1),e.setChecked(d.queryCommandValue(a)==c&&!g)}),e}}(d)}(i,h[i]);for(var d,g=0;d=["backcolor","forecolor"][g++];)b[d]=function(a){return function(c){var d=new b.ColorButton({className:"edui-for-"+a,color:"default",title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",editor:c,onpickcolor:function(b,d){c.execCommand(a,d)},onpicknocolor:function(){c.execCommand(a,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){c.execCommand(a,this.color)}});return b.buttons[a]=d,c.addListener("selectionchange",function(){d.setDisabled(c.queryCommandState(a)==-1)}),d}}(d);var j={noOk:["searchreplace","help","spechars","webapp","preview"],ok:["attachment","anchor","link","insertimage","map","gmap","insertframe","wordimage","insertvideo","insertframe","edittip","edittable","edittd","scrawl","template","music","background","charts"]};for(var i in j)!function(c,d){for(var f,g=0;f=d[g++];)browser.opera&&"searchreplace"===f||!function(d){b[d]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[d]||e[d],h=f.options.labelMap[d]||f.getLang("labelMap."+d)||"";var i;g&&(i=new b.Dialog(a.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+d,title:h,holdScroll:"insertimage"===d,fullscreen:/charts|preview/.test(d),closeDialog:f.getLang("closeDialog")},"ok"==c?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){i.close(!1)}}]}:{})),f.ui._dialogs[d+"Dialog"]=i);var j=new b.Button({className:"edui-for-"+d,title:h,onclick:function(){if(i)switch(d){case"wordimage":var a=f.execCommand("wordimage");a&&a.length&&(i.render(),i.open());break;case"scrawl":f.queryCommandState("scrawl")!=-1&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:f.options.theme,disabled:"scrawl"==d&&f.queryCommandState("scrawl")==-1||"charts"==d});return b.buttons[d]=j,f.addListener("selectionchange",function(){var a={edittable:1};if(!(d in a)){var b=f.queryCommandState(d);j.getDom()&&(j.setDisabled(b==-1),j.setChecked(b))}}),j}}(f.toLowerCase())}(i,j[i]);b.snapscreen=function(a,c,d){d=a.options.labelMap.snapscreen||a.getLang("labelMap.snapscreen")||"";var f=new b.Button({className:"edui-for-snapscreen",title:d,onclick:function(){a.execCommand("snapscreen")},theme:a.options.theme});if(b.buttons.snapscreen=f,c=c||(a.options.iframeUrlMap||{}).snapscreen||e.snapscreen){var g=new b.Dialog({iframeUrl:a.ui.mapUrl(c),editor:a,className:"edui-for-snapscreen",title:d,buttons:[{className:"edui-okbutton",label:a.getLang("ok"),editor:a,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:a.getLang("cancel"),editor:a,onclick:function(){g.close(!1)}}]});g.render(),a.ui._dialogs.snapscreenDialog=g}return a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState("snapscreen")==-1)}),f},b.insertcode=function(c,d,e){d=c.options.insertcode||[],e=c.options.labelMap.insertcode||c.getLang("labelMap.insertcode")||"";var f=[];a.each(d,function(a,b){f.push({label:a,value:b,theme:c.options.theme,renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "}})});var g=new b.Combox({editor:c,items:f,onselect:function(a,b){c.execCommand("insertcode",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.insertcode=g,c.addListener("selectionchange",function(a,b,d){if(!d){var f=c.queryCommandState("insertcode");if(f==-1)g.setDisabled(!0);else{g.setDisabled(!1);var h=c.queryCommandValue("insertcode");if(!h)return void g.setValue(e);h&&(h=h.replace(/['"]/g,"").split(",")[0]),g.setValue(h)}}}),g},b.fontfamily=function(c,d,e){if(d=c.options.fontfamily||[],e=c.options.labelMap.fontfamily||c.getLang("labelMap.fontfamily")||"",d.length){for(var f,g=0,h=[];f=d[g];g++){var i=c.getLang("fontfamily")[f.name]||"";!function(b,d){h.push({label:b,value:d,theme:c.options.theme,renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "}})}(f.label||i,f.val)}var j=new b.Combox({editor:c,items:h,onselect:function(a,b){c.execCommand("FontFamily",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.fontfamily=j,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("FontFamily");if(e==-1)j.setDisabled(!0);else{j.setDisabled(!1);var f=c.queryCommandValue("FontFamily");f&&(f=f.replace(/['"]/g,"").split(",")[0]),j.setValue(f)}}}),j}},b.fontsize=function(a,c,d){if(d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"",c=c||a.options.fontsize||[],c.length){for(var e=[],f=0;f'+(this.label||"")+""}})}var h=new b.Combox({editor:a,items:e,title:d,initValue:d,onselect:function(b,c){a.execCommand("FontSize",this.items[c].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return b.buttons.fontsize=h,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("FontSize");e==-1?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize")))}}),h}},b.paragraph=function(c,d,e){if(e=c.options.labelMap.paragraph||c.getLang("labelMap.paragraph")||"",d=c.options.paragraph||[],!a.isEmptyObject(d)){var f=[];for(var g in d)f.push({value:g,label:d[g]||c.getLang("paragraph")[g],theme:c.options.theme,renderLabelHtml:function(){return'
      '+(this.label||"")+"
      "}});var h=new b.Combox({editor:c,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(a,b){c.execCommand("Paragraph",this.items[b].value)},onbuttonclick:function(){this.showPopup()}});return b.buttons.paragraph=h,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("Paragraph");if(e==-1)h.setDisabled(!0);else{h.setDisabled(!1);var f=c.queryCommandValue("Paragraph"),g=h.indexByValue(f);g!=-1?h.setValue(f):h.setValue(h.initValue)}}}),h}},b.customstyle=function(a){var c=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(c.length){for(var e,f=a.getLang("customstyle"),g=0,h=[];e=c[g++];)!function(b){var c={};c.label=b.label?b.label:f[b.name],c.style=b.style,c.className=b.className,c.tag=b.tag,h.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'
      <'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"
      "}})}(e);var i=new b.Combox({editor:a,items:h,title:d,initValue:d,className:"edui-for-customstyle",onselect:function(b,c){a.execCommand("customstyle",this.items[c].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(a){for(var b,c=0;b=this.items[c++];)if(b.label==a)return c-1;return-1}});return b.buttons.customstyle=i,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("customstyle");if(e==-1)i.setDisabled(!0);else{i.setDisabled(!1);var f=a.queryCommandValue("customstyle"),g=i.indexByValue(f);g!=-1?i.setValue(f):i.setValue(i.initValue)}}}),i}},b.inserttable=function(a,c,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new b.TableButton({editor:a,title:d,className:"edui-for-inserttable",onpicktable:function(b,c,d){a.execCommand("InsertTable",{numRows:d,numCols:c,border:1})},onbuttonclick:function(){this.showPopup()}});return b.buttons.inserttable=e,a.addListener("selectionchange",function(){e.setDisabled(a.queryCommandState("inserttable")==-1)}),e},b.lineheight=function(a){var c=a.options.lineheight||[];if(c.length){for(var d,e=0,f=[];d=c[e++];)f.push({label:d,value:d,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new b.MenuButton({editor:a,className:"edui-for-lineheight",title:a.options.labelMap.lineheight||a.getLang("labelMap.lineheight")||"",items:f,onbuttonclick:function(){var b=a.queryCommandValue("LineHeight")||this.value;a.execCommand("LineHeight",b)}});return b.buttons.lineheight=g,a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(b==-1)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,"")),g.setChecked(b)}}),g}};for(var k,l=["top","bottom"],m=0;k=l[m++];)!function(a){b["rowspacing"+a]=function(c){var d=c.options["rowspacing"+a]||[];if(!d.length)return null;for(var e,f=0,g=[];e=d[f++];)g.push({label:e,value:e,theme:c.options.theme,onclick:function(){c.execCommand("rowspacing",this.value,a)}});var h=new b.MenuButton({editor:c,className:"edui-for-rowspacing"+a,title:c.options.labelMap["rowspacing"+a]||c.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var b=c.queryCommandValue("rowspacing",a)||this.value;c.execCommand("rowspacing",b,a)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState("rowspacing",a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,"")),h.setChecked(b)}}),h}}(k);for(var n,o=["insertorderedlist","insertunorderedlist"],p=0;n=o[p++];)!function(a){b[a]=function(c){var d=c.options[a],e=function(){c.execCommand(a,this.value)},f=[];for(var g in d)f.push({label:d[g]||c.getLang()[a][g]||"",value:g,theme:c.options.theme,onclick:e});var h=new b.MenuButton({editor:c,className:"edui-for-"+a,title:c.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var b=c.queryCommandValue(a)||this.value;c.execCommand(a,b)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState(a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue(a);h.setValue(d),h.setChecked(b)}}),h}}(n);b.fullscreen=function(a,c){c=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new b.Button({className:"edui-for-fullscreen",title:c,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen()),this.setChecked(a.ui.isFullScreen())}});return b.buttons.fullscreen=d,a.addListener("selectionchange",function(){var b=a.queryCommandState("fullscreen");d.setDisabled(b==-1),d.setChecked(a.ui.isFullScreen())}),d},b.emotion=function(a,c){var d="emotion",f=new b.MultiMenuPop({title:a.options.labelMap[d]||a.getLang("labelMap."+d)||"",editor:a,className:"edui-for-"+d,iframeUrl:a.ui.mapUrl(c||(a.options.iframeUrlMap||{})[d]||e[d])});return b.buttons[d]=f,a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState(d)==-1)}),f},b.autotypeset=function(a){var c=new b.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});return b.buttons.autotypeset=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("autotypeset")==-1)}),c},b.simpleupload=function(a){var c="simpleupload",d=new b.Button({className:"edui-for-"+c,title:a.options.labelMap[c]||a.getLang("labelMap."+c)||"",onclick:function(){},theme:a.options.theme,showText:!1});return b.buttons[c]=d,a.addListener("ready",function(){var b=d.getDom("body"),c=b.children[0];a.fireEvent("simpleuploadbtnready",c)}),a.addListener("selectionchange",function(b,e,f){var g=a.queryCommandState(c);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(),function(){function a(a){this.initOptions(a),this.initEditorUI()}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.dom.domUtils,f=[];a.prototype={uiName:"editor",initEditorUI:function(){function a(a,b){a.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:a.options.wordCountMsg||a.getLang("wordCountMsg"),wordOverFlowMsg:a.options.wordOverFlowMsg||a.getLang("wordOverFlowMsg")});var c=a.options,d=c.maximumWords,e=c.wordCountMsg,f=c.wordOverFlowMsg,g=b.getDom("wordcount");if(c.wordCount){var h=a.getContentLength(!0);h>d?(g.innerHTML=f,a.fireEvent("wordcountoverflow")):g.innerHTML=e.replace("{#leave}",d-h).replace("{#count}",h)}}this.editor.ui=this,this._dialogs={},this.initUIBase(),this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){function d(){a(b,c),e.un(b.document,"click",arguments.callee)}b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]},e.on(b.window,"scroll",function(a){baidu.editor.ui.Popup.postHide(a)}),b.ui._actualFrameWidth=b.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&b.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),b.options.elementPathEnabled&&(b.ui.getDom("elementpath").innerHTML='
      '+b.getLang("elementPathTip")+":
      "),b.options.wordCount&&(e.on(b.document,"click",d),b.ui.getDom("wordcount").innerHTML=b.getLang("wordCountTip")),b.ui._scale(),b.options.scaleEnabled?(b.autoHeightEnabled&&b.disableAutoHeight(),c.enableScale()):c.disableScale(),b.options.elementPathEnabled||b.options.wordCount||b.options.scaleEnabled||(b.ui.getDom("elementpath").style.display="none",b.ui.getDom("wordcount").style.display="none",b.ui.getDom("scale").style.display="none"),b.selection.isFocus()&&b.fireEvent("selectionchange",!1,!0)}),b.addListener("mousedown",function(a,b){var c=b.target||b.srcElement;baidu.editor.ui.Popup.postHide(b,c),baidu.editor.ui.ShortCutMenu.postHide(b)}),b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b),b.getDialog("edittip").open()});var d,f,g=!1;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(d=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:b}),editor:b,className:"edui-wordpastepop"}),d.render()),g=!0)}),b.addListener("afterinserthtml",function(){clearTimeout(f),f=setTimeout(function(){if(d&&(g||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),c=b.selection.getRange();c.insertNode(a);var f=getDomNode(a,"firstChild","previousSibling");f&&d.showAnchor(3==f.nodeType?f.parentNode:f),e.remove(a)}else d.show();delete b.ui._isTransfer,g=!1}},200)}),b.addListener("contextmenu",function(a,b){baidu.editor.ui.Popup.postHide(b)}),b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;b.altKey&&90==c&&UE.ui.buttons.fullscreen.onclick()}),b.addListener("wordcount",function(b){a(this,c)}),b.addListener("selectionchange",function(){b.options.elementPathEnabled&&c[(b.queryCommandState("elementpath")==-1?"dis":"en")+"ableElementPath"](),b.options.scaleEnabled&&c[(b.queryCommandState("scale")==-1?"dis":"en")+"ableScale"]()});var h=new baidu.editor.ui.Popup({editor:b,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),b.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(a){this.hide(),b.ui._dialogs[a]&&b.ui._dialogs[a].open()},_onImgSetFloat:function(a){this.hide(),b.execCommand("imagefloat",a)},_setIframeAlign:function(a){var b=h.anchorEl,c=b.cloneNode(!0);switch(a){case-2:c.setAttribute("align","");break;case-1:c.setAttribute("align","left");break;case 1:c.setAttribute("align","right")}b.parentNode.insertBefore(c,b),e.remove(b),h.anchorEl=c,h.showAnchor(h.anchorEl)},_updateIframe:function(){var a=b._iframe=h.anchorEl;e.hasClass(a,"ueditor_baidumap")?(b.selection.getRange().selectNode(a).select(),b.ui._dialogs.mapDialog.open(),h.hide()):(b.ui._dialogs.insertframeDialog.open(),h.hide())},_onRemoveButtonClick:function(a){b.execCommand(a),this.hide()},queryAutoHide:function(a){return a&&a.ownerDocument==b.document&&("img"==a.tagName.toLowerCase()||e.findParentByTagName(a,"a",!0))?a!==h.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,a)}});h.render(),b.options.imagePopup&&(b.addListener("mouseover",function(a,c){c=c||window.event;var d=c.target||c.srcElement;if(b.ui._dialogs.insertframeDialog&&/iframe/gi.test(d.tagName)){var e=h.formatHtml(""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'   '+b.getLang("modify")+"");e?(h.getDom("content").innerHTML=e,h.anchorEl=d,h.showAnchor(h.anchorEl)):h.hide()}}),b.addListener("selectionchange",function(a,c){if(c){var d="",f="",g=b.selection.getRange().getClosedNode(),i=b.ui._dialogs;if(g&&"IMG"==g.tagName){var j="insertimageDialog";if(g.className.indexOf("edui-faked-video")==-1&&g.className.indexOf("edui-upload-video")==-1||(j="insertvideoDialog"),g.className.indexOf("edui-faked-webapp")!=-1&&(j="webappDialog"),g.src.indexOf("http://api.map.baidu.com")!=-1&&(j="mapDialog"),g.className.indexOf("edui-faked-music")!=-1&&(j="musicDialog"),g.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1&&(j="gmapDialog"),g.getAttribute("anchorname")&&(j="anchorDialog",d=h.formatHtml(""+b.getLang("property")+': '+b.getLang("modify")+"  "+b.getLang("delete")+"")),g.getAttribute("word_img")&&(b.word_img=[g.getAttribute("word_img")],j="wordimageDialog"),(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))&&(j=""),!i[j])return;f=""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'  '+b.getLang("justifycenter")+"  '+b.getLang("modify")+"",!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var k,l=b.queryCommandValue("link");if(l&&(k=l.getAttribute("_href")||l.getAttribute("href",2))){var m=k;k.length>30&&(m=k.substring(0,20)+"..."),d&&(d+='
      '),d+=h.formatHtml(""+b.getLang("anthorMsg")+': '+m+' '+b.getLang("modify")+' '+b.getLang("clear")+""),h.showAnchor(l)}}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||l,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,c=this.toolbars||[],d=[],e=0;e
      '+(this.toolbars.length?'
      '+this.renderToolbarBoxHtml()+"
      ":"")+'
      '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b'+c+"");b.innerHTML='
      '+this.editor.getLang("elementPathTip")+": "+d.join(" > ")+"
      "}else b.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="",a.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){var a=this.getDom("elementpath");a.style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){function a(){o=e.getXY(h),p||(p=g.options.minFrameHeight+j.offsetHeight+k.offsetHeight),m.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+h.offsetWidth+"px;height:"+h.offsetHeight+"px;z-index:"+(g.options.zIndex+1),e.on(f,"mousemove",b),e.on(i,"mouseup",c),e.on(f,"mouseup",c)}function b(a){d();var b=a||window.event;r=b.pageX||f.documentElement.scrollLeft+b.clientX,s=b.pageY||f.documentElement.scrollTop+b.clientY,t=r-o.x,u=s-o.y,t>=q&&(n=!0,m.style.width=t+"px"),u>=p&&(n=!0,m.style.height=u+"px")}function c(){n&&(n=!1,g.ui._actualFrameWidth=m.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(m.offsetHeight-k.offsetHeight-j.offsetHeight-2,!0)),m&&(m.style.display="none"),d(),e.un(f,"mousemove",b),e.un(i,"mouseup",c),e.un(f,"mouseup",c)}function d(){browser.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,i=g.document,j=this.getDom("toolbarbox"),k=this.getDom("bottombar"),l=this.getDom("scale"),m=this.getDom("scalelayer"),n=!1,o=null,p=0,q=g.options.minFrameWidth,r=0,s=0,t=0,u=0,v=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)v.disableScale();else if(v.editor.options.scaleEnabled){v.enableScale();var c=v.editor.document.createElement("span");v.editor.body.appendChild(c),v.editor.body.style.height=Math.max(e.getXY(c).y,v.editor.iframe.offsetHeight-20)+"px",e.remove(c)}}),this.enableScale=function(){1!=g.queryCommandState("source")&&(l.style.display="",this.scaleEnabled=!0,e.on(l,"mousedown",a))},this.disableScale=function(){l.style.display="none",this.scaleEnabled=!1,e.un(l,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},postRender:function(){d.prototype.postRender.call(this);for(var a=0;a[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){UE._customizeUI[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()})}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}(); \ No newline at end of file diff --git a/member/editor/ueditor/ueditor.config.js b/member/editor/ueditor/ueditor.config.js new file mode 100644 index 0000000..e3b4f11 --- /dev/null +++ b/member/editor/ueditor/ueditor.config.js @@ -0,0 +1,497 @@ +/** + * ueditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +/**************************提示******************************** + * 所有被注释的配置项均为UEditor默认值。 + * 修改默认配置请首先确保已经完全明确该参数的真实用途。 + * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 + * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 + **************************提示********************************/ + +(function () { + + /** + * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 + * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 + * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。 + * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 + * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 + * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; + */ + var URL = window.UEDITOR_HOME_URL || getUEBasePath(); + + /** + * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 + */ + window.UEDITOR_CONFIG = { + + //为编辑器实例添加一个路径,这个不能被注释 + UEDITOR_HOME_URL: URL + + // 服务器统一请求接口路径 + , serverUrl: URL + "php/controller.php" + + //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 + , toolbars: [[ + 'fullscreen', 'source', '|', 'undo', 'redo', '|', + 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', + 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|', + 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', + 'directionalityltr', 'directionalityrtl', 'indent', '|', + 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|', + 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|', + 'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|', + 'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|', + 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|', + 'print', 'preview', 'searchreplace', 'drafts', 'help' + ]] + //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 + //,labelMap:{ + // 'anchor':'', 'undo':'' + //} + + //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: + //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() + //,lang:"zh-cn" + //,langPath:URL +"lang/" + + //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: + //现有如下皮肤:default + //,theme:'default' + //,themePath:URL +"themes/" + + //,zIndex : 900 //编辑器层级的基数,默认是900 + + //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 + //,charset:"utf-8" + + //若实例化编辑器的页面手动修改的domain,此处需要设置为true + //,customDomain:false + + //常用配置项目 + //,isShow : true //默认显示编辑器 + + //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 + + //,initialContent:'欢迎使用ueditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 + + //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 + + //,focus:false //初始化时,是否让编辑器获得焦点true或false + + //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 + //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 + + //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 + + //indentValue + //首行缩进距离,默认是2em + //,indentValue:'2em' + + //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 + //,initialFrameHeight:320 //初始化编辑器高度,默认320 + + //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false + + //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) + + //启用自动保存 + //,enableAutoSave: true + //自动保存间隔时间, 单位ms + //,saveInterval: 500 + + //,fullscreen : false //是否开启初始化时即全屏,默认关闭 + + //,imagePopup:true //图片操作的浮层开关,默认打开 + + //,autoSyncData:true //自动同步编辑器要提交的数据 + //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 + + //粘贴只保留标签,去除标签所有属性 + //,retainOnlyLabelPasted: false + + //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + //纯文本粘贴模式下的过滤规则 + //'filterTxtRules' : function(){ + // function transP(node){ + // node.tagName = 'p'; + // node.setStyle(); + // } + // return { + // //直接删除及其字节点内容 + // '-' : 'script style object iframe embed input select', + // 'p': {$:{}}, + // 'br':{$:{}}, + // 'div':{'$':{}}, + // 'li':{'$':{}}, + // 'caption':transP, + // 'th':transP, + // 'tr':transP, + // 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + // 'td':function(node){ + // //没有内容的td直接删掉 + // var txt = !!node.innerText(); + // if(txt){ + // node.parentNode.insertAfter(UE.uNode.createText('    '),node); + // } + // node.parentNode.removeChild(node,node.innerText()) + // } + // } + //}() + + //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 + + //insertorderedlist + //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,'insertorderedlist':{ + // //自定的样式 + // 'num':'1,2,3...', + // 'num1':'1),2),3)...', + // 'num2':'(1),(2),(3)...', + // 'cn':'一,二,三....', + // 'cn1':'一),二),三)....', + // 'cn2':'(一),(二),(三)....', + // //系统自带 + // 'decimal' : '' , //'1,2,3...' + // 'lower-alpha' : '' , // 'a,b,c...' + // 'lower-roman' : '' , //'i,ii,iii...' + // 'upper-alpha' : '' , lang //'A,B,C' + // 'upper-roman' : '' //'I,II,III...' + //} + + //insertunorderedlist + //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,insertunorderedlist : { //自定的样式 + // 'dash' :'— 破折号', //-破折号 + // 'dot':' 。 小圆圈', //系统自带 + // 'circle' : '', // '○ 小圆圈' + // 'disc' : '', // '● 小圆点' + // 'square' : '' //'■ 小方块' + //} + //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 + //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 + //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 + + //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 + + //fontfamily + //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 + //,'fontfamily':[ + // { label:'',name:'songti',val:'宋体,SimSun'}, + // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, + // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, + // { label:'',name:'heiti',val:'黑体, SimHei'}, + // { label:'',name:'lishu',val:'隶书, SimLi'}, + // { label:'',name:'andaleMono',val:'andale mono'}, + // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, + // { label:'',name:'arialBlack',val:'arial black,avant garde'}, + // { label:'',name:'comicSansMs',val:'comic sans ms'}, + // { label:'',name:'impact',val:'impact,chicago'}, + // { label:'',name:'timesNewRoman',val:'times new roman'} + //] + + //fontsize + //字号 + //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] + + //paragraph + //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 + //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} + + //rowspacingtop + //段间距 值和显示的名字相同 + //,'rowspacingtop':['5', '10', '15', '20', '25'] + + //rowspacingBottom + //段间距 值和显示的名字相同 + //,'rowspacingbottom':['5', '10', '15', '20', '25'] + + //lineheight + //行内间距 值和显示的名字相同 + //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] + + //customstyle + //自定义样式,不支持国际化,此处配置值即可最后显示值 + //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 + //尽量使用一些常用的标签 + //参数说明 + //tag 使用的标签名字 + //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, + //style 添加的样式 + //每一个对象就是一个自定义的样式 + //,'customstyle':[ + // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, + // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, + // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} + //] + + //打开右键菜单功能 + //,enableContextMenu: true + //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 + //,contextMenu:[ + // { + // label:'', //显示的名称 + // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 + // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName + // exec:function () { + // //this是当前编辑器的实例 + // //this.ui._dialogs['inserttableDialog'].open(); + // } + // } + //] + + //快捷菜单 + //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] + + //elementPathEnabled + //是否启用元素路径,默认是显示 + //,elementPathEnabled : true + + //wordCount + //,wordCount:true //是否开启字数统计 + //,maximumWords:10000 //允许的最大字符数 + //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 + //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 + //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 + //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! + + //tab + //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 + //,tabSize:4 + //,tabNode:' ' + + //removeFormat + //清除格式时可以删除的标签和属性 + //removeForamtTags标签 + //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' + //removeFormatAttributes属性 + //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' + + //undo + //可以最多回退的次数,默认20 + //,maxUndoCount:20 + //当输入的字符数超过该值时,保存一次现场 + //,maxInputCount:1 + + //autoHeightEnabled + // 是否自动长高,默认true + //,autoHeightEnabled:true + + //scaleEnabled + //是否可以拉伸长高,默认true(当开启时,自动长高失效) + //,scaleEnabled:false + //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 + //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 + + //autoFloatEnabled + //是否保持toolbar的位置不动,默认true + //,autoFloatEnabled:true + //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 + //,topOffset:30 + //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) + //,toolbarTopOffset:400 + + //设置远程图片是否抓取到本地保存 + //,catchRemoteImageEnable: true //设置是否抓取远程图片 + + //pageBreakTag + //分页标识符,默认是_ueditor_page_break_tag_ + //,pageBreakTag:'_ueditor_page_break_tag_' + + //autotypeset + //自动排版参数 + //,autotypeset: { + // mergeEmptyline: true, //合并空行 + // removeClass: true, //去掉冗余的class + // removeEmptyline: false, //去掉空行 + // textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + // imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + // pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + // clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + // clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + // removeEmptyNode: false, // 去掉空节点 + // //可以去掉的标签 + // removeTagNames: {标签名字:1}, + // indent: false, // 行首缩进 + // indentValue : '2em', //行首缩进的大小 + // bdc2sb: false, + // tobdc: false + //} + + //tableDragable + //表格是否可以拖拽 + //,tableDragable: true + + + + //sourceEditor + //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror + //注意默认codemirror只能在ie8+和非ie中使用 + //,sourceEditor:"codemirror" + //如果sourceEditor是codemirror,还用配置一下两个参数 + //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" + //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" + //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" + //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" + //编辑器初始化完成后是否进入源码模式,默认为否。 + //,sourceEditorFirst:false + + //iframeUrlMap + //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 + //,iframeUrlMap:{ + // 'anchor':'~/dialogs/anchor/anchor.html', + //} + + //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http + //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] + + //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html + //, webAppKey: "" + + //默认过滤规则相关配置项目 + //,disabledTableInTable:true //禁止表格嵌套 + //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 + //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 + + // xss 过滤是否开启,inserthtml等操作 + ,xssFilterRules: true + //input xss过滤 + ,inputXssFilter: true + //output xss过滤 + ,outputXssFilter: true + // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js + ,whitList: { + a: ['target', 'href', 'title', 'class', 'style'], + abbr: ['title', 'class', 'style'], + address: ['class', 'style'], + area: ['shape', 'coords', 'href', 'alt'], + article: [], + aside: [], + audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], + b: ['class', 'style'], + bdi: ['dir'], + bdo: ['dir'], + big: [], + blockquote: ['cite', 'class', 'style'], + br: [], + caption: ['class', 'style'], + center: [], + cite: [], + code: ['class', 'style'], + col: ['align', 'valign', 'span', 'width', 'class', 'style'], + colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], + dd: ['class', 'style'], + del: ['datetime'], + details: ['open'], + div: ['class', 'style'], + dl: ['class', 'style'], + dt: ['class', 'style'], + em: ['class', 'style'], + font: ['color', 'size', 'face'], + footer: [], + h1: ['class', 'style'], + h2: ['class', 'style'], + h3: ['class', 'style'], + h4: ['class', 'style'], + h5: ['class', 'style'], + h6: ['class', 'style'], + header: [], + hr: ['class'], + i: ['class', 'style'], + img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex', '_url'], + ins: ['datetime'], + li: ['class', 'style'], + mark: [], + nav: [], + ol: ['class', 'style'], + p: ['class', 'style'], + pre: ['class', 'style'], + s: [], + section:[], + small: [], + span: ['class', 'style'], + sub: ['class', 'style'], + sup: ['class', 'style'], + strong: ['class', 'style'], + table: ['width', 'border', 'align', 'valign', 'class', 'style'], + tbody: ['align', 'valign', 'class', 'style'], + td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + tfoot: ['align', 'valign', 'class', 'style'], + th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + thead: ['align', 'valign', 'class', 'style'], + tr: ['rowspan', 'align', 'valign', 'class', 'style'], + tt: [], + u: [], + ul: ['class', 'style'], + video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style', 'id', 'data-setup'] + } + }; + + function getUEBasePath(docUrl, confUrl) { + + return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath()); + + } + + function getConfigFilePath() { + + var configPath = document.getElementsByTagName('script'); + + return configPath[ configPath.length - 1 ].src; + + } + + function getBasePath(docUrl, confUrl) { + + var basePath = confUrl; + + + if (/^(\/|\\\\)/.test(confUrl)) { + + basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ''); + + } else if (!/^[a-z]+:/i.test(confUrl)) { + + docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ''); + + basePath = docUrl + "" + confUrl; + + } + + return optimizationPath(basePath); + + } + + function optimizationPath(path) { + + var protocol = /^[a-z]+:\/\//.exec(path)[ 0 ], + tmp = null, + res = []; + + path = path.replace(protocol, "").split("?")[0].split("#")[0]; + + path = path.replace(/\\/g, '/').split(/\//); + + path[ path.length - 1 ] = ""; + + while (path.length) { + + if (( tmp = path.shift() ) === "..") { + res.pop(); + } else if (tmp !== ".") { + res.push(tmp); + } + + } + + return protocol + res.join("/"); + + } + + window.UE = { + getUEBasePath: getUEBasePath + }; + +})(); diff --git a/member/editor/ueditor/ueditor.parse.js b/member/editor/ueditor/ueditor.parse.js new file mode 100644 index 0000000..407a466 --- /dev/null +++ b/member/editor/ueditor/ueditor.parse.js @@ -0,0 +1,1022 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) + */ + +(function(){ + +(function(){ + UE = window.UE || {}; + var isIE = !!window.ActiveXObject; + //定义utils工具 + var utils = { + removeLastbs : function(url){ + return url.replace(/\/$/,'') + }, + extend : function(t,s){ + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE : isIE, + cssRule : isIE ? function(key,style,doc){ + var indexList,index; + doc = doc || document; + if(doc.indexList){ + indexList = doc.indexList; + }else{ + indexList = doc.indexList = {}; + } + var sheetStyle; + if(!indexList[key]){ + if(style === undefined){ + return '' + } + sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length); + indexList[key] = index; + }else{ + sheetStyle = doc.styleSheets[indexList[key]]; + } + if(style === undefined){ + return sheetStyle.cssText + } + sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '') + } : function(key,style,doc){ + doc = doc || document; + var head = doc.getElementsByTagName('head')[0],node; + if(!(node = doc.getElementById(key))){ + if(style === undefined){ + return '' + } + node = doc.createElement('style'); + node.id = key; + head.appendChild(node) + } + if(style === undefined){ + return node.innerHTML + } + if(style !== ''){ + node.innerHTML = node.innerHTML + '\n' + style; + }else{ + head.removeChild(node) + } + }, + domReady : function (onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + }else{ + if (isIE) { + (function () { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + onready(); + })(); + window.attachEvent('onload', function(){ + onready() + }); + } else { + doc.addEventListener("DOMContentLoaded", function () { + doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + onready(); + }, false); + window.addEventListener('load', function(){onready()}, false); + } + } + + }, + each : function(obj, iterator, context) { + if (obj == null) return; + if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if(iterator.call(context, obj[i], i, obj) === false) + return false; + } + } else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if(iterator.call(context, obj[key], key, obj) === false) + return false; + } + } + } + }, + inArray : function(arr,item){ + var index = -1; + this.each(arr,function(v,i){ + if(v === item){ + index = i; + return false; + } + }); + return index; + }, + pushItem : function(arr,item){ + if(this.inArray(arr,item)==-1){ + arr.push(item) + } + }, + trim: function (str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); + }, + indexOf: function (array, item, start) { + var index = -1; + start = this.isNumber(start) ? start : 0; + this.each(array, function (v, i) { + if (i >= start && v === item) { + index = i; + return false; + } + }); + return index; + }, + hasClass: function (element, className) { + className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = element.className; ci = className[i++];) { + if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, + addClass:function (elm, classNames) { + if(!elm)return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + if(!new RegExp('\\b' + ci + '\\b').test(cls)){ + cls += ' ' + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass:function (elm, classNames) { + classNames = this.isArray(classNames) ? classNames : + this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') + } + cls = this.trim(cls).replace(/[ ]{2,}/g,' '); + elm.className = cls; + !cls && elm.removeAttribute('className'); + }, + on: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); + } + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + off: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try{ + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + loadFile : function () { + var tmpList = []; + function getItem(doc,obj){ + try{ + for(var i= 0,ci;ci=tmpList[i++];){ + if(ci.doc === doc && ci.url == (obj.src || obj.href)){ + return ci; + } + } + }catch(e){ + return null; + } + + } + return function (doc, obj, fn) { + var item = getItem(doc,obj); + if (item) { + if(item.ready){ + fn && fn(); + }else{ + item.funs.push(fn) + } + return; + } + tmpList.push({ + doc:doc, + url:obj.src||obj.href, + funs:[fn] + }); + if (!doc.body) { + var html = []; + for(var p in obj){ + if(p == 'tag')continue; + html.push(p + '="' + obj[p] + '"') + } + doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >'); + return; + } + if (obj.id && doc.getElementById(obj.id)) { + return; + } + var element = doc.createElement(obj.tag); + delete obj.tag; + for (var p in obj) { + element.setAttribute(p, obj[p]); + } + element.onload = element.onreadystatechange = function () { + if (!this.readyState || /loaded|complete/.test(this.readyState)) { + item = getItem(doc,obj); + if (item.funs.length > 0) { + item.ready = 1; + for (var fi; fi = item.funs.pop();) { + fi(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function(){ + throw Error('The load '+(obj.href||obj.src)+' fails,check the url') + }; + doc.getElementsByTagName("head")[0].appendChild(element); + } + }() + }; + utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) { + utils['is' + v] = function (obj) { + return Object.prototype.toString.apply(obj) == '[object ' + v + ']'; + } + }); + var parselist = {}; + UE.parse = { + register : function(parseName,fn){ + parselist[parseName] = fn; + }, + load : function(opt){ + utils.each(parselist,function(v){ + v.call(opt,utils); + }) + } + }; + uParse = function(selector,opt){ + utils.domReady(function(){ + var contents; + if(document.querySelectorAll){ + contents = document.querySelectorAll(selector) + }else{ + if(/^#/.test(selector)){ + contents = [document.getElementById(selector.replace(/^#/,''))] + }else if(/^\./.test(selector)){ + var contents = []; + utils.each(document.getElementsByTagName('*'),function(node){ + if(node.className && new RegExp('\\b' + selector.replace(/^\./,'') + '\\b','i').test(node.className)){ + contents.push(node) + } + }) + }else{ + contents = document.getElementsByTagName(selector) + } + } + utils.each(contents,function(v){ + UE.parse.load(utils.extend({root:v,selector:selector},opt)) + }) + }) + } +})(); + +UE.parse.register('insertcode',function(utils){ + var pres = this.root.getElementsByTagName('pre'); + if(pres.length){ + if(typeof XRegExp == "undefined"){ + var jsurl,cssurl; + if(this.rootPath !== undefined){ + jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js'; + cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css'; + }else{ + jsurl = this.highlightJsUrl; + cssurl = this.highlightCssUrl; + } + utils.loadFile(document,{ + id : "syntaxhighlighter_css", + tag : "link", + rel : "stylesheet", + type : "text/css", + href : cssurl + }); + utils.loadFile(document,{ + id : "syntaxhighlighter_js", + src : jsurl, + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + utils.each(pres,function(pi){ + if(pi && /brush/i.test(pi.className)){ + SyntaxHighlighter.highlight(pi); + } + }); + }); + }else{ + utils.each(pres,function(pi){ + if(pi && /brush/i.test(pi.className)){ + SyntaxHighlighter.highlight(pi); + } + }); + } + } + +}); +UE.parse.register('table', function (utils) { + var me = this, + root = this.root, + tables = root.getElementsByTagName('table'); + if (tables.length) { + var selector = this.selector; + //追加默认的表格样式 + utils.cssRule('table', + selector + ' table.noBorderTable td,' + + selector + ' table.noBorderTable th,' + + selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' + + selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' + + 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' + + selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' + + selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' + + selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' + + selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' + + selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' + + selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' + + selector + ' td p{margin:0;padding:0;}', + document); + //填充空的单元格 + + utils.each('td th caption'.split(' '), function (tag) { + var cells = root.getElementsByTagName(tag); + cells.length && utils.each(cells, function (node) { + if (!node.firstChild) { + node.innerHTML = ' '; + + } + }) + }); + + //表格可排序 + var tables = root.getElementsByTagName('table'); + utils.each(tables, function (table) { + if (/\bsortEnabled\b/.test(table.className)) { + utils.on(table, 'click', function(e){ + var target = e.target || e.srcElement, + cell = findParentByTagName(target, ['td', 'th']); + var table = findParentByTagName(target, 'table'), + colIndex = utils.indexOf(table.rows[0].cells, cell), + sortType = table.getAttribute('data-sort-type'); + if(colIndex != -1) { + sortTable(table, colIndex, me.tableSortCompareFn || sortType); + updateTable(table); + } + }); + } + }); + + //按照标签名查找父节点 + function findParentByTagName(target, tagNames) { + var i, current = target; + tagNames = utils.isArray(tagNames) ? tagNames:[tagNames]; + while(current){ + for(i = 0;i < tagNames.length; i++) { + if(current.tagName == tagNames[i].toUpperCase()) return current; + } + current = current.parentNode; + } + return null; + } + //表格排序 + function sortTable(table, sortByCellIndex, compareFn) { + var rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + + for (var i = 0,len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + + var Fn = { + 'reversecurrent': function(td1,td2){ + return 1; + }, + 'orderbyasc': function(td1,td2){ + var value1 = td1.innerText||td1.textContent, + value2 = td2.innerText||td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function(td1,td2){ + var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value1||0) - (value2||0); + }, + 'reversebynum': function(td1,td2){ + var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value2||0) - (value1||0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = sort(trArray,function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if(!lastRowIndex){ + tbody.appendChild(fragment); + }else{ + tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) + } + } + //冒泡排序 + function sort(array, compareFn){ + compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);}; + for(var i= 0,len = array.length; i 0){ + var t = array[i]; + array[i] = array[j]; + array[j] = t; + } + } + } + return array; + } + //更新表格 + function updateTable(table) { + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if(!utils.hasClass(table.rows[0], "firstRow")) { + for(var i = 1; i< table.rows.length; i++) { + utils.removeClass(table.rows[i], "firstRow"); + } + utils.addClass(table.rows[0], "firstRow"); + } + } + } +}); +UE.parse.register('charts',function( utils ){ + + utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}'); + var resourceRoot = this.rootPath, + containers = this.root, + sources = null; + + //不存在指定的根路径, 则直接退出 + if ( !resourceRoot ) { + return; + } + + if ( sources = parseSources() ) { + + loadResources(); + + } + + + function parseSources () { + + if ( !containers ) { + return null; + } + + return extractChartData( containers ); + + } + + /** + * 提取数据 + */ + function extractChartData ( rootNode ) { + + var data = [], + tables = rootNode.getElementsByTagName( "table" ); + + for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) { + + if ( tableNode.getAttribute( "data-chart" ) !== null ) { + + data.push( formatData( tableNode ) ); + + } + + } + + return data.length ? data : null; + + } + + function formatData ( tableNode ) { + + var meta = tableNode.getAttribute( "data-chart" ), + metaConfig = {}, + data = []; + + //提取table数据 + for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) { + + var rowData = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = ( cell.innerText || cell.textContent || '' ); + rowData.push( cell.tagName == 'TH' ? value:(value | 0) ); + + } + + data.push( rowData ); + + } + + //解析元信息 + meta = meta.split( ";" ); + for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) { + + metaData = metaData.split( ":" ); + metaConfig[ metaData[ 0 ] ] = metaData[ 1 ]; + + } + + + return { + table: tableNode, + meta: metaConfig, + data: data + }; + + } + + //加载资源 + function loadResources () { + + loadJQuery(); + + } + + function loadJQuery () { + + //不存在jquery, 则加载jquery + if ( !window.jQuery ) { + + utils.loadFile(document,{ + src : resourceRoot + "/third-party/jquery-1.10.2.min.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + loadHighcharts(); + + }); + + } else { + + loadHighcharts(); + + } + + } + + function loadHighcharts () { + + //不存在Highcharts, 则加载Highcharts + if ( !window.Highcharts ) { + + utils.loadFile(document,{ + src : resourceRoot + "/third-party/highcharts/highcharts.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + loadTypeConfig(); + + }); + + } else { + + loadTypeConfig(); + + } + + } + + //加载图表差异化配置文件 + function loadTypeConfig () { + + utils.loadFile(document,{ + src : resourceRoot + "/dialogs/charts/chart.config.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + render(); + + }); + + } + + //渲染图表 + function render () { + + var config = null, + chartConfig = null, + container = null; + + for ( var i = 0, len = sources.length; i < len; i++ ) { + + config = sources[ i ]; + + chartConfig = analysisConfig( config ); + + container = createContainer( config.table ); + + renderChart( container, typeConfig[ config.meta.chartType ], chartConfig ); + + } + + + } + + /** + * 渲染图表 + * @param container 图表容器节点对象 + * @param typeConfig 图表类型配置 + * @param config 图表通用配置 + * */ + function renderChart ( container, typeConfig, config ) { + + + $( container ).highcharts( $.extend( {}, typeConfig, { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: config.title, + x: -20 //center + }, + subtitle: { + text: config.subTitle, + x: -20 + }, + xAxis: { + title: { + text: config.xTitle + }, + categories: config.categories + }, + yAxis: { + title: { + text: config.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: config.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: config.series + + } )); + + } + + /** + * 创建图表的容器 + * 新创建的容器会替换掉对应的table对象 + * */ + function createContainer ( tableNode ) { + + var container = document.createElement( "div" ); + container.className = "edui-chart-container"; + + tableNode.parentNode.replaceChild( container, tableNode ); + + return container; + + } + + //根据config解析出正确的类别和图表数据信息 + function analysisConfig ( config ) { + + var series = [], + //数据类别 + categories = [], + result = [], + data = config.data, + meta = config.meta; + + //数据对齐方式为相反的方式, 需要反转数据 + if ( meta.dataFormat != "1" ) { + + for ( var i = 0, len = data.length; i < len ; i++ ) { + + for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) { + + if ( !result[ j ] ) { + result[ j ] = []; + } + + result[ j ][ i ] = data[ i ][ j ]; + + } + + } + + data = result; + + } + + result = {}; + + //普通图表 + if ( meta.chartType != typeConfig.length - 1 ) { + + categories = data[ 0 ].slice( 1 ); + + for ( var i = 1, curData; curData = data[ i ]; i++ ) { + series.push( { + name: curData[ 0 ], + data: curData.slice( 1 ) + } ); + } + + result.series = series; + result.categories = categories; + result.title = meta.title; + result.subTitle = meta.subTitle; + result.xTitle = meta.xTitle; + result.yTitle = meta.yTitle; + result.suffix = meta.suffix; + + } else { + + var curData = []; + + for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) { + + curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] ); + + } + + //饼图 + series[ 0 ] = { + type: 'pie', + name: meta.tip, + data: curData + }; + + result.series = series; + result.title = meta.title; + result.suffix = meta.suffix; + + } + + return result; + + } + +}); +UE.parse.register('background', function (utils) { + var me = this, + root = me.root, + p = root.getElementsByTagName('p'), + styles; + + for (var i = 0,ci; ci = p[i++];) { + styles = ci.getAttribute('data-background'); + if (styles){ + ci.parentNode.removeChild(ci); + } + } + + //追加默认的表格样式 + styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document); +}); +UE.parse.register('list',function(utils){ + var customCss = [], + customStyle = { + 'cn' : 'cn-1-', + 'cn1' : 'cn-2-', + 'cn2' : 'cn-3-', + 'num' : 'num-1-', + 'num1' : 'num-2-', + 'num2' : 'num-3-', + 'dash' : 'dash', + 'dot' : 'dot' + }; + + + utils.extend(this,{ + liiconpath : 'http://bs.baidu.com/listicon/', + listDefaultPaddingLeft : '20' + }); + + var root = this.root, + ols = root.getElementsByTagName('ol'), + uls = root.getElementsByTagName('ul'), + selector = this.selector; + + if(ols.length){ + applyStyle.call(this,ols); + } + + if(uls.length){ + applyStyle.call(this,uls); + } + + if(ols.length || uls.length){ + customCss.push(selector +' .list-paddingleft-1{padding-left:0}'); + customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}'); + customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}'); + + utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\n'), document); + } + function applyStyle(nodes){ + var T = this; + utils.each(nodes,function(list){ + if(list.className && /custom_/i.test(list.className)){ + var listStyle = list.className.match(/custom_(\w+)/)[1]; + if(listStyle == 'dash' || listStyle == 'dot'){ + utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}'); + utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); + + }else{ + var index = 1; + utils.each(list.childNodes,function(li){ + if(li.tagName == 'LI'){ + utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-'+customStyle[listStyle] +index + '.gif)}'); + index++; + } + }); + utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch(listStyle){ + case 'cn': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}'); + break; + case 'dot': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}'); + } + } + }); + } + + +}); +UE.parse.register('vedio',function(utils){ + var video = this.root.getElementsByTagName('video'), + audio = this.root.getElementsByTagName('audio'); + + document.createElement('video');document.createElement('audio'); + if(video.length || audio.length){ + var sourcePath = utils.removeLastbs(this.rootPath), + jsurl = sourcePath + '/third-party/video-js/video.js', + cssurl = sourcePath + '/third-party/video-js/video-js.min.css', + swfUrl = sourcePath + '/third-party/video-js/video-js.swf'; + + if(window.videojs) { + videojs.autoSetup(); + } else { + utils.loadFile(document,{ + id : "video_css", + tag : "link", + rel : "stylesheet", + type : "text/css", + href : cssurl + }); + utils.loadFile(document,{ + id : "video_js", + src : jsurl, + tag : "script", + type : "text/javascript" + },function(){ + videojs.options.flash.swf = swfUrl; + videojs.autoSetup(); + }); + } + + } +}); + +})(); diff --git a/member/editor/ueditor/ueditor.parse.min.js b/member/editor/ueditor/ueditor.parse.min.js new file mode 100644 index 0000000..af057a1 --- /dev/null +++ b/member/editor/ueditor/ueditor.parse.min.js @@ -0,0 +1,7 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:05 GMT+0800 (CST) + */ + +!function(){!function(){UE=window.UE||{};var a=!!window.ActiveXObject,b={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,b){for(var c=arguments,d=!!this.isBoolean(c[c.length-1])&&c[c.length-1],e=this.isBoolean(c[c.length-1])?c.length-1:c.length,f=1;f=c&&a===b)return d=e,!1}),d},hasClass:function(a,b){b=b.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},addClass:function(a,c){if(a){c=this.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var d,e=0,f=a.className;d=c[e++];)new RegExp("\\b"+d+"\\b").test(f)||(f+=" "+d);a.className=b.trim(f)}},removeClass:function(a,b){b=this.isArray(b)?b:this.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," "),a.className=e,!e&&a.removeAttribute("className")},on:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.addEventListener)a.addEventListener(c,d,!1);else{d._d||(d._d={els:[]});var g=c+d.toString(),h=b.indexOf(d._d.els,a);d._d[g]&&h!=-1||(h==-1&&d._d.els.push(a),d._d[g]||(d._d[g]=function(a){return d.call(a.srcElement,a||window.event)}),a.attachEvent("on"+c,d._d[g]))}a=null},off:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.removeEventListener)a.removeEventListener(c,d,!1);else{var g=c+d.toString();try{a.detachEvent("on"+c,d._d?d._d[g]:d)}catch(h){}if(d._d&&d._d[g]){var i=b.indexOf(d._d.els,a);i!=-1&&d._d.els.splice(i,1),0==d._d.els.length&&delete d._d[g]}}},loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url")},c.getElementsByTagName("head")[0].appendChild(i)}}}()};b.each(["String","Function","Array","Number","RegExp","Object","Boolean"],function(a){b["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var c={};UE.parse={register:function(a,b){c[a]=b},load:function(a){b.each(c,function(c){c.call(a,b)})}},uParse=function(a,c){b.domReady(function(){var d;if(document.querySelectorAll)d=document.querySelectorAll(a);else if(/^#/.test(a))d=[document.getElementById(a.replace(/^#/,""))];else if(/^\./.test(a)){var d=[];b.each(document.getElementsByTagName("*"),function(b){b.className&&new RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(b.className)&&d.push(b)})}else d=document.getElementsByTagName(a);b.each(d,function(d){UE.parse.load(b.extend({root:d,selector:a},c))})})}}(),UE.parse.register("insertcode",function(a){var b=this.root.getElementsByTagName("pre");if(b.length)if("undefined"==typeof XRegExp){var c,d;void 0!==this.rootPath?(c=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",d=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(c=this.highlightJsUrl,d=this.highlightCssUrl),a.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:d}),a.loadFile(document,{id:"syntaxhighlighter_js",src:c,tag:"script",type:"text/javascript",defer:"defer"},function(){a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})}),UE.parse.register("table",function(a){function b(b,c){var d,e=b;for(c=a.isArray(c)?c:[c];e;){for(d=0;d0){var g=a[c];a[c]=a[e],a[e]=g}return a}function e(b){if(!a.hasClass(b.rows[0],"firstRow")){for(var c=1;cemotion.css\">" + + "
      " + + "" + + "
      " + + "
      " + + "
      " + + "
      " + + "
      " + + "
      " + + "
      " + + "
      " + + "
      " + + "
      " + + "\" class=\'edui-emotion-JfaceReview edui-emotion-preview-img\'/>" + + "
      ", + + sourceData: { + emotion: { + tabNum:7, //切换面板数量 + SmilmgName:{ 'edui-emotion-Jtab0':['j_00', 84], 'edui-emotion-Jtab1':['t_00', 40], 'edui-emotion-Jtab2':['w_00', 52], 'edui-emotion-Jtab3':['B_00', 63], 'edui-emotion-Jtab4':['C_00', 20], 'edui-emotion-Jtab5':['i_f', 50], 'edui-emotion-Jtab6':['y_00', 40] }, //图片前缀名 + imageFolders:{ 'edui-emotion-Jtab0':'jx2/', 'edui-emotion-Jtab1':'tsj/', 'edui-emotion-Jtab2':'ldw/', 'edui-emotion-Jtab3':'bobo/', 'edui-emotion-Jtab4':'babycat/', 'edui-emotion-Jtab5':'face/', 'edui-emotion-Jtab6':'youa/'}, //图片对应文件夹路径 + imageCss:{'edui-emotion-Jtab0':'jd', 'edui-emotion-Jtab1':'tsj', 'edui-emotion-Jtab2':'ldw', 'edui-emotion-Jtab3':'bb', 'edui-emotion-Jtab4':'cat', 'edui-emotion-Jtab5':'pp', 'edui-emotion-Jtab6':'youa'}, //图片css类名 + imageCssOffset:{'edui-emotion-Jtab0':35, 'edui-emotion-Jtab1':35, 'edui-emotion-Jtab2':35, 'edui-emotion-Jtab3':35, 'edui-emotion-Jtab4':35, 'edui-emotion-Jtab5':25, 'edui-emotion-Jtab6':35}, //图片偏移 + SmileyInfor:{ + 'edui-emotion-Jtab0':['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'], + 'edui-emotion-Jtab1':['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'], + 'edui-emotion-Jtab2':['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'], + 'edui-emotion-Jtab3':['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'], + 'edui-emotion-Jtab4':['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'], + 'edui-emotion-Jtab5':['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'], + 'edui-emotion-Jtab6':['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上'] + } + } + }, + initContent:function( _editor, $widget ){ + + var me = this, + emotion = me.sourceData.emotion, + lang = _editor.getLang( 'emotion' )['static'], + emotionUrl = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/emotion/', + options = $.extend( {}, lang, { + emotion_url: emotionUrl + }), + $root = me.root(); + + if( me.inited ) { + me.preventDefault(); + this.switchToFirst(); + return; + } + + me.inited = true; + + editor = _editor; + this.widget = $widget; + + emotion.SmileyPath = _editor.options.emotionLocalization === true ? emotionUrl + 'images/' : "http://img.baidu.com/hi/"; + emotion.SmileyBox = me.createTabList( emotion.tabNum ); + emotion.tabExist = me.createArr( emotion.tabNum ); + + options['cover_img'] = emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif' : 'default/0.gif'); + + $root.html( $.parseTmpl( me.tpl, options ) ); + + me.tabs = $.eduitab({selector:".edui-emotion-tab-Jpanel"}); + + //缓存预览对象 + me.previewBox = $root.find(".edui-emotion-JtabIconReview"); + me.previewImg = $root.find(".edui-emotion-JfaceReview"); + + me.initImgName(); + + }, + initEvent:function(){ + + var me = this; + + //防止点击过后关闭popup + me.root().on('click', function(e){ + return false; + }); + + //移动预览 + me.root().delegate( 'td', 'mouseover mouseout', function( evt ){ + + var $td = $( this), + url = $td.attr('data-surl') || null; + + if( url ) { + me[evt.type]( this, url , $td.attr('data-posflag') ); + } + + return false; + + } ); + + //点击选中 + me.root().delegate( 'td', 'click', function( evt ){ + + var $td = $( this), + realUrl = $td.attr('data-realurl') || null; + + if( realUrl ) { + me.insertSmiley( realUrl.replace( /'/g, "\\'" ), evt ); + } + + return false; + + } ); + + //更新模板 + me.tabs.edui().on("beforeshow", function( evt ){ + + var contentId = $(evt.target).attr('data-context').replace( /^.*\.(?=[^\s]*$)/, '' ); + + evt.stopPropagation(); + + me.updateTab( contentId ); + + }); + + this.switchToFirst(); + + }, + initImgName: function() { + + var emotion = this.sourceData.emotion; + + for ( var pro in emotion.SmilmgName ) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if ( tempBox.length ) return; + + for ( var i = 1; i <= tempName[1]; i++ ) { + tempStr = tempName[0]; + if ( i < 10 ) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push( tempStr ); + } + } + + }, + /** + * 切换到第一个tab + */ + switchToFirst: function(){ + this.root().find(".edui-emotion-Jtabnav .edui-tab-text:first").trigger('click'); + }, + updateTab: function( contentBoxId ) { + + var me = this, + emotion = me.sourceData.emotion; + + me.autoHeight( contentBoxId ); + + if ( !emotion.tabExist[ contentBoxId ] ) { + + emotion.tabExist[ contentBoxId ] = true; + me.createTab( contentBoxId ); + + } + + }, + autoHeight: function( ) { + this.widget.height(this.root() + 2); + }, + createTabList: function( tabNum ) { + var obj = {}; + for ( var i = 0; i < tabNum; i++ ) { + obj["edui-emotion-Jtab" + i] = []; + } + return obj; + }, + mouseover: function( td, srcPath, posFlag ) { + + posFlag -= 0; + + $(td).css( 'backgroundColor', '#ACCD3C' ); + + this.previewImg.css( "backgroundImage", "url(" + srcPath + ")" ); + posFlag && this.previewBox.addClass('edui-emotion-preview-left'); + this.previewBox.show(); + + }, + mouseout: function( td ) { + $(td).css( 'backgroundColor', 'transparent' ); + this.previewBox.removeClass('edui-emotion-preview-left').hide(); + }, + insertSmiley: function( url, evt ) { + var obj = { + src: url + }; + obj._src = obj.src; + editor.execCommand( 'insertimage', obj ); + if ( !evt.ctrlKey ) { + //关闭预览 + this.previewBox.removeClass('edui-emotion-preview-left').hide(); + this.widget.edui().hide(); + } + }, + createTab: function( contentBoxId ) { + + var faceVersion = "?v=1.1", //版本号 + me = this, + $contentBox = this.root().find("."+contentBoxId), + emotion = me.sourceData.emotion, + imagePath = emotion.SmileyPath + emotion.imageFolders[ contentBoxId ], //获取显示表情和预览表情的路径 + positionLine = 11 / 2, //中间数 + iWidth = iHeight = 35, //图片长宽 + iColWidth = 3, //表格剩余空间的显示比例 + tableCss = emotion.imageCss[ contentBoxId ], + cssOffset = emotion.imageCssOffset[ contentBoxId ], + textHTML = [''], + i = 0, imgNum = emotion.SmileyBox[ contentBoxId ].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; + + for ( ; i < imgNum; ) { + textHTML.push( '' ); + for ( var j = 0; j < imgColNum; j++, i++ ) { + faceImage = emotion.SmileyBox[ contentBoxId ][i]; + if ( faceImage ) { + sUrl = imagePath + faceImage + faceVersion; + realUrl = imagePath + faceImage; + posflag = j < positionLine ? 0 : 1; + offset = cssOffset * i * (-1) - 1; + infor = emotion.SmileyInfor[ contentBoxId ][i]; + + textHTML.push( '' ); + } + textHTML.push( '' ); + } + textHTML.push( '
      ' ); + textHTML.push( '' ); + textHTML.push( '' ); + textHTML.push( '' ); + } else { + textHTML.push( '' ); + } + textHTML.push( '
      ' ); + textHTML = textHTML.join( "" ); + $contentBox.html( textHTML ); + }, + createArr: function( tabNum ) { + var arr = []; + for ( var i = 0; i < tabNum; i++ ) { + arr[i] = 0; + } + return arr; + }, + width:603, + height:400 + }); + +})(); + diff --git a/member/editor/umeditor/dialogs/emotion/images/0.gif b/member/editor/umeditor/dialogs/emotion/images/0.gif new file mode 100644 index 0000000..6964168 Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/0.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/bface.gif b/member/editor/umeditor/dialogs/emotion/images/bface.gif new file mode 100644 index 0000000..14fe618 Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/bface.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/cface.gif b/member/editor/umeditor/dialogs/emotion/images/cface.gif new file mode 100644 index 0000000..bff947f Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/cface.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/fface.gif b/member/editor/umeditor/dialogs/emotion/images/fface.gif new file mode 100644 index 0000000..0d8a6af Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/fface.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/jxface2.gif b/member/editor/umeditor/dialogs/emotion/images/jxface2.gif new file mode 100644 index 0000000..a959c90 Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/jxface2.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/neweditor-tab-bg.png b/member/editor/umeditor/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 0000000..8f398b0 Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/neweditor-tab-bg.png differ diff --git a/member/editor/umeditor/dialogs/emotion/images/tface.gif b/member/editor/umeditor/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000..1354f54 Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/tface.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/wface.gif b/member/editor/umeditor/dialogs/emotion/images/wface.gif new file mode 100644 index 0000000..5667160 Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/wface.gif differ diff --git a/member/editor/umeditor/dialogs/emotion/images/yface.gif b/member/editor/umeditor/dialogs/emotion/images/yface.gif new file mode 100644 index 0000000..51608be Binary files /dev/null and b/member/editor/umeditor/dialogs/emotion/images/yface.gif differ diff --git a/member/editor/umeditor/dialogs/formula/formula.css b/member/editor/umeditor/dialogs/formula/formula.css new file mode 100644 index 0000000..45d4865 --- /dev/null +++ b/member/editor/umeditor/dialogs/formula/formula.css @@ -0,0 +1,32 @@ +.edui-popup-formula .edui-formula-wrapper { + padding: 15px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-nav{ + height: auto; + *height: 31px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-text { + font-size: 12px; +} +.edui-popup-formula .edui-formula-wrapper .edui-formula-clearboth { + clear: both; + width: 0; + height: 0; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-pane ul { + margin: 0px; + padding: 0px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-content { + padding: 5px 0px 0px 0px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-pane .edui-formula-latex-item { + display: block; + float: left; + margin: 0px 3px 3px 0px; + width: 30px; + height: 30px; + border:1px solid #cccccc; + background-image: url("images/formula.png"); + cursor: pointer; +} \ No newline at end of file diff --git a/member/editor/umeditor/dialogs/formula/formula.html b/member/editor/umeditor/dialogs/formula/formula.html new file mode 100644 index 0000000..d3c47fc --- /dev/null +++ b/member/editor/umeditor/dialogs/formula/formula.html @@ -0,0 +1,213 @@ + + + + + Document + + + + + +
      +
      +
      + +
      + +
      + + + + + + + \ No newline at end of file diff --git a/member/editor/umeditor/dialogs/formula/formula.js b/member/editor/umeditor/dialogs/formula/formula.js new file mode 100644 index 0000000..ffa9e78 --- /dev/null +++ b/member/editor/umeditor/dialogs/formula/formula.js @@ -0,0 +1,124 @@ +(function () { + + var editor = null; + + UM.registerWidget('formula', { + + tpl: "formula.css\">" + + "
      " + + "
        " + + "
        " + + "
        ", + + sourceData: { + formula: { + 'common': [ + "{/}frac{ }{ }", "^{ }/_{ }", "x^{ }", "x_{ }", "x^{ }_{ }", "{/}bar{ }", "{/}sqrt{ }", "{/}nthroot{ }{ }", + "{/}sum^{ }_{n=}", "{/}sum", "{/}log_{ }", "{/}ln", "{/}int_{ }^{ }", "{/}oint_{ }^{ }" + ], + 'symbol': [ + "+", "-", "{/}pm", "{/}times", "{/}ast", "{/}div", "/", "{/}bigtriangleup", + "=", "{/}ne", "{/}approx", ">", "<", "{/}ge", "{/}le", "{/}infty", + "{/}cap", "{/}cup", "{/}because", "{/}therefore", "{/}subset", "{/}supset", "{/}subseteq", "{/}supseteq", + "{/}nsubseteq", "{/}nsupseteq", "{/}in", "{/}ni", "{/}notin", "{/}mapsto", "{/}leftarrow", "{/}rightarrow", + "{/}Leftarrow", "{/}Rightarrow", "{/}leftrightarrow", "{/}Leftrightarrow" + ], + 'letter': [ + "{/}alpha", "{/}beta", "{/}gamma", "{/}delta", "{/}varepsilon", "{/}varphi", "{/}lambda", "{/}mu", + "{/}rho", "{/}sigma", "{/}omega", "{/}Gamma", "{/}Delta", "{/}Theta", "{/}Lambda", "{/}Xi", + "{/}Pi", "{/}Sigma", "{/}Upsilon", "{/}Phi", "{/}Psi", "{/}Omega" + ] + } + }, + initContent: function (_editor, $widget) { + + var me = this, + formula = me.sourceData.formula, + lang = _editor.getLang('formula').static, + formulaUrl = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/formula/', + options = $.extend({}, lang, { 'formula_url': formulaUrl }), + $root = me.root(); + + if (me.inited) { + me.preventDefault(); + return; + } + me.inited = true; + + editor = _editor; + me.$widget = $widget; + + $root.html($.parseTmpl(me.tpl, options)); + me.tabs = $.eduitab({selector: "#edui-formula-tab-Jpanel"}); + + /* 初始化popup的内容 */ + var headHtml = [], xMax = 0, yMax = 0, + $tabContent = me.root().find('.edui-tab-content'); + $.each(formula, function (k, v) { + var contentHtml = []; + $.each(v, function (i, f) { + contentHtml.push('
      • '); + if (++xMax >=8) { + ++yMax; xMax = 0; + } + }); + yMax++; xMax = 0; + $tabContent.append('
          ' + contentHtml.join('') + '
        '); + headHtml.push('
      • ' + lang['lang_tab_' + k] + '
      • '); + }); + headHtml.push('
      • '); + $root.find('.edui-tab-nav').html(headHtml.join('')); + $root.find('.edui-tab-content').append('
        '); + + /* 选中第一个tab */ + me.switchTab(0); + }, + initEvent: function () { + var me = this; + + //防止点击过后关闭popup + me.root().on('click', function (e) { + return false; + }); + + //点击tab切换菜单 + me.root().find('.edui-tab-nav').delegate('.edui-tab-item', 'click', function (evt) { + me.switchTab(this); + return false; + }); + + //点击选中公式 + me.root().find('.edui-tab-pane').delegate('.edui-formula-latex-item', 'click', function (evt) { + var $item = $(this), + latex = $item.attr('data-latex') || ''; + + if (latex) { + me.insertLatex(latex.replace("{/}", "\\")); + } + me.$widget.edui().hide(); + return false; + }); + }, + switchTab:function(index){ + var me = this, + $root = me.root(), + index = $.isNumeric(index) ? index:$.inArray(index, $root.find('.edui-tab-nav .edui-tab-item')); + + $root.find('.edui-tab-nav .edui-tab-item').removeClass('edui-active').eq(index).addClass('edui-active'); + $root.find('.edui-tab-content .edui-tab-pane').removeClass('edui-active').eq(index).addClass('edui-active'); + + /* 自动长高 */ + me.autoHeight(0); + }, + autoHeight: function () { + this.$widget.height(this.root() + 2); + }, + insertLatex: function (latex) { + editor.execCommand('formula', latex ); + }, + width: 350, + height: 400 + }); + +})(); + diff --git a/member/editor/umeditor/dialogs/formula/images/formula.png b/member/editor/umeditor/dialogs/formula/images/formula.png new file mode 100644 index 0000000..04cbb3b Binary files /dev/null and b/member/editor/umeditor/dialogs/formula/images/formula.png differ diff --git a/member/editor/umeditor/dialogs/image/image.css b/member/editor/umeditor/dialogs/image/image.css new file mode 100644 index 0000000..5548391 --- /dev/null +++ b/member/editor/umeditor/dialogs/image/image.css @@ -0,0 +1,42 @@ +.edui-dialog-image .edui-image-wrapper{font-size: 12px;margin: 15px;} + +/*upload*/ +.edui-dialog-image .edui-image-upload1{position: absolute;top:50%;left:50%;width:44px;height:38px;margin-top:-19px; margin-left: -22px;} +.edui-dialog-image .edui-image-upload2{position:relative;float:left;width:120px;height:120px;margin:5px 0 0 5px;} + +.edui-dialog-image .edui-image-form{position: absolute;left: 0px;top: 0px;width: 100%;height: 100%;opacity: 0;cursor: pointer;} +.edui-dialog-image .edui-image-form .edui-image-file{width: 100%;height:100%;filter: alpha(opacity=0)} + +.edui-dialog-image .edui-image-upload1 .edui-image-icon{display: inline-block;width:44px;height:38px;background-image: url('images/upload1.png')} +.edui-dialog-image .edui-image-upload1 .edui-image-icon.hover{background-position: -50px 0;} +.edui-dialog-image .edui-image-upload2 .edui-image-icon{display: inline-block;width:120px;height:120px;background-image: url('images/upload2.png')} + +.edui-dialog-image .edui-image-dragTip{position: absolute;display:none;top:50%;left:50%;margin-top:30px;margin-left: -60px; + color: #222;font-size:14px;text-shadow: 0px 2px 3px #555;} + +.edui-dialog-image .edui-image-content{height:330px;width:100%;position: relative;} + +.edui-dialog-image .edui-image-mask{display: none;position: absolute;top:0;left:0;width: 100%; height: 100%;background-color:#fff; + text-align: center;line-height:300px;color:#000;font-size:14px;font-weight:bold;opacity: 0.6;filter: alpha(opacity=60);} +.edui-dialog-image .edui-image-mask.edui-active{display: block;} + +/*network*/ +.edui-dialog-image .edui-image-searchBar{margin: 10px;} +.edui-dialog-image .edui-image-searchBar .edui-image-searchTxt{display: inline-block !important;*display: inline !important;*zoom:1;width:400px; border: 1px solid #c5d2ff; height: 20px; line-height: 18px; font-size: 14px; padding: 3px; margin: 0;outline:0;} +.edui-dialog-image .edui-image-searchBar .edui-image-searchAdd{display: inline-block !important;*display: inline !important;*zoom:1; + width:60px; text-align:center;height: 25px;text-align: center;line-height: 25px; + background-color: #ffffff;padding: 0; border: 1px solid #ababab;margin-left: 20px;cursor: pointer; +} +.edui-dialog-image .edui-image-searchBar .edui-image-searchAdd.hover{ + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; +} +.edui-dialog-image .edui-image-searchRes{height:280px;overflow:auto;} + + +/*common*/ +.edui-dialog-image .edui-image-item{position:relative;float:left;width:120px;height:120px;border: 1px solid #CCC;cursor: default;margin: 5px 0 0 5px;} +.edui-dialog-image .edui-image-item .edui-image-pic{position: absolute;left:-9999px;} +.edui-dialog-image .edui-image-item .edui-image-close{position:absolute;right:0;background: url('images/close.png');width:17px;height:17px;cursor:pointer;z-index:1} +.edui-dialog-image .edui-image-item.hover .edui-image-close{display: block;} diff --git a/member/editor/umeditor/dialogs/image/image.js b/member/editor/umeditor/dialogs/image/image.js new file mode 100644 index 0000000..b6222df --- /dev/null +++ b/member/editor/umeditor/dialogs/image/image.js @@ -0,0 +1,445 @@ +(function () { + + var utils = UM.utils, + browser = UM.browser, + Base = { + checkURL: function (url) { + if(!url) return false; + url = utils.trim(url); + if (url.length <= 0) { + return false; + } + if (url.search(/http:\/\/|https:\/\//) !== 0) { + url += 'http://'; + } + + url=url.replace(/\?[\s\S]*$/,""); + + if (!/(.gif|.jpg|.jpeg|.png)$/i.test(url)) { + return false; + } + return url; + }, + getAllPic: function (sel, $w, editor) { + var me = this, + arr = [], + $imgs = $(sel, $w); + + $.each($imgs, function (index, node) { + $(node).removeAttr("width").removeAttr("height"); + +// if (node.width > editor.options.initialFrameWidth) { +// me.scale(node, editor.options.initialFrameWidth - +// parseInt($(editor.body).css("padding-left")) - +// parseInt($(editor.body).css("padding-right"))); +// } + + return arr.push({ + _src: node.src, + src: node.src + }); + }); + + return arr; + }, + scale: function (img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + + return this; + }, + close: function ($img) { + + $img.css({ + top: ($img.parent().height() - $img.height()) / 2, + left: ($img.parent().width()-$img.width())/2 + }).prev().on("click",function () { + + if ( $(this).parent().remove().hasClass("edui-image-upload-item") ) { + //显示图片计数-1 + Upload.showCount--; + Upload.updateView(); + } + + }); + + return this; + }, + createImgBase64: function (img, file, $w) { + if (browser.webkit) { + //Chrome8+ + img.src = window.webkitURL.createObjectURL(file); + } else if (browser.gecko) { + //FF4+ + img.src = window.URL.createObjectURL(file); + } else { + //实例化file reader对象 + var reader = new FileReader(); + reader.onload = function (e) { + img.src = this.result; + $w.append(img); + }; + reader.readAsDataURL(file); + } + }, + callback: function (editor, $w, url, state) { + + if (state == "SUCCESS") { + //显示图片计数+1 + Upload.showCount++; + var $img = $(""), + $item = $("
        ").append($img); + + if ($(".edui-image-upload2", $w).length < 1) { + $(".edui-image-content", $w).append($item); + + Upload.render(".edui-image-content", 2) + .config(".edui-image-upload2"); + } else { + $(".edui-image-upload2", $w).before($item).show(); + } + + $img.on("load", function () { + Base.scale(this, 120); + Base.close($(this)); + $(".edui-image-content", $w).focus(); + }); + + } else { + currentDialog.showTip( state ); + window.setTimeout( function () { + + currentDialog.hideTip(); + + }, 3000 ); + } + + Upload.toggleMask(); + + } + }; + + /* + * 本地上传 + * */ + var Upload = { + showCount: 0, + uploadTpl: '
        ' + + '' + + '
        ' + + '' + + '
        ' + + + '
        ', + init: function (editor, $w) { + var me = this; + + me.editor = editor; + me.dialog = $w; + me.render(".edui-image-local", 1); + me.config(".edui-image-upload1"); + me.submit(); + me.drag(); + + $(".edui-image-upload1").hover(function () { + $(".edui-image-icon", this).toggleClass("hover"); + }); + + if (!(UM.browser.ie && UM.browser.version <= 9)) { + $(".edui-image-dragTip", me.dialog).css("display", "block"); + } + + + return me; + }, + render: function (sel, t) { + var me = this; + + $(sel, me.dialog).append($(me.uploadTpl.replace(/%%/g, t))); + + return me; + }, + config: function (sel) { + var me = this, + url=me.editor.options.imageUrl; + + url=url + (url.indexOf("?") == -1 ? "?" : "&") + "editorid="+me.editor.id;//初始form提交地址; + + $("form", $(sel, me.dialog)).attr("action", url); + + return me; + }, + uploadComplete: function(r){ + var me = this; + try{ + var json = eval('('+r+')'); + Base.callback(me.editor, me.dialog, json.url, json.state); + }catch (e){ + var lang = me.editor.getLang('image'); + Base.callback(me.editor, me.dialog, '', (lang && lang.uploadError) || 'Error!'); + } + }, + submit: function (callback) { + + var me = this, + input = $( ''), + input = input[0]; + + $(me.dialog).delegate( ".edui-image-file", "change", function ( e ) { + + if ( !this.parentNode ) { + return; + } + + $('').insertBefore(me.dialog).on('load', function(){ + var r = this.contentWindow.document.body.innerHTML; + if(r == '')return; + me.uploadComplete(r); + $(this).unbind('load'); + $(this).remove(); + + }); + + $(this).parent()[0].submit(); + Upload.updateInput( input ); + me.toggleMask("Loading...."); + callback && callback(); + + }); + + return me; + }, + //更新input + updateInput: function ( inputField ) { + + $( ".edui-image-file", this.dialog ).each( function ( index, ele ) { + + ele.parentNode.replaceChild( inputField.cloneNode( true ), ele ); + + } ); + + }, + //更新上传框 + updateView: function () { + + if ( Upload.showCount !== 0 ) { + return; + } + + $(".edui-image-upload2", this.dialog).hide(); + $(".edui-image-dragTip", this.dialog).show(); + $(".edui-image-upload1", this.dialog).show(); + + }, + drag: function () { + var me = this; + //做拽上传的支持 + if (!UM.browser.ie9below) { + me.dialog.find('.edui-image-content').on('drop',function (e) { + + //获取文件列表 + var fileList = e.originalEvent.dataTransfer.files; + var img = document.createElement('img'); + var hasImg = false; + $.each(fileList, function (i, f) { + if (/^image/.test(f.type)) { + //创建图片的base64 + Base.createImgBase64(img, f, me.dialog); + + var xhr = new XMLHttpRequest(); + xhr.open("post", me.editor.getOpt('imageUrl') + "?type=ajax", true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + //模拟数据 + var fd = new FormData(); + fd.append(me.editor.getOpt('imageFieldName'), f); + + xhr.send(fd); + xhr.addEventListener('load', function (e) { + var r = e.target.response, json; + me.uploadComplete(r); + if (i == fileList.length - 1) { + $(img).remove() + } + }); + hasImg = true; + } + }); + if (hasImg) { + e.preventDefault(); + me.toggleMask("Loading...."); + } + + }).on('dragover', function (e) { + e.preventDefault(); + }); + } + }, + toggleMask: function (html) { + var me = this; + + var $mask = $(".edui-image-mask", me.dialog); + if (html) { + if (!(UM.browser.ie && UM.browser.version <= 9)) { + $(".edui-image-dragTip", me.dialog).css( "display", "none" ); + } + $(".edui-image-upload1", me.dialog).css( "display", "none" ); + $mask.addClass("edui-active").html(html); + } else { + + $mask.removeClass("edui-active").html(); + + if ( Upload.showCount > 0 ) { + return me; + } + + if (!(UM.browser.ie && UM.browser.version <= 9) ){ + $(".edui-image-dragTip", me.dialog).css("display", "block"); + } + $(".edui-image-upload1", me.dialog).css( "display", "block" ); + } + + return me; + } + }; + + /* + * 网络图片 + * */ + var NetWork = { + init: function (editor, $w) { + var me = this; + + me.editor = editor; + me.dialog = $w; + + me.initEvt(); + }, + initEvt: function () { + var me = this, + url, + $ele = $(".edui-image-searchTxt", me.dialog); + + $(".edui-image-searchAdd", me.dialog).on("click", function () { + url = Base.checkURL($ele.val()); + + if (url) { + + $("").on("load", function () { + + + + var $item = $("
        ").append(this); + + $(".edui-image-searchRes", me.dialog).append($item); + + Base.scale(this, 120); + + $item.width($(this).width()); + + Base.close($(this)); + + $ele.val(""); + }); + } + }) + .hover(function () { + $(this).toggleClass("hover"); + }); + } + }; + + var $tab = null, + currentDialog = null; + + UM.registerWidget('image', { + tpl: "image.css\">" + + "
        " + + "" + + "
        " + + "
        " + + "
        " + + "
        " + + "
        <%=lang_input_dragTip%>
        " + + "
        " + + "
        " + + "
        " + + "" + + "
        <%=lang_btn_add%>
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "
        ", + initContent: function (editor, $dialog) { + var lang = editor.getLang('image')["static"], + opt = $.extend({}, lang, { + image_url: UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/image/' + }); + + Upload.showCount = 0; + + if (lang) { + var html = $.parseTmpl(this.tpl, opt); + } + + currentDialog = $dialog.edui(); + + this.root().html(html); + + }, + initEvent: function (editor, $w) { + $tab = $.eduitab({selector: ".edui-image-wrapper"}) + .edui().on("beforeshow", function (e) { + e.stopPropagation(); + }); + + Upload.init(editor, $w); + + NetWork.init(editor, $w); + }, + buttons: { + 'ok': { + exec: function (editor, $w) { + var sel = "", + index = $tab.activate(); + + if (index == 0) { + sel = ".edui-image-content .edui-image-pic"; + } else if (index == 1) { + sel = ".edui-image-searchRes .edui-image-pic"; + } + + var list = Base.getAllPic(sel, $w, editor); + + if (index != -1) { + editor.execCommand('insertimage', list); + } + } + }, + 'cancel': {} + }, + width: 700, + height: 408 + }, function (editor, $w, url, state) { + Base.callback(editor, $w, url, state) + }) +})(); + diff --git a/member/editor/umeditor/dialogs/image/image.js.bak b/member/editor/umeditor/dialogs/image/image.js.bak new file mode 100644 index 0000000..1b5765d --- /dev/null +++ b/member/editor/umeditor/dialogs/image/image.js.bak @@ -0,0 +1,446 @@ +(function () { + + var utils = UM.utils, + browser = UM.browser, + Base = { + checkURL: function (url) { + if(!url) return false; + url = utils.trim(url); + if (url.length <= 0) { + return false; + } + if (url.search(/http:\/\/|https:\/\//) !== 0) { + url += 'http://'; + } + + url=url.replace(/\?[\s\S]*$/,""); + + if (!/(.gif|.jpg|.jpeg|.png)$/i.test(url)) { + return false; + } + return url; + }, + getAllPic: function (sel, $w, editor) { + var me = this, + arr = [], + $imgs = $(sel, $w); + + $.each($imgs, function (index, node) { + $(node).removeAttr("width").removeAttr("height"); + +// if (node.width > editor.options.initialFrameWidth) { +// me.scale(node, editor.options.initialFrameWidth - +// parseInt($(editor.body).css("padding-left")) - +// parseInt($(editor.body).css("padding-right"))); +// } + + return arr.push({ + _src: node.src, + src: node.src + }); + }); + + return arr; + }, + scale: function (img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + + return this; + }, + close: function ($img) { + + $img.css({ + top: ($img.parent().height() - $img.height()) / 2, + left: ($img.parent().width()-$img.width())/2 + }).prev().on("click",function () { + + if ( $(this).parent().remove().hasClass("edui-image-upload-item") ) { + //显示图片计数-1 + Upload.showCount--; + Upload.updateView(); + } + + }); + + return this; + }, + createImgBase64: function (img, file, $w) { + if (browser.webkit) { + //Chrome8+ + img.src = window.webkitURL.createObjectURL(file); + } else if (browser.gecko) { + //FF4+ + img.src = window.URL.createObjectURL(file); + } else { + //实例化file reader对象 + var reader = new FileReader(); + reader.onload = function (e) { + img.src = this.result; + $w.append(img); + }; + reader.readAsDataURL(file); + } + }, + callback: function (editor, $w, url, state) { + + if (state == "SUCCESS") { + //显示图片计数+1 + Upload.showCount++; + var $img = $(""), + $item = $("
        ").append($img); + + if ($(".edui-image-upload2", $w).length < 1) { + $(".edui-image-content", $w).append($item); + + Upload.render(".edui-image-content", 2) + .config(".edui-image-upload2"); + } else { + $(".edui-image-upload2", $w).before($item).show(); + } + + $img.on("load", function () { + Base.scale(this, 120); + Base.close($(this)); + $(".edui-image-content", $w).focus(); + }); + + } else { + currentDialog.showTip( state ); + window.setTimeout( function () { + + currentDialog.hideTip(); + + }, 3000 ); + } + + Upload.toggleMask(); + + } + }; + + /* + * 本地上传 + * */ + var Upload = { + showCount: 0, + uploadTpl: '
        ' + + '' + + '
        ' + + '' + + '
        ' + + + '
        ', + init: function (editor, $w) { + var me = this; + + me.editor = editor; + me.dialog = $w; + me.render(".edui-image-local", 1); + me.config(".edui-image-upload1"); + me.submit(); + me.drag(); + + $(".edui-image-upload1").hover(function () { + $(".edui-image-icon", this).toggleClass("hover"); + }); + + if (!(UM.browser.ie && UM.browser.version <= 9)) { + $(".edui-image-dragTip", me.dialog).css("display", "block"); + } + + + return me; + }, + render: function (sel, t) { + var me = this; + + $(sel, me.dialog).append($(me.uploadTpl.replace(/%%/g, t))); + + return me; + }, + config: function (sel) { + var me = this, + url=me.editor.options.imageUrl; + + url=url + (url.indexOf("?") == -1 ? "?" : "&") + "editorid="+me.editor.id;//初始form提交地址; + + $("form", $(sel, me.dialog)).attr("action", url); + + return me; + }, + + uploadComplete: function(r){ + var me = this; + try{ + var json = eval('('+r+')'); + Base.callback(me.editor, me.dialog, json.url, json.state); + }catch (e){ + var lang = me.editor.getLang('image'); + Base.callback(me.editor, me.dialog, '', (lang && lang.uploadError) || 'Error!'); + } + }, + submit: function (callback) { + + var me = this, + input = $( ''), + input = input[0]; + + $(me.dialog).delegate( ".edui-image-file", "change", function ( e ) { + + if ( !this.parentNode ) { + return; + } + + $('').insertBefore(me.dialog).on('load', function(){ + var r = this.contentWindow.document.body.innerHTML; + if(r == '')return; + me.uploadComplete(r); + $(this).unbind('load'); + $(this).remove(); + + }); + + $(this).parent()[0].submit(); + Upload.updateInput( input ); + me.toggleMask("Loading...."); + callback && callback(); + + }); + + return me; + }, + //更新input + updateInput: function ( inputField ) { + + $( ".edui-image-file", this.dialog ).each( function ( index, ele ) { + + ele.parentNode.replaceChild( inputField.cloneNode( true ), ele ); + + } ); + + }, + //更新上传框 + updateView: function () { + + if ( Upload.showCount !== 0 ) { + return; + } + + $(".edui-image-upload2", this.dialog).hide(); + $(".edui-image-dragTip", this.dialog).show(); + $(".edui-image-upload1", this.dialog).show(); + + }, + drag: function () { + var me = this; + //做拽上传的支持 + if (!UM.browser.ie9below) { + me.dialog.find('.edui-image-content').on('drop',function (e) { + + //获取文件列表 + var fileList = e.originalEvent.dataTransfer.files; + var img = document.createElement('img'); + var hasImg = false; + $.each(fileList, function (i, f) { + if (/^image/.test(f.type)) { + //创建图片的base64 + Base.createImgBase64(img, f, me.dialog); + + var xhr = new XMLHttpRequest(); + xhr.open("post", me.editor.getOpt('imageUrl') + "?type=ajax", true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + //模拟数据 + var fd = new FormData(); + fd.append(me.editor.getOpt('imageFieldName'), f); + + xhr.send(fd); + xhr.addEventListener('load', function (e) { + var r = e.target.response, json; + me.uploadComplete(r); + if (i == fileList.length - 1) { + $(img).remove() + } + }); + hasImg = true; + } + }); + if (hasImg) { + e.preventDefault(); + me.toggleMask("Loading...."); + } + + }).on('dragover', function (e) { + e.preventDefault(); + }); + } + }, + toggleMask: function (html) { + var me = this; + + var $mask = $(".edui-image-mask", me.dialog); + if (html) { + if (!(UM.browser.ie && UM.browser.version <= 9)) { + $(".edui-image-dragTip", me.dialog).css( "display", "none" ); + } + $(".edui-image-upload1", me.dialog).css( "display", "none" ); + $mask.addClass("edui-active").html(html); + } else { + + $mask.removeClass("edui-active").html(); + + if ( Upload.showCount > 0 ) { + return me; + } + + if (!(UM.browser.ie && UM.browser.version <= 9) ){ + $(".edui-image-dragTip", me.dialog).css("display", "block"); + } + $(".edui-image-upload1", me.dialog).css( "display", "block" ); + } + + return me; + } + }; + + /* + * 网络图片 + * */ + var NetWork = { + init: function (editor, $w) { + var me = this; + + me.editor = editor; + me.dialog = $w; + + me.initEvt(); + }, + initEvt: function () { + var me = this, + url, + $ele = $(".edui-image-searchTxt", me.dialog); + + $(".edui-image-searchAdd", me.dialog).on("click", function () { + url = Base.checkURL($ele.val()); + + if (url) { + + $("").on("load", function () { + + + + var $item = $("
        ").append(this); + + $(".edui-image-searchRes", me.dialog).append($item); + + Base.scale(this, 120); + + $item.width($(this).width()); + + Base.close($(this)); + + $ele.val(""); + }); + } + }) + .hover(function () { + $(this).toggleClass("hover"); + }); + } + }; + + var $tab = null, + currentDialog = null; + + UM.registerWidget('image', { + tpl: "image.css\">" + + "
        " + + "" + + "
        " + + "
        " + + "
        " + + "
        " + + "
        <%=lang_input_dragTip%>
        " + + "
        " + + "
        " + + "
        " + + "" + + "
        <%=lang_btn_add%>
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "
        ", + initContent: function (editor, $dialog) { + var lang = editor.getLang('image')["static"], + opt = $.extend({}, lang, { + image_url: UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/image/' + }); + + Upload.showCount = 0; + + if (lang) { + var html = $.parseTmpl(this.tpl, opt); + } + + currentDialog = $dialog.edui(); + + this.root().html(html); + + }, + initEvent: function (editor, $w) { + $tab = $.eduitab({selector: ".edui-image-wrapper"}) + .edui().on("beforeshow", function (e) { + e.stopPropagation(); + }); + + Upload.init(editor, $w); + + NetWork.init(editor, $w); + }, + buttons: { + 'ok': { + exec: function (editor, $w) { + var sel = "", + index = $tab.activate(); + + if (index == 0) { + sel = ".edui-image-content .edui-image-pic"; + } else if (index == 1) { + sel = ".edui-image-searchRes .edui-image-pic"; + } + + var list = Base.getAllPic(sel, $w, editor); + + if (index != -1) { + editor.execCommand('insertimage', list); + } + } + }, + 'cancel': {} + }, + width: 700, + height: 408 + }, function (editor, $w, url, state) { + Base.callback(editor, $w, url, state) + }) +})(); + diff --git a/member/editor/umeditor/dialogs/image/images/close.png b/member/editor/umeditor/dialogs/image/images/close.png new file mode 100644 index 0000000..d368388 Binary files /dev/null and b/member/editor/umeditor/dialogs/image/images/close.png differ diff --git a/member/editor/umeditor/dialogs/image/images/upload1.png b/member/editor/umeditor/dialogs/image/images/upload1.png new file mode 100644 index 0000000..c9056ca Binary files /dev/null and b/member/editor/umeditor/dialogs/image/images/upload1.png differ diff --git a/member/editor/umeditor/dialogs/image/images/upload2.png b/member/editor/umeditor/dialogs/image/images/upload2.png new file mode 100644 index 0000000..57ce63f Binary files /dev/null and b/member/editor/umeditor/dialogs/image/images/upload2.png differ diff --git a/member/editor/umeditor/dialogs/link/link.js b/member/editor/umeditor/dialogs/link/link.js new file mode 100644 index 0000000..8a1f817 --- /dev/null +++ b/member/editor/umeditor/dialogs/link/link.js @@ -0,0 +1,74 @@ +(function(){ + var utils = UM.utils; + function hrefStartWith(href, arr) { + href = href.replace(/^\s+|\s+$/g, ''); + for (var i = 0, ai; ai = arr[i++];) { + if (href.indexOf(ai) == 0) { + return true; + } + } + return false; + } + + UM.registerWidget('link', { + tpl: "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + +// "" + +// "" + +// "" + + "", + initContent: function (editor) { + var lang = editor.getLang('link'); + if (lang) { + var html = $.parseTmpl(this.tpl, lang.static); + } + this.root().html(html); + }, + initEvent: function (editor, $w) { + var link = editor.queryCommandValue('link'); + if(link){ + $('#edui-link-Jhref',$w).val(utils.html($(link).attr('href'))); + $('#edui-link-Jtitle',$w).val($(link).attr('title')); + $(link).attr('target') == '_blank' && $('#edui-link-Jtarget').attr('checked',true) + } + $('#edui-link-Jhref',$w).focus(); + }, + buttons: { + 'ok': { + exec: function (editor, $w) { + var href = $('#edui-link-Jhref').val().replace(/^\s+|\s+$/g, ''); + + if (href) { + editor.execCommand('link', { + 'href': href, + 'target': $("#edui-link-Jtarget:checked").length ? "_blank" : '_self', + 'title': $("#edui-link-Jtitle").val().replace(/^\s+|\s+$/g, ''), + '_href': href + }); + } + } + }, + 'cancel':{} + }, + width: 400 + }) +})(); + diff --git a/member/editor/umeditor/dialogs/map/map.html b/member/editor/umeditor/dialogs/map/map.html new file mode 100644 index 0000000..aaf86b2 --- /dev/null +++ b/member/editor/umeditor/dialogs/map/map.html @@ -0,0 +1,148 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
        + + + \ No newline at end of file diff --git a/member/editor/umeditor/dialogs/map/map.js b/member/editor/umeditor/dialogs/map/map.js new file mode 100644 index 0000000..2c7b8f2 --- /dev/null +++ b/member/editor/umeditor/dialogs/map/map.js @@ -0,0 +1,265 @@ +(function () { + + var widgetName = 'map'; + + UM.registerWidget(widgetName, { + + tpl: "" + + "
        " + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""+ + "" + + "
        <%=lang_city%>:\"/><%=lang_address%>:<%=lang_search%>
        " + + "
        " + + "
        " + + "", + initContent: function (editor, $widget) { + + var me = this, + lang = editor.getLang(widgetName), + theme_url = editor.options.themePath + editor.options.theme; + + if( me.inited ) { + me.preventDefault(); + return false; + } + + me.inited = true; + + me.lang = lang; + me.editor = editor; + + me.root().html($.parseTmpl(me.tpl, $.extend({}, lang['static'], { + 'theme_url': theme_url + }))); + + me.initRequestApi(); + + }, + /** + * 初始化请求API + */ + initRequestApi: function () { + + var $ifr = null; + + //已经初始化过, 不用再次初始化 + if (window.BMap && window.BMap.Map) { + this.initBaiduMap(); + } else { + + $ifr = $(''); + $ifr.appendTo( this.root() ); + + $ifr = $ifr[ 0 ].contentWindow.document; + + $ifr.open(); + $ifr.write( this.root().find(".edui-tpl-container").html().replace( /scr_ipt/g, 'script').replace('<>',"'" + this.editor.id + "'") ); + + } + + }, + requestMapApi: function (src) { + + var me = this; + + if (src.length) { + + var _src = src[0]; + + src = src.slice(1); + + if (_src) { + $.getScript(_src, function () { + me.requestMapApi(src); + }); + } else { + me.requestMapApi(src); + } + + } else { + + me.initBaiduMap(); + + } + + + }, + initBaiduMap: function () { + + var $root = this.root(), + map = new BMap.Map($root.find(".edui-map-container")[0]), + me = this, + marker, + point, + imgcss, + img = $(me.editor.selection.getRange().getClosedNode()); + + map.enableInertialDragging(); + map.enableScrollWheelZoom(); + map.enableContinuousZoom(); + + if (img.length && /api[.]map[.]baidu[.]com/ig.test(img.attr("src"))) { + var url = img.attr("src"), + centerPos = me.getPars(url, "center").split(","), + markerPos = me.getPars(url, "markers").split(","); + point = new BMap.Point(Number(centerPos[0]), Number(centerPos[1])); + marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1]))); + map.addControl(new BMap.NavigationControl()); + map.centerAndZoom(point, Number(me.getPars(url, "zoom"))); + imgcss = img.attr('style'); + } else { + point = new BMap.Point(116.404, 39.915); // 创建点坐标 + marker = new BMap.Marker(point); + map.addControl(new BMap.NavigationControl()); + map.centerAndZoom(point, 10); // 初始化地图,设置中心点坐标和地图级别。 + } + marker.enableDragging(); + map.addOverlay(marker); + + me.map = map; + me.marker = marker; + me.imgcss = imgcss; + }, + doSearch: function () { + var me = this, + city = me.root().find('.edui-map-city').val(), + address = me.root().find('.edui-map-address').val(); + + if (!city) { + alert(me.lang.cityMsg); + return; + } + var search = new BMap.LocalSearch(city, { + onSearchComplete: function (results) { + if (results && results.getNumPois()) { + var points = []; + for (var i = 0; i < results.getCurrentNumPois(); i++) { + points.push(results.getPoi(i).point); + } + if (points.length > 1) { + me.map.setViewport(points); + } else { + me.map.centerAndZoom(points[0], 13); + } + point = me.map.getCenter(); + /*me.marker.setPoint(point);*/ + me.marker.setPosition(point); + } else { + alert(me.lang.errorMsg); + } + } + }); + search.search(address || city); + }, + getPars: function (str, par) { + var reg = new RegExp(par + "=((\\d+|[.,])*)", "g"); + return reg.exec(str)[1]; + }, + reset: function(){ + this.map && this.map.reset(); + }, + initEvent: function () { + var me = this, + $root = me.root(); + + $root.find('.edui-map-address').on('keydown', function (evt) { + evt = evt || event; + if (evt.keyCode == 13) { + me.doSearch(); + return false; + } + }); + + $root.find(".edui-map-button").on('click', function (evt) { + me.doSearch(); + }); + + $root.find(".edui-map-address").focus(); + + $root.on( "mousewheel DOMMouseScroll", function ( e ) { + return false; + } ); + + }, + width: 580, + height: 408, + buttons: { + ok: { + exec: function (editor) { + var widget = editor.getWidgetData(widgetName), + center = widget.map.getCenter(), + zoom = widget.map.getZoom(), + size = widget.map.getSize(), + /*point = widget.marker.P;*/ + point = widget.marker.getPosition(); + + if (widget.root().find(".edui-map-dynamic")[0].checked) { + var URL = editor.getOpt('UMEDITOR_HOME_URL'), + url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/map.html" + + '#center=' + center.lng + ',' + center.lat, + '&zoom=' + zoom, + '&width=' + size.width, + '&height=' + size.height, + '&markers=' + point.lng + ',' + point.lat].join(''); + editor.execCommand('inserthtml', ''); + } else { + url = "https://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat + + "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat; + editor.execCommand('inserthtml', '', true); + } + + widget.reset(); + } + }, + cancel: { + exec: function(editor){ + editor.getWidgetData(widgetName).reset(); + } + } + } + }); + +})(); + diff --git a/member/editor/umeditor/dialogs/video/images/center_focus.jpg b/member/editor/umeditor/dialogs/video/images/center_focus.jpg new file mode 100644 index 0000000..262b029 Binary files /dev/null and b/member/editor/umeditor/dialogs/video/images/center_focus.jpg differ diff --git a/member/editor/umeditor/dialogs/video/images/left_focus.jpg b/member/editor/umeditor/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000..7886d27 Binary files /dev/null and b/member/editor/umeditor/dialogs/video/images/left_focus.jpg differ diff --git a/member/editor/umeditor/dialogs/video/images/none_focus.jpg b/member/editor/umeditor/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000..7c768dc Binary files /dev/null and b/member/editor/umeditor/dialogs/video/images/none_focus.jpg differ diff --git a/member/editor/umeditor/dialogs/video/images/right_focus.jpg b/member/editor/umeditor/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000..173e10d Binary files /dev/null and b/member/editor/umeditor/dialogs/video/images/right_focus.jpg differ diff --git a/member/editor/umeditor/dialogs/video/video.css b/member/editor/umeditor/dialogs/video/video.css new file mode 100644 index 0000000..7a44e0a --- /dev/null +++ b/member/editor/umeditor/dialogs/video/video.css @@ -0,0 +1,59 @@ +@charset "utf-8"; +.edui-dialog-video .edui-video-wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative} +.edui-dialog-video .edui-video-tabbody{height:335px;} +.edui-dialog-video .edui-video-panel { position: absolute;width:100%; height:100%;background: #fff;} +.edui-dialog-video .edui-video-panel table td{vertical-align: middle;border:none;font-size:12px;padding:0;}/*DT*/ +.edui-dialog-video #eduiVideoUrl { + width: 470px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +.edui-dialog-video #eduiVideoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;} +.edui-dialog-video #searchList{width: 570px;overflow: auto;zoom:1;height: 270px;} +.edui-dialog-video #searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;} +.edui-dialog-video #searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/ +.edui-dialog-video #searchList p{margin-left: 10px;} +.edui-dialog-video #eduiVideoType{ + width: 65px; + height: 23px; + line-height: 22px; + border: 1px solid #d7d7d7; +} +.edui-dialog-video #eduiVideoSearchBtn,.edui-dialog-video #eduiVideoSearchReset{ + /*width: 80px;*/ + height: 25px; + line-height: 25px; + background: #eee; + border: 1px solid #d7d7d7; + cursor: pointer; + padding: 0 5px; +} + + + +.edui-dialog-video #eduiVideoPreview{width: 420px; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left} +.edui-dialog-video #eduiVideoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;} +.edui-dialog-video .edui-video-wrapper fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} +.edui-dialog-video .edui-video-wrapper fieldset legend{font-weight: bold;} +.edui-dialog-video .edui-video-wrapper fieldset p{line-height: 30px;} +.edui-dialog-video .edui-video-wrapper fieldset input.edui-video-txt{ + width: 65px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +.edui-dialog-video .edui-video-wrapper label.edui-video-url{font-weight: bold;margin-left: 5px;color: #06c;} +.edui-dialog-video #eduiVideoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +.edui-dialog-video #eduiVideoFloat .edui-video-focus{opacity: 1;filter: alpha(opacity = 100)} +.edui-dialog-video .edui-video-wrapper span.edui-video-view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue} \ No newline at end of file diff --git a/member/editor/umeditor/dialogs/video/video.js b/member/editor/umeditor/dialogs/video/video.js new file mode 100644 index 0000000..64a47ec --- /dev/null +++ b/member/editor/umeditor/dialogs/video/video.js @@ -0,0 +1,282 @@ + +(function(){ + var domUtils = UM.dom.domUtils; + var widgetName = 'video'; + + UM.registerWidget( widgetName,{ + + tpl: "video.css\" />" + + "
        " + + "
        " + + "
        " + + "<%=lang_tab_insertV%>" + + "
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "<%=lang_video_size%>" + + "" + + "" + + "" + + "
        " + + "
        " + + "
        " + + "<%=lang_alignment%>" + + "
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "
        " + + "
        ", + initContent:function( editor, $widget ){ + + var me = this, + lang = editor.getLang( widgetName), + video_url = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/video/'; + + me.lang = lang; + me.editor = editor; + me.$widget = $widget; + me.root().html( $.parseTmpl( me.tpl, $.extend( { video_url: video_url }, lang['static'] ) ) ); + + me.initController( lang ); + + }, + initEvent:function(){ + + var me = this, + url = $("#eduiVideoUrl", me.$widget)[0]; + + if( 'oninput' in url ) { + url.oninput = function(){ + me.createPreviewVideo( this.value ); + }; + } else { + url.onpropertychange = function () { + me.createPreviewVideo( this.value ); + } + } + + }, + initController: function( lang ){ + + var me = this, + img = me.editor.selection.getRange().getClosedNode(), + url; + + me.createAlignButton( ["eduiVideoFloat"] ); + + //编辑视频时初始化相关信息 + if(img && img.className == "edui-faked-video"){ + $("#eduiVideoUrl", me.$widget)[0].value = url = img.getAttribute("_url"); + $("#eduiVideoWidth", me.$widget)[0].value = img.width; + $("#eduiVideoHeight", me.$widget)[0].value = img.height; + var align = domUtils.getComputedStyle(img,"float"), + parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); + me.updateAlignButton(parentAlign==="center"?"center":align); + } + me.createPreviewVideo(url); + + }, + /** + * 根据url生成视频预览 + */ + createPreviewVideo: function(url){ + + if ( !url )return; + + var me = this, + lang = me.lang, + conUrl = me.convert_url(url); + + if(!me.endWith(conUrl,[".swf",".flv",".wmv"])){ + $("#eduiVideoPreview", me.$widget).html( lang.urlError ); + return; + } + $("#eduiVideoPreview", me.$widget)[0].innerHTML = ''; + + }, + /** + * 将单个视频信息插入编辑器中 + */ + insertSingle: function(){ + + var me = this, + width = $("#eduiVideoWidth", me.$widget)[0], + height = $("#eduiVideoHeight", me.$widget)[0], + url=$('#eduiVideoUrl', me.$widget)[0].value, + align = this.findFocus("eduiVideoFloat","name"); + + if(!url) return false; + if ( !me.checkNum( [width, height] ) ) return false; + this.editor.execCommand('insertvideo', { + url: me.convert_url(url), + width: width.value, + height: height.value, + align: align + }); + + }, + /** + * URL转换 + */ + convert_url: function(url){ + if ( !url ) return ''; + var matches = url.match(/youtu.be\/(\w+)$/) || + url.match(/youtube\.com\/watch\?v=(\w+)/) || + url.match(/youtube.com\/v\/(\w+)/), + youku = url.match(/youku\.com\/v_show\/id_(\w+)/), + youkuPlay = /player\.youku\.com/ig.test(url); + + if(youkuPlay){ + url = url.replace(/\?f=.*/, ""); + } else if (matches){ + url = "https://www.youtube.com/v/" + matches[1] + "?version=3&feature=player_embedded"; + }else if(youku){ + url = "http://player.youku.com/player.php/sid/"+youku[1]+"/v.swf" + } else { + url = url.replace(/http:\/\/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "http://www.tudou.com/v/$1") + .replace(/http:\/\/www\.youtube\.com\/watch\?v=([\w\-]+)/i, "http://www.youtube.com/v/$1") + .replace(/http:\/\/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, "http://player.youku.com/player.php/sid/$1") + .replace(/http:\/\/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "http://player.56.com/v_$1.swf") + .replace(/http:\/\/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "http://player.56.com/v_$1.swf") + .replace(/http:\/\/v\.ku6\.com\/.+\/([^.]+)\.html/i, "http://player.ku6.com/refer/$1/v.swf") + .replace(/\?f=.*/, ""); + } + return url; + }, + /** + * 检测传入的所有input框中输入的长宽是否是正数 + */ + checkNum: function checkNum( nodes ) { + + var me = this; + + for ( var i = 0, ci; ci = nodes[i++]; ) { + var value = ci.value; + if ( !me.isNumber( value ) && value) { + alert( me.lang.numError ); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + }, + /** + * 数字判断 + * @param value + */ + isNumber: function( value ) { + return /(0|^[1-9]\d*$)/.test( value ); + }, + updateAlignButton: function( align ) { + var aligns = $( "#eduiVideoFloat", this.$widget )[0].children; + + for ( var i = 0, ci; ci = aligns[i++]; ) { + if ( ci.getAttribute( "name" ) == align ) { + if ( ci.className !="edui-video-focus" ) { + ci.className = "edui-video-focus"; + } + } else { + if ( ci.className =="edui-video-focus" ) { + ci.className = ""; + } + } + } + + }, + /** + * 创建图片浮动选择按钮 + * @param ids + */ + createAlignButton: function( ids ) { + var lang = this.lang, + vidoe_home = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/video/'; + + for ( var i = 0, ci; ci = ids[i++]; ) { + var floatContainer = $( "#" + ci, this.$widget ) [0], + nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight}; + for ( var j in nameMaps ) { + var div = document.createElement( "div" ); + div.setAttribute( "name", j ); + if ( j == "none" ) div.className="edui-video-focus"; + div.style.cssText = "background:url("+ vidoe_home +"images/" + j + "_focus.jpg);"; + div.setAttribute( "title", nameMaps[j] ); + floatContainer.appendChild( div ); + } + this.switchSelect( ci ); + } + }, + /** + * 选择切换 + */ + switchSelect: function( selectParentId ) { + var selects = $( "#" + selectParentId, this.$widget )[0].children; + for ( var i = 0, ci; ci = selects[i++]; ) { + $(ci).on("click", function () { + for ( var j = 0, cj; cj = selects[j++]; ) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute( "class" ); + } + this.className = "edui-video-focus"; + } ) + } + }, + /** + * 找到id下具有focus类的节点并返回该节点下的某个属性 + * @param id + * @param returnProperty + */ + findFocus: function( id, returnProperty ) { + var tabs = $( "#" + id , this.$widget)[0].children, + property; + for ( var i = 0, ci; ci = tabs[i++]; ) { + if ( ci.className=="edui-video-focus" ) { + property = ci.getAttribute( returnProperty ); + break; + } + } + return property; + }, + /** + * 末尾字符检测 + */ + endWith: function(str,endStrArr){ + for(var i=0,len = endStrArr.length;i \ No newline at end of file diff --git a/member/editor/umeditor/init.api.js b/member/editor/umeditor/init.api.js new file mode 100644 index 0000000..d1f7cef --- /dev/null +++ b/member/editor/umeditor/init.api.js @@ -0,0 +1,21 @@ +function EditorAPI(i, k, v) { + var i = i ? i : 'content'; + var k = k ? k : 'len'; + var v = v ? v : ''; + switch(k) { + case 'get': + return um.getContent(); + break; + case 'set': + um.setContent(v); + break; + case 'ins': + um.execCommand('inserthtml', v); + break; + case 'len': + return um.getContentTxt().length; + break; + default: + break; + } +} \ No newline at end of file diff --git a/member/editor/umeditor/init.inc.php b/member/editor/umeditor/init.inc.php new file mode 100644 index 0000000..c6026d8 --- /dev/null +++ b/member/editor/umeditor/init.inc.php @@ -0,0 +1,47 @@ +'; +$editor .= ''; +$editor .= ''; +$editor .= ''; +$editor .= ''; +$editor .= ''; +$editor .= ''; +$editor .= ''; +$editor .= ''; +?> \ No newline at end of file diff --git a/member/editor/umeditor/lang/en/en.js b/member/editor/umeditor/lang/en/en.js new file mode 100644 index 0000000..45b2f1a --- /dev/null +++ b/member/editor/umeditor/lang/en/en.js @@ -0,0 +1,150 @@ +/** + * English language package + */ +UM.I18N['en'] = { + 'labelMap':{ + 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', + 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', + 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', + 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', + 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', + 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', + 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', + 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', + 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", + 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph', 'image':'Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', + 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', + 'video':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', + 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', + 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', + 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'highlightcode':'Code', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', + 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', + 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', + 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'drafts': 'drafts', 'formula':'formula' + }, + 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, + 'fontfamily':{ + 'songti':'Sim sun', + 'kaiti':'Sim kai', + 'heiti':'Sim hei', + 'lishu':'Sim li', + 'yahei': 'Microsoft yahei', + 'andaleMono':'Andale mono', + 'arial': 'Arial', + 'arialBlack':'Arial black', + 'comicSansMs':'Comic sans ms', + 'impact':'Impact', + 'timesNewRoman':'Times new roman' + }, + 'ok':"OK", + 'cancel':"Cancel", + 'closeDialog':"closeDialog", + 'tableDrag':"You must import the file uiUtils.js before drag! ", + 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", + 'anthorMsg':"Link", + 'clearColor':'Clear', + 'standardColor':'Standard color', + 'themeColor':'Theme color', + 'property':'Property', + 'default':'Default', + 'modify':'Modify', + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justify':'Default', + 'clear':'Clear', + 'anchorMsg':'Anchor', + 'delete':'Delete', + 'clickToUpload':"Click to upload", + 'unset':"Language hasn't been set!", + 't_row':'row', + 't_col':'col', + 'more':'More', + 'pasteOpt':'Paste Option', + 'pasteSourceFormat':"Keep Source Formatting", + 'tagFormat':'Keep tag', + 'pasteTextFormat':'Keep Text only', + + //===============dialog i18N======================= + 'image':{ + 'static':{ + 'lang_tab_local':"Local Upload", + 'lang_tab_imgSearch':"Network Pictures", + 'lang_input_dragTip':"Support drag upload", + 'lang_btn_add':"Add" + }, + 'uploadError': 'Upload Error' + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'Choice', + 'lang_input_Tuzki':'Tuzki', + 'lang_input_lvdouwa':'LvDouWa', + 'lang_input_BOBO':'BOBO', + 'lang_input_babyCat':'BabyCat', + 'lang_input_bubble':'Bubble', + 'lang_input_youa':'YouA' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_search':'Search', + 'address':{'value':"Beijing"} + }, + 'searchError':'Unable to locate the address!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'Text:', + 'lang_input_url':'URL:', + 'lang_input_title':'Title:', + 'lang_input_target':'open in new window:' + }, + 'validLink':'Supports only effective when a link is selected', + 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + }, + 'map':{ + 'static':{ + 'lang_city':"City", + 'lang_address':"Address", + 'city':{'value':"Beijing"}, + 'lang_search':"Search", + 'lang_dynamicmap':"Dynamic map" + }, + 'cityMsg':"Please enter the city name!", + 'errorMsg':"Can't find the place!" + }, + 'video':{ + 'static':{ + 'lang_tab_insertV':"Video", + 'lang_video_url':" URL ", + 'lang_video_size':"Video Size", + 'lang_videoW':"Width", + 'lang_videoH':"Height", + 'lang_alignment':"Alignment", + 'videoSearchTxt':{'value':"Enter the search keyword!"}, + 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn':{'value':"Search in Baidu"}, + 'videoSearchReset':{'value':"Clear result"} + }, + 'numError':"Please enter the correct Num. e.g 123,400", + 'floatLeft':"Float left", + 'floatRight':"Float right", + 'default':"Default", + 'block':"Display in block", + 'urlError':"The video url format may be wrong!", + 'loading':"  The video is loading, please wait…", + 'clickToSelect':"Click to select", + 'goToSource':'Visit source video ', + 'noVideo':"    Sorry,can't find the video,please try again!" + }, + 'formula':{ + 'static':{ + 'lang_tab_common':'Common', + 'lang_tab_symbol':'Symbol', + 'lang_tab_letter':'Letter' + } + } +}; \ No newline at end of file diff --git a/member/editor/umeditor/lang/en/images/addimage.png b/member/editor/umeditor/lang/en/images/addimage.png new file mode 100644 index 0000000..3a2fd17 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/addimage.png differ diff --git a/member/editor/umeditor/lang/en/images/alldeletebtnhoverskin.png b/member/editor/umeditor/lang/en/images/alldeletebtnhoverskin.png new file mode 100644 index 0000000..355eeab Binary files /dev/null and b/member/editor/umeditor/lang/en/images/alldeletebtnhoverskin.png differ diff --git a/member/editor/umeditor/lang/en/images/alldeletebtnupskin.png b/member/editor/umeditor/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000..61658ce Binary files /dev/null and b/member/editor/umeditor/lang/en/images/alldeletebtnupskin.png differ diff --git a/member/editor/umeditor/lang/en/images/background.png b/member/editor/umeditor/lang/en/images/background.png new file mode 100644 index 0000000..d5bf5fd Binary files /dev/null and b/member/editor/umeditor/lang/en/images/background.png differ diff --git a/member/editor/umeditor/lang/en/images/button.png b/member/editor/umeditor/lang/en/images/button.png new file mode 100644 index 0000000..098874c Binary files /dev/null and b/member/editor/umeditor/lang/en/images/button.png differ diff --git a/member/editor/umeditor/lang/en/images/copy.png b/member/editor/umeditor/lang/en/images/copy.png new file mode 100644 index 0000000..f982e8b Binary files /dev/null and b/member/editor/umeditor/lang/en/images/copy.png differ diff --git a/member/editor/umeditor/lang/en/images/deletedisable.png b/member/editor/umeditor/lang/en/images/deletedisable.png new file mode 100644 index 0000000..c8ee750 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/deletedisable.png differ diff --git a/member/editor/umeditor/lang/en/images/deleteenable.png b/member/editor/umeditor/lang/en/images/deleteenable.png new file mode 100644 index 0000000..26acc88 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/deleteenable.png differ diff --git a/member/editor/umeditor/lang/en/images/imglabel.png b/member/editor/umeditor/lang/en/images/imglabel.png new file mode 100644 index 0000000..da401e6 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/imglabel.png differ diff --git a/member/editor/umeditor/lang/en/images/listbackground.png b/member/editor/umeditor/lang/en/images/listbackground.png new file mode 100644 index 0000000..4f82ccd Binary files /dev/null and b/member/editor/umeditor/lang/en/images/listbackground.png differ diff --git a/member/editor/umeditor/lang/en/images/localimage.png b/member/editor/umeditor/lang/en/images/localimage.png new file mode 100644 index 0000000..12c8e6a Binary files /dev/null and b/member/editor/umeditor/lang/en/images/localimage.png differ diff --git a/member/editor/umeditor/lang/en/images/music.png b/member/editor/umeditor/lang/en/images/music.png new file mode 100644 index 0000000..2f495fe Binary files /dev/null and b/member/editor/umeditor/lang/en/images/music.png differ diff --git a/member/editor/umeditor/lang/en/images/rotateleftdisable.png b/member/editor/umeditor/lang/en/images/rotateleftdisable.png new file mode 100644 index 0000000..741526e Binary files /dev/null and b/member/editor/umeditor/lang/en/images/rotateleftdisable.png differ diff --git a/member/editor/umeditor/lang/en/images/rotateleftenable.png b/member/editor/umeditor/lang/en/images/rotateleftenable.png new file mode 100644 index 0000000..e164ddb Binary files /dev/null and b/member/editor/umeditor/lang/en/images/rotateleftenable.png differ diff --git a/member/editor/umeditor/lang/en/images/rotaterightdisable.png b/member/editor/umeditor/lang/en/images/rotaterightdisable.png new file mode 100644 index 0000000..5a78c26 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/rotaterightdisable.png differ diff --git a/member/editor/umeditor/lang/en/images/rotaterightenable.png b/member/editor/umeditor/lang/en/images/rotaterightenable.png new file mode 100644 index 0000000..d768531 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/rotaterightenable.png differ diff --git a/member/editor/umeditor/lang/en/images/upload.png b/member/editor/umeditor/lang/en/images/upload.png new file mode 100644 index 0000000..7bb15b3 Binary files /dev/null and b/member/editor/umeditor/lang/en/images/upload.png differ diff --git a/member/editor/umeditor/lang/zh-cn/images/copy.png b/member/editor/umeditor/lang/zh-cn/images/copy.png new file mode 100644 index 0000000..b2536aa Binary files /dev/null and b/member/editor/umeditor/lang/zh-cn/images/copy.png differ diff --git a/member/editor/umeditor/lang/zh-cn/images/imglabel.png b/member/editor/umeditor/lang/zh-cn/images/imglabel.png new file mode 100644 index 0000000..4fc3c88 Binary files /dev/null and b/member/editor/umeditor/lang/zh-cn/images/imglabel.png differ diff --git a/member/editor/umeditor/lang/zh-cn/images/localimage.png b/member/editor/umeditor/lang/zh-cn/images/localimage.png new file mode 100644 index 0000000..7303c36 Binary files /dev/null and b/member/editor/umeditor/lang/zh-cn/images/localimage.png differ diff --git a/member/editor/umeditor/lang/zh-cn/images/music.png b/member/editor/umeditor/lang/zh-cn/images/music.png new file mode 100644 index 0000000..354edeb Binary files /dev/null and b/member/editor/umeditor/lang/zh-cn/images/music.png differ diff --git a/member/editor/umeditor/lang/zh-cn/images/upload.png b/member/editor/umeditor/lang/zh-cn/images/upload.png new file mode 100644 index 0000000..08d4d92 Binary files /dev/null and b/member/editor/umeditor/lang/zh-cn/images/upload.png differ diff --git a/member/editor/umeditor/lang/zh-cn/zh-cn.js b/member/editor/umeditor/lang/zh-cn/zh-cn.js new file mode 100644 index 0000000..5f4a5e5 --- /dev/null +++ b/member/editor/umeditor/lang/zh-cn/zh-cn.js @@ -0,0 +1,150 @@ +/** + * 中文语言包 + */ +UM.I18N['zh-cn'] = { + 'labelMap':{ + 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图', + 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框', + 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用', + 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览', + 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期', + 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格', + 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格', + 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言','fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'image':'图片', + 'edittable':'表格属性','edittd':'单元格属性', 'link':'超链接','emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'百度地图', 'gmap':'Google地图', + 'video':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表', + 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入', + 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'highlightcode':'插入代码', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认', + 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存', + 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', 'webapp':'百度应用', + 'touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦','music':'音乐','inserttable':'插入表格', + 'drafts': '草稿箱', 'formula':'数学公式' + + + }, + 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'}, + 'fontfamily':{ + 'songti':'宋体', + 'kaiti':'楷体', + 'heiti':'黑体', + 'lishu':'隶书', + 'yahei':'微软雅黑', + 'andaleMono':'andale mono', + 'arial': 'arial', + 'arialBlack':'arial black', + 'comicSansMs':'comic sans ms', + 'impact':'impact', + 'timesNewRoman':'times new roman' + }, + 'ok':"确认", + 'cancel':"取消", + 'closeDialog':"关闭对话框", + 'tableDrag':"表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'anthorMsg':"链接", + 'clearColor':'清空颜色', + 'standardColor':'标准颜色', + 'themeColor':'主题颜色', + 'property':'属性', + 'default':'默认', + 'modify':'修改', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中', + 'justify':'默认', + 'clear':'清除', + 'anchorMsg':'锚点', + 'delete':'删除', + 'clickToUpload':"点击上传", + 'unset':'尚未设置语言文件', + 't_row':'行', + 't_col':'列', + 'more':'更多', + 'pasteOpt':'粘贴选项', + 'pasteSourceFormat':"保留源格式", + 'tagFormat':'只保留标签', + 'pasteTextFormat':'只保留文本', + + //===============dialog i18N======================= + 'image':{ + 'static':{ + 'lang_tab_local':"本地上传", + 'lang_tab_imgSearch':"网络图片", + 'lang_input_dragTip':"支持图片拖拽上传", + 'lang_btn_add':"添加" + }, + 'uploadError': '上传出错' + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'精选', + 'lang_input_Tuzki':'兔斯基', + 'lang_input_BOBO':'BOBO', + 'lang_input_lvdouwa':'绿豆蛙', + 'lang_input_babyCat':'baby猫', + 'lang_input_bubble':'泡泡', + 'lang_input_youa':'有啊' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'地址', + 'lang_input_search':'搜索', + 'address':{'value':"北京"} + }, + 'searchError':'无法定位到该地址!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'文本内容:', + 'lang_input_url':'链接地址:', + 'lang_input_title':'标题:', + 'lang_input_target':'是否在新窗口打开:' + }, + 'validLink':'只支持选中一个链接时生效', + 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map':{ + 'static':{ + 'lang_city':"城市", + 'lang_address':"地址", + 'city':{'value':"北京"}, + 'lang_search':"搜索", + 'lang_dynamicmap':"插入动态地图" + }, + 'cityMsg':"请选择城市", + 'errorMsg':"抱歉,找不到该位置!" + }, + 'video':{ + 'static':{ + 'lang_tab_insertV':"插入视频", + 'lang_video_url':"视频网址", + 'lang_video_size':"视频尺寸", + 'lang_videoW':"宽度", + 'lang_videoH':"高度", + 'lang_alignment':"对齐方式", + 'videoSearchTxt':{'value':"请输入搜索关键字!"}, + 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn':{'value':"百度一下"}, + 'videoSearchReset':{'value':"清空结果"} + }, + 'numError':"请输入正确的数值,如123,400", + 'floatLeft':"左浮动", + 'floatRight':"右浮动", + 'default':"默认", + 'block':"独占一行", + 'urlError':"输入的视频地址有误,请检查后再试!", + 'loading':"  视频加载中,请等待……", + 'clickToSelect':"点击选中", + 'goToSource':'访问源视频', + 'noVideo':"    抱歉,找不到对应的视频,请重试!" + }, + 'formula':{ + 'static':{ + 'lang_tab_common':'常用公式', + 'lang_tab_symbol':'符号', + 'lang_tab_letter':'字母' + } + } +}; \ No newline at end of file diff --git a/member/editor/umeditor/themes/default/css/umeditor.css b/member/editor/umeditor/themes/default/css/umeditor.css new file mode 100644 index 0000000..3a51c6a --- /dev/null +++ b/member/editor/umeditor/themes/default/css/umeditor.css @@ -0,0 +1,773 @@ +.edui-container{ + position: relative; + border: 1px solid #d4d4d4; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #fff; +} +.edui-container .edui-toolbar{ + position: relative; + width:auto; + border-bottom: 1px solid #e1e1e1; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #fafafa; + z-index: 99999; +} +.edui-toolbar .edui-btn-toolbar{ + position: relative; + padding: 5px; +} +.edui-container .edui-editor-body{ + background-color: #fff; +} +.edui-editor-body .edui-body-container{ +} + +.edui-editor-body .edui-body-container p{margin:5px 0;} +.edui-editor-body .edui-body-container{ + border:0; + outline:none; + cursor:text; + padding:0 10px 0; + overflow:auto; + display:block; + word-wrap:break-word; + font-size:16px; + font-family:sans-serif; +} +.edui-editor-body.focus{border:1px solid #5c9dff} +.edui-editor-body table{margin:10px 0 10px;border-collapse:collapse;display:table;} +.edui-editor-body td{padding: 5px 10px;border: 1px solid #DDD;} +.edui-editor-body iframe.mathquill-embedded-latex{ + border: 0px; + padding: 0px; + display: inline; + margin: 0px; + background: none; + vertical-align: middle; + width: 0px; + height: 0px; +} +/*普通按钮*/ +.edui-btn-toolbar .edui-btn{ + position: relative; + display: inline-block; + vertical-align: top; + *display: inline; + *zoom:1; + width:auto; + margin: 0 1px; + padding:1px; + border:none; + background: none; +} +.edui-btn-toolbar .edui-btn .edui-icon{ + width: 20px; + height: 20px; + margin: 0; + padding:0; + background-repeat: no-repeat; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +/*状态反射*/ +.edui-btn-toolbar .edui-btn.edui-hover, +.edui-btn-toolbar .edui-btn.edui-active{ + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; + _z-index: 1; +} +.edui-btn-toolbar .edui-btn.edui-disabled{ + opacity: 0.3; + filter: alpha(opacity = 30); +} +.edui-btn-toolbar .edui-btn .edui-icon-source { + background-position:-260px -0px; +} +.edui-btn-toolbar .edui-btn .edui-icon-undo { + background-position: -160px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-redo { + background-position: -100px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-bold{ + background-position: 0 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-italic { + background-position: -60px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-underline { + background-position: -140px 0 +} +.edui-btn-toolbar .edui-btn .edui-icon-strikethrough { + background-position: -120px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-superscript { + background-position: -620px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-subscript { + background-position: -600px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-font, .edui-btn-toolbar .edui-btn .edui-icon-forecolor { + background-position: -720px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-backcolor { + background-position: -760px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist { + background-position: -80px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist { + background-position: -20px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-selectall { + background-position: -400px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-cleardoc { + background-position: -520px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-paragraph { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-fontfamily { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-fontsize { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyleft { + background-position: -460px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifycenter { + background-position: -420px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyright { + background-position:-480px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify { + background-position: -440px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-link { + background-position: -500px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-unlink { + background-position: -640px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-image { + background-position: -380px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-emotion { + background-position: -60px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-video { + background-position: -320px -20px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-map { + background-position: -40px -40px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-gmap { + background-position: -260px -40px; +} +.edui-btn-toolbar .edui-btn .edui-icon-horizontal { + background-position: -360px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-print { + background-position: -440px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-preview { + background-position: -420px -20px; +} + +.edui-btn-toolbar .edui-btn-fullscreen{ + float:right; +} +.edui-btn-toolbar .edui-btn .edui-icon-fullscreen { + background-position: -100px -20px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-removeformat { + background-position: -580px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-drafts { + background-position: -560px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-formula { + background-position: -80px -20px; +} +.edui-btn-toolbar .edui-splitbutton{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + margin:0 2px; +} +.edui-splitbutton .edui-btn{ + margin: 0; +} +.edui-splitbutton .edui-caret{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + width: 8px; + height: 20px; + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; +} + +.edui-btn-toolbar .edui-splitbutton, +.edui-btn-toolbar .edui-splitbutton{ + _border: none; +} + +/*状态反射*/ +.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{ + background-color: #d5e1f2; +} + +.edui-btn-toolbar .edui-splitbutton.edui-disabled{ + opacity: 0.3; + filter: alpha(opacity = 30); +} +.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{ + opacity: 0.3 \0; + filter: alpha(opacity = 30)\0; +} + + +.edui-btn-toolbar .edui-combobox{ + border: 1px solid #CCC; + padding:0; + margin:0 2px; + line-height: 20px; +} +.edui-combobox .edui-button-label{ + position: relative; + display: inline-block; + vertical-align: top; + *display: inline ; + *zoom:1; + width:60px; + height:20px; + line-height: 20px; + padding: 2px; + margin: 0; + font-size: 12px; + text-align: center; + cursor: default; +} +.edui-combobox .edui-button-spacing{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + height:20px; + margin: 0; + padding:0 3px; +} +.edui-combobox .edui-caret{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + height:20px; + width: 12px; + margin: 0; + padding: 0; + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; +} +.edui-btn-toolbar .edui-combobox.edui-disabled{ + opacity: 0.2; + filter: alpha(opacity = 20); +} +.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label, +.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{ + opacity: 0.2 \0; + filter: alpha(opacity = 20)\0; +} +.edui-combobox-menu{ + position: absolute; + top: 100%; + left: 0; + display: none; + list-style: none; + text-decoration: none; + margin: 0; + padding:5px; + background-color: #ffffff; + border: 1px solid #ccc; + font-size: 12px; + box-shadow: 2px 2px 5px #d3d6da; + min-width: 160px; + _width: 160px; +} + +.edui-combobox-menu .edui-combobox-item { + display: block; + border: 1px solid white; +} + +.edui-combobox-menu .edui-combobox-item-label { + height: 25px; + line-height: 25px; + display: inline-block; + _display: inline; + _zoom: 1; + margin-left: 10px; +} + +.edui-combobox-menu .edui-combobox-item:hover, .edui-combobox-menu .edui-combobox-stack-item:hover, .edui-combobox-menu .edui-combobox-item-hover { + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; +} + +.edui-combobox-menu .edui-combobox-item .edui-combobox-icon { + display: inline-block; + *zoom: 1; + *display: inline; + width: 24px; + height: 25px; + background: red; + vertical-align: bottom; + background: url(../images/ok.gif) no-repeat 1000px 1000px; +} + +.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + + +.edui-combobox-menu .edui-combobox-item-separator { + min-width: 160px; + height: 1px; + line-height: 1px; + overflow: hidden; + background: #d3d3d3; + margin: 5px 0; + *margin-top: -8px; +} + +/* 字体样式校正 */ + +.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +/* 24 */ +.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label { + height: 27px; + line-height: 27px; +} + +.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 5px; +} + +/* 32 */ +.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label { + height: 31px; + line-height: 31px; +} + +.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 4px; +} + + +/* 48 */ +.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label { + height: 47px; + line-height: 47px; +} + +/*.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-icon {*/ + /*height: 25px;*/ + /*margin-bottom: 11px;*/ +/*}*/ + +/*.edui-combobox-fontsize .edui-combobox-item-6.edui-combobox-checked .edui-combobox-icon {*/ + /*background-position: 10px 7px;*/ +/*}*/ + + +/* 段落样式校正 */ +/* h1 */ +.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label { + font-size: 32px; + height: 36px; + line-height: 36px; +} + +.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon { + height: 25px; + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +/* h2 */ +.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label { + font-size: 28px; + height: 27px; + line-height: 27px; +} + +.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon { + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 10px; +} + +/* h3 */ +.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label { + font-size: 24px; + height: 25px; + line-height: 25px; +} + +.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon { + height: 25px; + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 11px; +} + +/* h4 */ +.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label { + font-size: 18px; + height: 25px; + line-height: 25px; +} + +.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 6px; +} + +/* h5 */ +.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label { + font-size: 16px; +} + +/* h6 */ +.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label { + font-size: 12px; +} +.edui-modal { + position: fixed; + _position: absolute; + top: 10%; + left: 50%; + border: 1px solid #acacac; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #ffffff; + outline: 0; +} +.edui-modal-header { + padding: 5px 10px; + border-bottom: 1px solid #eee; +} +.edui-modal-header .edui-close { + float: right; + width:20px; + height:20px; + margin-top: 2px; + padding: 1px; + border: 0; + background: url("../images/close.png") no-repeat center center; + cursor: pointer; +} +.edui-modal-header .edui-close.edui-hover { + background-color: #d5e1f2; + padding:0; + border: 1px solid #a3bde3; +} +.edui-modal-header .edui-title { + margin: 0; + line-height: 25px; + font-size: 20px; +} +.edui-modal-body { + position: relative; + max-height: 400px; + font-size: 12px; + overflow-y: auto; +} +.edui-modal-footer { + float: right; + padding: 5px 15px 15px; + overflow: hidden; +} +.edui-modal-footer .edui-btn { + float: left; + height: 24px; + width: 96px; + margin: 0 10px; + background-color: #ffffff; + padding: 0; + border: 1px solid #ababab; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: pointer; +} +.edui-modal-footer .edui-btn.edui-hover{ + background-color: #d5e1f2; + border: 1px solid #a3bde3; +} +.edui-modal-backdrop{ + opacity: 0.5; + filter: alpha(opacity=50); + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #c6c6c6; +} + +.edui-modal .edui-modal-tip { + color: red; + position: absolute; + bottom: 10px; + left: 10px; + height: 30px; + line-height: 30px; + display: none; +} +/*图片上传*/ +.edui-dialog-image-body { + width: 700px; + height: 400px; +} +/*插入视频*/ +.edui-dialog-video-body{ + width: 600px; + height: 350px; +} +/*谷歌地图*/ +.edui-dialog-gmap-body{ + width:550px; + height: 400px; +} + +/*百度地图*/ +.edui-dialog-map-body{ + width:580px; + height: 400px; +} + +/*链接*/ +.edui-dialog-link-body{ + width:400px; + height:200px; +} +.edui-popup{ + display: none; + background: url('../images/pop-bg.png') repeat #fff; + padding: 2px; +} +.edui-popup .edui-popup-body{ + border: 1px solid #bfbfbf; + background-color: #fff; +} +.edui-popup .edui-popup-caret{ + width: 21px; + height: 11px; +} +.edui-popup .edui-popup-caret.up{ + background:url('../images/caret.png') no-repeat 0 0; +} +.edui-popup .edui-popup-caret.down{ + background:url('../images/caret.png') no-repeat 0 0; +} + + +.edui-tab-nav { + margin: 0; + padding:0; + border-bottom: 1px solid #ddd; + list-style: none; + height:30px; +} +.edui-tab-nav .edui-tab-item { + float:left; + margin-bottom: -1px; + margin-top: 1px; + margin-top: 0\9; +} +.edui-tab-nav .edui-tab-item .edui-tab-text{ + display: block; + padding:8px 12px; + border: 1px solid transparent; + color: #0088cc; + text-decoration: none; + outline: 0; + _border:1px solid #fff ; + cursor: pointer; +} +.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS { + outline: none; +} +.edui-tab-nav .edui-tab-item.edui-active .edui-tab-text{ + border: 1px solid #ddd; + border-bottom-color: transparent; + background-color: #fff; + padding:8px 12px; + color: #555555; + cursor: default; +} +.edui-tab-content .edui-tab-pane{ + padding: 1px; + position: relative; + display: none; + background-color: #fff; + clear: both; +} +.edui-tab-content .edui-tab-pane.edui-active{ + display: block; +} + + +.edui-btn-toolbar .edui-tooltip{ + position: absolute; + padding: 5px 0; + display: none; + /*opacity: 0.8;*/ + /*filter: alpha(opacity=80);*/ + z-index: 99999; +} +.edui-tooltip .edui-tooltip-arrow{ + position: absolute; + top: 0; + _top: -2px; + left: 50%; + width: 0; + height: 0; + padding: 0; + font-size:0; + margin-left: -5px; + border-color: transparent; + border-style: dashed dashed solid dashed; + border-bottom-color: #000000; + border-width: 0 5px 5px; + background: transparent; +} +.edui-tooltip .edui-tooltip-inner{ + padding: 6px; + color: #ffffff; + text-align: center; + text-decoration: none; + font-size: 10px; + background-color: #000000; + white-space: nowrap; + line-height: 12px; +} +.edui-splitbutton-color-label { + width: 16px; + height: 3px; + position: absolute; + bottom: 2px; + left: 50%; + margin-left: -8px; + overflow: hidden; + line-height: 3px; +} +.edui-popup .edui-colorpicker { + margin: 10px; + font-size: 12px; +} +.edui-colorpicker .edui-colorpicker-topbar{ + height: 27px; + width: 200px; + overflow: hidden; +} +.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{ + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} +.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-nocolor{ + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} +.edui-colorpicker table{ + border-collapse: collapse; + border-spacing: 2px; +} +.edui-colorpicker tr.edui-colorpicker-firstrow{ + height: 30px; +} +.edui-colorpicker table td{ + padding: 0 2px; +} +.edui-colorpicker table td .edui-colorpicker-colorcell{ + display: block; + text-decoration: none; + color: black; + width: 14px; + height: 14px; + margin: 0; + cursor: pointer; +} +.edui-toolbar .edui-separator{ + width: 2px; + height: 20px; + padding: 1px 2px; + background: url(../images/icons.png) -179px 1px; + background: url(../images/icons.gif) -179px 1px \9; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + border:none; + +} \ No newline at end of file diff --git a/member/editor/umeditor/themes/default/css/umeditor.css.bak b/member/editor/umeditor/themes/default/css/umeditor.css.bak new file mode 100644 index 0000000..de146d6 --- /dev/null +++ b/member/editor/umeditor/themes/default/css/umeditor.css.bak @@ -0,0 +1,774 @@ +.edui-container{ + width:600px; + position: relative; + border: 1px solid #d4d4d4; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #fff; +} +.edui-container .edui-toolbar{ + position: relative; + width:auto; + border-bottom: 1px solid #e1e1e1; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #fafafa; + z-index: 99999; +} +.edui-toolbar .edui-btn-toolbar{ + position: relative; + padding: 5px; +} +.edui-container .edui-editor-body{ + background-color: #fff; +} +.edui-editor-body .edui-body-container{ +} + +.edui-editor-body .edui-body-container p{margin:5px 0;} +.edui-editor-body .edui-body-container{ + border:0; + outline:none; + cursor:text; + padding:0 10px 0; + overflow:auto; + display:block; + word-wrap:break-word; + font-size:16px; + font-family:sans-serif; +} +.edui-editor-body.focus{border:1px solid #5c9dff} +.edui-editor-body table{margin:10px 0 10px;border-collapse:collapse;display:table;} +.edui-editor-body td{padding: 5px 10px;border: 1px solid #DDD;} +.edui-editor-body iframe.mathquill-embedded-latex{ + border: 0px; + padding: 0px; + display: inline; + margin: 0px; + background: none; + vertical-align: middle; + width: 0px; + height: 0px; +} +/*普通按钮*/ +.edui-btn-toolbar .edui-btn{ + position: relative; + display: inline-block; + vertical-align: top; + *display: inline; + *zoom:1; + width:auto; + margin: 0 1px; + padding:1px; + border:none; + background: none; +} +.edui-btn-toolbar .edui-btn .edui-icon{ + width: 20px; + height: 20px; + margin: 0; + padding:0; + background-repeat: no-repeat; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +/*状态反射*/ +.edui-btn-toolbar .edui-btn.edui-hover, +.edui-btn-toolbar .edui-btn.edui-active{ + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; + _z-index: 1; +} +.edui-btn-toolbar .edui-btn.edui-disabled{ + opacity: 0.3; + filter: alpha(opacity = 30); +} +.edui-btn-toolbar .edui-btn .edui-icon-source { + background-position:-260px -0px; +} +.edui-btn-toolbar .edui-btn .edui-icon-undo { + background-position: -160px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-redo { + background-position: -100px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-bold{ + background-position: 0 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-italic { + background-position: -60px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-underline { + background-position: -140px 0 +} +.edui-btn-toolbar .edui-btn .edui-icon-strikethrough { + background-position: -120px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-superscript { + background-position: -620px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-subscript { + background-position: -600px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-font, .edui-btn-toolbar .edui-btn .edui-icon-forecolor { + background-position: -720px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-backcolor { + background-position: -760px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist { + background-position: -80px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist { + background-position: -20px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-selectall { + background-position: -400px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-cleardoc { + background-position: -520px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-paragraph { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-fontfamily { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-fontsize { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyleft { + background-position: -460px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifycenter { + background-position: -420px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyright { + background-position:-480px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify { + background-position: -440px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-link { + background-position: -500px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-unlink { + background-position: -640px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-image { + background-position: -380px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-emotion { + background-position: -60px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-video { + background-position: -320px -20px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-map { + background-position: -40px -40px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-gmap { + background-position: -260px -40px; +} +.edui-btn-toolbar .edui-btn .edui-icon-horizontal { + background-position: -360px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-print { + background-position: -440px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-preview { + background-position: -420px -20px; +} + +.edui-btn-toolbar .edui-btn-fullscreen{ + float:right; +} +.edui-btn-toolbar .edui-btn .edui-icon-fullscreen { + background-position: -100px -20px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-removeformat { + background-position: -580px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-drafts { + background-position: -560px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-formula { + background-position: -80px -20px; +} +.edui-btn-toolbar .edui-splitbutton{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + margin:0 2px; +} +.edui-splitbutton .edui-btn{ + margin: 0; +} +.edui-splitbutton .edui-caret{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + width: 8px; + height: 20px; + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; +} + +.edui-btn-toolbar .edui-splitbutton, +.edui-btn-toolbar .edui-splitbutton{ + _border: none; +} + +/*状态反射*/ +.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{ + background-color: #d5e1f2; +} + +.edui-btn-toolbar .edui-splitbutton.edui-disabled{ + opacity: 0.3; + filter: alpha(opacity = 30); +} +.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{ + opacity: 0.3 \0; + filter: alpha(opacity = 30)\0; +} + + +.edui-btn-toolbar .edui-combobox{ + border: 1px solid #CCC; + padding:0; + margin:0 2px; + line-height: 20px; +} +.edui-combobox .edui-button-label{ + position: relative; + display: inline-block; + vertical-align: top; + *display: inline ; + *zoom:1; + width:60px; + height:20px; + line-height: 20px; + padding: 2px; + margin: 0; + font-size: 12px; + text-align: center; + cursor: default; +} +.edui-combobox .edui-button-spacing{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + height:20px; + margin: 0; + padding:0 3px; +} +.edui-combobox .edui-caret{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + height:20px; + width: 12px; + margin: 0; + padding: 0; + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; +} +.edui-btn-toolbar .edui-combobox.edui-disabled{ + opacity: 0.2; + filter: alpha(opacity = 20); +} +.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label, +.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{ + opacity: 0.2 \0; + filter: alpha(opacity = 20)\0; +} +.edui-combobox-menu{ + position: absolute; + top: 100%; + left: 0; + display: none; + list-style: none; + text-decoration: none; + margin: 0; + padding:5px; + background-color: #ffffff; + border: 1px solid #ccc; + font-size: 12px; + box-shadow: 2px 2px 5px #d3d6da; + min-width: 160px; + _width: 160px; +} + +.edui-combobox-menu .edui-combobox-item { + display: block; + border: 1px solid white; +} + +.edui-combobox-menu .edui-combobox-item-label { + height: 25px; + line-height: 25px; + display: inline-block; + _display: inline; + _zoom: 1; + margin-left: 10px; +} + +.edui-combobox-menu .edui-combobox-item:hover, .edui-combobox-menu .edui-combobox-stack-item:hover, .edui-combobox-menu .edui-combobox-item-hover { + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; +} + +.edui-combobox-menu .edui-combobox-item .edui-combobox-icon { + display: inline-block; + *zoom: 1; + *display: inline; + width: 24px; + height: 25px; + background: red; + vertical-align: bottom; + background: url(../images/ok.gif) no-repeat 1000px 1000px; +} + +.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + + +.edui-combobox-menu .edui-combobox-item-separator { + min-width: 160px; + height: 1px; + line-height: 1px; + overflow: hidden; + background: #d3d3d3; + margin: 5px 0; + *margin-top: -8px; +} + +/* 字体样式校正 */ + +.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +/* 24 */ +.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label { + height: 27px; + line-height: 27px; +} + +.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 5px; +} + +/* 32 */ +.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label { + height: 31px; + line-height: 31px; +} + +.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 4px; +} + + +/* 48 */ +.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label { + height: 47px; + line-height: 47px; +} + +/*.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-icon {*/ + /*height: 25px;*/ + /*margin-bottom: 11px;*/ +/*}*/ + +/*.edui-combobox-fontsize .edui-combobox-item-6.edui-combobox-checked .edui-combobox-icon {*/ + /*background-position: 10px 7px;*/ +/*}*/ + + +/* 段落样式校正 */ +/* h1 */ +.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label { + font-size: 32px; + height: 36px; + line-height: 36px; +} + +.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon { + height: 25px; + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +/* h2 */ +.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label { + font-size: 28px; + height: 27px; + line-height: 27px; +} + +.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon { + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 10px; +} + +/* h3 */ +.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label { + font-size: 24px; + height: 25px; + line-height: 25px; +} + +.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon { + height: 25px; + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 11px; +} + +/* h4 */ +.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label { + font-size: 18px; + height: 25px; + line-height: 25px; +} + +.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 6px; +} + +/* h5 */ +.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label { + font-size: 16px; +} + +/* h6 */ +.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label { + font-size: 12px; +} +.edui-modal { + position: fixed; + _position: absolute; + top: 10%; + left: 50%; + border: 1px solid #acacac; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #ffffff; + outline: 0; +} +.edui-modal-header { + padding: 5px 10px; + border-bottom: 1px solid #eee; +} +.edui-modal-header .edui-close { + float: right; + width:20px; + height:20px; + margin-top: 2px; + padding: 1px; + border: 0; + background: url("../images/close.png") no-repeat center center; + cursor: pointer; +} +.edui-modal-header .edui-close.edui-hover { + background-color: #d5e1f2; + padding:0; + border: 1px solid #a3bde3; +} +.edui-modal-header .edui-title { + margin: 0; + line-height: 25px; + font-size: 20px; +} +.edui-modal-body { + position: relative; + max-height: 400px; + font-size: 12px; + overflow-y: auto; +} +.edui-modal-footer { + float: right; + padding: 5px 15px 15px; + overflow: hidden; +} +.edui-modal-footer .edui-btn { + float: left; + height: 24px; + width: 96px; + margin: 0 10px; + background-color: #ffffff; + padding: 0; + border: 1px solid #ababab; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: pointer; +} +.edui-modal-footer .edui-btn.edui-hover{ + background-color: #d5e1f2; + border: 1px solid #a3bde3; +} +.edui-modal-backdrop{ + opacity: 0.5; + filter: alpha(opacity=50); + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #c6c6c6; +} + +.edui-modal .edui-modal-tip { + color: red; + position: absolute; + bottom: 10px; + left: 10px; + height: 30px; + line-height: 30px; + display: none; +} +/*图片上传*/ +.edui-dialog-image-body { + width: 700px; + height: 400px; +} +/*插入视频*/ +.edui-dialog-video-body{ + width: 600px; + height: 350px; +} +/*谷歌地图*/ +.edui-dialog-gmap-body{ + width:550px; + height: 400px; +} + +/*百度地图*/ +.edui-dialog-map-body{ + width:580px; + height: 400px; +} + +/*链接*/ +.edui-dialog-link-body{ + width:400px; + height:200px; +} +.edui-popup{ + display: none; + background: url('../images/pop-bg.png') repeat #fff; + padding: 2px; +} +.edui-popup .edui-popup-body{ + border: 1px solid #bfbfbf; + background-color: #fff; +} +.edui-popup .edui-popup-caret{ + width: 21px; + height: 11px; +} +.edui-popup .edui-popup-caret.up{ + background:url('../images/caret.png') no-repeat 0 0; +} +.edui-popup .edui-popup-caret.down{ + background:url('../images/caret.png') no-repeat 0 0; +} + + +.edui-tab-nav { + margin: 0; + padding:0; + border-bottom: 1px solid #ddd; + list-style: none; + height:30px; +} +.edui-tab-nav .edui-tab-item { + float:left; + margin-bottom: -1px; + margin-top: 1px; + margin-top: 0\9; +} +.edui-tab-nav .edui-tab-item .edui-tab-text{ + display: block; + padding:8px 12px; + border: 1px solid transparent; + color: #0088cc; + text-decoration: none; + outline: 0; + _border:1px solid #fff ; + cursor: pointer; +} +.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS { + outline: none; +} +.edui-tab-nav .edui-tab-item.edui-active .edui-tab-text{ + border: 1px solid #ddd; + border-bottom-color: transparent; + background-color: #fff; + padding:8px 12px; + color: #555555; + cursor: default; +} +.edui-tab-content .edui-tab-pane{ + padding: 1px; + position: relative; + display: none; + background-color: #fff; + clear: both; +} +.edui-tab-content .edui-tab-pane.edui-active{ + display: block; +} + + +.edui-btn-toolbar .edui-tooltip{ + position: absolute; + padding: 5px 0; + display: none; + /*opacity: 0.8;*/ + /*filter: alpha(opacity=80);*/ + z-index: 99999; +} +.edui-tooltip .edui-tooltip-arrow{ + position: absolute; + top: 0; + _top: -2px; + left: 50%; + width: 0; + height: 0; + padding: 0; + font-size:0; + margin-left: -5px; + border-color: transparent; + border-style: dashed dashed solid dashed; + border-bottom-color: #000000; + border-width: 0 5px 5px; + background: transparent; +} +.edui-tooltip .edui-tooltip-inner{ + padding: 6px; + color: #ffffff; + text-align: center; + text-decoration: none; + font-size: 10px; + background-color: #000000; + white-space: nowrap; + line-height: 12px; +} +.edui-splitbutton-color-label { + width: 16px; + height: 3px; + position: absolute; + bottom: 2px; + left: 50%; + margin-left: -8px; + overflow: hidden; + line-height: 3px; +} +.edui-popup .edui-colorpicker { + margin: 10px; + font-size: 12px; +} +.edui-colorpicker .edui-colorpicker-topbar{ + height: 27px; + width: 200px; + overflow: hidden; +} +.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{ + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} +.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-nocolor{ + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} +.edui-colorpicker table{ + border-collapse: collapse; + border-spacing: 2px; +} +.edui-colorpicker tr.edui-colorpicker-firstrow{ + height: 30px; +} +.edui-colorpicker table td{ + padding: 0 2px; +} +.edui-colorpicker table td .edui-colorpicker-colorcell{ + display: block; + text-decoration: none; + color: black; + width: 14px; + height: 14px; + margin: 0; + cursor: pointer; +} +.edui-toolbar .edui-separator{ + width: 2px; + height: 20px; + padding: 1px 2px; + background: url(../images/icons.png) -179px 1px; + background: url(../images/icons.gif) -179px 1px \9; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + border:none; + +} \ No newline at end of file diff --git a/member/editor/umeditor/themes/default/css/umeditor.min.css b/member/editor/umeditor/themes/default/css/umeditor.min.css new file mode 100644 index 0000000..fc686c7 --- /dev/null +++ b/member/editor/umeditor/themes/default/css/umeditor.min.css @@ -0,0 +1,8 @@ +/*! + * UEditor Mini版本 + * version: 1.2.2 + * build: Fri Feb 10 2017 15:00:06 GMT+0800 (CST) + */ + + +.edui-container{position:relative;border:1px solid #d4d4d4;box-shadow:2px 2px 5px #d3d6da;background-color:#fff}.edui-container .edui-toolbar{position:relative;width:auto;border-bottom:1px solid #e1e1e1;box-shadow:2px 2px 5px #d3d6da;background-color:#fafafa;z-index:99999}.edui-toolbar .edui-btn-toolbar{position:relative;padding:5px}.edui-container .edui-editor-body{background-color:#fff}.edui-editor-body .edui-body-container{}.edui-editor-body .edui-body-container p{margin:5px 0}.edui-editor-body .edui-body-container{border:0;outline:0;cursor:text;padding:0 10px;overflow:auto;display:block;word-wrap:break-word;font-size:16px;font-family:sans-serif}.edui-editor-body.focus{border:1px solid #5c9dff}.edui-editor-body table{margin:10px 0;border-collapse:collapse;display:table}.edui-editor-body td{padding:5px 10px;border:1px solid #DDD}.edui-editor-body iframe.mathquill-embedded-latex{border:0;padding:0;display:inline;margin:0;background:0 0;vertical-align:middle;width:0;height:0}.edui-btn-toolbar .edui-btn{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:auto;margin:0 1px;padding:1px;border:0;background:0 0}.edui-btn-toolbar .edui-btn .edui-icon{width:20px;height:20px;margin:0;padding:0;background-repeat:no-repeat;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-btn-toolbar .edui-btn.edui-hover,.edui-btn-toolbar .edui-btn.edui-active{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3;_z-index:1}.edui-btn-toolbar .edui-btn.edui-disabled{opacity:.3;filter:alpha(opacity=30)}.edui-btn-toolbar .edui-btn .edui-icon-source{background-position:-260px -0px}.edui-btn-toolbar .edui-btn .edui-icon-undo{background-position:-160px 0}.edui-btn-toolbar .edui-btn .edui-icon-redo{background-position:-100px 0}.edui-btn-toolbar .edui-btn .edui-icon-bold{background-position:0 0}.edui-btn-toolbar .edui-btn .edui-icon-italic{background-position:-60px 0}.edui-btn-toolbar .edui-btn .edui-icon-underline{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-strikethrough{background-position:-120px 0}.edui-btn-toolbar .edui-btn .edui-icon-superscript{background-position:-620px 0}.edui-btn-toolbar .edui-btn .edui-icon-subscript{background-position:-600px 0}.edui-btn-toolbar .edui-btn .edui-icon-font,.edui-btn-toolbar .edui-btn .edui-icon-forecolor{background-position:-720px 0}.edui-btn-toolbar .edui-btn .edui-icon-backcolor{background-position:-760px 0}.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist{background-position:-80px 0}.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist{background-position:-20px 0}.edui-btn-toolbar .edui-btn .edui-icon-selectall{background-position:-400px -20px}.edui-btn-toolbar .edui-btn .edui-icon-cleardoc{background-position:-520px 0}.edui-btn-toolbar .edui-btn .edui-icon-paragraph{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-fontfamily{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-fontsize{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyleft{background-position:-460px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifycenter{background-position:-420px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyright{background-position:-480px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify{background-position:-440px 0}.edui-btn-toolbar .edui-btn .edui-icon-link{background-position:-500px 0}.edui-btn-toolbar .edui-btn .edui-icon-unlink{background-position:-640px 0}.edui-btn-toolbar .edui-btn .edui-icon-image{background-position:-380px 0}.edui-btn-toolbar .edui-btn .edui-icon-emotion{background-position:-60px -20px}.edui-btn-toolbar .edui-btn .edui-icon-video{background-position:-320px -20px}.edui-btn-toolbar .edui-btn .edui-icon-map{background-position:-40px -40px}.edui-btn-toolbar .edui-btn .edui-icon-gmap{background-position:-260px -40px}.edui-btn-toolbar .edui-btn .edui-icon-horizontal{background-position:-360px 0}.edui-btn-toolbar .edui-btn .edui-icon-print{background-position:-440px -20px}.edui-btn-toolbar .edui-btn .edui-icon-preview{background-position:-420px -20px}.edui-btn-toolbar .edui-btn-fullscreen{float:right}.edui-btn-toolbar .edui-btn .edui-icon-fullscreen{background-position:-100px -20px}.edui-btn-toolbar .edui-btn .edui-icon-removeformat{background-position:-580px 0}.edui-btn-toolbar .edui-btn .edui-icon-drafts{background-position:-560px 0}.edui-btn-toolbar .edui-btn .edui-icon-formula{background-position:-80px -20px}.edui-btn-toolbar .edui-splitbutton{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;margin:0 2px}.edui-splitbutton .edui-btn{margin:0}.edui-splitbutton .edui-caret{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:8px;height:20px;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-btn-toolbar .edui-splitbutton,.edui-btn-toolbar .edui-splitbutton{_border:0}.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{background-color:#d5e1f2}.edui-btn-toolbar .edui-splitbutton.edui-disabled{opacity:.3;filter:alpha(opacity=30)}.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{opacity:.3 \0;filter:alpha(opacity=30)\0}.edui-btn-toolbar .edui-combobox{border:1px solid #CCC;padding:0;margin:0 2px;line-height:20px}.edui-combobox .edui-button-label{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:60px;height:20px;line-height:20px;padding:2px;margin:0;font-size:12px;text-align:center;cursor:default}.edui-combobox .edui-button-spacing{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;height:20px;margin:0;padding:0 3px}.edui-combobox .edui-caret{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;height:20px;width:12px;margin:0;padding:0;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-btn-toolbar .edui-combobox.edui-disabled{opacity:.2;filter:alpha(opacity=20)}.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label,.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{opacity:.2 \0;filter:alpha(opacity=20)\0}.edui-combobox-menu{position:absolute;top:100%;left:0;display:none;list-style:none;text-decoration:none;margin:0;padding:5px;background-color:#fff;border:1px solid #ccc;font-size:12px;box-shadow:2px 2px 5px #d3d6da;min-width:160px;_width:160px}.edui-combobox-menu .edui-combobox-item{display:block;border:1px solid #fff}.edui-combobox-menu .edui-combobox-item-label{height:25px;line-height:25px;display:inline-block;_display:inline;_zoom:1;margin-left:10px}.edui-combobox-menu .edui-combobox-item:hover,.edui-combobox-menu .edui-combobox-stack-item:hover,.edui-combobox-menu .edui-combobox-item-hover{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3}.edui-combobox-menu .edui-combobox-item .edui-combobox-icon{display:inline-block;*zoom:1;*display:inline;width:24px;height:25px;background:red;vertical-align:bottom;background:url(../images/ok.gif) no-repeat 1000px 1000px}.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-menu .edui-combobox-item-separator{min-width:160px;height:1px;line-height:1px;overflow:hidden;background:#d3d3d3;margin:5px 0;*margin-top:-8px}.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label{height:27px;line-height:27px}.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon{background-position:10px 5px}.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label{height:31px;line-height:31px}.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon{background-position:10px 4px}.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label{height:47px;line-height:47px}.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label{font-size:32px;height:36px;line-height:36px}.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon{height:25px;margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label{font-size:28px;height:27px;line-height:27px}.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon{margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon{background-position:10px 10px}.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label{font-size:24px;height:25px;line-height:25px}.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon{height:25px;margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon{background-position:10px 11px}.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label{font-size:18px;height:25px;line-height:25px}.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon{background-position:10px 6px}.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label{font-size:16px}.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label{font-size:12px}.edui-modal{position:fixed;_position:absolute;top:10%;left:50%;border:1px solid #acacac;box-shadow:2px 2px 5px #d3d6da;background-color:#fff;outline:0}.edui-modal-header{padding:5px 10px;border-bottom:1px solid #eee}.edui-modal-header .edui-close{float:right;width:20px;height:20px;margin-top:2px;padding:1px;border:0;background:url(../images/close.png) no-repeat center center;cursor:pointer}.edui-modal-header .edui-close.edui-hover{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3}.edui-modal-header .edui-title{margin:0;line-height:25px;font-size:20px}.edui-modal-body{position:relative;max-height:400px;font-size:12px;overflow-y:auto}.edui-modal-footer{float:right;padding:5px 15px 15px;overflow:hidden}.edui-modal-footer .edui-btn{float:left;height:24px;width:96px;margin:0 10px;background-color:#fff;padding:0;border:1px solid #ababab;font-size:12px;line-height:24px;text-align:center;cursor:pointer}.edui-modal-footer .edui-btn.edui-hover{background-color:#d5e1f2;border:1px solid #a3bde3}.edui-modal-backdrop{opacity:.5;filter:alpha(opacity=50);position:fixed;top:0;right:0;bottom:0;left:0;background-color:#c6c6c6}.edui-modal .edui-modal-tip{color:red;position:absolute;bottom:10px;left:10px;height:30px;line-height:30px;display:none}.edui-dialog-image-body{width:700px;height:400px}.edui-dialog-video-body{width:600px;height:350px}.edui-dialog-gmap-body{width:550px;height:400px}.edui-dialog-map-body{width:580px;height:400px}.edui-dialog-link-body{width:400px;height:200px}.edui-popup{display:none;background:url(../images/pop-bg.png) repeat #fff;padding:2px}.edui-popup .edui-popup-body{border:1px solid #bfbfbf;background-color:#fff}.edui-popup .edui-popup-caret{width:21px;height:11px}.edui-popup .edui-popup-caret.up{background:url(../images/caret.png) no-repeat 0 0}.edui-popup .edui-popup-caret.down{background:url(../images/caret.png) no-repeat 0 0}.edui-tab-nav{margin:0;padding:0;border-bottom:1px solid #ddd;list-style:none;height:30px}.edui-tab-nav .edui-tab-item{float:left;margin-bottom:-1px;margin-top:1px;margin-top:0\9}.edui-tab-nav .edui-tab-item .edui-tab-text{display:block;padding:8px 12px;border:1px solid transparent;color:#08c;text-decoration:none;outline:0;_border:1px solid #fff;cursor:pointer}.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS{outline:0}.edui-tab-nav .edui-tab-item.edui-active .edui-tab-text{border:1px solid #ddd;border-bottom-color:transparent;background-color:#fff;padding:8px 12px;color:#555;cursor:default}.edui-tab-content .edui-tab-pane{padding:1px;position:relative;display:none;background-color:#fff;clear:both}.edui-tab-content .edui-tab-pane.edui-active{display:block}.edui-btn-toolbar .edui-tooltip{position:absolute;padding:5px 0;display:none;z-index:99999}.edui-tooltip .edui-tooltip-arrow{position:absolute;top:0;_top:-2px;left:50%;width:0;height:0;padding:0;font-size:0;margin-left:-5px;border-color:transparent;border-style:dashed dashed solid;border-bottom-color:#000;border-width:0 5px 5px;background:transparent}.edui-tooltip .edui-tooltip-inner{padding:6px;color:#fff;text-align:center;text-decoration:none;font-size:10px;background-color:#000;white-space:nowrap;line-height:12px}.edui-splitbutton-color-label{width:16px;height:3px;position:absolute;bottom:2px;left:50%;margin-left:-8px;overflow:hidden;line-height:3px}.edui-popup .edui-colorpicker{margin:10px;font-size:12px}.edui-colorpicker .edui-colorpicker-topbar{height:27px;width:200px;overflow:hidden}.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:14px;height:14px;border:1px solid #333;padding:3px 5px;cursor:pointer}.edui-colorpicker table{border-collapse:collapse;border-spacing:2px}.edui-colorpicker tr.edui-colorpicker-firstrow{height:30px}.edui-colorpicker table td{padding:0 2px}.edui-colorpicker table td .edui-colorpicker-colorcell{display:block;text-decoration:none;color:#000;width:14px;height:14px;margin:0;cursor:pointer}.edui-toolbar .edui-separator{width:2px;height:20px;padding:1px 2px;background:url(../images/icons.png) -179px 1px;background:url(../images/icons.gif) -179px 1px \9;display:inline-block;vertical-align:top;*display:inline;*zoom:1;border:0} \ No newline at end of file diff --git a/member/editor/umeditor/themes/default/images/caret.png b/member/editor/umeditor/themes/default/images/caret.png new file mode 100644 index 0000000..cf06947 Binary files /dev/null and b/member/editor/umeditor/themes/default/images/caret.png differ diff --git a/member/editor/umeditor/themes/default/images/close.png b/member/editor/umeditor/themes/default/images/close.png new file mode 100644 index 0000000..a57693f Binary files /dev/null and b/member/editor/umeditor/themes/default/images/close.png differ diff --git a/member/editor/umeditor/themes/default/images/icons.gif b/member/editor/umeditor/themes/default/images/icons.gif new file mode 100644 index 0000000..8206560 Binary files /dev/null and b/member/editor/umeditor/themes/default/images/icons.gif differ diff --git a/member/editor/umeditor/themes/default/images/icons.png b/member/editor/umeditor/themes/default/images/icons.png new file mode 100644 index 0000000..de9a1bb Binary files /dev/null and b/member/editor/umeditor/themes/default/images/icons.png differ diff --git a/member/editor/umeditor/themes/default/images/ok.gif b/member/editor/umeditor/themes/default/images/ok.gif new file mode 100644 index 0000000..9d1362c Binary files /dev/null and b/member/editor/umeditor/themes/default/images/ok.gif differ diff --git a/member/editor/umeditor/themes/default/images/pop-bg.png b/member/editor/umeditor/themes/default/images/pop-bg.png new file mode 100644 index 0000000..d7a5a30 Binary files /dev/null and b/member/editor/umeditor/themes/default/images/pop-bg.png differ diff --git a/member/editor/umeditor/themes/default/images/spacer.gif b/member/editor/umeditor/themes/default/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/member/editor/umeditor/themes/default/images/spacer.gif differ diff --git a/member/editor/umeditor/themes/default/images/videologo.gif b/member/editor/umeditor/themes/default/images/videologo.gif new file mode 100644 index 0000000..555af74 Binary files /dev/null and b/member/editor/umeditor/themes/default/images/videologo.gif differ diff --git a/member/editor/umeditor/third-party/jquery.min.js b/member/editor/umeditor/third-party/jquery.min.js new file mode 100644 index 0000000..da41706 --- /dev/null +++ b/member/editor/umeditor/third-party/jquery.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
        ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
        a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
        t
        ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
        ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
        ","
        "],area:[1,"",""],param:[1,"",""],thead:[1,"","
        "],tr:[2,"","
        "],col:[2,"","
        "],td:[3,"","
        "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
        ","
        "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("').attr('id', id) + .css({ + width:'0px', + height:'0px', + 'overflow':'hidden', + 'float':'left', + 'position':'absolute', + top:'-10000px', + left:'-10000px' + }) + .appendTo(me.$container.find('.edui-dialog-container')); + + var w = window.open('', id, ''), + d = w.document; + d.open(); + d.write('
        '+this.getContent(null,null,true)+'
        '); + d.close(); + }, + notNeedUndo : 1 +}; +///import core +///commands 格式 +///commandsName Paragraph +///commandsTitle 段落格式 +/** + * 段落样式 + * @function + * @name UM.execCommand + * @param {String} cmdName paragraph插入段落执行命令 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {String} attrs 标签的属性 + * @author zhanyi + */ +UM.plugins['paragraph'] = function() { + var me = this; + me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}); + me.commands['paragraph'] = { + execCommand : function( cmdName, style ) { + return this.document.execCommand('formatBlock',false,'<' + style + '>'); + }, + queryCommandValue : function() { + try{ + var val = this.document.queryCommandValue('formatBlock') + }catch(e){ + } + return val ; + } + }; +}; + +///import core +///import plugins\inserthtml.js +///commands 分割线 +///commandsName Horizontal +///commandsTitle 分隔线 +/** + * 分割线 + * @function + * @name UM.execCommand + * @param {String} cmdName horizontal插入分割线 + */ +UM.plugins['horizontal'] = function(){ + var me = this; + me.commands['horizontal'] = { + execCommand : function( ) { + this.document.execCommand('insertHorizontalRule'); + var rng = me.selection.getRange().txtToElmBoundary(true), + start = rng.startContainer; + if(domUtils.isBody(rng.startContainer)){ + var next = rng.startContainer.childNodes[rng.startOffset]; + if(!next){ + next = $('

        ').appendTo(rng.startContainer).html(browser.ie ? ' ' : '
        ')[0] + } + rng.setStart(next,0).setCursor() + }else{ + + while(dtd.$inline[start.tagName] && start.lastChild === start.firstChild){ + + var parent = start.parentNode; + parent.appendChild(start.firstChild); + parent.removeChild(start); + start = parent; + } + while(dtd.$inline[start.tagName]){ + start = start.parentNode; + } + if(start.childNodes.length == 1 && start.lastChild.nodeName == 'HR'){ + var hr = start.lastChild; + $(hr).insertBefore(start); + rng.setStart(start,0).setCursor(); + }else{ + hr = $('hr',start)[0]; + domUtils.breakParent(hr,start); + var pre = hr.previousSibling; + if(pre && domUtils.isEmptyBlock(pre)){ + $(pre).remove() + } + rng.setStart(hr.nextSibling,0).setCursor(); + } + + } + } + }; + +}; + + +///import core +///commands 清空文档 +///commandsName ClearDoc +///commandsTitle 清空文档 +/** + * + * 清空文档 + * @function + * @name UM.execCommand + * @param {String} cmdName cleardoc清空文档 + */ + +UM.commands['cleardoc'] = { + execCommand : function() { + var me = this, + range = me.selection.getRange(); + me.body.innerHTML = "

        "+(ie ? "" : "
        ")+"

        "; + range.setStart(me.body.firstChild,0).setCursor(false,true); + setTimeout(function(){ + me.fireEvent("clearDoc"); + },0); + + } +}; + + +///import core +///commands 撤销和重做 +///commandsName Undo,Redo +///commandsTitle 撤销,重做 +/** + * @description 回退 + * @author zhanyi + */ + +UM.plugins['undo'] = function () { + var saveSceneTimer; + var me = this, + maxUndoCount = me.options.maxUndoCount || 20, + maxInputCount = me.options.maxInputCount || 20, + fillchar = new RegExp(domUtils.fillChar + '|<\/hr>', 'gi');// ie会产生多余的 + var noNeedFillCharTags = { + ol:1,ul:1,table:1,tbody:1,tr:1,body:1 + }; + var orgState = me.options.autoClearEmptyNode; + function compareAddr(indexA, indexB) { + if (indexA.length != indexB.length) + return 0; + for (var i = 0, l = indexA.length; i < l; i++) { + if (indexA[i] != indexB[i]) + return 0 + } + return 1; + } + + function compareRangeAddress(rngAddrA, rngAddrB) { + if (rngAddrA.collapsed != rngAddrB.collapsed) { + return 0; + } + if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) { + return 0; + } + return 1; + } + + function UndoManager() { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.undo = function () { + if (this.hasUndo) { + if (!this.list[this.index - 1] && this.list.length == 1) { + this.reset(); + return; + } + while (this.list[this.index].content == this.list[this.index - 1].content) { + this.index--; + if (this.index == 0) { + return this.restore(0); + } + } + this.restore(--this.index); + } + }; + this.redo = function () { + if (this.hasRedo) { + while (this.list[this.index].content == this.list[this.index + 1].content) { + this.index++; + if (this.index == this.list.length - 1) { + return this.restore(this.index); + } + } + this.restore(++this.index); + } + }; + + this.restore = function () { + var me = this.editor; + var scene = this.list[this.index]; + var root = UM.htmlparser(scene.content.replace(fillchar, '')); + me.options.autoClearEmptyNode = false; + me.filterInputRule(root,true); + me.options.autoClearEmptyNode = orgState; + //trace:873 + //去掉展位符 + me.body.innerHTML = root.toHtml(); + me.fireEvent('afterscencerestore'); + //处理undo后空格不展位的问题 + if (browser.ie) { + utils.each(domUtils.getElementsByTagName(me.document,'td th caption p'),function(node){ + if(domUtils.isEmptyNode(node)){ + domUtils.fillNode(me.document, node); + } + }) + } + + try{ + var rng = new dom.Range(me.document,me.body).moveToAddress(scene.address); + if(browser.ie && rng.collapsed && rng.startContainer.nodeType == 1){ + var tmpNode = rng.startContainer.childNodes[rng.startOffset]; + if( !tmpNode || tmpNode.nodeType == 1 && dtd.$empty[tmpNode]){ + rng.insertNode(me.document.createTextNode(' ')).collapse(true); + } + } + rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); + }catch(e){} + + this.update(); + this.clearKey(); + //不能把自己reset了 + me.fireEvent('reset', true); + }; + + this.getScene = function () { + var me = this.editor; + var rng = me.selection.getRange(), + rngAddress = rng.createAddress(false,true); + me.fireEvent('beforegetscene'); + var root = UM.htmlparser(me.body.innerHTML,true); + me.options.autoClearEmptyNode = false; + me.filterOutputRule(root,true); + me.options.autoClearEmptyNode = orgState; + var cont = root.toHtml(); + browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); + me.fireEvent('aftergetscene'); + return { + address:rngAddress, + content:cont + } + }; + this.save = function (notCompareRange,notSetCursor) { + clearTimeout(saveSceneTimer); + var currentScene = this.getScene(notSetCursor), + lastScene = this.list[this.index]; + //内容相同位置相同不存 + if (lastScene && lastScene.content == currentScene.content && + ( notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address) ) + ) { + return; + } + this.list = this.list.slice(0, this.index + 1); + this.list.push(currentScene); + //如果大于最大数量了,就把最前的剔除 + if (this.list.length > maxUndoCount) { + this.list.shift(); + } + this.index = this.list.length - 1; + this.clearKey(); + //跟新undo/redo状态 + this.update(); + + }; + this.update = function () { + this.hasRedo = !!this.list[this.index + 1]; + this.hasUndo = !!this.list[this.index - 1]; + }; + this.reset = function () { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.clearKey(); + }; + this.clearKey = function () { + keycont = 0; + lastKeyCode = null; + }; + } + + me.undoManger = new UndoManager(); + me.undoManger.editor = me; + function saveScene() { + this.undoManger.save(); + } + + me.addListener('saveScene', function () { + var args = Array.prototype.splice.call(arguments,1); + this.undoManger.save.apply(this.undoManger,args); + }); + + me.addListener('beforeexeccommand', saveScene); + me.addListener('afterexeccommand', saveScene); + + me.addListener('reset', function (type, exclude) { + if (!exclude) { + this.undoManger.reset(); + } + }); + me.commands['redo'] = me.commands['undo'] = { + execCommand:function (cmdName) { + this.undoManger[cmdName](); + }, + queryCommandState:function (cmdName) { + return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1; + }, + notNeedUndo:1 + }; + + var keys = { + // /*Backspace*/ 8:1, /*Delete*/ 46:1, + /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1, + 37:1, 38:1, 39:1, 40:1 + + }, + keycont = 0, + lastKeyCode; + //输入法状态下不计算字符数 + var inputType = false; + me.addListener('ready', function () { + $(this.body).on('compositionstart', function () { + inputType = true; + }).on('compositionend', function () { + inputType = false; + }) + }); + //快捷键 + me.addshortcutkey({ + "Undo":"ctrl+90", //undo + "Redo":"ctrl+89,shift+ctrl+z" //redo + + }); + var isCollapsed = true; + me.addListener('keydown', function (type, evt) { + + var me = this; + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + + if(!me.selection.getRange().collapsed){ + me.undoManger.save(false,true); + isCollapsed = false; + return; + } + if (me.undoManger.list.length == 0) { + me.undoManger.save(true); + } + clearTimeout(saveSceneTimer); + function save(cont){ + + if (cont.selection.getRange().collapsed) + cont.fireEvent('contentchange'); + cont.undoManger.save(false,true); + cont.fireEvent('selectionchange'); + } + saveSceneTimer = setTimeout(function(){ + if(inputType){ + var interalTimer = setInterval(function(){ + if(!inputType){ + save(me); + clearInterval(interalTimer) + } + },300) + return; + } + save(me); + },200); + + lastKeyCode = keyCode; + keycont++; + if (keycont >= maxInputCount ) { + save(me) + } + } + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + if(!isCollapsed){ + this.undoManger.save(false,true); + isCollapsed = true; + } + } + }); + +}; + +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 +/** + * @description 粘贴 + * @author zhanyi + */ +UM.plugins['paste'] = function () { + function getClipboardData(callback) { + var doc = this.document; + if (doc.getElementById('baidu_pastebin')) { + return; + } + var range = this.selection.getRange(), + bk = range.createBookmark(), + //创建剪贴的容器div + pastebin = doc.createElement('div'); + pastebin.id = 'baidu_pastebin'; + // Safari 要求div必须有内容,才能粘贴内容进来 + browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar)); + this.body.appendChild(pastebin); + //trace:717 隐藏的span不能得到top + //bk.start.innerHTML = ' '; + bk.start.style.display = ''; + + pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + + //要在现在光标平行的位置加入,否则会出现跳动的问题 + $(bk.start).position().top + 'px'; + + range.selectNodeContents(pastebin).select(true); + + setTimeout(function () { + if (browser.webkit) { + for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) { + if (domUtils.isEmptyNode(pi)) { + domUtils.remove(pi); + } else { + pastebin = pi; + break; + } + } + } + try { + pastebin.parentNode.removeChild(pastebin); + } catch (e) { + } + range.moveToBookmark(bk).select(true); + callback(pastebin); + }, 0); + } + + var me = this; + + + function filter(div) { + var html; + if (div.firstChild) { + //去掉cut中添加的边界值 + var nodes = domUtils.getElementsByTagName(div, 'span'); + for (var i = 0, ni; ni = nodes[i++];) { + if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') { + domUtils.remove(ni); + } + } + + if (browser.webkit) { + + var brs = div.querySelectorAll('div br'); + for (var i = 0, bi; bi = brs[i++];) { + var pN = bi.parentNode; + if (pN.tagName == 'DIV' && pN.childNodes.length == 1) { + pN.innerHTML = '


        '; + domUtils.remove(pN); + } + } + var divs = div.querySelectorAll('#baidu_pastebin'); + for (var i = 0, di; di = divs[i++];) { + var tmpP = me.document.createElement('p'); + di.parentNode.insertBefore(tmpP, di); + while (di.firstChild) { + tmpP.appendChild(di.firstChild); + } + domUtils.remove(di); + } + + var metas = div.querySelectorAll('meta'); + for (var i = 0, ci; ci = metas[i++];) { + domUtils.remove(ci); + } + + var brs = div.querySelectorAll('br'); + for (i = 0; ci = brs[i++];) { + if (/^apple-/i.test(ci.className)) { + domUtils.remove(ci); + } + } + } + if (browser.gecko) { + var dirtyNodes = div.querySelectorAll('[_moz_dirty]'); + for (i = 0; ci = dirtyNodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + } + if (!browser.ie) { + var spans = div.querySelectorAll('span.Apple-style-span'); + for (var i = 0, ci; ci = spans[i++];) { + domUtils.remove(ci, true); + } + } + + //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 + html = div.innerHTML;//.replace(/>(?:(\s| )*?)<'); + + //过滤word粘贴过来的冗余属性 + html = UM.filterWord(html); + //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 + var root = UM.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UM.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + //针对chrome的处理 + if (browser.webkit) { + var br = root.lastChild(); + if (br && br.type == 'element' && br.tagName == 'br') { + root.removeChild(br) + } + utils.each(me.body.querySelectorAll('div'), function (node) { + if (domUtils.isEmptyBlock(node)) { + domUtils.remove(node) + } + }) + } + html = {'html': root.toHtml()}; + me.fireEvent('beforepaste', html, root); + //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 + if(!html.html){ + return; + } + + me.execCommand('insertHtml', html.html, true); + me.fireEvent("afterpaste", html); + } + } + + + me.addListener('ready', function () { + $(me.body).on( 'cut', function () { + var range = me.selection.getRange(); + if (!range.collapsed && me.undoManger) { + me.undoManger.save(); + } + }).on(browser.ie || browser.opera ? 'keydown' : 'paste', function (e) { + //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 + if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) { + return; + } + getClipboardData.call(me, function (div) { + filter(div); + }); + }); + + }); +}; + + +///import core +///commands 有序列表,无序列表 +///commandsName InsertOrderedList,InsertUnorderedList +///commandsTitle 有序列表,无序列表 +/** + * 有序列表 + * @function + * @name UM.execCommand + * @param {String} cmdName insertorderlist插入有序列表 + * @param {String} style 值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman + * @author zhanyi + */ +/** + * 无序链接 + * @function + * @name UM.execCommand + * @param {String} cmdName insertunorderlist插入无序列表 + * * @param {String} style 值为:circle,disc,square + * @author zhanyi + */ + +UM.plugins['list'] = function () { + var me = this; + + me.setOpt( { + 'insertorderedlist':{ + 'decimal':'', + 'lower-alpha':'', + 'lower-roman':'', + 'upper-alpha':'', + 'upper-roman':'' + }, + 'insertunorderedlist':{ + 'circle':'', + 'disc':'', + 'square':'' + } + } ); + + this.addInputRule(function(root){ + utils.each(root.getNodesByTagName('li'), function (node) { + if(node.children.length == 0){ + node.parentNode.removeChild(node); + } + }) + }); + me.commands['insertorderedlist'] = + me.commands['insertunorderedlist'] = { + execCommand:function (cmdName) { + this.document.execCommand(cmdName); + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + + this.$body.find('ol,ul').each(function(i,n){ + var parent = n.parentNode; + if(parent.tagName == 'P' && parent.lastChild === parent.firstChild){ + $(n).children().each(function(j,li){ + var p = parent.cloneNode(false); + $(p).append(li.innerHTML); + $(li).html('').append(p); + }); + $(n).insertBefore(parent); + $(parent).remove(); + } + + if(dtd.$inline[parent.tagName]){ + if(parent.tagName == 'SPAN'){ + + $(n).children().each(function(k,li){ + var span = parent.cloneNode(false); + if(li.firstChild.nodeName != 'P'){ + + while(li.firstChild){ + span.appendChild(li.firstChild) + }; + $('

        ').appendTo(li).append(span); + }else{ + while(li.firstChild){ + span.appendChild(li.firstChild) + }; + $(li.firstChild).append(span); + } + }) + + } + domUtils.remove(parent,true) + } + }); + + + + + rng.moveToBookmark(bk).select(); + return true; + }, + queryCommandState:function (cmdName) { + return this.document.queryCommandState(cmdName); + } + }; +}; + + +///import core +///import plugins/serialize.js +///import plugins/undo.js +///commands 查看源码 +///commandsName Source +///commandsTitle 查看源码 +(function (){ + var sourceEditors = { + textarea: function (editor, holder){ + var textarea = holder.ownerDocument.createElement('textarea'); + textarea.style.cssText = 'resize:none;border:0;padding:0;margin:0;overflow-y:auto;outline:0'; + // todo: IE下只有onresize属性可用... 很纠结 + if (browser.ie && browser.version < 8) { + + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + holder.onresize = function (){ + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + }; + } + holder.appendChild(textarea); + return { + container : textarea, + setContent: function (content){ + textarea.value = content; + }, + getContent: function (){ + return textarea.value; + }, + select: function (){ + var range; + if (browser.ie) { + range = textarea.createTextRange(); + range.collapse(true); + range.select(); + } else { + //todo: chrome下无法设置焦点 + textarea.setSelectionRange(0, 0); + textarea.focus(); + } + }, + dispose: function (){ + holder.removeChild(textarea); + // todo + holder.onresize = null; + textarea = null; + holder = null; + } + }; + } + }; + + UM.plugins['source'] = function (){ + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + + opt.sourceEditor = 'textarea'; + + me.setOpt({ + sourceEditorFirst:false + }); + function createSourceEditor(holder){ + return sourceEditors.textarea(me, holder); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent = me.getContent, + bakAddress; + + me.commands['source'] = { + execCommand: function (){ + + sourceMode = !sourceMode; + if (sourceMode) { + bakAddress = me.selection.getRange().createAddress(false,true); + me.undoManger && me.undoManger.save(true); + if(browser.gecko){ + me.body.contentEditable = false; + } + +// bakCssText = me.body.style.cssText; + me.body.style.cssText += ';position:absolute;left:-32768px;top:-32768px;'; + + + me.fireEvent('beforegetcontent'); + var root = UM.htmlparser(me.body.innerHTML); + me.filterOutputRule(root); + root.traversal(function (node) { + if (node.type == 'element') { + switch (node.tagName) { + case 'td': + case 'th': + case 'caption': + if(node.children && node.children.length == 1){ + if(node.firstChild().tagName == 'br' ){ + node.removeChild(node.firstChild()) + } + }; + break; + case 'pre': + node.innerText(node.innerText().replace(/ /g,' ')) + + } + } + }); + + me.fireEvent('aftergetcontent'); + + var content = root.toHtml(true); + + sourceEditor = createSourceEditor(me.body.parentNode); + + sourceEditor.setContent(content); + + var getStyleValue=function(attr){ + return parseInt($(me.body).css(attr)); + }; + $(sourceEditor.container).width($(me.body).width()+getStyleValue("padding-left")+getStyleValue("padding-right")) + .height($(me.body).height()); + setTimeout(function (){ + sourceEditor.select(); + }); + //重置getContent,源码模式下取值也能是最新的数据 + me.getContent = function (){ + return sourceEditor.getContent() || '

        ' + (browser.ie ? '' : '
        ')+'

        '; + }; + } else { + me.$body.css({ + 'position':'', + 'left':'', + 'top':'' + }); +// me.body.style.cssText = bakCssText; + var cont = sourceEditor.getContent() || '

        ' + (browser.ie ? '' : '
        ')+'

        '; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>','g'), function(a,b){ + if(b && !dtd.$inlineWithA[b.toLowerCase()]){ + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,''); + } + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,'') + }); + me.setContent(cont); + sourceEditor.dispose(); + sourceEditor = null; + //还原getContent方法 + me.getContent = oldGetContent; + var first = me.body.firstChild; + //trace:1106 都删除空了,下边会报错,所以补充一个p占位 + if(!first){ + me.body.innerHTML = '

        '+(browser.ie?'':'
        ')+'

        '; + } + //要在ifm为显示时ff才能取到selection,否则报错 + //这里不能比较位置了 + me.undoManger && me.undoManger.save(true); + if(browser.gecko){ + me.body.contentEditable = true; + } + try{ + me.selection.getRange().moveToAddress(bakAddress).select(); + }catch(e){} + + } + this.fireEvent('sourcemodechanged', sourceMode); + }, + queryCommandState: function (){ + return sourceMode|0; + }, + notNeedUndo : 1 + }; + var oldQueryCommandState = me.queryCommandState; + + + me.queryCommandState = function (cmdName){ + cmdName = cmdName.toLowerCase(); + if (sourceMode) { + //源码模式下可以开启的命令 + return cmdName in { + 'source' : 1, + 'fullscreen' : 1 + } ? oldQueryCommandState.apply(this, arguments) : -1 + } + return oldQueryCommandState.apply(this, arguments); + }; + + }; + +})(); +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br +/** + * @description 处理回车 + * @author zhanyi + */ +UM.plugins['enterkey'] = function() { + var hTag, + me = this, + tag = me.options.enterTag; + me.addListener('keyup', function(type, evt) { + + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var range = me.selection.getRange(), + start = range.startContainer, + doSave; + + //修正在h1-h6里边回车后不能嵌套p的问题 + if (!browser.ie) { + + if (/h\d/i.test(hTag)) { + if (browser.gecko) { + var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true); + if (!h) { + me.document.execCommand('formatBlock', false, '

        '); + doSave = 1; + } + } else { + //chrome remove div + if (start.nodeType == 1) { + var tmp = me.document.createTextNode(''),div; + range.insertNode(tmp); + div = domUtils.findParentByTagName(tmp, 'div', true); + if (div) { + var p = me.document.createElement('p'); + while (div.firstChild) { + p.appendChild(div.firstChild); + } + div.parentNode.insertBefore(p, div); + domUtils.remove(div); + range.setStartBefore(tmp).setCursor(); + doSave = 1; + } + domUtils.remove(tmp); + + } + } + + if (me.undoManger && doSave) { + me.undoManger.save(); + } + } + //没有站位符,会出现多行的问题 + browser.opera && range.select(); + }else{ + me.fireEvent('saveScene',true,true) + } + } + }); + + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) {//回车 + if(me.fireEvent('beforeenterkeydown')){ + domUtils.preventDefault(evt); + return; + } + me.fireEvent('saveScene',true,true); + hTag = ''; + + + var range = me.selection.getRange(); + + if (!range.collapsed) { + //跨td不能删 + var start = range.startContainer, + end = range.endContainer, + startTd = domUtils.findParentByTagName(start, 'td', true), + endTd = domUtils.findParentByTagName(end, 'td', true); + if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + return; + } + } + if (tag == 'p') { + + + if (!browser.ie) { + + start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true); + + //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command + //trace:2431 + if (!start && !browser.opera) { + + me.document.execCommand('formatBlock', false, '

        '); + + if (browser.gecko) { + range = me.selection.getRange(); + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + start && domUtils.removeDirtyAttr(start); + } + + + } else { + hTag = start.tagName; + start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start); + } + + } + + } + + } + }); + + browser.ie && me.addListener('setDisabled',function(){ + $(me.body).find('p').each(function(i,p){ + if(domUtils.isEmptyBlock(p)){ + p.innerHTML = ' ' + } + }) + }) +}; + +///import core +///commands 预览 +///commandsName Preview +///commandsTitle 预览 +/** + * 预览 + * @function + * @name UM.execCommand + * @param {String} cmdName preview预览编辑器内容 + */ +UM.commands['preview'] = { + execCommand : function(){ + var w = window.open('', '_blank', ''), + d = w.document, + c = this.getContent(null,null,true), + path = this.getOpt('UMEDITOR_HOME_URL'), + formula = c.indexOf('mathquill-embedded-latex')!=-1 ? + '' + + '' + + '':''; + d.open(); + d.write('' + formula + '

        '+c+'
        '); + d.close(); + }, + notNeedUndo : 1 +}; + +///import core +///commands 加粗,斜体,上标,下标 +///commandsName Bold,Italic,Subscript,Superscript +///commandsTitle 加粗,加斜,下标,上标 +/** + * b u i等基础功能实现 + * @function + * @name UM.execCommands + * @param {String} cmdName bold加粗。italic斜体。subscript上标。superscript下标。 +*/ +UM.plugins['basestyle'] = function(){ + var basestyles = ['bold','underline','superscript','subscript','italic','strikethrough'], + me = this; + //添加快捷键 + me.addshortcutkey({ + "Bold" : "ctrl+66",//^B + "Italic" : "ctrl+73", //^I + "Underline" : "ctrl+shift+85",//^U + "strikeThrough" : 'ctrl+shift+83' //^s + }); + //过滤最后的产出数据 + me.addOutputRule(function(root){ + $.each(root.getNodesByTagName('b i u strike s'),function(i,node){ + switch (node.tagName){ + case 'b': + node.tagName = 'strong'; + break; + case 'i': + node.tagName = 'em'; + break; + case 'u': + node.tagName = 'span'; + node.setStyle('text-decoration','underline'); + break; + case 's': + case 'strike': + node.tagName = 'span'; + node.setStyle('text-decoration','line-through') + } + }); + }); + $.each(basestyles,function(i,cmd){ + me.commands[cmd] = { + execCommand : function( cmdName ) { + var rng = this.selection.getRange(); + if(rng.collapsed && this.queryCommandState(cmdName) != 1){ + var node = this.document.createElement({ + 'bold':'strong', + 'underline':'u', + 'superscript':'sup', + 'subscript':'sub', + 'italic':'em', + 'strikethrough':'strike' + }[cmdName]); + rng.insertNode(node).setStart(node,0).setCursor(false); + return true; + }else{ + return this.document.execCommand(cmdName) + } + + }, + queryCommandState : function(cmdName) { + if(browser.gecko){ + return this.document.queryCommandState(cmdName) + } + var path = this.selection.getStartElementPath(),result = false; + $.each(path,function(i,n){ + switch (cmdName){ + case 'bold': + if(n.nodeName == 'STRONG' || n.nodeName == 'B'){ + result = 1; + return false; + } + break; + case 'underline': + if(n.nodeName == 'U' || n.nodeName == 'SPAN' && $(n).css('text-decoration') == 'underline'){ + result = 1; + return false; + } + break; + case 'superscript': + if(n.nodeName == 'SUP'){ + result = 1; + return false; + } + break; + case 'subscript': + if(n.nodeName == 'SUB'){ + result = 1; + return false; + } + break; + case 'italic': + if(n.nodeName == 'EM' || n.nodeName == 'I'){ + result = 1; + return false; + } + break; + case 'strikethrough': + if(n.nodeName == 'S' || n.nodeName == 'STRIKE' || n.nodeName == 'SPAN' && $(n).css('text-decoration') == 'line-through'){ + result = 1; + return false; + } + break; + } + }) + return result + } + }; + }) +}; + + +///import core +///import plugins/inserthtml.js +///commands 视频 +///commandsName InsertVideo +///commandsTitle 插入视频 +///commandsDialog dialogs\video +UM.plugins['video'] = function (){ + var me =this, + div; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url,width,height,id,align,toEmbed){ + return !toEmbed ? + + '' + + : + ''; + } + + function switchImgAndEmbed(root,img2embed){ + utils.each(root.getNodesByTagName(img2embed ? 'img' : 'embed'),function(node){ + if(node.getAttr('class') == 'edui-faked-video'){ + + var html = creatInsertStr( img2embed ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',img2embed); + node.parentNode.replaceChild(UM.uNode.createElement(html),node) + } + }) + } + + me.addOutputRule(function(root){ + switchImgAndEmbed(root,true) + }); + me.addInputRule(function(root){ + switchImgAndEmbed(root) + }); + + me.commands["insertvideo"] = { + execCommand: function (cmd, videoObjs){ + videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs]; + var html = [],id = 'tmpVedio'; + for(var i=0,vi,len = videoObjs.length;i'](?:(amp|lt|quot|gt|#39|nbsp);)?/g); + html.push(creatInsertStr( vi.url, vi.width || 420, vi.height || 280, id + i,vi.align,false)); + } + me.execCommand("inserthtml",html.join(""),true); + + }, + queryCommandState : function(){ + var img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-video"); + return flag ? 1 : 0; + } + }; +}; +///import core +///commands 全选 +///commandsName SelectAll +///commandsTitle 全选 +/** + * 选中所有 + * @function + * @name UM.execCommand + * @param {String} cmdName selectall选中编辑器里的所有内容 + * @author zhanyi +*/ +UM.plugins['selectall'] = function(){ + var me = this; + me.commands['selectall'] = { + execCommand : function(){ + //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 + var me = this,body = me.body, + range = me.selection.getRange(); + range.selectNodeContents(body); + if(domUtils.isEmptyBlock(body)){ + //opera不能自动合并到元素的里边,要手动处理一下 + if(browser.opera && body.firstChild && body.firstChild.nodeType == 1){ + range.setStartAtFirst(body.firstChild); + } + range.collapse(true); + } + range.select(true); + }, + notNeedUndo : 1 + }; + + + //快捷键 + me.addshortcutkey({ + "selectAll" : "ctrl+65" + }); +}; + +//UM.plugins['removeformat'] = function () { +// var me = this; +// me.commands['removeformat'] = { +// execCommand: function () { +// me.document.execCommand('removeformat'); +// +// /* 处理ie8和firefox选区有链接时,清除格式的bug */ +// if (browser.gecko || browser.ie8 || browser.webkit) { +// var nativeRange = this.selection.getNative().getRangeAt(0), +// common = nativeRange.commonAncestorContainer, +// rng = me.selection.getRange(), +// bk = rng.createBookmark(); +// +// function isEleInBookmark(node, bk){ +// if ( (domUtils.getPosition(node, bk.start) & domUtils.POSITION_FOLLOWING) && +// (domUtils.getPosition(bk.end, node) & domUtils.POSITION_FOLLOWING) ) { +// return true; +// } else if ( (domUtils.getPosition(node, bk.start) & domUtils.POSITION_CONTAINS) || +// (domUtils.getPosition(node, bk.end) & domUtils.POSITION_CONTAINS) ) { +// return true; +// } +// return false; +// } +// +// $(common).find('a').each(function (k, a) { +// if ( isEleInBookmark(a, bk) ) { +// a.removeAttribute('style'); +// } +// }); +// +// } +// } +// }; +// +//}; +// + + +UM.plugins['removeformat'] = function(){ + var me = this; + me.setOpt({ + 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', + 'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign' + }); + me.commands['removeformat'] = { + execCommand : function( cmdName, tags, style, attrs,notIncludeA ) { + + var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) , + removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ), + range = new dom.Range( this.document ), + bookmark,node,parent, + filter = function( node ) { + return node.nodeType == 1; + }; + + function isRedundantSpan (node) { + if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){ + return 0; + } + if (browser.ie) { + //ie 下判断实效,所以只能简单用style来判断 + //return node.style.cssText == '' ? 1 : 0; + var attrs = node.attributes; + if ( attrs.length ) { + for ( var i = 0,l = attrs.length; i + var node = range.startContainer, + tmp, + collapsed = range.collapsed; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setStartBefore(node); + //trace:937 + //更新结束边界 + if(range.startContainer === range.endContainer){ + range.endOffset--; + } + domUtils.remove(node); + node = tmp; + } + + if(!collapsed){ + node = range.endContainer; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setEndBefore(node); + domUtils.remove(node); + + node = tmp; + } + + + } + } + + + + range = this.selection.getRange(); + if(!range.collapsed) { + doRemove( range ); + range.select(); + } + + } + + }; + +}; +/* + * 处理特殊键的兼容性问题 + */ +UM.plugins['keystrokes'] = function() { + var me = this; + var collapsed = true; + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng = me.selection.getRange(); + + //处理全选的情况 + if(!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <=90 + || keyCode >= 48 && keyCode <= 57 || + keyCode >= 96 && keyCode <= 111 || { + 13:1, + 8:1, + 46:1 + }[keyCode]) + ){ + + var tmpNode = rng.startContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setStartBefore(tmpNode) + } + tmpNode = rng.endContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setEndAfter(tmpNode) + } + rng.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
        + if(rng.endContainer && rng.endContainer.nodeType == 1){ + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + rng.setEndAfter(tmpNode); + } + } + if(rng.startOffset == 0){ + tmpNode = rng.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = rng.endContainer; + if(rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.fireEvent('saveScene'); + me.body.innerHTML = '

        '+(browser.ie ? '' : '
        ')+'

        '; + rng.setStart(me.body.firstChild,0).setCursor(false,true); + me._selectionChange(); + return; + } + } + } + } + + //处理backspace + if (keyCode == 8) { + rng = me.selection.getRange(); + collapsed = rng.collapsed; + if(me.fireEvent('delkeydown',evt)){ + return; + } + var start,end; + //避免按两次删除才能生效的问题 + if(rng.collapsed && rng.inFillChar()){ + start = rng.startContainer; + + if(domUtils.isFillChar(start)){ + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + domUtils.remove(start) + }else{ + start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar ),''); + rng.startOffset--; + rng.collapse(true).select(true) + } + } + //解决选中control元素不能删除的问题 + if (start = rng.getClosedNode()) { + me.fireEvent('saveScene'); + rng.setStartBefore(start); + domUtils.remove(start); + rng.setCursor(); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + //阻止在table上的删除 + if (!browser.ie) { + start = domUtils.findParentByTagName(rng.startContainer, 'table', true); + end = domUtils.findParentByTagName(rng.endContainer, 'table', true); + if (start && !end || !start && end || start !== end) { + evt.preventDefault(); + return; + } + } + start = rng.startContainer; + if(rng.collapsed && start.nodeType == 1){ + var currentNode = start.childNodes[rng.startOffset-1]; + if(currentNode && currentNode.nodeType == 1 && currentNode.tagName == 'BR'){ + me.fireEvent('saveScene'); + rng.setStartBefore(currentNode).collapse(true); + domUtils.remove(currentNode); + rng.select(); + me.fireEvent('saveScene'); + } + } + + //trace:3613 + if(browser.chrome){ + if(rng.collapsed){ + + while(rng.startOffset == 0 && !domUtils.isEmptyBlock(rng.startContainer)){ + rng.setStartBefore(rng.startContainer) + } + var pre = rng.startContainer.childNodes[rng.startOffset-1]; + if(pre && pre.nodeName == 'BR'){ + rng.setStartBefore(pre); + me.fireEvent('saveScene'); + $(pre).remove(); + rng.setCursor(); + me.fireEvent('saveScene'); + } + + } + } + } + //trace:1634 + //ff的del键在容器空的时候,也会删除 + if(browser.gecko && keyCode == 46){ + var range = me.selection.getRange(); + if(range.collapsed){ + start = range.startContainer; + if(domUtils.isEmptyBlock(start)){ + var parent = start.parentNode; + while(domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)){ + start = parent; + parent = parent.parentNode; + } + if(start === parent.lastChild) + evt.preventDefault(); + return; + } + } + } + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng,me = this; + if(keyCode == 8){ + if(me.fireEvent('delkeyup')){ + return; + } + rng = me.selection.getRange(); + if(rng.collapsed){ + var tmpNode, + autoClearTagName = ['h1','h2','h3','h4','h5','h6']; + if(tmpNode = domUtils.findParentByTagName(rng.startContainer,autoClearTagName,true)){ + if(domUtils.isEmptyBlock(tmpNode)){ + var pre = tmpNode.previousSibling; + if(pre && pre.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtLast(pre).setCursor(false,true); + return; + }else{ + var next = tmpNode.nextSibling; + if(next && next.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtFirst(next).setCursor(false,true); + return; + } + } + } + } + //处理当删除到body时,要重新给p标签展位 + if(domUtils.isBody(rng.startContainer)){ + var tmpNode = domUtils.createElement(me.document,'p',{ + 'innerHTML' : browser.ie ? domUtils.fillChar : '
        ' + }); + rng.insertNode(tmpNode).setStart(tmpNode,0).setCursor(false,true); + } + } + + + //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 + if( !collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))){ + if(browser.ie){ + var span = rng.document.createElement('span'); + rng.insertNode(span).setStartBefore(span).collapse(true); + rng.select(); + domUtils.remove(span) + }else{ + rng.select() + } + + } + } + + }) +}; +/** + * 自动保存草稿 + */ +UM.plugins['autosave'] = function() { + + + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + + //默认间隔时间 + me.setOpt('saveInterval', 500); + + //存储媒介封装 + var LocalStorage = UM.LocalStorage = ( function () { + + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = "localStorage"; + + return { + + saveLocalData: function ( key, data ) { + + if ( storage && data) { + storage.setItem( key, data ); + return true; + } + + return false; + + }, + + getLocalData: function ( key ) { + + if ( storage ) { + return storage.getItem( key ); + } + + return null; + + }, + + removeItem: function ( key ) { + + storage && storage.removeItem( key ); + + } + + }; + + function getUserData () { + + var container = document.createElement( "div" ); + container.style.display = "none"; + + if( !container.addBehavior ) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + + getItem: function ( key ) { + + var result = null; + + try { + document.body.appendChild( container ); + container.load( LOCAL_FILE ); + result = container.getAttribute( key ); + document.body.removeChild( container ); + } catch ( e ) { + } + + return result; + + }, + + setItem: function ( key, value ) { + + document.body.appendChild( container ); + container.setAttribute( key, value ); + container.save( LOCAL_FILE ); + document.body.removeChild( container ); + + }, +// 暂时没有用到 +// clear: function () { +// +// var expiresTime = new Date(); +// expiresTime.setFullYear( expiresTime.getFullYear() - 1 ); +// document.body.appendChild( container ); +// container.expires = expiresTime.toUTCString(); +// container.save( LOCAL_FILE ); +// document.body.removeChild( container ); +// +// }, + + removeItem: function ( key ) { + + document.body.appendChild( container ); + container.removeAttribute( key ); + container.save( LOCAL_FILE ); + document.body.removeChild( container ); + + } + + }; + + } + + } )(); + + function save ( editor ) { + + var saveData = null; + + if ( new Date() - lastSaveTime < MIN_TIME ) { + return; + } + + if ( !editor.hasContents() ) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && LocalStorage.removeItem( saveKey ); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if ( editor.fireEvent( "beforeautosave", { + content: saveData + } ) === false ) { + return; + } + + LocalStorage.saveLocalData( saveKey, saveData ); + + editor.fireEvent( "afterautosave", { + content: saveData + } ); + + } + + me.addListener('ready', function(){ + var _suffix = "-drafts-data", + key = null; + + if ( me.key ) { + key = me.key + _suffix; + } else { + key = ( me.container.parentNode.id || 'ue-common' ) + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = ( location.protocol + location.host + location.pathname ).replace( /[.:\/]/g, '_' ) + key; + }); + + me.addListener('contentchange', function(){ + + if ( !saveKey ) { + return; + } + + if ( me._saveFlag ) { + window.clearTimeout( me._saveFlag ); + } + + if ( me.options.saveInterval > 0 ) { + + me._saveFlag = window.setTimeout( function () { + + save( me ); + + }, me.options.saveInterval ); + + } else { + + save(me); + + } + + }) + + + me.commands['clearlocaldata'] = { + execCommand:function (cmd, name) { + if ( saveKey && LocalStorage.getLocalData( saveKey ) ) { + LocalStorage.removeItem( saveKey ) + } + }, + notNeedUndo: true, + ignoreContentChange:true + }; + + me.commands['getlocaldata'] = { + execCommand:function (cmd, name) { + return saveKey ? LocalStorage.getLocalData( saveKey ) || '' : ''; + }, + notNeedUndo: true, + ignoreContentChange:true + }; + + me.commands['drafts'] = { + execCommand:function (cmd, name) { + if ( saveKey ) { + me.body.innerHTML = LocalStorage.getLocalData( saveKey ) || '

        '+(browser.ie ? ' ' : '
        ')+'

        '; + me.focus(true); + } + }, + queryCommandState: function () { + return saveKey ? ( LocalStorage.getLocalData( saveKey ) === null ? -1 : 0 ) : -1; + }, + notNeedUndo: true, + ignoreContentChange:true + } + +}; + +/** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ +UM.plugins['autoupload'] = function () { + + var me = this; + + me.setOpt('pasteImageEnabled', true); + me.setOpt('dropFileEnabled', true); + var sendAndInsertImage = function (file, editor) { + //模拟数据 + var fd = new FormData(); + fd.append(editor.options.imageFieldName || 'upfile', file, file.name || ('blob.' + file.type.substr('image/'.length))); + fd.append('type', 'ajax'); + var xhr = new XMLHttpRequest(); + xhr.open("post", me.options.imageUrl, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener('load', function (e) { + try { + var json = eval('('+e.target.response+')'), + link = json.url, + picLink = me.options.imagePath + link; + editor.execCommand('insertimage', { + src: picLink, + _src: picLink + }); + } catch (er) { + } + }); + xhr.send(fd); + }; + + function getPasteImage(e) { + return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items : null; + } + + function getDropImage(e) { + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null; + } + + me.addListener('ready', function () { + if (window.FormData && window.FileReader) { + var autoUploadHandler = function (e) { + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == 'paste' ? getPasteImage(e.originalEvent) : getDropImage(e.originalEvent); + if (items) { + var len = items.length, + file; + while (len--) { + file = items[len]; + if (file.getAsFile) file = file.getAsFile(); + if (file && file.size > 0 && /image\/\w+/i.test(file.type)) { + sendAndInsertImage(file, me); + hasImg = true; + } + } + if (hasImg) return false; + } + + }; + me.getOpt('pasteImageEnabled') && me.$body.on('paste', autoUploadHandler); + me.getOpt('dropFileEnabled') && me.$body.on('drop', autoUploadHandler); + + //取消拖放图片时出现的文字光标位置提示 + me.$body.on('dragover', function (e) { + if (e.originalEvent.dataTransfer.types[0] == 'Files') { + return false; + } + }); + } + }); + +}; +/** + * 公式插件 + */ +UM.plugins['formula'] = function () { + var me = this; + + function getActiveIframe() { + return me.$body.find('iframe.edui-formula-active')[0] || null; + } + + function blurActiveIframe(){ + var iframe = getActiveIframe(); + iframe && iframe.contentWindow.formula.blur(); + } + + me.addInputRule(function (root) { + $.each(root.getNodesByTagName('span'), function (i, node) { + if (node.hasClass('mathquill-embedded-latex')) { + var firstChild, latex = ''; + while(firstChild = node.firstChild()){ + latex += firstChild.data; + node.removeChild(firstChild); + } + node.tagName = 'iframe'; + node.setAttr({ + 'frameborder': '0', + 'src': me.getOpt('UMEDITOR_HOME_URL') + 'dialogs/formula/formula.html', + 'data-latex': utils.unhtml(latex) + }); + } + }); + }); + me.addOutputRule(function (root) { + $.each(root.getNodesByTagName('iframe'), function (i, node) { + if (node.hasClass('mathquill-embedded-latex')) { + node.tagName = 'span'; + node.appendChild(UM.uNode.createText(node.getAttr('data-latex'))); + node.setAttr({ + 'frameborder': '', + 'src': '', + 'data-latex': '' + }); + } + }); + }); + me.addListener('click', function(){ + blurActiveIframe(); + }); + me.addListener('afterexeccommand', function(type, cmd){ + if(cmd != 'formula') { + blurActiveIframe(); + } + }); + + me.commands['formula'] = { + execCommand: function (cmd, latex) { + var iframe = getActiveIframe(); + if (iframe) { + iframe.contentWindow.formula.insertLatex(latex); + } else { + me.execCommand('inserthtml', '' + latex + ''); + browser.ie && browser.ie9below && setTimeout(function(){ + var rng = me.selection.getRange(), + startContainer = rng.startContainer; + if(startContainer.nodeType == 1 && !startContainer.childNodes[rng.startOffset]){ + rng.insertNode(me.document.createTextNode(' ')); + rng.setCursor() + } + },100) + } + }, + queryCommandState: function (cmd) { + return 0; + }, + queryCommandValue: function (cmd) { + var iframe = getActiveIframe(); + return iframe && iframe.contentWindow.formula.getLatex(); + } + } + +}; + +/** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + +UM.plugins.xssFilter = function() { + + var config = UMEDITOR_CONFIG; + var whiteList = config.whiteList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whiteList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UM.utils.each(attrs, function (val, key) { + + if (UM.utils.indexOf(whiteList[tagName], key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whiteList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UM.utils.each(whiteList, function(val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UM.utils.each(whiteList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whiteList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whiteList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + +}; + +(function ($) { + //对jquery的扩展 + $.parseTmpl = function parse(str, data) { + var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + 'with(obj||{}){__p.push(\'' + str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/<%=([\s\S]+?)%>/g,function (match, code) { + return "',obj." + code.replace(/\\'/g, "'") + ",'"; + }).replace(/<%([\s\S]+?)%>/g,function (match, code) { + return "');" + code.replace(/\\'/g, "'").replace(/[\r\n\t]/g, ' ') + "__p.push('"; + }).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/\t/g, '\\t') + "');}return __p.join('');"; + var func = new Function('obj', tmpl); + return data ? func(data) : func; + }; + $.extend2 = function (t, s) { + var a = arguments, + notCover = $.type(a[a.length - 1]) == 'boolean' ? a[a.length - 1] : false, + len = $.type(a[a.length - 1]) == 'boolean' ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }; + + $.IE6 = !!window.ActiveXObject && parseFloat(navigator.userAgent.match(/msie (\d+)/i)[1]) == 6; + + //所有ui的基类 + var _eventHandler = []; + var _widget = function () { + }; + var _prefix = 'edui'; + _widget.prototype = { + on: function (ev, cb) { + this.root().on(ev, $.proxy(cb, this)); + return this; + }, + off: function (ev, cb) { + this.root().off(ev, $.proxy(cb, this)); + return this; + }, + trigger: function (ev, data) { + return this.root().trigger(ev, data) === false ? false : this; + }, + root: function ($el) { + return this._$el || (this._$el = $el); + }, + destroy: function () { + + }, + data: function (key, val) { + if (val !== undefined) { + this.root().data(_prefix + key, val); + return this; + } else { + return this.root().data(_prefix + key) + } + }, + register: function (eventName, $el, fn) { + _eventHandler.push({ + 'evtname': eventName, + '$els': $.isArray($el) ? $el : [$el], + handler: $.proxy(fn, $el) + }) + } + }; + + //从jq实例上拿到绑定的widget实例 + $.fn.edui = function (obj) { + return obj ? this.data('eduiwidget', obj) : this.data('eduiwidget'); + }; + + function _createClass(ClassObj, properties, supperClass) { + ClassObj.prototype = $.extend2( + $.extend({}, properties), + (UM.ui[supperClass] || _widget).prototype, + true + ); + ClassObj.prototype.supper = (UM.ui[supperClass] || _widget).prototype; + //父class的defaultOpt 合并 + if( UM.ui[supperClass] && UM.ui[supperClass].prototype.defaultOpt ) { + + var parentDefaultOptions = UM.ui[supperClass].prototype.defaultOpt, + subDefaultOptions = ClassObj.prototype.defaultOpt; + + ClassObj.prototype.defaultOpt = $.extend( {}, parentDefaultOptions, subDefaultOptions || {} ); + + } + return ClassObj + } + + var _guid = 1; + + function mergeToJQ(ClassObj, className) { + $[_prefix + className] = ClassObj; + $.fn[_prefix + className] = function (opt) { + var result, args = Array.prototype.slice.call(arguments, 1); + + this.each(function (i, el) { + var $this = $(el); + var obj = $this.edui(); + if (!obj) { + ClassObj(!opt || !$.isPlainObject(opt) ? {} : opt, $this); + $this.edui(obj) + } + if ($.type(opt) == 'string') { + if (opt == 'this') { + result = obj; + } else { + result = obj[opt].apply(obj, args); + if (result !== obj && result !== undefined) { + return false; + } + result = null; + } + + } + }); + + return result !== null ? result : this; + } + } + + UM.ui = { + define: function (className, properties, supperClass) { + var ClassObj = UM.ui[className] = _createClass(function (options, $el) { + var _obj = function () { + }; + $.extend(_obj.prototype, ClassObj.prototype, { + guid: className + _guid++, + widgetName: className + } + ); + var obj = new _obj; + if ($.type(options) == 'string') { + obj.init && obj.init({}); + obj.root().edui(obj); + obj.root().find('a').click(function (evt) { + evt.preventDefault() + }); + return obj.root()[_prefix + className].apply(obj.root(), arguments) + } else { + $el && obj.root($el); + obj.init && obj.init(!options || $.isPlainObject(options) ? $.extend2(options || {}, obj.defaultOpt || {}, true) : options); + try{ + obj.root().find('a').click(function (evt) { + evt.preventDefault() + }); + }catch(e){ + } + + return obj.root().edui(obj); + } + + },properties, supperClass); + + mergeToJQ(ClassObj, className); + } + }; + + $(function () { + $(document).on('click mouseup mousedown dblclick mouseover', function (evt) { + $.each(_eventHandler, function (i, obj) { + if (obj.evtname == evt.type) { + $.each(obj.$els, function (i, $el) { + if ($el[0] !== evt.target && !$.contains($el[0], evt.target)) { + obj.handler(evt); + } + }) + } + }) + }) + }) +})(jQuery); +//button 类 +UM.ui.define('button', { + tpl: '<<%if : !${texttype}%>div class="edui-btn edui-btn-${icon} <%if : ${name}%>edui-btn-name-${name}<%/if%>" unselectable="on" onmousedown="return false" <%else%>a class="edui-text-btn"<%/if%><% if: ${title} %> data-original-title="${title}" <%/if%>> ' + + '<% if: ${icon} %>
        <%/if%><%if: ${text} %>${text}<%/if%>' + + '<%if: ${caret} && ${text}%><%/if%>' + + '<% if: ${caret} %><%/if%>div<%else%>a<%/if%>>', + + defaultOpt: { + text: '', + title: '', + icon: '', + width: '', + caret: false, + texttype: false, + click: function () { + } + }, + init: function (options) { + var me = this; + + me.root($(UM.utils.render(me.tpl, options))) + .click(function (evt) { + me.wrapclick(options.click, evt) + }); + + me.root().hover(function () { + if(!me.root().hasClass("edui-disabled")){ + me.root().toggleClass('edui-hover') + } + }) + + return me; + }, + wrapclick: function (fn, evt) { + if (!this.disabled()) { + this.root().trigger('wrapclick'); + $.proxy(fn, this, evt)() + } + return this; + }, + label: function (text) { + if (text === undefined) { + return this.root().find('.edui-button-label').text(); + } else { + this.root().find('.edui-button-label').text(text); + return this; + } + }, + disabled: function (state) { + if (state === undefined) { + return this.root().hasClass('edui-disabled') + } + this.root().toggleClass('edui-disabled', state); + if(this.root().hasClass('edui-disabled')){ + this.root().removeClass('edui-hover') + } + return this; + }, + active: function (state) { + if (state === undefined) { + return this.root().hasClass('edui-active') + } + this.root().toggleClass('edui-active', state) + + return this; + }, + mergeWith: function ($obj) { + var me = this; + me.data('$mergeObj', $obj); + $obj.edui().data('$mergeObj', me.root()); + if (!$.contains(document.body, $obj[0])) { + $obj.appendTo(me.root()); + } + me.on('click',function () { + me.wrapclick(function () { + $obj.edui().show(); + }) + }).register('click', me.root(), function (evt) { + $obj.hide() + }); + } +}); +//toolbar 类 +(function () { + UM.ui.define('toolbar', { + tpl: '
        ' + , + init: function () { + var $root = this.root($(this.tpl)); + this.data('$btnToolbar', $root.find('.edui-btn-toolbar')) + }, + appendToBtnmenu : function(data){ + var $cont = this.data('$btnToolbar'); + data = $.isArray(data) ? data : [data]; + $.each(data,function(i,$item){ + $cont.append($item) + }) + } + }); +})(); + +//menu 类 +UM.ui.define('menu',{ + show : function($obj,dir,fnname,topOffset,leftOffset){ + + fnname = fnname || 'position'; + if(this.trigger('beforeshow') === false){ + return; + }else{ + this.root().css($.extend({display:'block'},$obj ? { + top : $obj[fnname]().top + ( dir == 'right' ? 0 : $obj.outerHeight()) - (topOffset || 0), + left : $obj[fnname]().left + (dir == 'right' ? $obj.outerWidth() : 0) - (leftOffset || 0) + }:{})) + this.trigger('aftershow'); + } + }, + hide : function(all){ + var $parentmenu; + if(this.trigger('beforehide') === false){ + return; + } else { + + if($parentmenu = this.root().data('parentmenu')){ + if($parentmenu.data('parentmenu')|| all) + $parentmenu.edui().hide(); + } + this.root().css('display','none'); + this.trigger('afterhide'); + } + }, + attachTo : function($obj){ + var me = this; + if(!$obj.data('$mergeObj')){ + $obj.data('$mergeObj',me.root()); + $obj.on('wrapclick',function(evt){ + me.show() + }); + me.register('click',$obj,function(evt){ + me.hide() + }); + me.data('$mergeObj',$obj) + } + } +}); +//dropmenu 类 +UM.ui.define('dropmenu', { + tmpl: '
          ' + + '<%for: ${data} as ${ci}%>' + + '<%if: ${ci.divider}%>
        • <%else%>' + + '
        • ' + + '${ci.label}' + + '
        • <%/if%>' + + '<%/for%>' + + '
        ', + defaultOpt: { + data: [], + click: function () { + + } + }, + init: function (options) { + var me = this; + var eventName = { + click: 1, + mouseover: 1, + mouseout: 1 + }; + + this.root($(UM.utils.render(this.tmpl, options))).on('click', 'li[class!="edui-disabled edui-divider edui-dropdown-submenu"]',function (evt) { + $.proxy(options.click, me, evt, $(this).data('value'), $(this))() + }).find('li').each(function (i, el) { + var $this = $(this); + if (!$this.hasClass("edui-disabled edui-divider edui-dropdown-submenu")) { + var data = options.data[i]; + $.each(eventName, function (k) { + data[k] && $this[k](function (evt) { + $.proxy(data[k], el)(evt, data, me.root) + }) + }) + } + }) + + }, + disabled: function (cb) { + $('li[class!=edui-divider]', this.root()).each(function () { + var $el = $(this); + if (cb === true) { + $el.addClass('edui-disabled') + } else if ($.isFunction(cb)) { + $el.toggleClass('edui-disabled', cb(li)) + } else { + $el.removeClass('edui-disabled') + } + + }); + }, + val: function (val) { + var currentVal; + $('li[class!="edui-divider edui-disabled edui-dropdown-submenu"]', this.root()).each(function () { + var $el = $(this); + if (val === undefined) { + if ($el.find('em.edui-dropmenu-checked').length) { + currentVal = $el.data('value'); + return false + } + } else { + $el.find('em').toggleClass('edui-dropmenu-checked', $el.data('value') == val) + } + }); + if (val === undefined) { + return currentVal + } + }, + addSubmenu: function (label, menu, index) { + index = index || 0; + + var $list = $('li[class!=edui-divider]', this.root()); + var $node = $('
      • ' + label + '
      • ').append(menu); + + if (index >= 0 && index < $list.length) { + $node.insertBefore($list[index]); + } else if (index < 0) { + $node.insertBefore($list[0]); + } else if (index >= $list.length) { + $node.appendTo($list); + } + } +}, 'menu'); +//splitbutton 类 +///import button +UM.ui.define('splitbutton',{ + tpl :'
        data-original-title="${title}"<%/if%>>
        <%if: ${icon}%>
        <%/if%><%if: ${text}%>${text}<%/if%>
        '+ + '
        '+ + '
        <\/div>'+ + '
        '+ + '
        ', + defaultOpt:{ + text:'', + title:'', + click:function(){} + }, + init : function(options){ + var me = this; + me.root( $(UM.utils.render(me.tpl, options))); + me.root().find('.edui-btn:first').click(function(evt){ + if(!me.disabled()){ + $.proxy(options.click,me)(); + } + }); + me.root().find('.edui-dropdown-toggle').click(function(){ + if(!me.disabled()){ + me.trigger('arrowclick') + } + }); + me.root().hover(function () { + if(!me.root().hasClass("edui-disabled")){ + me.root().toggleClass('edui-hover') + } + }); + + return me; + }, + wrapclick:function(fn,evt){ + if(!this.disabled()){ + $.proxy(fn,this,evt)() + } + return this; + }, + disabled : function(state){ + if(state === undefined){ + return this.root().hasClass('edui-disabled') + } + this.root().toggleClass('edui-disabled',state).find('.edui-btn').toggleClass('edui-disabled',state); + return this; + }, + active:function(state){ + if(state === undefined){ + return this.root().hasClass('edui-active') + } + this.root().toggleClass('edui-active',state).find('.edui-btn:first').toggleClass('edui-active',state); + return this; + }, + mergeWith:function($obj){ + var me = this; + me.data('$mergeObj',$obj); + $obj.edui().data('$mergeObj',me.root()); + if(!$.contains(document.body,$obj[0])){ + $obj.appendTo(me.root()); + } + me.root().delegate('.edui-dropdown-toggle','click',function(){ + me.wrapclick(function(){ + $obj.edui().show(); + }) + }); + me.register('click',me.root().find('.edui-dropdown-toggle'),function(evt){ + $obj.hide() + }); + } +}); +/** + * Created with JetBrains PhpStorm. + * User: hn + * Date: 13-7-10 + * Time: 下午3:07 + * To change this template use File | Settings | File Templates. + */ +UM.ui.define('colorsplitbutton',{ + + tpl : '
        data-original-title="${title}"<%/if%>>
        <%if: ${icon}%>
        <%/if%>
        style="background: ${color}"<%/if%>>
        <%if: ${text}%>${text}<%/if%>
        '+ + '
        '+ + '
        <\/div>'+ + '
        '+ + '
        ', + defaultOpt: { + color: '' + }, + init: function( options ){ + + var me = this; + + me.supper.init.call( me, options ); + + }, + colorLabel: function(){ + return this.root().find('.edui-splitbutton-color-label'); + } + +}, 'splitbutton'); +//popup 类 +UM.ui.define('popup', { + tpl: '
        onmousedown="return false"<%/if%>'+ + '>
        ${subtpl|raw}
        ' + + '
        ' + + '
        ', + defaultOpt: { + stopprop:false, + subtpl: '', + width: '', + height: '' + }, + init: function (options) { + this.root($(UM.utils.render(this.tpl, options))); + return this; + }, + mergeTpl: function (data) { + return UM.utils.render(this.tpl, {subtpl: data}); + }, + show: function ($obj, posObj) { + if (!posObj) posObj = {}; + + var fnname = posObj.fnname || 'position'; + if (this.trigger('beforeshow') === false) { + return; + } else { + this.root().css($.extend({display: 'block'}, $obj ? { + top: $obj[fnname]().top + ( posObj.dir == 'right' ? 0 : $obj.outerHeight()) - (posObj.offsetTop || 0), + left: $obj[fnname]().left + (posObj.dir == 'right' ? $obj.outerWidth() : 0) - (posObj.offsetLeft || 0), + position: 'absolute' + } : {})); + + this.root().find('.edui-popup-caret').css({ + top: posObj.caretTop || 0, + left: posObj.caretLeft || 0, + position: 'absolute' + }).addClass(posObj.caretDir || "up") + + } + this.trigger("aftershow"); + }, + hide: function () { + this.root().css('display', 'none'); + this.trigger('afterhide') + }, + attachTo: function ($obj, posObj) { + var me = this + if (!$obj.data('$mergeObj')) { + $obj.data('$mergeObj', me.root()); + $obj.on('wrapclick', function (evt) { + me.show($obj, posObj) + }); + me.register('click', $obj, function (evt) { + me.hide() + }); + me.data('$mergeObj', $obj) + } + }, + getBodyContainer: function () { + return this.root().find(".edui-popup-body"); + } +}); +//scale 类 +UM.ui.define('scale', { + tpl: '
        ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
        ', + defaultOpt: { + $doc: $(document), + $wrap: $(document) + }, + init: function (options) { + if(options.$doc) this.defaultOpt.$doc = options.$doc; + if(options.$wrap) this.defaultOpt.$wrap = options.$wrap; + this.root($(UM.utils.render(this.tpl, options))); + this.initStyle(); + this.startPos = this.prePos = {x: 0, y: 0}; + this.dragId = -1; + return this; + }, + initStyle: function () { + utils.cssRule('edui-style-scale', '.edui-scale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;}' + + '.edui-scale span{position:absolute;left:0;top:0;width:7px;height:7px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' + + '.edui-scale .edui-scale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-scale .edui-scale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' + + '.edui-scale .edui-scale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-scale .edui-scale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-scale .edui-scale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-scale .edui-scale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' + + '.edui-scale .edui-scale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' + + '.edui-scale .edui-scale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'); + }, + _eventHandler: function (e) { + var me = this, + $doc = me.defaultOpt.$doc; + switch (e.type) { + case 'mousedown': + var hand = e.target || e.srcElement, hand; + if (hand.className.indexOf('edui-scale-hand') != -1) { + me.dragId = hand.className.slice(-1); + me.startPos.x = me.prePos.x = e.clientX; + me.startPos.y = me.prePos.y = e.clientY; + $doc.bind('mousemove', $.proxy(me._eventHandler, me)); + } + break; + case 'mousemove': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.prePos.x = e.clientX; + me.prePos.y = e.clientY; + me.updateTargetElement(); + } + break; + case 'mouseup': + if (me.dragId != -1) { + me.dragId = -1; + me.updateTargetElement(); + var $target = me.data('$scaleTarget'); + if ($target.parent()) me.attachTo(me.data('$scaleTarget')); + } + $doc.unbind('mousemove', $.proxy(me._eventHandler, me)); + break; + default: + break; + } + }, + updateTargetElement: function () { + var me = this, + $root = me.root(), + $target = me.data('$scaleTarget'); + $target.css({width: $root.width(), height: $root.height()}); + me.attachTo($target); + }, + updateContainerStyle: function (dir, offset) { + var me = this, + $dom = me.root(), + tmp, + rect = [ + //[left, top, width, height] + [0, 0, -1, -1], + [0, 0, 0, -1], + [0, 0, 1, -1], + [0, 0, -1, 0], + [0, 0, 1, 0], + [0, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + + if (rect[dir][0] != 0) { + tmp = parseInt($dom.offset().left) + offset.x; + $dom.css('left', me._validScaledProp('left', tmp)); + } + if (rect[dir][1] != 0) { + tmp = parseInt($dom.offset().top) + offset.y; + $dom.css('top', me._validScaledProp('top', tmp)); + } + if (rect[dir][2] != 0) { + tmp = $dom.width() + rect[dir][2] * offset.x; + $dom.css('width', me._validScaledProp('width', tmp)); + } + if (rect[dir][3] != 0) { + tmp = $dom.height() + rect[dir][3] * offset.y; + $dom.css('height', me._validScaledProp('height', tmp)); + } + }, + _validScaledProp: function (prop, value) { + var $ele = this.root(), + $wrap = this.defaultOpt.$doc, + calc = function(val, a, b){ + return (val + a) > b ? b - a : value; + }; + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : calc(value, $ele.width(), $wrap.width()); + case 'top': + return value < 0 ? 0 : calc(value, $ele.height(),$wrap.height()); + case 'width': + return value <= 0 ? 1 : calc(value, $ele.offset().left, $wrap.width()); + case 'height': + return value <= 0 ? 1 : calc(value, $ele.offset().top, $wrap.height()); + } + }, + show: function ($obj) { + var me = this; + if ($obj) me.attachTo($obj); + me.root().bind('mousedown', $.proxy(me._eventHandler, me)); + me.defaultOpt.$doc.bind('mouseup', $.proxy(me._eventHandler, me)); + me.root().show(); + me.trigger("aftershow"); + }, + hide: function () { + var me = this; + me.root().unbind('mousedown', $.proxy(me._eventHandler, me)); + me.defaultOpt.$doc.unbind('mouseup', $.proxy(me._eventHandler, me)); + me.root().hide(); + me.trigger('afterhide') + }, + attachTo: function ($obj) { + var me = this, + imgPos = $obj.offset(), + $root = me.root(), + $wrap = me.defaultOpt.$wrap, + posObj = $wrap.offset(); + + me.data('$scaleTarget', $obj); + me.root().css({ + position: 'absolute', + width: $obj.width(), + height: $obj.height(), + left: imgPos.left - posObj.left - parseInt($wrap.css('border-left-width')) - parseInt($root.css('border-left-width')), + top: imgPos.top - posObj.top - parseInt($wrap.css('border-top-width')) - parseInt($root.css('border-top-width')) + }); + }, + getScaleTarget: function () { + return this.data('$scaleTarget')[0]; + } +}); +//colorpicker 类 +UM.ui.define('colorpicker', { + tpl: function (opt) { + var COLORS = ( + 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' + + 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' + + 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' + + 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' + + 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' + + '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' + + 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(','); + + var html = '
        ' + + '
        ' + + '' + + ''; + + for (var i = 0; i < COLORS.length; i++) { + if (i && i % 10 === 0) { + html += '' + (i == 60 ? '' : '') + ''; + } + html += i < 70 ? '' : ''; + } + html += '
        '+opt.lang_themeColor+'
        '+opt.lang_standardColor+'
        '; + return html; + }, + init: function (options) { + var me = this; + me.root($(UM.utils.render(me.supper.mergeTpl(me.tpl(options)),options))); + + me.root().on("click",function (e) { + me.trigger('pickcolor', $(e.target).data('color')); + }); + } +}, 'popup'); +/** + * Created with JetBrains PhpStorm. + * User: hn + * Date: 13-5-29 + * Time: 下午8:01 + * To change this template use File | Settings | File Templates. + */ + +(function(){ + + var widgetName = 'combobox', + itemClassName = 'edui-combobox-item', + HOVER_CLASS = 'edui-combobox-item-hover', + ICON_CLASS = 'edui-combobox-checked-icon', + labelClassName = 'edui-combobox-item-label'; + + UM.ui.define( widgetName, ( function(){ + + return { + tpl: "
          edui-combobox-${comboboxName}<%/if%>\" unselectable=\"on\" onmousedown=\"return false\" role=\"menu\" aria-labelledby=\"dropdownMenu\">" + + "<%if: ${autoRecord} %>" + + "<%for : ${recordStack} as ${recordItem}, ${index}%>" + + "<%var : style = ${itemStyles}[${recordItem}]%><%var : record = ${items}[${recordItem}]%>" + + "
        • edui-combobox-checked<%/if%>\" data-item-index=\"${recordItem}\" unselectable=\"on\" onmousedown=\"return false\">" + + "" + + "" + + "
        • " + + "<%/for%>" + + "<%if: ${index} %>" + + "
        • " + + "<%/if%>" + + "<%/if%>" + + "<%for: ${items} as ${item}, ${itemIndex}%>" + + "<%var : labelStyle = ${itemStyles}[${itemIndex}]%>" + + "
        • edui-combobox-checked<%/if%> edui-combobox-item-${itemIndex}\" data-item-index=\"${itemIndex}\" unselectable=\"on\" onmousedown=\"return false\">" + + "" + + "" + + "
        • " + + "<%/for%>" + + "
        ", + defaultOpt: { + //记录栈初始列表 + recordStack: [], + //可用项列表 + items: [], + //item对应的值列表 + value: [], + comboboxName: '', + selected: '', + //自动记录 + autoRecord: true, + //最多记录条数 + recordCount: 5 + }, + init: function( options ){ + + var me = this; + + $.extend( me._optionAdaptation( options ), me._createItemMapping( options.recordStack, options.items ), { + itemClassName: itemClassName, + iconClass: ICON_CLASS, + labelClassName: labelClassName + } ); + + this._transStack( options ); + + me.root( $( UM.utils.render(me.tpl, options) ) ); + + this.data( 'options', options ).initEvent(); + + }, + initEvent: function(){ + + var me = this; + + me.initSelectItem(); + + this.initItemActive(); + + }, + /** + * 初始化选择项 + */ + initSelectItem: function(){ + + var me = this, + labelClass = "."+labelClassName; + + me.root().delegate('.' + itemClassName, 'click', function(){ + + var $li = $(this), + index = $li.attr('data-item-index'); + + me.trigger('comboboxselect', { + index: index, + label: $li.find(labelClass).text(), + value: me.data('options').value[ index ] + }).select( index ); + + me.hide(); + + return false; + + }); + + }, + initItemActive: function(){ + var fn = { + mouseenter: 'addClass', + mouseleave: 'removeClass' + }; + if ($.IE6) { + this.root().delegate( '.'+itemClassName, 'mouseenter mouseleave', function( evt ){ + $(this)[ fn[ evt.type ] ]( HOVER_CLASS ); + }).one('afterhide', function(){ + }); + } + }, + /** + * 选择给定索引的项 + * @param index 项索引 + * @returns {*} 如果存在对应索引的项,则返回该项;否则返回null + */ + select: function( index ){ + + var itemCount = this.data('options').itemCount, + items = this.data('options').autowidthitem; + + if ( items && !items.length ) { + items = this.data('options').items; + } + + if( itemCount == 0 ) { + return null; + } + + if( index < 0 ) { + + index = itemCount + index % itemCount; + + } else if ( index >= itemCount ) { + + index = itemCount-1; + + } + + this.trigger( 'changebefore', items[ index ] ); + + this._update( index ); + + this.trigger( 'changeafter', items[ index ] ); + + return null; + + }, + selectItemByLabel: function( label ){ + + var itemMapping = this.data('options').itemMapping, + me = this, + index = null; + + !$.isArray( label ) && ( label = [ label ] ); + + $.each( label, function( i, item ){ + + index = itemMapping[ item ]; + + if( index !== undefined ) { + + me.select( index ); + return false; + + } + + } ); + + }, + /** + * 转换记录栈 + */ + _transStack: function( options ) { + + var temp = [], + itemIndex = -1, + selected = -1; + + $.each( options.recordStack, function( index, item ){ + + itemIndex = options.itemMapping[ item ]; + + if( $.isNumeric( itemIndex ) ) { + + temp.push( itemIndex ); + + //selected的合法性检测 + if( item == options.selected ) { + selected = itemIndex; + } + + } + + } ); + + options.recordStack = temp; + options.selected = selected; + temp = null; + + }, + _optionAdaptation: function( options ) { + + if( !( 'itemStyles' in options ) ) { + + options.itemStyles = []; + + for( var i = 0, len = options.items.length; i < len; i++ ) { + options.itemStyles.push(''); + } + + } + + options.autowidthitem = options.autowidthitem || options.items; + options.itemCount = options.items.length; + + return options; + + }, + _createItemMapping: function( stackItem, items ){ + + var temp = {}, + result = { + recordStack: [], + mapping: {} + }; + + $.each( items, function( index, item ){ + temp[ item ] = index; + } ); + + result.itemMapping = temp; + + $.each( stackItem, function( index, item ){ + + if( temp[ item ] !== undefined ) { + result.recordStack.push( temp[ item ] ); + result.mapping[ item ] = temp[ item ]; + } + + } ); + + return result; + + }, + _update: function ( index ) { + + var options = this.data("options"), + newStack = [], + newChilds = null; + + $.each( options.recordStack, function( i, item ){ + + if( item != index ) { + newStack.push( +item ); + } + + } ); + + //压入最新的记录 + newStack.unshift( +index ); + + if( newStack.length > options.recordCount ) { + newStack.length = options.recordCount; + } + + options.recordStack = newStack; + options.selected = +index; + newChilds = $( UM.utils.render(this.tpl, options ) ); + + //重新渲染 + this.root().html( newChilds.html() ); + + newChilds = null; + newStack = null; + + } + }; + + } )(), 'menu' ); + +})(); + +/** + * Combox 抽象基类 + * User: hn + * Date: 13-5-29 + * Time: 下午8:01 + * To change this template use File | Settings | File Templates. + */ + +(function(){ + + var widgetName = 'buttoncombobox'; + + UM.ui.define( widgetName, ( function(){ + + return { + defaultOpt: { + //按钮初始文字 + label: '', + title: '' + }, + init: function( options ) { + + var me = this; + + var btnWidget = $.eduibutton({ + caret: true, + name: options.comboboxName, + title: options.title, + text: options.label, + click: function(){ + me.show( this.root() ); + } + }); + + me.supper.init.call( me, options ); + + //监听change, 改变button显示内容 + me.on('changebefore', function( e, label ){ + btnWidget.eduibutton('label', label ); + }); + + me.data( 'button', btnWidget ); + + me.attachTo(btnWidget) + + }, + button: function(){ + return this.data( 'button' ); + } + } + + } )(), 'combobox' ); + +})(); + +/*modal 类*/ +UM.ui.define('modal', { + tpl: '
        ' + + '
        ' + + '
        ' + + '

        ${title}

        ' + + '
        ' + + '
        ' + + '
        ' + + '<% if: ${cancellabel} || ${oklabel} %>' + + '' + + '<%/if%>
        ', + defaultOpt: { + title: "", + cancellabel: "", + oklabel: "", + width: '', + height: '', + backdrop: true, + keyboard: true + }, + init: function (options) { + var me = this; + + me.root($(UM.utils.render(me.tpl, options || {}))); + + me.data("options", options); + if (options.okFn) { + me.on('ok', $.proxy(options.okFn, me)) + } + if (options.cancelFn) { + me.on('beforehide', $.proxy(options.cancelFn, me)) + } + + me.root().delegate('[data-hide="modal"]', 'click', $.proxy(me.hide, me)) + .delegate('[data-ok="modal"]', 'click', $.proxy(me.ok, me)); + + $('[data-hide="modal"],[data-ok="modal"]',me.root()).hover(function(){ + $(this).toggleClass('edui-hover') + }); + }, + toggle: function () { + var me = this; + return me[!me.data("isShown") ? 'show' : 'hide'](); + }, + show: function () { + + var me = this; + + me.trigger("beforeshow"); + + if (me.data("isShown")) return; + + me.data("isShown", true); + + me.escape(); + + me.backdrop(function () { + me.autoCenter(); + me.root() + .show() + .focus() + .trigger('aftershow'); + }) + }, + showTip: function ( text ) { + $( '.edui-modal-tip', this.root() ).html( text ).fadeIn(); + }, + hideTip: function ( text ) { + $( '.edui-modal-tip', this.root() ).fadeOut( function (){ + $(this).html(''); + } ); + }, + autoCenter: function () { + //ie6下不用处理了 + !$.IE6 && this.root().css("margin-left", -(this.root().width() / 2)); + }, + hide: function () { + var me = this; + + me.trigger("beforehide"); + + if (!me.data("isShown")) return; + + me.data("isShown", false); + + me.escape(); + + me.hideModal(); + }, + escape: function () { + var me = this; + if (me.data("isShown") && me.data("options").keyboard) { + me.root().on('keyup', function (e) { + e.which == 27 && me.hide(); + }) + } + else if (!me.data("isShown")) { + me.root().off('keyup'); + } + }, + hideModal: function () { + var me = this; + me.root().hide(); + me.backdrop(function () { + me.removeBackdrop(); + me.trigger('afterhide'); + }) + }, + removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove(); + this.$backdrop = null; + }, + backdrop: function (callback) { + var me = this; + if (me.data("isShown") && me.data("options").backdrop) { + me.$backdrop = $('
        ').click( + me.data("options").backdrop == 'static' ? + $.proxy(me.root()[0].focus, me.root()[0]) + : $.proxy(me.hide, me) + ) + } + me.trigger('afterbackdrop'); + callback && callback(); + + }, + attachTo: function ($obj) { + var me = this + if (!$obj.data('$mergeObj')) { + + $obj.data('$mergeObj', me.root()); + $obj.on('click', function () { + me.toggle($obj) + }); + me.data('$mergeObj', $obj) + } + }, + ok: function () { + var me = this; + me.trigger('beforeok'); + if (me.trigger("ok", me) === false) { + return; + } + me.hide(); + }, + getBodyContainer: function () { + return this.root().find('.edui-modal-body') + } +}); + + +/*tooltip 类*/ +UM.ui.define('tooltip', { + tpl: '
        ' + + '
        ' + + '
        ' + + '
        ', + init: function (options) { + var me = this; + me.root($(UM.utils.render(me.tpl, options || {}))); + }, + content: function (e) { + var me = this, + title = $(e.currentTarget).attr("data-original-title"); + + me.root().find('.edui-tooltip-inner')['text'](title); + }, + position: function (e) { + var me = this, + $obj = $(e.currentTarget); + + me.root().css($.extend({display: 'block'}, $obj ? { + top: $obj.outerHeight(), + left: (($obj.outerWidth() - me.root().outerWidth()) / 2) + } : {})) + }, + show: function (e) { + if ($(e.currentTarget).hasClass('edui-disabled')) return; + + var me = this; + me.content(e); + me.root().appendTo($(e.currentTarget)); + me.position(e); + me.root().css('display', 'block'); + }, + hide: function () { + var me = this; + me.root().css('display', 'none') + }, + attachTo: function ($obj) { + var me = this; + + function tmp($obj) { + var me = this; + + if (!$.contains(document.body, me.root()[0])) { + me.root().appendTo($obj); + } + + me.data('tooltip', me.root()); + + $obj.each(function () { + if ($(this).attr("data-original-title")) { + $(this).on('mouseenter', $.proxy(me.show, me)) + .on('mouseleave click', $.proxy(me.hide, me)) + + } + }); + + } + + if ($.type($obj) === "undefined") { + $("[data-original-title]").each(function (i, el) { + tmp.call(me, $(el)); + }) + + } else { + if (!$obj.data('tooltip')) { + tmp.call(me, $obj); + } + } + } +}); + +/*tab 类*/ +UM.ui.define('tab', { + init: function (options) { + var me = this, + slr = options.selector; + + if ($.type(slr)) { + me.root($(slr, options.context)); + me.data("context", options.context); + + $(slr, me.data("context")).on('click', function (e) { + me.show(e); + }); + } + }, + show: function (e) { + + var me = this, + $cur = $(e.target), + $ul = $cur.closest('ul'), + selector, + previous, + $target, + e; + + selector = $cur.attr('data-context'); + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); + + var $tmp = $cur.parent('li'); + + if (!$tmp.length || $tmp.hasClass('edui-active')) return; + + previous = $ul.find('.edui-active:last a')[0]; + + e = $.Event('beforeshow', { + target: $cur[0], + relatedTarget: previous + }); + + me.trigger(e); + + if (e.isDefaultPrevented()) return; + + $target = $(selector, me.data("context")); + + me.activate($cur.parent('li'), $ul); + me.activate($target, $target.parent(), function () { + me.trigger({ + type: 'aftershow', relatedTarget: previous + }) + }); + }, + activate: function (element, container, callback) { + if (element === undefined) { + return $(".edui-tab-item.edui-active",this.root()).index(); + } + + var $active = container.find('> .edui-active'); + + $active.removeClass('edui-active'); + + element.addClass('edui-active'); + + callback && callback(); + } +}); + + +//button 类 +UM.ui.define('separator', { + tpl: '
        ', + init: function (options) { + var me = this; + me.root($($.parseTmpl(me.tpl, options))); + return me; + } +}); +/** + * @file adapter.js + * @desc adapt ui to editor + * @import core/Editor.js, core/utils.js + */ + +(function () { + var _editorUI = {}, + _editors = {}, + _readyFn = [], + _activeWidget = null, + _widgetData = {}, + _widgetCallBack = {}, + _cacheUI = {}, + _maxZIndex = null; + + utils.extend(UM, { + defaultWidth : 500, + defaultHeight : 500, + registerUI: function (name, fn) { + utils.each(name.split(/\s+/), function (uiname) { + _editorUI[uiname] = fn; + }) + }, + + setEditor : function(editor){ + !_editors[editor.id] && (_editors[editor.id] = editor); + }, + registerWidget : function(name,pro,cb){ + _widgetData[name] = $.extend2(pro,{ + $root : '', + _preventDefault:false, + root:function($el){ + return this.$root || (this.$root = $el); + }, + preventDefault:function(){ + this._preventDefault = true; + }, + clear:false + }); + if(cb){ + _widgetCallBack[name] = cb; + } + }, + getWidgetData : function(name){ + return _widgetData[name] + }, + setWidgetBody : function(name,$widget,editor){ + if(!editor._widgetData){ + + utils.extend(editor,{ + _widgetData : {}, + getWidgetData : function(name){ + return this._widgetData[name]; + }, + getWidgetCallback : function(widgetName){ + var me = this; + return function(){ + return _widgetCallBack[widgetName].apply(me,[me,$widget].concat(Array.prototype.slice.call(arguments,0))) + } + } + }) + + } + var pro = _widgetData[name]; + if(!pro){ + return null; + } + pro = editor._widgetData[name]; + if(!pro){ + pro = _widgetData[name]; + pro = editor._widgetData[name] = $.type(pro) == 'function' ? pro : utils.clone(pro); + } + + pro.root($widget.edui().getBodyContainer()); + + pro.initContent(editor,$widget); + if(!pro._preventDefault){ + pro.initEvent(editor,$widget); + } + + pro.width && $widget.width(pro.width); + + + }, + setActiveWidget : function($widget){ + _activeWidget = $widget; + }, + getEditor: function (id, options) { + var editor = _editors[id] || (_editors[id] = this.createEditor(id, options)); + _maxZIndex = _maxZIndex ? Math.max(editor.getOpt('zIndex'), _maxZIndex):editor.getOpt('zIndex'); + return editor; + }, + setTopEditor: function(editor){ + $.each(_editors, function(i, o){ + if(editor == o) { + editor.$container && editor.$container.css('zIndex', _maxZIndex + 1); + } else { + o.$container && o.$container.css('zIndex', o.getOpt('zIndex')); + } + }); + }, + clearCache : function(id){ + if ( _editors[id]) { + delete _editors[id] + } + }, + delEditor: function (id) { + var editor; + if (editor = _editors[id]) { + editor.destroy(); + } + }, + ready: function( fn ){ + _readyFn.push( fn ); + }, + createEditor: function (id, opt) { + var editor = new UM.Editor(opt); + var T = this; + + editor.langIsReady ? $.proxy(renderUI,T)() : editor.addListener("langReady", $.proxy(renderUI,T)); + function renderUI(){ + + + var $container = this.createUI('#' + id, editor); + editor.key=id; + editor.ready(function(){ + $.each( _readyFn, function( index, fn ){ + $.proxy( fn, editor )(); + } ); + }); + var options = editor.options; + if(options.initialFrameWidth){ + options.minFrameWidth = options.initialFrameWidth + }else{ + options.minFrameWidth = options.initialFrameWidth = editor.$body.width() || UM.defaultWidth; + } + + $container.css({ + width: options.initialFrameWidth, + zIndex:editor.getOpt('zIndex') + }); + + //ie6下缓存图片 + UM.browser.ie && UM.browser.version === 6 && document.execCommand("BackgroundImageCache", false, true); + + editor.render(id); + + + //添加tooltip; + $.eduitooltip && $.eduitooltip('attachTo', $("[data-original-title]",$container)).css('z-index',editor.getOpt('zIndex')+1); + + $container.find('a').click(function(evt){ + evt.preventDefault() + }); + + editor.fireEvent("afteruiready"); + } + + return editor; + + }, + createUI: function (id, editor) { + var $editorCont = $(id), + $container = $('
        ').insertBefore($editorCont); + editor.$container = $container; + editor.container = $container[0]; + + editor.$body = $editorCont; + + //修正在ie9+以上的版本中,自动长高收起时的,残影问题 + if(browser.ie && browser.ie9above){ + var $span = $(''); + $span.insertAfter($container); + } + //初始化注册的ui组件 + $.each(_editorUI,function(n,v){ + var widget = v.call(editor,n); + if(widget){ + _cacheUI[n] = widget; + } + + }); + + $container.find('.edui-editor-body').append($editorCont).before(this.createToolbar(editor.options, editor)); + + $container.find('.edui-toolbar').append($('
        ')); + + + return $container; + }, + createToolbar: function (options, editor) { + var $toolbar = $.eduitoolbar(), toolbar = $toolbar.edui(); + //创建下来菜单列表 + + if (options.toolbar && options.toolbar.length) { + var btns = []; + $.each(options.toolbar,function(i,uiNames){ + $.each(uiNames.split(/\s+/),function(index,name){ + if(name == '|'){ + $.eduiseparator && btns.push($.eduiseparator()); + }else{ + var ui = _cacheUI[name]; + if(name=="fullscreen"){ + ui&&btns.unshift(ui); + }else{ + ui && btns.push(ui); + } + } + + }); + btns.length && toolbar.appendToBtnmenu(btns); + }); + } else { + $toolbar.find('.edui-btn-toolbar').remove() + } + return $toolbar; + } + + }) + + +})(); + + + +UM.registerUI('bold italic redo undo underline strikethrough superscript subscript insertorderedlist insertunorderedlist ' + + 'cleardoc selectall link unlink print preview justifyleft justifycenter justifyright justifyfull removeformat horizontal drafts', + function(name) { + var me = this; + var $btn = $.eduibutton({ + icon : name, + click : function(){ + me.execCommand(name); + }, + title: this.getLang('labelMap')[name] || '' + }); + + this.addListener('selectionchange',function(){ + var state = this.queryCommandState(name); + $btn.edui().disabled(state == -1).active(state == 1) + }); + return $btn; + } +); + + +/** + * 全屏组件 + */ + +(function(){ + + //状态缓存 + var STATUS_CACHE = {}, + //状态值列表 + STATUS_LIST = [ 'width', 'height', 'position', 'top', 'left', 'margin', 'padding', 'overflowX', 'overflowY' ], + CONTENT_AREA_STATUS = {}, + //页面状态 + DOCUMENT_STATUS = {}, + DOCUMENT_ELEMENT_STATUS = {}, + + FULLSCREENS = {}; + + + UM.registerUI('fullscreen', function( name ){ + + var me = this, + $button = $.eduibutton({ + 'icon': 'fullscreen', + 'title': (me.options.labelMap && me.options.labelMap[name]) || me.getLang("labelMap." + name), + 'click': function(){ + //切换 + me.execCommand( name ); + UM.setTopEditor(me); + } + }); + + me.addListener( "selectionchange", function () { + + var state = this.queryCommandState( name ); + $button.edui().disabled( state == -1 ).active( state == 1 ); + + } ); + + //切换至全屏 + me.addListener('ready', function(){ + + me.options.fullscreen && Fullscreen.getInstance( me ).toggle(); + + }); + + return $button; + + }); + + UM.commands[ 'fullscreen' ] = { + + execCommand: function (cmdName) { + + Fullscreen.getInstance( this ).toggle(); + + }, + queryCommandState: function (cmdName) { + + return this._edui_fullscreen_status; + }, + notNeedUndo: 1 + + }; + + function Fullscreen( editor ) { + + var me = this; + + if( !editor ) { + throw new Error('invalid params, notfound editor'); + } + + me.editor = editor; + + //记录初始化的全屏组件 + FULLSCREENS[ editor.uid ] = this; + + editor.addListener('destroy', function(){ + delete FULLSCREENS[ editor.uid ]; + me.editor = null; + }); + + } + + Fullscreen.prototype = { + + /** + * 全屏状态切换 + */ + toggle: function(){ + + var editor = this.editor, + //当前编辑器的缩放状态 + _edui_fullscreen_status = this.isFullState(); + editor.fireEvent('beforefullscreenchange', !_edui_fullscreen_status ); + + //更新状态 + this.update( !_edui_fullscreen_status ); + + !_edui_fullscreen_status ? this.enlarge() : this.revert(); + + editor.fireEvent('afterfullscreenchange', !_edui_fullscreen_status ); + if(editor.body.contentEditable === 'true'){ + editor.fireEvent( 'fullscreenchanged', !_edui_fullscreen_status ); + } + + editor.fireEvent( 'selectionchange' ); + + }, + /** + * 执行放大 + */ + enlarge: function(){ + + this.saveSataus(); + + this.setDocumentStatus(); + + this.resize(); + + }, + /** + * 全屏还原 + */ + revert: function(){ + + //还原CSS表达式 + var options = this.editor.options, + height = /%$/.test(options.initialFrameHeight) ? '100%' : (options.initialFrameHeight - this.getStyleValue("padding-top")- this.getStyleValue("padding-bottom") - this.getStyleValue('border-width')); + + $.IE6 && this.getEditorHolder().style.setExpression('height', 'this.scrollHeight <= ' + height + ' ? "' + height + 'px" : "auto"'); + + //还原容器状态 + this.revertContainerStatus(); + + this.revertContentAreaStatus(); + + this.revertDocumentStatus(); + + }, + /** + * 更新状态 + * @param isFull 当前状态是否是全屏状态 + */ + update: function( isFull ) { + this.editor._edui_fullscreen_status = isFull; + }, + /** + * 调整当前编辑器的大小, 如果当前编辑器不处于全屏状态, 则不做调整 + */ + resize: function(){ + + var $win = null, + height = 0, + width = 0, + borderWidth = 0, + paddingWidth = 0, + editor = this.editor, + me = this, + bound = null, + editorBody = null; + + if( !this.isFullState() ) { + return; + } + + $win = $( window ); + width = $win.width(); + height = $win.height(); + editorBody = this.getEditorHolder(); + //文本编辑区border宽度 + borderWidth = parseInt( domUtils.getComputedStyle( editorBody, 'border-width' ), 10 ) || 0; + //容器border宽度 + borderWidth += parseInt( domUtils.getComputedStyle( editor.container, 'border-width' ), 10 ) || 0; + //容器padding + paddingWidth += parseInt( domUtils.getComputedStyle( editorBody, 'padding-left' ), 10 ) + parseInt( domUtils.getComputedStyle( editorBody, 'padding-right' ), 10 ) || 0; + + //干掉css表达式 + $.IE6 && editorBody.style.setExpression( 'height', null ); + + bound = this.getBound(); + + $( editor.container ).css( { + width: width + 'px', + height: height + 'px', + position: !$.IE6 ? 'fixed' : 'absolute', + top: bound.top, + left: bound.left, + margin: 0, + padding: 0, + overflowX: 'hidden', + overflowY: 'hidden' + } ); + + $( editorBody ).css({ + width: width - 2*borderWidth - paddingWidth + 'px', + height: height - 2*borderWidth - ( editor.options.withoutToolbar ? 0 : $( '.edui-toolbar', editor.container ).outerHeight() ) - $( '.edui-bottombar', editor.container).outerHeight() + 'px', + overflowX: 'hidden', + overflowY: 'auto' + }); + + }, + /** + * 保存状态 + */ + saveSataus: function(){ + + var styles = this.editor.container.style, + tmp = null, + cache = {}; + + for( var i= 0, len = STATUS_LIST.length; i offset) { + setFloating(); + }else{ + unsetFloating(); + } + } + var defer_updateFloating = utils.defer(function(){ + updateFloating(); + },browser.ie ? 200 : 100,true); + + me.addListener('destroy',function(){ + $(window).off('scroll resize',updateFloating); + me.removeListener('keydown', defer_updateFloating); + }); + + if(checkHasUI(me)){ + toolbarBox = $('.edui-toolbar',me.container)[0]; + me.addListener("afteruiready",function(){ + setTimeout(function(){ + orgTop = $(toolbarBox).offset().top; + },100); + }); + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + if(LteIE6){ + fixIE6FixedPos(); + } + + $(window).on('scroll resize',updateFloating); + me.addListener('keydown', defer_updateFloating); + me.addListener('resize', function(){ + unsetFloating(); + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + updateFloating(); + }); + + me.addListener('beforefullscreenchange', function (t, enabled){ + if (enabled) { + unsetFloating(); + isFullScreening = enabled; + } + }); + me.addListener('fullscreenchanged', function (t, enabled){ + if (!enabled) { + updateFloating(); + } + isFullScreening = enabled; + }); + me.addListener('sourcemodechanged', function (t, enabled){ + setTimeout(function (){ + updateFloating(); + },0); + }); + me.addListener("clearDoc",function(){ + setTimeout(function(){ + updateFloating(); + },0); + + }) + } + }) + + +}); +UM.registerUI('source',function(name){ + var me = this; + me.addListener('fullscreenchanged',function(){ + me.$container.find('textarea').width(me.$body.width() - 10).height(me.$body.height()) + + }); + var $btn = $.eduibutton({ + icon : name, + click : function(){ + me.execCommand(name); + UM.setTopEditor(me); + }, + title: this.getLang('labelMap')[name] || '' + }); + + this.addListener('selectionchange',function(){ + var state = this.queryCommandState(name); + $btn.edui().disabled(state == -1).active(state == 1) + }); + return $btn; +}); + +UM.registerUI('paragraph fontfamily fontsize', function( name ) { + + var me = this, + label = (me.options.labelMap && me.options.labelMap[name]) || me.getLang("labelMap." + name), + options = { + label: label, + title: label, + comboboxName: name, + items: me.options[ name ] || [], + itemStyles: [], + value: [], + autowidthitem: [] + }, + $combox = null, + comboboxWidget = null; + if(options.items.length == 0){ + return null; + } + switch ( name ) { + + case 'paragraph': + options = transForParagraph( options ); + break; + + case 'fontfamily': + options = transForFontfamily( options ); + break; + + case 'fontsize': + options = transForFontsize( options ); + break; + + } + + //实例化 + $combox = $.eduibuttoncombobox(options).css('zIndex',me.getOpt('zIndex') + 1); + comboboxWidget = $combox.edui(); + + comboboxWidget.on('comboboxselect', function( evt, res ){ + me.execCommand( name, res.value ); + }).on("beforeshow", function(){ + if( $combox.parent().length === 0 ) { + $combox.appendTo( me.$container.find('.edui-dialog-container') ); + } + UM.setTopEditor(me); + }); + + + //状态反射 + this.addListener('selectionchange',function( evt ){ + + var state = this.queryCommandState( name ), + value = this.queryCommandValue( name ); + + //设置按钮状态 + comboboxWidget.button().edui().disabled( state == -1 ).active( state == 1 ); + if(value){ + //设置label + value = value.replace(/['"]/g, '').toLowerCase().split(/['|"]?\s*,\s*[\1]?/); + + comboboxWidget.selectItemByLabel( value ); + } + + + }); + + return comboboxWidget.button().addClass('edui-combobox'); + + /** + * 宽度自适应工具函数 + * @param word 单词内容 + * @param hasSuffix 是否含有后缀 + */ + function wordCountAdaptive ( word, hasSuffix ) { + + var $tmpNode = $('' ).html( word ).css( { + display: 'inline', + position: 'absolute', + top: -10000000, + left: -100000 + } ).appendTo( document.body), + width = $tmpNode.width(); + + $tmpNode.remove(); + $tmpNode = null; + + if( width < 50 ) { + + return word; + + } else { + + word = word.slice( 0, hasSuffix ? -4 : -1 ); + + if( !word.length ) { + return '...'; + } + + return wordCountAdaptive( word + '...', true ); + + } + + } + + + //段落参数转换 + function transForParagraph ( options ) { + + var tempItems = []; + + for( var key in options.items ) { + + options.value.push( key ); + tempItems.push( key ); + options.autowidthitem.push( wordCountAdaptive( key ) ); + + } + + options.items = tempItems; + options.autoRecord = false; + + return options; + + } + + //字体参数转换 + function transForFontfamily ( options ) { + + var temp = null, + tempItems = []; + + for( var i = 0, len = options.items.length; i < len; i++ ) { + + temp = options.items[ i ].val; + tempItems.push( temp.split(/\s*,\s*/)[0] ); + options.itemStyles.push('font-family: ' + temp); + options.value.push( temp ); + options.autowidthitem.push( wordCountAdaptive( tempItems[ i ] ) ); + + } + + options.items = tempItems; + + return options; + + } + + //字体大小参数转换 + function transForFontsize ( options ) { + + var temp = null, + tempItems = []; + + options.itemStyles = []; + options.value = []; + + for( var i = 0, len = options.items.length; i < len; i++ ) { + + temp = options.items[ i ]; + tempItems.push( temp ); + options.itemStyles.push('font-size: ' + temp +'px'); + + } + + options.value = options.items; + options.items = tempItems; + options.autoRecord = false; + + return options; + + } + +}); + + +UM.registerUI('forecolor backcolor', function( name ) { + function getCurrentColor() { + return domUtils.getComputedStyle( $colorLabel[0], 'background-color' ); + } + + var me = this, + $colorPickerWidget = null, + $colorLabel = null, + $btn = null; + + //querycommand + this.addListener('selectionchange', function(){ + + var state = this.queryCommandState( name ); + $btn.edui().disabled( state == -1 ).active( state == 1 ); + + }); + + $btn = $.eduicolorsplitbutton({ + icon: name, + caret: true, + name: name, + title: me.getLang("labelMap")[name], + click: function() { + me.execCommand( name, getCurrentColor() ); + } + }); + + $colorLabel = $btn.edui().colorLabel(); + + $colorPickerWidget = $.eduicolorpicker({ + name: name, + lang_clearColor: me.getLang('clearColor') || '', + lang_themeColor: me.getLang('themeColor') || '', + lang_standardColor: me.getLang('standardColor') || '' + }) + .on('pickcolor', function( evt, color ){ + window.setTimeout( function(){ + $colorLabel.css("backgroundColor", color); + me.execCommand( name, color ); + }, 0 ); + }) + .on('show',function(){ + UM.setActiveWidget( colorPickerWidget.root() ); + }).css('zIndex',me.getOpt('zIndex') + 1); + + $btn.edui().on('arrowclick',function(){ + if(!$colorPickerWidget.parent().length){ + me.$container.find('.edui-dialog-container').append($colorPickerWidget); + } + $colorPickerWidget.edui().show($btn,{ + caretDir:"down", + offsetTop:-5, + offsetLeft:8, + caretLeft:11, + caretTop:-8 + }); + UM.setTopEditor(me); + }).register('click', $btn, function () { + $colorPickerWidget.edui().hide() + }); + + return $btn; + +}); + +})(jQuery) \ No newline at end of file diff --git a/member/editor/umeditor/umeditor.min.js b/member/editor/umeditor/umeditor.min.js new file mode 100644 index 0000000..f667658 --- /dev/null +++ b/member/editor/umeditor/umeditor.min.js @@ -0,0 +1,273 @@ +/* + UEditor Mini?? + version: 1.2.2 + build: Fri Feb 10 2017 15:00:06 GMT+0800 (CST) +*/ +var $jscomp={scope:{},findInternal:function(g,B,w){g instanceof String&&(g=String(g));for(var x=g.length,m=0;mc||d.quirks;d.ie9above=8c}d.gecko&&(f=a.match(/rv:([\d\.]+)/))&&(f=f[1].split("."),c=1E4*f[0]+100*(f[1]||0)+1*(f[2]||0));/chrome\/(\d+\.\d)/i.test(a)&&(d.chrome=+RegExp.$1);/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(d.safari=+(RegExp.$1||RegExp.$2));d.opera&&(c=parseFloat(b.version()));d.webkit&&(c=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));d.version=c;d.isCompatible= +!d.mobile&&(d.ie&&6<=c||d.gecko&&10801<=c||d.opera&&9.5<=c||d.air&&1<=c||d.webkit&&522<=c||!1);return d}(),E=m.ie,n=UM.utils={each:function(a,b,d){if(null!=a)if(a.length===+a.length)for(var c=0,f=a.length;c=d&&a===b)return c= +h,!1});return c},removeItem:function(a,b){for(var d=0,c=a.length;d'](?:(amp|lt|quot|gt|#39|nbsp);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},html:function(a){return a? +a.replace(/&((g|l|quo)t|amp|#39);/g,function(a){return{"<":"<","&":"&",""":'"',">":">","'":"'"}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d=0,h;h=b[d++];)if(h.doc===a&&h.url==(c.src||c.href))return h}catch(e){return null}} +var b=[];return function(d,c,f){var h=a(d,c);if(h)h.ready?f&&f():h.funs.push(f);else if(b.push({doc:d,url:c.src||c.href,funs:[f]}),!d.body){f=[];for(var e in c)"tag"!=e&&f.push(e+'="'+c[e]+'"');d.write("<"+c.tag+" "+f.join(" ")+" >")}else if(!c.id||!d.getElementById(c.id)){var l=d.createElement(c.tag);delete c.tag;for(e in c)l.setAttribute(e,c[e]);l.onload=l.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){h=a(d,c);if(0m.version?{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}:{tabindex:"tabIndex",readonly:"readOnly"},K=n.listToMap("-webkit-box -moz-box block list-item table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption".split(" ")), +k=x.domUtils={NODE_ELEMENT:1,NODE_DOCUMENT:9,NODE_TEXT:3,NODE_COMMENT:8,NODE_DOCUMENT_FRAGMENT:11,POSITION_IDENTICAL:0,POSITION_DISCONNECTED:1,POSITION_FOLLOWING:2,POSITION_PRECEDING:4,POSITION_IS_CONTAINED:8,POSITION_CONTAINS:16,fillChar:E&&"6"==m.version?"\ufeff":"\u200b",keys:{8:1,46:1,16:1,17:1,18:1,37:1,38:1,39:1,40:1,13:1},breakParent:function(a,b){var d,c=a,f=a,h,e;do{c=c.parentNode;h?(d=c.cloneNode(!1),d.appendChild(h),h=d,d=c.cloneNode(!1),d.appendChild(e),e=d):(h=c.cloneNode(!1),e=h.cloneNode(!1)); +for(;d=f.previousSibling;)h.insertBefore(d,h.firstChild);for(;d=f.nextSibling;)e.appendChild(d);f=c}while(b!==c);d=b.parentNode;d.insertBefore(h,b);d.insertBefore(e,b);d.insertBefore(a,e);k.remove(b);return a},trimWhiteTextNode:function(a){function b(b){for(var c;(c=a[b])&&3==c.nodeType&&k.isWhitespace(c);)a.removeChild(c)}b("firstChild");b("lastChild")},getPosition:function(a,b){if(a===b)return 0;var d,c=[a],f=[b];for(d=a;d=d.parentNode;){if(d===b)return 10;c.push(d)}for(d=b;d=d.parentNode;){if(d=== +a)return 20;f.push(d)}c.reverse();f.reverse();if(c[0]!==f[0])return 1;for(d=-1;d++,c[d]===f[d];);a=c[d];for(b=f[d];a=a.nextSibling;)if(a===b)return 4;return 2},getNodeIndex:function(a,b){for(var d=a,c=0;d=d.previousSibling;)b&&3==d.nodeType?d.nodeType!=d.nextSibling.nodeType&&c++:c++;return c},inDoc:function(a,b){return 10==k.getPosition(a,b)},findParent:function(a,b,d){if(a&&!k.isBody(a))for(a=d?a:a.parentNode;a;){if(!b||b(a)||k.isBody(a))return b&&!b(a)&&k.isBody(a)?null:a;a=a.parentNode}return null}, +findParentByTagName:function(a,b,d,c){b=n.listToMap(n.isArray(b)?b:[b]);return k.findParent(a,function(a){return b[a.tagName]&&!(c&&c(a))},d)},findParents:function(a,b,d,c){for(b=b&&(d&&d(a)||!d)?[a]:[];a=k.findParent(a,d);)b.push(a);return c?b:b.reverse()},insertAfter:function(a,b){return a.parentNode.insertBefore(b,a.nextSibling)},remove:function(a,b){var d=a.parentNode,c;if(d){if(b&&a.hasChildNodes())for(;c=a.firstChild;)d.insertBefore(c,a);d.removeChild(a)}return a},getNextDomNode:function(a, +b,d,c){return w(a,"firstChild","nextSibling",b,d,c)},getPreDomNode:function(a,b,d,c){return w(a,"lastChild","previousSibling",b,d,c)},isBookmarkNode:function(a){return 1==a.nodeType&&a.id&&/^_baidu_bookmark_/i.test(a.id)},getWindow:function(a){a=a.ownerDocument||a;return a.defaultView||a.parentWindow},getCommonAncestor:function(a,b){if(a===b)return a;for(var d=[a],c=[b],f=a,h=-1;f=f.parentNode;){if(f===b)return f;d.push(f)}for(f=b;f=f.parentNode;){if(f===a)return f;c.push(f)}d.reverse();for(c.reverse();h++, +d[h]===c[h];);return 0==h?null:d[h-1]},clearEmptySibling:function(a,b,d){function c(a,b){for(var c;a&&!k.isBookmarkNode(a)&&(k.isEmptyInlineElement(a)||!(new RegExp("[^\t\n\r"+k.fillChar+"]")).test(a.nodeValue));)c=a[b],k.remove(a),a=c}!b&&c(a.nextSibling,"nextSibling");!d&&c(a.previousSibling,"previousSibling")},split:function(a,b){var d=a.ownerDocument;if(m.ie&&b==a.nodeValue.length){var c=d.createTextNode("");return k.insertAfter(a,c)}c=a.splitText(b);m.ie8&&(d=d.createTextNode(""),k.insertAfter(c, +d),k.remove(d));return c},isWhitespace:function(a){return!(new RegExp("[^ \t\n\r"+k.fillChar+"]")).test(a.nodeValue)},getXY:function(a){for(var b=0,d=0;a.offsetParent;)d+=a.offsetTop,b+=a.offsetLeft,a=a.offsetParent;return{x:b,y:d}},isEmptyInlineElement:function(a){if(1!=a.nodeType||!p.$removeEmpty[a.tagName])return 0;for(a=a.firstChild;a;){if(k.isBookmarkNode(a)||1==a.nodeType&&!k.isEmptyInlineElement(a)||3==a.nodeType&&!k.isWhitespace(a))return 0;a=a.nextSibling}return 1},isBlockElm:function(a){return 1== +a.nodeType&&(p.$block[a.tagName]||K[k.getComputedStyle(a,"display")])&&!p.$nonChild[a.tagName]},getElementsByTagName:function(a,b,d){if(d&&n.isString(d)){var c=d;d=function(a){var b=!1;g.each(n.trim(c).replace(/[ ]{2,}/g," ").split(" "),function(l,c){if(g(a).hasClass(c))return b=!0,!1});return b}}b=n.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var f=[],h=0,e;e=b[h++];){e=a.getElementsByTagName(e);for(var l=0,t;t=e[l++];)d&&!d(t)||f.push(t)}return f},unSelectable:E&&m.ie9below||m.opera?function(a){a.onselectstart= +function(){return!1};a.onclick=a.onkeyup=a.onkeydown=function(){return!1};a.unselectable="on";a.setAttribute("unselectable","on");for(var b=0,d;d=a.all[b++];)switch(d.tagName.toLowerCase()){case "iframe":case "textarea":case "input":case "select":break;default:d.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=n.isArray(b)?b:n.trim(b).replace(/[ ]{2,}/g, +" ").split(" ");for(var d=0,c;c=b[d++];){c=J[c]||c;switch(c){case "className":a[c]="";break;case "style":a.style.cssText="",a.getAttributeNode("style")&&!m.ie&&a.removeAttributeNode(a.getAttributeNode("style"))}a.removeAttribute(c)}},createElement:function(a,b,d){return k.setAttributes(a.createElement(b),d)},setAttributes:function(a,b){for(var d in b)if(b.hasOwnProperty(d)){var c=b[d];switch(d){case "class":a.className=c;break;case "style":a.style.cssText=a.style.cssText+";"+c;break;case "innerHTML":a[d]= +c;break;case "value":a.value=c;break;default:a.setAttribute(J[d]||d,c)}}return a},getComputedStyle:function(a,b){return n.transUnitToPx(n.fixColor(b,g(a).css(b)))},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){m.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(n.cssStyleToDomStyle(b));a.style.cssText||k.removeAttributes(a, +["style"])},getStyle:function(a,b){var d=a.style[n.cssStyleToDomStyle(b)];return n.fixColor(b,d)},setStyle:function(a,b,d){a.style[n.cssStyleToDomStyle(b)]=d;n.trim(a.style.cssText)||this.removeAttributes(a,"style")},removeDirtyAttr:function(a){for(var b=0,d,c=a.getElementsByTagName("*");d=c[b++];)d.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var d=0,c=a.firstChild;for(b=b||function(){return 1};c;)b(c)&&d++,c=c.nextSibling;return d},isEmptyNode:function(a){return!a.firstChild|| +0==k.getChildCount(a,function(a){return!k.isBr(a)&&!k.isBookmarkNode(a)&&!k.isWhitespace(a)})},isBr:function(a){return 1==a.nodeType&&"BR"==a.tagName},isEmptyBlock:function(a,b){if(1!=a.nodeType)return 0;b=b||new RegExp("[ \t\r\n"+k.fillChar+"]","g");if(0=b.nodeValue.length)this.setStartAfter(b);else{var d=k.split(b,c);b===e?this.setEnd(d,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1);this.setStartBefore(d)}if(l)return this.collapse(!0)}a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length)a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c)}if(a||!this.collapsed)b(this,"start"),b(this,"end");return this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length);this.trimBoundary(!0);var l=this.startContainer,e=l.childNodes[this.startOffset];e?l.insertBefore(a,e): +l.appendChild(a);b.parentNode===this.endContainer&&(this.endOffset+=c);return this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var l,e=this.document.createElement("span");e.style.cssText="display:none;line-height:0px;";e.appendChild(this.document.createTextNode("\u200d"));e.id="_baidu_bookmark_start_"+(b?"":c++);this.collapsed||(l=e.cloneNode(!0),l.id="_baidu_bookmark_end_"+(b?"":c++));this.insertNode(e);l&&this.collapse().insertNode(l).setEndBefore(l); +this.setStartAfter(e);return{start:a?e.id:e,end:l?a?l.id:l:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start;a=a.end&&a.id?this.document.getElementById(a.end):a.end;this.setStartBefore(b);k.remove(b);a?(this.setEndBefore(a),k.remove(a)):this.collapse(!0);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!k.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&& +this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!k.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},getClosedNode:function(){var a;if(!this.collapsed){var b=this.cloneRange().adjustmentBoundary().shrinkBoundary();b.collapsed||1!=b.startContainer.nodeType||b.startContainer!==b.endContainer|| +1!=b.endOffset-b.startOffset||(b=b.startContainer.childNodes[b.startOffset])&&1==b.nodeType&&(p.$empty[b.tagName]||p.$nonChild[b.tagName])&&(a=b)}return a},select:m.ie?function(a,c){var l;this.collapsed||this.shrinkBoundary();var e=this.getClosedNode();if(e&&!c){try{l=this.document.body.createControlRange(),l.addElement(e),l.select()}catch(G){}return this}var e=this.createBookmark(),t=e.start;l=this.document.body.createTextRange();l.moveToElementText(t);l.moveStart("character",1);if(!this.collapsed){var g= +this.document.body.createTextRange(),t=e.end;g.moveToElementText(t);l.setEndPoint("EndToEnd",g)}else if(!a&&3!=this.startContainer.nodeType){var g=this.document.createTextNode(f),A=this.document.createElement("span");A.appendChild(this.document.createTextNode(f));t.parentNode.insertBefore(A,t);t.parentNode.insertBefore(g,t);b(this.document,g);h=g;d(A,"previousSibling");d(t,"nextSibling");l.moveStart("character",-1);l.collapse(!0)}this.moveToBookmark(e);A&&k.remove(A);try{l.select()}catch(G){}return this}: +function(a){function c(a){function b(b,c,e){3==b.nodeType&&b.nodeValue.lengthe&&(e=0);d.push(e);return d}var e={},l=this;e.startAddress=c(!0);a||(e.endAddress=l.collapsed?[].concat(e.startAddress):c());return e},moveToAddress:function(a,b){function c(a, +b){for(var c=e.body,l,d,f=0,h,t=a.length;f ');this.cloneRange().insertNode(a.get(0));var b=g(window).scrollTop(), +c=g(window).height(),e=a.offset().top;if(eb+c)e>b+c?window.scrollTo(0,e-c+a.height()):window.scrollTo(0,b-e);a.remove()},getOffset:function(){var a=this.createBookmark(),b=g(a.start).css("display","inline-block").offset();this.moveToBookmark(a);return b}}})();(function(){function a(a,b){var c=k.getNodeIndex;a=a.duplicate();a.collapse(b);var e=a.parentElement();if(!e.hasChildNodes())return{container:e,offset:0};for(var l=e.children,d,f=a.duplicate(),r=0,g=l.length-1,y=-1;r<=g;){y=Math.floor((r+ +g)/2);d=l[y];f.moveToElementText(d);var A=f.compareEndPoints("StartToStart",a);if(0A)r=y+1;else return{container:e,offset:c(d)}}if(-1==y){f.moveToElementText(e);f.setEndPoint("StartToStart",a);f=f.text.replace(/(\r\n|\r)/g,"\n").length;l=e.childNodes;if(!f)return d=l[l.length-1],{container:d,offset:d.nodeValue.length};for(c=l.length;0=m.version&&(a.style.height=c,a.style.setExpression("height", +"this.scrollHeight <= "+c+' ? "'+c+'px" : "auto"'))):g(a).height(c),a.style.zIndex=b.zIndex,this._setup(a))},_setup:function(b){var c=this,d=c.options;b.contentEditable=!0;document.body.spellcheck=!1;c.document=document;c.window=document.defaultView||document.parentWindow;c.body=b;c.$body=g(b);c.selection=new x.Selection(document,c.body);c._isEnabled=!1;var e;m.gecko&&(e=this.selection.getNative())&&e.removeAllRanges();this._initEvents();for(var f=b.parentNode;f&&!k.isBody(f);f=f.parentNode)if("FORM"== +f.tagName){c.form=f;if(c.options.autoSyncData)g(b).on("blur",function(){a(f,c)});else g(f).on("submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var h=c.execCommand;c.execCommand=function(){c.fireEvent("firstBeforeExecCommand");return h.apply(c,arguments)};this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);k.isEmptyNode(c.body)&&(c.body.innerHTML="

        "+(m.ie?"":"
        ")+"

        ");d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd); +!c.options.autoClearinitialContent&&c._selectionChange()},0);c.container||(c.container=b.parentNode);c._bindshortcutKeys();c.isReady=1;c.fireEvent("ready");d.onready&&d.onready.call(c);if(!m.ie||m.ie9above)g(c.body).on("blur focus",function(a){var b=c.selection.getNative();if("blur"==a.type)0=m.version&&this.container&&(this.container.style.height=a,this.container.style.setExpression("height","this.scrollHeight <= "+a+' ? "'+a+'px" : "auto"'))):g(this.body).height(a);this.fireEvent("resize")},setWidth:function(a){this.$container&&this.$container.width(a);g(this.body).width(a- +1*g(this.body).css("padding-left").replace("px","")-1*g(this.body).css("padding-right").replace("px",""));this.fireEvent("resize")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a;n.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f;for(f in b)for(var l=b[f].split(","),h=0,t;t=l[h++];){t=t.split(":");var g=t[0];t=t[1];if(/^(ctrl)(\+shift)?\+(\d+)$/.test(g.toLowerCase())||/^(\d+)$/.test(g))if("ctrl"== +RegExp.$1&&(d.ctrlKey||d.metaKey)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)-1!=a.queryCommandState(f,t)&&a.execCommand(f,t),k.preventDefault(d)}})},getContent:function(a,b,c,d,f){a&&n.isFunction(a)&&(b=a);if(b?!b():!this.hasContents())return"";this.fireEvent("beforegetcontent");a=UM.htmlparser(this.body.innerHTML,d);this.filterOutputRule(a);this.fireEvent("aftergetcontent",a);return a.toHtml(f)},getAllHtml:function(){var a=[];this.fireEvent("getAllHtml",a);if(m.ie&& +8':""});n.each(this.document.getElementsByTagName("script"),function(a){b+=a.outerHTML})}return""+(this.options.charset?'':"")+(b||this.document.getElementsByTagName("head")[0].innerHTML)+a.join("\n")+"m.version?'class="view"': +"")+">"+this.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(k.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,""),b=b.replace(/<(p|div)[^>]*>(| )<\/\1>/gi,"\n").replace(//gi,"\n").replace(/<[^>/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return p.$block[c]?"\n":b?b:""});return b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){return this.body[m.ie?"innerText":"textContent"].replace(new RegExp(k.fillChar, +"g"),"").replace(/\u00a0/g," ")},setContent:function(b,c,d){this.fireEvent("beforesetcontent",b);b=UM.htmlparser(b);this.filterInputRule(b);b=b.toHtml();this.body.innerHTML=(c?this.body.innerHTML:"")+b;if("p"==this.options.enterTag)if(c=this.body.firstChild,!c||1==c.nodeType&&(p.$cdata[c.tagName]||"DIV"==c.tagName&&c.getAttribute("cdata_tag")||k.isCustomeNode(c))&&c===this.body.lastChild)this.body.innerHTML="

        "+(m.ie?" ":"
        ")+"

        "+this.body.innerHTML;else for(var e=this.document.createElement("p");c;){for(;c&& +(3==c.nodeType||1==c.nodeType&&p.p[c.tagName]&&!p.$cdata[c.tagName]);)b=c.nextSibling,e.appendChild(c),c=b;if(e.firstChild)if(c)c.parentNode.insertBefore(e,c),e=this.document.createElement("p");else{this.body.appendChild(e);break}c=c.nextSibling}this.fireEvent("aftersetcontent");this.fireEvent("contentchange");!d&&this._selectionChange();this._bakRange=this._bakIERange=this._bakNativeRange=null;var f;m.gecko&&(f=this.selection.getNative())&&f.removeAllRanges();this.options.autoSyncData&&this.form&& +a(this.form,this)},focus:function(a){try{var b=this.selection.getRange();a?b.setStartAtLast(this.body.lastChild).setCursor(!1,!0):b.select(!0);this.fireEvent("focus")}catch(t){}},blur:function(){var a=this.selection.getNative();a.empty?a.empty():a.removeAllRanges();this.fireEvent("blur")},isFocus:function(){return!0===this.fireEvent("isfocus")?!0:this.selection.isFocus()},_initEvents:function(){var a=this,b=function(){a._proxyDomEvent.apply(a,arguments)};g(a.body).on("click contextmenu mousedown keydown keyup keypress mouseup mouseover mouseout selectstart", +b).on("focus blur",b).on("mouseup keydown",function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent(a.type.replace(/^on/,""),a)},_selectionChange:function(a,b){var c=this,d=!1,e,l;m.ie&&9>m.version&&b&&"mouseup"==b.type&&!this.selection.getRange().collapsed&&(d=!0,e=b.clientX,l=b.clientY);clearTimeout(f);f=setTimeout(function(){if(c.selection.getNative()){var a;if(d&&"None"==c.selection.getNative().type){a= +c.document.body.createTextRange();try{a.moveToPoint(e,l)}catch(G){a=null}}var f;a&&(f=c.selection.getIERange,c.selection.getIERange=function(){return a});c.selection.cache();f&&(c.selection.getIERange=f);c.selection._cachedRange&&c.selection._cachedStartElement&&(c.fireEvent("beforeselectionchange"),c.fireEvent("selectionchange",!!b),c.fireEvent("afterselectionchange"),c.selection.clear())}},a||50)},_callCmdFn:function(a,b){b=Array.prototype.slice.call(b,0);var c=b.shift().toLowerCase(),d,e;e=(d= +this.commands[c]||UM.commands[c])&&d[a];if(!(d&&e||"queryCommandState"!=a))return 0;if(e)return e.apply(this,[c].concat(b))},execCommand:function(a){if(!this.isFocus()){var b=this.selection._bakRange;b?b.select():this.focus(!0)}a=a.toLowerCase();var c,b=this.commands[a]||UM.commands[a];if(!b||!b.execCommand)return null;b.notNeedUndo||this.__hasEnterExecCommand?(c=this._callCmdFn("execCommand",arguments),this.__hasEnterExecCommand||b.ignoreContentChange||this._ignoreContentChange||this.fireEvent("contentchange")): +(this.__hasEnterExecCommand=!0,-1!=this.queryCommandState.apply(this,arguments)&&(this.fireEvent("saveScene"),this.fireEvent("beforeexeccommand",a),c=this._callCmdFn("execCommand",arguments),b.ignoreContentChange||this._ignoreContentChange||this.fireEvent("contentchange"),this.fireEvent("afterexeccommand",a),this.fireEvent("saveScene")),this.__hasEnterExecCommand=!1);this.__hasEnterExecCommand||b.ignoreContentChange||this._ignoreContentChange||this._selectionChange();return c},queryCommandState:function(a){try{return this._callCmdFn("queryCommandState", +arguments)}catch(l){return 0}},queryCommandValue:function(a){try{return this._callCmdFn("queryCommandValue",arguments)}catch(l){return null}},hasContents:function(a){if(a)for(var b=0,c;c=a[b++];)if(0"+(E?"":"
        ")+"

        ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus();b._selectionChange()},0))}return function(b){this.body.innerHTML='

        '+b+"

        ";this.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this.selection.getRange();if("none"==this.container.style.display){try{a.moveToBookmark(this.lastBk), +delete this.lastBk}catch(l){a.setStartAtFirst(this.body).collapse(!0)}setTimeout(function(){a.select(!0)},100);this.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){this.lastBk||(this.lastBk=this.selection.getRange().createBookmark(!0));this.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UM.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c=0,d;(d=a[c++])&&(b=b[d], +b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]);for(var c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length,d=0,e;e=b[d++];)c+=this.body.getElementsByTagName(e).length}return c},addInputRule:function(a,b){a.ignoreUndo=b;this.inputRules.push(a)},filterInputRule:function(a,b){for(var c=0,d;d=this.inputRules[c++];)b&&d.ignoreUndo||d.call(this,a)},addOutputRule:function(a,b){a.ignoreUndo=b;this.outputRules.push(a)}, +filterOutputRule:function(a,b){for(var c=0,d;d=this.outputRules[c++];)b&&d.ignoreUndo||d.call(this,a)}};n.inherits(h,I)})();UM.filterWord=function(){function a(a){return a=a.replace(/[\d.]+\w+/g,function(a){return n.transUnitToPx(a)})}function b(b){return b.replace(/[\t\r\n]+/g," ").replace(/\x3c!--[\s\S]*?--\x3e/ig,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(b){if(m.opera)return"";try{if(/Bitmap/i.test(b))return"";var c=b.match(/width:([ \d.]*p[tx])/i)[1],d=b.match(/height:([ \d.]*p[tx])/i)[1], +e=b.match(/src=\s*"([^"]*)"/i)[1];return''}catch(l){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/

        ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

        $1

        ").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig,function(a,b,d,e){return"class"==b&&"MsoListParagraph"== +e?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,d){return d.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(b,d,h,e){b=[];e=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").split(/;\s*/g);h=0;for(var c;c=e[h];h++){var f,g=c.split(":");if(2==g.length&&(c=g[0].toLowerCase(),f=g[1].toLowerCase(),!(/^(background)\w*/.test(c)&&0==f.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(c)&&/^0\w+$/.test(f)))){switch(c){case "mso-padding-alt":case "mso-padding-top-alt":case "mso-padding-right-alt":case "mso-padding-bottom-alt":case "mso-padding-left-alt":case "mso-margin-alt":case "mso-margin-top-alt":case "mso-margin-right-alt":case "mso-margin-bottom-alt":case "mso-margin-left-alt":case "mso-height":case "mso-width":case "mso-vertical-align-alt":/");e&&!p.$inlineWithA[c.tagName]&&"pre"!= +c.tagName&&c.children&&c.children.length&&(l=a(f,l,!0),b(f,l));if(c.children&&c.children.length)for(h=0;r=c.children[h++];)e&&"element"==r.type&&!p.$inlineWithA[r.tagName]&&1"))}function f(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d=0;c=a.children[d++];)if(c=f(c,b))return c} +function h(a,b,c){"element"==a.type&&a.tagName==b&&c.push(a);if(a.children&&a.children.length)for(var d=0,f;f=a.children[d++];)h(f,b,c)}function e(a,b){if(a.children&&a.children.length)for(var c=0,d;d=a.children[c];)e(d,b),d.parentNode&&(d.children&&d.children.length&&b(d),d.parentNode&&c++);else b(a)}var l=UM.uNode=function(a){this.type=a.type;this.data=a.data;this.tagName=a.tagName;this.parentNode=a.parentNode;this.attrs=a.attrs||{};this.children=a.children},t={href:1,src:1,_src:1,_href:1,cdata_data:1}, +k={style:1,script:1};l.createElement=function(a){return/[<>]/.test(a)?UM.htmlparser(a).children[0]:new l({type:"element",children:[],tagName:a})};l.createText=function(a,b){return new UM.uNode({type:"text",data:b?a:n.unhtml(a||"")})};l.prototype={toHtml:function(a){var b=[];d(this,b,a,0);return b.join("")},innerHTML:function(a){if("element"!=this.type||p.$empty[this.tagName])return this;if(n.isString(a)){if(this.children)for(var b=0,c;c=this.children[b++];)c.parentNode=null;this.children=[];a=UM.htmlparser(a); +for(b=0;c=a.children[b++];)this.children.push(c),c.parentNode=this;return this}a=new UM.uNode({type:"root",children:this.children});return a.toHtml()},innerText:function(a,b){if("element"!=this.type||p.$empty[this.tagName])return this;if(a){if(this.children)for(var c=0,d;d=this.children[c++];)d.parentNode=null;this.children=[];this.appendChild(l.createText(a,b));return this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children? +this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a=this.parentNode,b=0,c;c=a.children[b];b++)if(c===this)return 0==b?null:a.children[b-1]},nextSibling:function(){for(var a=this.parentNode,b=0,c;c=a.children[b++];)if(c===this)return a.children[b]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c=0,d;d=this.children[c];c++)if(d===b)return this.children.splice(c, +1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!p.$empty[this.tagName]){this.children||(this.children=[]);a.parentNode&&a.parentNode.removeChild(a);for(var b=0,c;c=this.children[b];b++)if(c===a){this.children.splice(b,1);break}this.children.push(a);a.parentNode=this;return a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c=0,d;d=this.children[c];c++)if(d===b)return this.children.splice(c, +0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c=0,d;d=this.children[c];c++)if(d===b)return this.children.splice(c+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c=0,d;d=this.children[c];c++)if(d===a){this.children.splice(c,1);d.parentNode=null;if(b&&d.children&&d.children.length)for(var f=0,e;e=d.children[f];f++)this.children.splice(c+f,0,e),e.parentNode=this;return d}},getAttr:function(a){return this.attrs&& +this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(a)if(this.attrs||(this.attrs={}),n.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a];else delete this.attrs},hasAttr:function(a){a=this.getAttr(a);return null!==a&&void 0!==a},getIndex:function(){for(var a=this.parentNode,b=0,c;c=a.children[b];b++)if(c===this)return b;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c= +0;b=this.children[c++];)if(b=f(b,a))return b},getNodesByTagName:function(a){a=n.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;n.each(a,function(a){if(c.children&&c.children.length)for(var d=0,f;f=c.children[d++];)h(f,a,b)});return b},getStyle:function(a){var b=this.getAttr("style");return b?(a=b.match(new RegExp("(^|;)\\s*"+a+":([^;]+)","i")))&&a[0]?a[2]:"":""},setStyle:function(a,b){function c(a,b){d=d.replace(new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi"),"$1");b&&(d=a+":"+n.unhtml(b)+ +";"+d)}var d=this.getAttr("style");d||(d="");if(n.isObject(a))for(var f in a)c(f,a[f]);else c(a,b);this.setAttr("style",n.trim(d))},hasClass:function(a){if(this.hasAttr("class")){var b=this.getAttr("class").split(/\s+/),c=!1;g.each(b,function(b,d){d===a&&(c=!0)});return c}return!1},addClass:function(a){var b=null,c=!1;this.hasAttr("class")?(b=this.getAttr("class"),b=b.split(/\s+/),b.forEach(function(b){b===a&&(c=!0)}),!c&&b.push(a),this.setAttr("class",b.join(" "))):this.setAttr("class",a)},removeClass:function(a){if(this.hasAttr("class")){var b= +this.getAttr("class"),b=b.replace(new RegExp("\\b"+a+"\\b","g"),"");this.setAttr("class",n.trim(b).replace(/[ ]{2,}/g," "))}},traversal:function(a){this.children&&this.children.length&&e(this,a);return this}}})();UM.htmlparser=function(a,b){function d(a,b){if(r[a.tagName]){var c=g.createElement(r[a.tagName]);a.appendChild(c);c.appendChild(g.createText(b))}else a.appendChild(g.createText(b))}function c(a,b,d){var f;if(f=v[b]){for(var e=a,t;"root"!=e.type;){if(n.isArray(f)?-1!=n.indexOf(f,e.tagName): +f==e.tagName){a=e;t=!0;break}e=e.parentNode}t||(a=c(a,n.isArray(f)?f[0]:f))}f=new g({parentNode:a,type:"element",tagName:b.toLowerCase(),children:p.$empty[b]?null:[]});if(d){for(e={};t=h.exec(d);)e[t[1].toLowerCase()]=l[t[1].toLowerCase()]?t[2]||t[3]||t[4]:n.unhtml(t[2]||t[3]||t[4]);f.attrs=e}a.children.push(f);return p.$empty[b]?a:f}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\s\/>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,h=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g, +e={b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1};a=a.replace(new RegExp(k.fillChar,"g"),"");b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&e[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var l={href:1,src:1}, +g=UM.uNode,v={td:"tr",tr:["tbody","thead","tfoot"],tbody:"table",th:"tr",thead:"table",tfoot:"table",caption:"table",li:["ul","ol"],dt:"dl",dd:"dl",option:"select"},r={ol:"li",ul:"li"},q,y=0,m=0,G=new g({type:"root",children:[]}),u=G;q=f.exec(a);){y=q.index;try{if(y>m&&d(u,a.slice(m,y)),q[3])p.$cdata[u.tagName]?d(u,q[0]):u=c(u,q[3].toLowerCase(),q[4]);else if(q[1]){if("root"!=u.type)if(p.$cdata[u.tagName]&&!p.$cdata[q[1]])d(u,q[0]);else{for(y=u;"element"==u.type&&u.tagName!=q[1].toLowerCase();)if(u= +u.parentNode,"root"==u.type)throw u=y,"break";u=u.parentNode}}else q[2]&&u.children.push(new g({type:"comment",data:q[2],parentNode:u}))}catch(L){}m=f.lastIndex}m"+(m.ie?"":"
        ")+ +"

        ",f.setStart(c.body.firstChild,0).collapse(!0)))),!f.collapsed&&f.deleteContents(),1==f.startContainer.nodeType)){b=f.startContainer.childNodes[f.startOffset];var h;if(b&&k.isBlockElm(b)&&(h=b.previousSibling)&&k.isBlockElm(h)){for(f.setEnd(h,h.childNodes.length).collapse();b.firstChild;)h.appendChild(b.firstChild);k.remove(b)}}var e,l;d=0;var g;f.inFillChar()&&(b=f.startContainer,k.isFillChar(b)?(f.setStartBefore(b).collapse(!0),k.remove(b)):k.isFillChar(b,!0)&&(b.nodeValue=b.nodeValue.replace(H, +""),f.startOffset--,f.collapsed&&f.collapse(!0)));for(;b=a.firstChild;){if(d){for(e=c.document.createElement("p");b&&(3==b.nodeType||!p.$block[b.tagName]);)g=b.nextSibling,e.appendChild(b),b=g;e.firstChild&&(b=e)}f.insertNode(b);g=b.nextSibling;if(!d&&b.nodeType==k.NODE_ELEMENT&&k.isBlockElm(b)&&(e=k.findParent(b,function(a){return k.isBlockElm(a)}))&&"body"!=e.tagName.toLowerCase()&&(!p[e.tagName][b.nodeName]||b.parentNode!==e)){if(p[e.tagName][b.nodeName])for(l=b.parentNode;l!==e;)h=l,l=l.parentNode; +else h=e;k.breakParent(b,h||l);h=b.previousSibling;k.trimWhiteTextNode(h);h.childNodes.length||k.remove(h);!m.ie&&(v=b.nextSibling)&&k.isBlockElm(v)&&v.lastChild&&!k.isBr(v.lastChild)&&v.appendChild(c.document.createElement("br"));d=1}var v=b.nextSibling;if(!a.firstChild&&v&&k.isBlockElm(v)){f.setStart(v,0).collapse(!0);break}f.setEndAfter(b).collapse()}b=f.startContainer;g&&k.isBr(g)&&k.remove(g);if(k.isBlockElm(b)&&k.isEmptyNode(b))if(g=b.nextSibling)k.remove(b),1==g.nodeType&&p.$block[g.tagName]&& +f.setStart(g,0).collapse(!0).shrinkBoundary();else try{b.innerHTML=m.ie?k.fillChar:"
        "}catch(q){f.setStartBefore(b),k.remove(b)}try{if(m.ie9below&&1==f.startContainer.nodeType&&!f.startContainer.childNodes[f.startOffset]&&(h=f.startContainer.childNodes[f.startOffset-1])&&1==h.nodeType&&p.$empty[h.tagName]){var r=this.document.createTextNode(k.fillChar);f.insertNode(r).setStart(r,0).collapse(!0)}setTimeout(function(){f.select(!0)})}catch(q){}setTimeout(function(){f=c.selection.getRange();f.scrollIntoView(); +c.fireEvent("afterinserthtml")},200)}}};UM.commands.insertimage={execCommand:function(a,b){b=n.isArray(b)?b:[b];if(b.length){var d=[],c,f;f=b[0];if(1==b.length)c=''+f.alt+'","center"==f.floatStyle&&(c='

        '+c+"

        "),d.push(c);else for(var h=0;f=b[h++];)c="

        ",d.push(c);this.execCommand("insertHtml",d.join(""),!0)}}};UM.plugins.justify=function(){var a=this;g.each(["justifyleft","justifyright","justifycenter","justifyfull"],function(b,d){a.commands[d]={execCommand:function(a){return this.document.execCommand(a)},queryCommandValue:function(a){var b=this.document.queryCommandValue(a);return!0===b||"true"===b?a.replace(/justify/,""):""},queryCommandState:function(a){return this.document.queryCommandState(a)? +1:0}}})};UM.plugins.font=function(){var a=this,b={forecolor:"forecolor",backcolor:"backcolor",fontsize:"fontsize",fontfamily:"fontname"},d={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"},c={forecolor:"color",fontsize:"size",fontfamily:"face"};a.setOpt({fontfamily:[{name:"songti",val:"\u5b8b\u4f53,SimSun"},{name:"yahei",val:"\u5fae\u8f6f\u96c5\u9ed1,Microsoft YaHei"},{name:"kaiti",val:"\u6977\u4f53,\u6977\u4f53_GB2312, SimKai"},{name:"heiti",val:"\u9ed1\u4f53, SimHei"}, +{name:"lishu",val:"\u96b6\u4e66, SimLi"},{name:"andaleMono",val:"andale mono"},{name:"arial",val:"arial, helvetica,sans-serif"},{name:"arialBlack",val:"arial black,avant garde"},{name:"comicSansMs",val:"comic sans ms"},{name:"impact",val:"impact,chicago"},{name:"timesNewRoman",val:"times new roman"},{name:"sans-serif",val:"sans-serif"}],fontsize:[10,12,16,18,24,32,48]});a.addOutputRule(function(a){n.each(a.getNodesByTagName("font"),function(a){if("font"==a.tagName){var b=[],c;for(c in a.attrs)switch(c){case "size":var d= +a.attrs[c];g.each({10:"1",12:"2",16:"3",18:"4",24:"5",32:"6",48:"7"},function(a,b){if(b==d)return d=a,!1});b.push("font-size:"+d+"px");break;case "color":b.push("color:"+a.attrs[c]);break;case "face":b.push("font-family:"+a.attrs[c]);break;case "style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}a.tagName="span";"span"==a.parentNode.tagName&&1==a.parentNode.children.length&&(g.each(a.attrs,function(b,c){a.parentNode.attrs[b]="style"==b?a.parentNode.attrs[b]+c:c}),a.parentNode.removeChild(a,!0))})}); +for(var f in b)(function(f){a.commands[f]={execCommand:function(a,c){if("transparent"!=c){var f=this.selection.getRange();if(f.collapsed){var e=g("").css(d[a],c)[0];f.insertNode(e).setStart(e,0).setCursor()}else{"fontsize"==a&&(c={10:"1",12:"2",16:"3",18:"4",24:"5",32:"6",48:"7"}[(c+"").replace(/px/,"")]);this.document.execCommand(b[a],!1,c);m.gecko&&g.each(this.$body.find("a"),function(a,b){var c=b.parentNode;if(c.lastChild===c.firstChild&&/FONT|SPAN/.test(c.tagName)){var d=c.cloneNode(!1); +d.innerHTML=b.innerHTML;g(b).html("").append(d).insertBefore(c);g(c).remove()}});if(!m.ie){var e=this.selection.getNative().getRangeAt(0).commonAncestorContainer,f=this.selection.getRange(),l=f.createBookmark(!0);g(e).find("a").each(function(a,b){var c=b.parentNode;"FONT"==c.nodeName&&(c=c.cloneNode(!1),c.innerHTML=b.innerHTML,g(b).html("").append(c))});f.moveToBookmark(l).select()}return!0}}},queryCommandValue:function(b){var f=a.selection.getStart(),e=g(f).css(d[b]);void 0===e&&(e=g(f).attr(c[b])); +return e?n.fixColor(b,e).replace(/px/,""):""},queryCommandState:function(a){return this.queryCommandValue(a)}}})(f)};UM.plugins.link=function(){this.setOpt("autourldetectinie",!1);m.ie&&!1===this.options.autourldetectinie&&this.addListener("keyup",function(a,b){var d=b.keyCode;if(13==d||32==d){var c=this.selection.getRange().startContainer;13==d?"P"==c.nodeName&&(d=c.previousSibling)&&1==d.nodeType&&(d=d.lastChild)&&"A"==d.nodeName&&!d.getAttribute("_href")&&k.remove(d,!0):32==d&&3==c.nodeType&&/^\s$/.test(c.nodeValue)&& +(c=c.previousSibling)&&"A"==c.nodeName&&!c.getAttribute("_href")&&k.remove(c,!0)}});this.addOutputRule(function(a){g.each(a.getNodesByTagName("a"),function(a,d){var b=d.getAttr("_href");/^(ftp|https?|\/|file)/.test(b)||(b="http://"+b);d.setAttr("href",b);d.setAttr("_href");""==d.getAttr("title")&&d.setAttr("title")})});this.addInputRule(function(a){g.each(a.getNodesByTagName("a"),function(a,d){d.setAttr("_href",d.getAttr("href"))})});this.commands.link={execCommand:function(a,b){var d=this.selection.getRange(); +b._href&&(b._href=n.unhtml(b._href,/[<">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g));b.href&&(b.href=n.unhtml(b.href,/[<">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g));if(d.collapsed){var c=d.startContainer;(c=k.findParentByTagName(c,"a",!0))?(g(c).attr(b),d.selectNode(c).select()):d.insertNode(g(""+b.href+"").attr(b)[0]).select()}else this.document.execCommand("createlink",!1,"_umeditor_link"),n.each(k.getElementsByTagName(this.body,"a",function(a){return"_umeditor_link"==a.getAttribute("href")}),function(a){"_umeditor_link"== +g(a).text()&&g(a).text(b.href);k.setAttributes(a,b);d.selectNode(a).select()})},queryCommandState:function(){return this.queryCommandValue("link")?1:0},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b;g.each(a,function(a,c){if("A"==c.nodeName)return b=c,!1});return b}};this.commands.unlink={execCommand:function(){this.document.execCommand("unlink")}}};UM.commands.print={execCommand:function(){var a="editor_print_"+ +new Date;g('').attr("id", +a).css({width:"0px",height:"0px",overflow:"hidden","float":"left",position:"absolute",top:"-10000px",left:"-10000px"}).appendTo(this.$container.find(".edui-dialog-container"));var b=window.open("",a,"").document;b.open();b.write("
        "+this.getContent(null,null,!0)+"
        + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        联想智慧商显中国行启动仪式成功举行

        +
        +
        +
        +  2022-04-23 阅读:17 +
        +
        +

        2022年4月20日上午,联想智慧商显中国行启动仪式成功举行。中银科技董事长饶旭东、中银科技总经理张昌伟、联想智慧商显事业部副总经理彭涛及其他相关员工出席会议。

        “立足广东,行迹全国。”作为联想电容会议平板及商显产品国代,此次联想智慧商显中国行将以广东省为起点,逐步“走出去”,扩大联想智慧商显服务范围,让更多企业和客户切身体验到联想智慧商显产品,享受智慧化办公带来的便利。

        联想智慧商显系列产品着力于提升企业的办公效率,满足不同的会议办公场景需求,还实现了各类设备间的协同与兼容:智能会议一体机与笔记本电脑的互联打通、高效配合,实现无缝连接的智能会议体验。

        在智能变革的时代浪潮下,联想智慧商显中国行系列活动,是为了拉近和客户的距离,“走近客户,才能走进客户,”才能更加清晰地了解客户需求,更好地为客户提供整合性的解决方案及定制化的终端产品。

        今年,“联想智慧商显中国行”将踏遍祖国大地,通过不同的产品场景化应用和行业定制案例,全方位展现联想智慧商显,在企业数字化办公及智能化转型方面的优势,赋能到更多客户的智能化转型实践中,共建智能生态,实现智慧中国愿景。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/10.html b/news/10.html new file mode 100644 index 0000000..ba65a52 --- /dev/null +++ b/news/10.html @@ -0,0 +1,362 @@ + + + + +格尔木高速路政支队依法移除非公路标志标牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        格尔木高速路政支队依法移除非公路标志标牌

        +
        +
        +
        +  2022-04-30 阅读:10 +
        +
        +

        4月27日,格尔木高速路政支队执法人员在日常巡查中发现G6京藏高速K2114+000米处(都兰至茶卡方向)公路建筑控制区内设有一处非公路交通标志标牌龙门架,存在安全隐患,严重影响了辖区路容路貌。

        公路标志标牌

        路政执法人员迅速行动,前往相关地点查看,经过现场测量勘验发现,该处龙门架为都兰县夏日哈镇斜龙沟路建设项目三标段项目部标志,距离高速公路隔离栅23.6米,严重违反了《中华人民共和国公路法》《公路安全保护条例》等相关公路法律法规,属于违法设置的非公路标志标牌。路政执法人员现场拍照取证,随即前往该项目施工路段寻找现场负责人,告知相关事宜,向其进行法律法规宣传讲解,指出擅自设置非标行为的违法性和危害性。经过宣传教育后,该项目负责人表示将严格遵守国家法律法规,积极配合路政部门相关工作,并调动机械联合路政执法人员将龙门架移至建筑控制区外。

        此次行动共出动执法人员2人次,执法车辆1辆次,移除非标龙门架1处。下一步,支队将持续加大公路巡查力度与路域环境整治力度,对发现的各类非标,做到发现一起、查处一起、拆除一起,将路域环境整治工作持续常态化推进,切实提升辖区路域环境质量。支队全体执法人员将肩负使命,竭诚奋进,为人民群众提供“畅、安、舒、美”的通行环境。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/100.html b/news/100.html new file mode 100644 index 0000000..d6afe24 --- /dev/null +++ b/news/100.html @@ -0,0 +1,362 @@ + + + + +智慧园区数字标牌应具备的条件和优势_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        智慧园区数字标牌应具备的条件和优势

        +
        +
        +
        +  2022-09-22 阅读:9 +
        +
        +

        智慧园区作为国家智慧城市发展战略的重要组成部分,是落实便民、利民服务的直观体现。在智慧园区内随处可见的数字标牌,然而,很多智慧园区数字标牌都存在“画质分辨率低、运营效率差、管理成本高、缺乏数据分析与深挖能力”等问题,与真正意义上的智慧园区应用方案存在着一定差距。智慧园区数字标牌应满足的几个条件和优势所在,如下文:


        一、智慧园区数字标牌应具备的条件。显示效果好,清晰度高,画面显示能适应户外环境;信息编辑、发布功能灵活,操作简捷;设备支持远程管理,易于更新和维护,节省维护成本;性能稳定,设备生命周期长,可长时间稳定运行。

        二、智慧园区数字标牌的优势。显示采用LED+LCD技术,户外显示效果好,画质清晰,分辨率高;灵活的内容编辑和发布管理,更新维护简捷,成本低;设备数据可实时监测,支持远程控制、远程管理;性能稳定,支持宽温宽压,可适用于各种恶劣的天气环境;智慧园区数字标牌系统架构精简,后台统一管控,实现了灵活的信息发布,支持高分辨率、高清画质播放。同时搭载了信息发布系统,可以监测智慧园区数字标牌的运行情况,实现了对数据传输、广告投放、播放时间、播放次数及播放范围等数据的实时监测,并可以通过远程控制平台的管理软件,对数字标牌进行遥控。智慧园区数字标牌提供一站式安装,运维管理便捷,总体成本低。

        随着新技术的快速发展和深入应用,智慧园区在当下具有广阔的市场发展空间,智慧园区的建设与应用将会成为园区改造升级的必然选择。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/101.html b/news/101.html new file mode 100644 index 0000000..3e1f514 --- /dev/null +++ b/news/101.html @@ -0,0 +1,362 @@ + + + + +四川省社会科学院研究生学院标识标牌采购项目(二次)结果公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        四川省社会科学院研究生学院标识标牌采购项目(二次)结果公告

        +
        +
        +
        +  2022-09-23 阅读:2 +
        +
        +

        一、项目编号:SCZZ08-FZC-2022-0732(2)(招标文件编号:SCZZ08-FZC-2022-0732(2))

        二、项目名称:四川省社会科学院研究生学院标识标牌采购项目(二次)

        三、中标(成交)信息

        供应商名称:成都三朵广告有限公司

        供应商地址:成都市青羊区西二巷新1号4楼

        中标(成交)金额:7.6845500(万元)

        四、主要标的信息

        五、评审专家(单一来源采购人员)名单:

        吴志成、全洪江、赵郁芳(业主代表)

        六、代理服务收费标准及金额:

        本项目代理费收费标准:本比选文件特别约定,采购代理服务费由中选人向采购代理机构支付,采购代理服务费为人民币4000元。

        本项目代理费总金额:0.4000000 万元(人民币)

        七、公告期限

        自本公告发布之日起1个工作日。

        八、其它补充事宜

        无。

        九、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名 称:四川省社会科学院     

        地址:四川省成都市一环路西一段155号        

        联系方式:赵老师 028- 87012090      

        2.采购代理机构信息

        名 称:四川中志招标代理有限公司            

        地 址:成都市高新区吉泰五路88号3栋7层1号(花样年香年广场)            

        联系方式:李先生 028-84510079-8012            

        3.项目联系方式

        项目联系人:李先生

        电 话:  028-65783579(报名相关事宜咨询)、028-84510079-8012(采购项目相关事宜咨询)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/102.html b/news/102.html new file mode 100644 index 0000000..bbb7332 --- /dev/null +++ b/news/102.html @@ -0,0 +1,362 @@ + + + + +福建某单位灯箱、广告牌采购安装竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        福建某单位灯箱、广告牌采购安装竞争性谈判公告

        +
        +
        +
        +  2022-09-23 阅读:1 +
        +
        +

        福建康泰招标有限公司受某单位 委托,根据《中华人民共和国政府采购法》等有关规定,现对灯箱、广告牌采购安装进行其他招标,欢迎合格的供应商前来投标。


        项目名称:灯箱、广告牌采购安装

        项目编号:2022-JLDXBU-W3001

        项目联系方式:

        项目联系人:郑仲岳、王政

        项目联系电话:0591-87803505转822

         

        采购单位联系方式:

        采购单位:某单位

        采购单位地址:福建省福州市

        采购单位联系方式:黄先生 18060635063

         

        代理机构联系方式:

        代理机构:福建康泰招标有限公司

        代理机构联系人:郑仲岳、王政 0591-87803505转822

        代理机构地址: 福州市鼓楼区湖东路169号中闽天骜大厦13层


        一、采购项目内容

        我单位就以下项目进行国内竞争性谈判,采购资金已全部落实,欢迎符合条件的供应商参加谈判报价。

        一、项目名称:灯箱、广告牌采购安装

        二、项目编号:2022-JLDXBU-W3001

        三、项目概况:

         四、供应商资格条件

        (一)符合《中华人民共和国政府采购法》第二十二条资格条件:

        1.具有独立承担民事责任的能力;

        2.具有良好的商业信誉和健全的财务会计制度;

        3.具有履行合同所必需的设备和专业技术能力;

        4.有依法缴纳税收和社会保障资金的良好记录;

        5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;

        6.法律、行政法规规定的其他条件。

        (二)国有企业;事业单位;军队单位;成立三年以上的非外资控股企业。

        (三)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业的生产场经营地址或者注册登记地址为同一地址的,非国有销售型企业的股东和管理人员(法定代表人、董事、监事)之间存在近亲属、相互占股等关联的,也不得同时参加同一包的采购活动。近亲属指夫妻、直系血亲、三代以内旁系血亲或近姻亲关系。

        (四)未被列入政府采购失信名单、军队供应商暂停名单,未在军队采购失信名单禁入处罚期内,未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人。

        ※(五)本项目不接受联合体报价。

        ※(六)本项目特定资质:/。

        五、竞争性谈判文件申领时间、地点、方式

        (一)申领时间:2022年 9  月  23  日至  9 月  28 日,每日上午08:30至12 :00,15:00至18:00(北京时间,公休、法定节假日除外)。

        (二)申领地点:福建康泰招标有限公司财务室(福州市鼓楼区湖东路169号中闽天骜大厦13楼)。

        (三)申领竞争性谈判文件时需提供以下资料:

        1.营业执照或事业单位法人证书复印件加盖公章(军队单位不需要提供);

        2.法定代表人资格证明书原件;

        3.法定代表人授权书原件;

        4.非外资企业或外资控股企业的书面声明(企业提供,事业单位、军队单位不需要提供);

        5.报价方主要股东或出资人信息;

        6.未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重失信行为记录名单,未被列入军队供应商暂停名单,未在军队采购供应商失信名单禁入处罚期内的承诺书;

        ※7.本项目特定资质材料:/。

        (四)申领方式

        供应商采取发送电子邮件方式递交报名资料,邮件主题:项目名称+项目编号+公司名称;邮件内容:列明公司名称、法定代表人或授权代表人姓名及联系方式;邮件附件:需采用A4纸幅面,将报名材料加盖企业鲜章,按顺序制作成1个PDF格式文件,文件名称与主题一致,复印件扫描无效。报名材料审核通过后,采购代理机构联系人向供应商邮箱发送竞争性谈判文件电子版;审核未通过的,采购代理机构联系人以邮件形式回复审核情况,供应商可在竞争性谈判文件申领时间内重新提交材料。采购代理机构邮箱:2785972036@qq.com。

        供应商携带资料赴报名现场,经审查合格后领取竞争性谈判文件。

        ※(五)竞争性谈判文件售价:200元/份,售后不退。

        六、首次响应文件接收开始和截止时间及地点、方式

        (一)首次响应文件开始接收时间:2022年 9 月  29 日09时00分(北京时间)。

        (二)首次响应文件截止接收时间:2022年 9 月 29 日09时30分(北京时间)。

        (三)响应地点:福建康泰招标有限公司开标大厅(福州市鼓楼区湖东路169号中闽天骜大厦13楼)。

        响应方式:由报价方法定代表人或授权代表现场递交响应文件,不接受邮寄等其他方式。

        七、谈判时间、地点

        (一)谈判时间:2022年  9 月 29 日09时30分(北京时间)。

        (二)谈判地点:福建康泰招标有限公司开标大厅(福州市鼓楼区湖东路169号中闽天骜大厦13楼)。

        八、本采购项目相关信息在《军队采购网》(www.plap.cn)和 《中国政府采购网》(http://www.ccgp.gov.cn/)上发布。

        九、联系方式

        (一)采购人联系方式

        采 购 人:某单位

        联 系 人:黄先生  

        电    话:18060635063 

        联系地址:福建省福州市

        (二)采购代理机构联系方式

        采购代理机构:福建康泰招标有限公司

        地    址:福州市鼓楼区湖东路169号中闽天骜大厦13层

        邮    编: 350001        

        电    话: 0591-87803505  

        传    真: 0591-87112226  

        报名事宜联系方式:王先生 0591-87803505转818  

        项目投标咨询联系方式:郑仲岳、王政 0591-87803505转822

        保证金事宜联系方式:洪女士 0591-87803505转807

        电子信箱:2785972036@qq.com

        报名费及谈判保证金缴交银行账号

        账户名称: 福建康泰招标有限公司

        账    号: 35050101100100000019

        开户银行: 恒丰银行股份有限公司福州分行营业部

        十、监督部门联系方式

        监督人:  袁先生      

        电  话:  18060636190 

        二、开标时间:2022年09月29日 09:30

        三、其它补充事宜

        四、预算金额:

        预算金额:23.1000000 万元(人民币)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/103.html b/news/103.html new file mode 100644 index 0000000..3ce6c82 --- /dev/null +++ b/news/103.html @@ -0,0 +1,362 @@ + + + + +三星户外显示屏涉嫌侵权遭美国ITC调查_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        三星户外显示屏涉嫌侵权遭美国ITC调查

        +
        +
        +
        +  2022-09-24 阅读:7 +
        +
        +

        据韩联社9月23日报道,三星电子户外显示屏涉嫌侵害显示器制造商MRI的专利和违反《关税法》被美国国际贸易委员会(ITC)立案调查。

        美国国际贸易委员会(ITC)当地时间9月22日表示,已受理MRI对三星电子及三星SDS的户外显示屏“数字标牌”(Digital Signage)涉嫌侵害其专利及违反《关税法》的起诉,并已着手展开相关调查。

        MRI主张,用于三星“数字标牌”显示屏的冷却散热系统侵犯其专利,违反了《关税法》禁止对美出口侵害美国专利等知识产权产品的条款。据悉,MRI上月曾向美国德克萨斯州东区地方法院提起同一指控的索赔诉讼。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/104.html b/news/104.html new file mode 100644 index 0000000..42ffedd --- /dev/null +++ b/news/104.html @@ -0,0 +1,362 @@ + + + + +西安市西派国樾项目标示标牌及地坪漆工程招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        西安市西派国樾项目标示标牌及地坪漆工程招标公告

        +
        +
        +
        +  2022-10-11 阅读:12 +
        +
        +

        招标:西安市西派国樾项目标示标牌及地坪漆工程招标公告
        (招标编号:ZB-GXXM-GC-2022-10)
        项目所在地区:陕西省,西安市
        一、招标条件
        本西派国樾项目标示标牌及地坪漆工程已由项目审批/核准/备案机关批准,项目资金来 源为其他资金企业自筹资金,招标人为西安铁弘房地产开发有限公司。本项目已具备招标条 件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:西派国樾项目标示标牌及地坪漆工程所需的全部工作内容。
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)西派国樾项目标示标牌及地坪漆工程;
        三、投标人资格要求
        (001西派国樾项目标示标牌及地坪漆工程)的投标人资格能力要求:
        1.在中华人民共和 国境内依法注册的具有独立法人资格的企业,为一般纳税人,具有有效的营业执照2.资格 要求具备建设行政主管部门核发的建筑装修装饰工程专业承包二级及以上资质,并具有有 效的安全生产许可证;
        3.项目经理:本项目拟派项目经理需具备建筑工程专业二级及以上注 册建造师资格,并具有安全生产考核合格证;
        4.信誉要求:未处于财产被接管、冻结、破产 状态;
        5.业绩要求:近3年(2019年1月1日以来)已完成或正在施工的项目共不少于1个类似工程业绩。类似工程业绩是指:标示标牌制作安装或地坪漆业绩;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年10月10日15时00分到2022年10月17日18时00分
        五、投标文件的递交
        递交截止时间:2022年10月31日09时30分
        六、开标时间
        开标时间:2022年10月31日09时30分
        七、其他
        1.凡有意参加投标者,请于2022年10月10日15:00至2022年10月17日18:00(北 京时间,下同),提供以下加盖公章的复印件资料获取招标文件:
        (1)购买人有效身份证及单位介绍信;
        (2)注册于中华人民共和 国的企业法人营业执照;
        (3)资质证书及安全生产许可证;
        (4)拟派项目经理证书及安全 生产考核合格B证;
        (5)近3年(2019年1月1日以来)已完成或正在施工的项目共不少 于1个类似工程业绩。类似工程业绩是指:标示标牌制作安装或地坪漆业绩;
        2.招标文件每 套售价800元,售后不退。
        联系人:张工
        电话:158 1057 3263
        邮箱:zchyzb20@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/105.html b/news/105.html new file mode 100644 index 0000000..9bbb53e --- /dev/null +++ b/news/105.html @@ -0,0 +1,362 @@ + + + + +成都市自来水六厂、七厂百米桩、标牌调整竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都市自来水六厂、七厂百米桩、标牌调整竞争性磋商公告

        +
        +
        +
        +  2022-10-11 阅读:15 +
        +
        +

        成都市自来水六厂、七厂集中式饮用水水源保护区百米桩、标牌调整的潜在供应商应在四川省政府采购一体化平台项目电子化交易系统(以下简称“项目电子化交易系统”)获取采购文件,并于 2022年10月21日 11时00分 (北京时间)前提交响应文件。


        一、项目基本情况

        项目编号:N5101172022000243

        项目名称:成都市自来水六厂、七厂集中式饮用水水源保护区百米桩、标牌调整

        采购方式:竞争性磋商

        预算金额:2,790,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起80日

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目专门面向中小微企业采购的项目,货物制造商应为中小微企业或监狱企业或残疾人福利性单位。


        3.本项目的特定资格要求:

        采购包1:

        1、供应商及其现任法定代表人或主要负责人近三年内不得具有行贿犯罪记录;
        2、供应商未被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单;
        3、供应商不得具有禁止投标情形;
        4、按照本项目竞争性磋商文件要求购买了竞争性磋商文件;
        5、本项目不接受联合体磋商。


        三、获取采购文件

        时间:2022年10月11日至2022年10月17日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2022年10月21日 11时00分00秒(北京时间)

        地点:成都市金牛区蜀西路52号1栋604号

        五、开启

        时间:2022年10月21日 11时00分00秒(北京时间)

        地点:成都市金牛区蜀西路52号1栋604号

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本项目采购过程中需要使用四川省政府采购一体化平台,登录方式及地址:通过四川政府采购网(www.ccgp-sichuan.gov.cn)首页供应商用户登录,供应商应当按照以下要求进行系统操作。

        (一)供应商应当自行在四川政府采购网-办事指南查看相应的系统操作指南,并严格按照操作指南要求进行系统操作。在登录、使用采购一体化平台前,应当按照要求完成供应商注册和信息完善,加入采购一体化平台供应商库。

        (二)供应商应当使用纳入全国公共资源交易平台(四川省)数字证书互认范围的数字证书及签章(以下简称“互认的证书及签章”)进行系统操作。供应商使用互认的证书及签章登录采购一体化平台进行的一切操作和资料传递,以及加盖电子签章确认采购过程中制作、交换的电子数据,均属于供应商真实意思表示,由供应商对其系统操作行为和电子签章确认的事项承担法律责任。

        已办理互认的证书及签章的供应商,校验互认的证书及签章有效性后,即可按照系统操作要求进行身份信息绑定、权限设置和系统操作;未办理互认的证书及签章的供应商,按要求办理互认的证书及签章并校验有效性后,按照系统操作要求进行身份信息绑定、权限设置和系统操作。互认的证书及签章的办理与校验,可查看四川政府采购网-办事指南。

        供应商应当加强互认的证书及签章日常校验和妥善保管,确保在参加采购活动期间互认的证书及签章能够正常使用;供应商应当严格互认的证书及签章的内部授权管理,防止非授权操作。

        (三)供应商应当自行准备电子化采购所需的计算机终端、软硬件及网络环境,承担因准备不足产生的不利后果。

        (四)采购一体化平台技术支持:

        在线客服:通过四川政府采购网-在线客服进行咨询

        400服务电话:4001600900

        CA及签章服务:通过四川政府采购网-办事指南进行查询

        1、本项目备案号:51011722210200001403[2022]00440;2、预算金额为人民币279万元。最高限价为人民币278.940128万元。3、监督部门:郫都区财政局,联系电话:028-87882979。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:成都市郫都生态环境局

        地址:德源镇红旗大道北段221号

        联系方式:15228806113

        2.采购代理机构信息

        名称:四川航睿招标代理有限公司

        地址:成都市金牛区蜀西路52号1栋604号

        联系方式:028-63948100

        3.项目联系方式

        项目联系人:刘女士

        电话:028-63948100


        四川航睿招标代理有限公司

        2022年10月10日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/106.html b/news/106.html new file mode 100644 index 0000000..6ef88de --- /dev/null +++ b/news/106.html @@ -0,0 +1,362 @@ + + + + +广元市公安局交通警察支队城区道路交通标志、标牌采购项目采购更正公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        广元市公安局交通警察支队城区道路交通标志、标牌采购项目采购更正公告

        +
        +
        +
        +  2022-10-11 阅读:10 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:N5108012022000120

        原公告的采购项目名称:城区道路交通标志、标牌采购项目

        首次公告日期:2022年09月23日


        二、更正信息:

        更正事项:采购公告

        更正原因:

        受疫情影响,根据“广元市利州区应对新型冠状病毒肺炎疫情应急指挥部关于延长临时性社会管控的通告”,广元市利州区(含广元经开区)将继续按照2022年10月6日发布的《关于进一步加强临时性社会管控的通告》执行,将开标时间作出更正!

        更正内容:

        原公告的响应文件提交截止时间:2022-10-14 14:30:00,更正为:2022-10-21 14:30:00。

        原公告的开启时间:2022-10-14 14:30:00,更正为:2022-10-21 14:30:00。

        其他内容不变

        更正日期:2022年10月10日


        三、其他补充事项

        1.采购预算和最高限价为:33万元;

        2.监督部门:广元市财政局、联系电话:0839-3273732。


        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名称:广元市公安局交通警察支队

        地址:广元市利州区米仓路52号

        联系方式:0839-5206522

        2.采购代理机构信息

        名称:四川鸿泰招投标代理有限公司

        地址:广元市利州区文化路169号五楼

        联系方式:0839-3310759

        3.项目联系方式

        项目联系人:肖红

        电话:0839-3310759


        四川鸿泰招投标代理有限公司

        2022年10月10日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/107.html b/news/107.html new file mode 100644 index 0000000..1a86d23 --- /dev/null +++ b/news/107.html @@ -0,0 +1,362 @@ + + + + +电动汽车保有量将破千万辆,2030年充电桩数字标牌规模超百亿_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        电动汽车保有量将破千万辆,2030年充电桩数字标牌规模超百亿

        +
        +
        +
        +  2022-10-11 阅读:32 +
        +
        +

        9月,我国发改委、我国充电联盟、我国电动轿车百人会等分别发布了新能源轿车、纯电动轿车的保有量以及充换电设备运行的状况:到2022年,我国电动轿车保有量将超越千万辆;到8月的充电桩数量为431.5万台,超越早前的全年猜测。到2030年,我国的电动轿车保有量将到达8000万辆。

        洛图科技(RUNTO)依照1:1的车桩比要求、37.7%的公桩占比、20%的屏幕渗透率测算,至2030年,带屏充电桩的商场出货量将接近600万台,所装备的数字标牌规模将超越100亿元。

        到8月,电动轿车、充电桩展开远超预期

        数据显现,到2022年8月,全国新能源轿车保有量已达1099万辆,约占全球一半左右;纯电动轿车保有量已达890万辆,占到新能源轿车的约81%;充电桩保有量为431.5万台;公共充电桩保有量为162.3万台,占比全体的37.7%。

        而根据今年2月洛图科技(RUNTO)发布的《电动车销量大涨164%,Volta的广告式充电桩正在我国仿制》一文中猜测,2022年全年,我国商场纯电动轿车出货将到达300万辆,保有量增至约940万辆;充电桩保有量将到达380万台,其间公共充电桩猜测出货量为50万台,保有量至160万台。

        数据显现,无论是纯电动轿车仍是配套充电桩的展开现状现已远超早前预期。只是8个月,纯电动轿车的保有量现已接近年头的全年猜测。按此节奏,估计全年电动轿车保有量将超越千万台,到达1015万台。(一般我国轿车销量大部分都会集在9月-12月)

        一起,到8月底,431.5万台的全体充电桩和162.3万台的公共充电桩现已超越全年猜测,车桩比从近年来的平均2.5:1直降至2.06:1。


        巨量猜测下,充电桩相关玩家现已超5万家

        9月23日,我国电动轿车百人会猜测,到2030年,新能源轿车保有量估计为1.2亿辆,电动轿车保有量达8000万辆。

        2022年1月,国家展开变革委等部分印发《关于进一步提升电动轿车充电基础设备服务保障才能的施行定见》,提出要构成适度超前、布局均衡、智能高效的充电基础设备系统,到2025年底,可以满意超越2000万辆电动轿车充电需求。

        我国政府在2015年发布的《关于加速电动轿车充电基础设备建造的辅导定见》中提出,到2030年,车桩比应实现1:1。

        持续加码的方针盈余吸引着各路玩家在充电桩范畴竞相展开布局。到8月,我国充电桩相关企业现已超越5万家。

        充电桩行业主流商业形式主要有以星星充电、特来电为代表的运营商主导形式,以蔚来、阿维塔、特斯拉为代表的车企主导形式,以及以能链、云快充为代表的第三方充电服务渠道主导形式。

        整车企业为做好用户服务,树立企业品牌形象,主推合适自家车型的专属大功率充电桩。受众更广的公共充电桩运营商则更多以标准化产品辐射更多车型,而且考虑投资报答。


        充电桩工业链包括上游充电桩部件制造商、中游充电桩运营服务供给商、下流服务支撑环节。现在,中游充电运营商的老练商业形式尚处于探究阶段,仍需不短的时间才能实现盈余。


        广告式充电桩应运而生

        广告式充电桩是野外数字标牌与公共类充电桩融合的产物。事实上,在20-30分钟的充电时间内,各种衍生的服务需求存在发掘空间。媒介载体的信息发布,或可以成为充电桩运营的另一收入来源。

        根据洛图科技(RUNTO)数据,2021年,公共类充电桩保有量109万台,与上年比新增29万台,其间带屏充电桩渗透率20%,年度出货量在5.8万台。

        带屏充电桩所加载的屏幕现在仍以小尺度为主,覆盖了3.4寸、7寸、10.1寸到15寸。但这些产品受限于尺度,给用户造成的视觉冲击小,广告投入的转化率和价值难以科学量化,普遍认为难达预期报答。

        商用显现工业的数字标牌企业推出了更大尺度屏幕的广告式充电桩,屏幕尺度根本在30寸以上,2021年在全体带屏充电桩中占比仅5%。细分尺度看, 42/43寸和32寸产品较多,占比分别是32%、28%,其他是55寸、65寸、75寸等。

        根据到2030年会有8000万辆电动轿车的猜测,洛图科技(RUNTO)依照1:1的车桩比和37.7%的公桩渗透率估算,需求3000万根左右的公共充电桩。保守地猜测,以现在屏幕在充电桩商场的渗透率坚持20%不变的状况下,至2030年,带屏充电桩的商场出货量能接近600万台,总的建桩投入将是一个5000亿元的商场。其间,充电桩装备的每一面屏幕都有尺度晋级和联网的可能性,然后成为一块数字标牌,其商场规模将超越100亿元。

        从现在的充电桩商场不断增加的需求来看,盈余方式的改造必定会倒逼运营者进行运营形式的晋级优化,使“充电桩+广告+流量”成为该产品商场价值的新形式,成为未来充电桩可持续展开的优先选项之一。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/108.html b/news/108.html new file mode 100644 index 0000000..c3557cc --- /dev/null +++ b/news/108.html @@ -0,0 +1,362 @@ + + + + +郝家桥景区Vi导视系统牌采购项目竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        郝家桥景区Vi导视系统牌采购项目竞争性谈判公告

        +
        +
        +
        +  2022-10-11 阅读:10 +
        +
        +

        一、项目基本情况

        项目编号:ZJSD2022-ZC-026

        项目名称:郝家桥景区Vi导视系统牌采购项目

        采购方式:竞争性谈判

        预算金额:670,360.00元

        采购需求:

        合同包1(郝家桥景区Vi导视系统牌采购项目):

        合同包预算金额:670,360.00元

        合同包最高限价:670,360.00元

        品目号

        品目名称

        采购标的

        数量(单位)

        技术规格、参数及要求

        品目预算(元)

        最高限价(元)

        1-1    其他不另分类的物品    郝家桥景区Vi导视系统牌采购项目    1(批)    详见采购文件    670,360.00    670,360.00    

        本合同包不接受联合体投标

        合同履行期限:无

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        合同包1(郝家桥景区Vi导视系统牌采购项目)落实政府采购政策需满足的资格要求如下:

        1).《节能产品政府采购实施意见》(财库〔2004〕185号);
        2).《环境标志产品政府采购实施的意见》(财库〔2006〕90号);
        3).《国务院办公厅关于建立政府强制采购节能产品制度的通知》(国办发〔2007〕51号);
        4).根据《政府采购促进中小企业发展管理办法》(财库〔2020〕46号)的规定,本项目专门面向中小企业采购。
        5).根据《陕西省财政厅关于进一步加大政府采购支持中小企业力度的通知》(陕财办采〔2022〕5号);
        6).根据《榆林市财政局关于进一步加大政府采购支持中小企业力度的通知》(榆政财采发〔2022〕10号)
        7).《陕西省财政厅关于印发<陕西省中小企业政府采购信用融资办法>的通知》(陕财办采〔2018〕23号)相关政策、业务流程、办理平台(http://www.ccgp-shaanxi.gov.cn/zcdservice/zcd/shanxi/;
        8).财政部司法部关于政府采购支持监狱企业发展有关问题的通知(财库〔2014〕68号);
        9).《财政部民政部中国残疾人联合会关于促进残疾人就业政府采购政策的通知》(财库〔2017〕141号);
        10).《关于在政府采购活动中查询及使用信用记录有关问题的通知》(财库〔2016〕125号);
        11).其他需要落实的政府采购政策。


        3.本项目的特定资格要求:

        合同包1(郝家桥景区Vi导视系统牌采购项目)特定资格要求如下:

        (1)供应商具有独立承担民事责任能力的法人、事业单位或其他组织。供应商应提供合法有效的标识有统一社会信用代码的营业执照及2021年度企业年度报告或事业单位法人证书等国家规定的相关证明(经营范围须与采购内容相关);
        (2)税收缴纳证明:提供2022年1月至今已缴纳的至少连续3个月的纳税证明(银行缴费凭证)或完税证明,依法免税的单位应提供相关证明材料;
        (3)财务状况报告:提供2021年度的财务审计报告,(成立时间至提交投标文件递交截止时间不足一年的,供应商须自行声明);
        (4)社会保障资金缴纳证明:提供2022年1月至投标截止时间止至少连续3个月的社会保障资金银行缴费单据或社保机构开具的社会保险参保缴费情况证明,依法不需要缴纳社会保障资金的单位应提供相关证明材料(加盖公章的复印件);
        (5)参加政府采购活动前三年内,在经营活动中没有重大违法记录的书面声明;
        (6)供应商不得列入信用中国(http://www.creditchina.gov.cn/)被失信执行?人?、?重?大?违?法?税?收?违?法?案?件?当事?人?名单?,?不?得?列入?中?国政?府?采?购?网?(www.ccgp.gov.cn)政府采购严重违法失信行为记录名单(网页查询截图并加盖供应商公章);
        (7)?提供榆林市政府采购服务类项目供应商信用承诺书原件(格式见投标文件);
        (8)供应商应在“信用中国(陕西榆林)?”网站进行注册、登录、并提供截图,自主上报信用承诺书(网址:?https://www.ylcredit.gov.cn/),开标现场由工作人员登录网站查询;?
        (9)提供谈判保证金交纳凭证;
        (10)本项目不接受联合体投标。单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加同一标段投标或者未划分标段的同一招标项目投标。违反规定的,其投标均无效;
        (11)一个供应商只能参与采购人同期公告一个标段的投标申请,如同时参与两个标段的投标申请时,视为不响应公告要求,所提出的投标申请均无效,所递交的响应文件不参与评审。
        (12)本项目专门面向中小企业


        三、获取招标文件

        时间: 2022年10月11日 至 2022年10月13日 ,每天上午 09:30:00 至 12:00:00 ,下午 14:30:00 至 17:00:00 (北京时间)

        途径:全国公共资源交易中心平台(陕西省)使用CA锁报名后自行下载

        方式:在线获取

        售价: 0元

        四、提交投标文件截止时间、开标时间和地点

        时间: 2022年10月17日 13时30分00秒 (北京时间)

        提交投标文件地点:全国公共资源交易中心平台CA锁在线上传递交

        开标地点:榆林市市民大厦十楼不见面7室

        五、公告期限

        自本公告发布之日起3个工作日。

        六、其他补充事宜

        1、供应商可登录全国公共资源交易中心平台(陕西省) (http://www.sxggzyjy.cn/),选择“电子交易平台-陕西政府采购交易系统-陕西省公共资源交易平台-投标人”进行登录,登录后选择“交易乙方”身份进入投标人界面进行报名并免费下载谈判文件。

        2、下载时间为:2022年10月11日9时30分至2022年10月13日17时00分止。

        3、CA锁购买:榆林市市民大厦四楼窗口,电话:0912-3515031。

        4、本项目采用电子化招投标方式和“不见面”开标形式,供应商使用数字认证证书(CA 锁)对响应文件进行签章、加密、递交及开标时解密等相关招投标事宜。供应商应于谈判响应文件递交截止时间前任意时段登录交易平台〖首页〉电子交易平台〉企业端〗在线提交电子谈判响应文件,逾期提交系统间拒绝接收。供应商可登录榆林交易平台〖首页〉不见面开标〗在线参与开评标过程,详见《榆林市不见面开标大厅操作手册(投标人)》(交易平台〖首页〉服务指南〉下载专区〗中的《榆林市不见面开标大厅操作手册(投标人)》)。

        5、供应商应随时关注发布的变更公告,当澄清或修改的内容影响响应文件编制时,将在交易平台上同步发布答疑文件,此时供应商应从“项目流程·〉答疑文件下载”下载最新发布的答疑文件(*.SXSCF格式),并使用该文件重新编制电子响应文件(*.SXSTF格式),使用旧版电子谈判文件或旧版答疑文件制作的电子投标文件,系统将拒绝接收,责任自负。

        七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名称:绥德县文化和旅游文物广电局

        地址:绥德县名州镇绥师路宣传文化中心

        联系方式:17365650808

        2.采购代理机构信息

        名称:致君项目管理有限公司

        地址:绥德县永乐大道光明苑小区1单元302室

        联系方式:0912-5611585

        3.项目联系方式

        项目联系人:汪笑笑

        电话:18220282200


        致君项目管理有限公司

        2022年10月11日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/109.html b/news/109.html new file mode 100644 index 0000000..e936bfd --- /dev/null +++ b/news/109.html @@ -0,0 +1,362 @@ + + + + +LG电子推出163英寸超高清微型LED标牌,已在亚洲等地上市_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        LG电子推出163英寸超高清微型LED标牌,已在亚洲等地上市

        +
        +
        +
        +  2022-10-20 阅读:8 +
        +
        +

        韩联社消息,9月10日,LG电子旗下超高清微型LED标牌“LG MAGNIT”亚洲、北美、欧洲等地上市。LG MAGNIT是一块163英寸的模块化屏幕,专为户外广告而设计,但这家韩国公司也认为它适合作为豪宅中的电视来使用。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/11.html b/news/11.html new file mode 100644 index 0000000..d928f48 --- /dev/null +++ b/news/11.html @@ -0,0 +1,362 @@ + + + + +海信商显加速出海,智能会议平板和数字标牌新品进军印尼_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        海信商显加速出海,智能会议平板和数字标牌新品进军印尼

        +
        +
        +
        +  2022-04-30 阅读:16 +
        +
        +

        日前,海信印尼公司与当地知名的专业视听渠道商V2公司在印尼首都雅加达联合举办商用显示新品发布会。发布会上,海信智能会议平板及M系列数字标牌产品正式亮相,双方还确认了超过220万美元的合作备忘录,这也将加速海信品牌数字标牌在东南亚地区的出海步伐。而在近日,海信商显产品入驻印尼警察指挥中心,将服务今年11月在巴厘岛举办的G20峰会。

        疫情以来,具有远程协同、视频会议等功能的智能会议平板在印尼市场备受欢迎。本次发布会,海信印尼公司和V2联合发布了海信最新WR6BE系列智能会议平板产品。该产品采用了4K可插拔摄像头,在暗光的环境下也能拍出清晰的影响;其智能取景功能也可以根据参会人数和位置变化调整画面大小,呈现最佳构图;35ms的超低书写延迟也带来顺畅、准确的书写体验;此外,WR6BE在传屏和交互方面的设计也非常方便,满足了商务环境下对远程会议的需求。


        同时,海信M系列数字标牌也在本次发布会上亮相,海信与V2也确认了M系列标牌的采购备忘录,内容包括2022年V2从海信印尼公司采购价值超过220万美元M系列标牌。海信印尼公司B2B销售总监Mr.Pangaji在发布会中表示:“ 自2021年以来,我们一直与印尼V2合作智能交互会议平板,今年M系列标牌的合作使双方都看到一个可以共同开拓的市场机会,为印尼市场创造更多附加值。”


        不仅是商用显示产品,发布会上,V2印尼首席执行官Mr. Hidayat表示海信激光电视将入驻他们位于印尼广场的高端音视频商店(Musique),同时,海信75英寸、85英寸8K电视未来也会入驻V2,这将有利于提升双方的品牌形象和知名度。


        此前,海信商用显示屏已应用于法国巴黎圣日耳曼足球俱乐部主场的LED计分大屏幕、香榭丽舍大街的球迷商店、英国的BP石油加油站、波兰的KFC餐厅、挪威的国家冰球场和奥斯陆艺术中心等等。在本月19日,海信55寸拼接屏登陆印尼G20峰会警察指挥中心,作为指挥大屏将在巴厘岛举行的G20峰会上服务。据悉,海信商用显示在2021年海外销售额同比增长达323%的基础上,2022年会继续加速出海。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/110.html b/news/110.html new file mode 100644 index 0000000..8e77ea0 --- /dev/null +++ b/news/110.html @@ -0,0 +1,362 @@ + + + + +中国商显市场即将迎来新一轮科技巅峰时代_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国商显市场即将迎来新一轮科技巅峰时代

        +
        +
        +
        +  2022-10-20 阅读:4 +
        +
        +

        中国经济体系已然进入了科技爆发时代,元宇宙、区块链、5G、黑科技、信创等特别关键词成为2022年度热搜词。“科技”为行业以及企业带来了巨大的红利效应,行业的需求促进科技快速的更新、迭代、发展、创新,反推企业因为需求而衍生的科技化、智能化、智慧化、数字化、信息化的产品也促使行业迎来了科技巅峰时代!

        纵观天下,科技的发展与复兴预示着行业的变革与洗牌,在大行业市场中各行各业都面临着巨大的挑战,更多细分行业慢慢融合、跨界、共建、共享形成一个全新的行业产品供应链。在细分行业中,LED、平板、大屏、广告机等一系列商显产品更是被行业不断的充斥洗礼,商显行业重新定位与上线,在疫情以及后疫情下复苏式产生。教育、金融、交通、企业、应急、汽车、政府等都针对LED、大屏、一体机等商显以及商显周边产品有大量的需求,那么商显产品的未来走向如何?行业关注点在哪里?针对这些问题,第十四届中国(国际)商用显示系统显示系统产业领袖峰会(以下简称:CBDS 2022)暨第五届深圳(国际)智慧显示系统产业应用博览会(以下简称:ISVE 2022)为您揭开答案。

        (商显龙头企业董事长出席CBDS高峰论坛,共话商显新未来)

        (一)政策引路:CBDS&ISVE引路“政策”下的行业发展变革!

        “政策”促使商显行业仍在疫情高危状态下快速成长,《“十四五”数字经济发展规化》,重点提出国家新基建的大力推进以及数字经济体系的深度融合,企业、政府、交通、教育、医疗等领域都将加快智能化、智慧化、数字化的转型,智慧显示终端成为了产业数字化中不可或缺的基本载体。一次次市场大环境的洗牌过程中,商显行业打破陈规,”突破、破局、重生、转档“颠覆了行业的发展历史,中国商显纵深、垂直、渗透细分市场行业中,商显于今已然成为中国重要经济产业支柱行业。本届”ISVE“强势来袭,在与会期间为观众及与会展商分享未来商显未来之路,发展、变革、领航、创新、求存等关键问题点,将会逐一剖析,为企业与观众带来新的行业市场方向指引。

        (二)需求拉动:CBDS&ISVE拉动行业经济指数增涨,数据说话!

        中国LED行业市场规模2023年有望增长至1104.1亿元,达到年复合增长率14.8%;工信部领导与会发言中指出:2020年我国新型显示产业直接营业收入达到4460亿元,全球占比达到了40.3%,产业规模位居全球第一。依据中央新闻报导“元宇宙”产业也快速提升,于2030年,中国市场也可高达5亿元。同时,信创领域大幅度增涨,疫情下更明确信创发展路线,短期区县/行业信创接捧进一步打开5000亿市场空间,2022年信创产业如期落地,其相关产业链企业、产品都享受了高额红利,中长期信创产业也逐步迈向世界舞台。

        (三)名企云集:CBDS&ISVE汇聚龙头企业,共享商显科技盛果!

        商显市场因企业的汇聚而形成生态产业供应链,有效的良性竞争,互相用技术PK,促使行业发展大步向前,名企在商显领域洽洽承担了这一分殊荣,肩负着行业产品的创新与提升,背负着市场的发展与前景,本届”ISVE”也汇聚如海康威视、京东方、TCL华星光电、文香、创维、光峰、康冠、优色、视美泰、深远通、岩沛光电、创为兴、中沛光电、瑞致达、龙祥卓越等;等知名企业,与会其间将与观众以及业内人士共同分享商显世界的技术与未来,面对技术前行的行业领头企业,汇聚全新力量,提炼精华观点,沉浸式场景化体验将是未来5-10年的发展重点,共建、融合、纵深、细分也将是未发展的必经之路。行业与企业相互依存,而今企业需砥砺前行、转档变形、涅槃重生,共建商显市场闭环生态圈。

        (四)高端论坛:”CBDS&ISVE引发行业最新看点,信创、元宇宙市场高调探索!

        信创:去美化”信创“产业在本届”ISVE“展中完美体现,与会其间深度分享未来中国式”信创“产业的发展,主控芯片、主机集成、系统底层架构编写等将在展会中盛装亮相,中国式”信创“行业的不屈发展, 让行业大盘快速增涨,因此,”ISVE“组建信创分享论坛,分享未来”信创“发展之路,起承转合无缝对接商业赢利点,快速让“信创”产业“变现”!

        元宇宙:元宇宙由经信息化、智慧化、智能化的时代而来,虚拟与现实的呈现,并成功采用设备端完成,VR、XR的出现让元宇宙市场有了新的解读,商显与XR、VR更快速的融合于市场,虚拟拍摄解决绿布带来的抠图不完全问题;汽车设计,采用小间距LED并结合VR设计,让汽车设计轻松呈现于肉眼,每一个立体细节近在眼前。本届”ISVE“提炼”元宇宙“关键词,透明化虚拟与现实的发展必经过程,发展势不可挡,商显与”元宇宙“相互成就,未来可期!


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/111.html b/news/111.html new file mode 100644 index 0000000..5698e5f --- /dev/null +++ b/news/111.html @@ -0,0 +1,362 @@ + + + + +灵武市民政局地名标牌(村牌)采购安装项目竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + + + +
          +
        • + +
          +
          产品
          +
          公司
          +
          展会
          +
          资讯
          +
          技术
          +
          +
        • +
        • + + +
        • +
        • +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        灵武市民政局地名标牌(村牌)采购安装项目竞争性磋商

        +
        +
        +
        +  2022-10-21 阅读:5 +
        +
        +

        项目概况

        “千年古县 美丽灵武”地名标牌(村牌)采购安装项目 采购项目的潜在供应商应在邮箱获取或网上下载获取采购文件,并于2022年10月31日 14点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:DHYCG-2022031

        项目名称:“千年古县 美丽灵武”地名标牌(村牌)采购安装项目

        采购方式:竞争性磋商

        预算金额:80.0900000 万元(人民币)

        最高限价(如有):78.8400000 万元(人民币)

        采购需求:

        标的名称

        采购内容

        数量

        简要规格描述或

        项目基本概况

        预算金额(万元)

        “千年古县 美丽灵武”地名标牌(村牌)采购安装项目

        地名标牌(村牌)采购安装

        1

        详见招标文件、工程量清单

        80.09万元

         

        合同履行期限:签订合同90日历天完成

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        中小企业优惠、环境标志产品、创新产品、监狱企业、残疾人福利性单位;


        3.本项目的特定资格要求:(1)提供投标人营业执照副本或事业单位、社会团体等法人证书副本(复印件加盖公章);(2)法定代表人授权委托书及被授权人身份证(法定代表人直接投标可不提供,但须提供法定代表人身份证明);(3)投标人须具备建筑工程施工总承包三级及以上资质(复印件加盖公章),具备有效的施工安全生产许可证; (4)提供依法缴纳税收和社会保障资金良好记录承诺书(原件);(5)参加政府采购活动前3年内在经营活动中没有重大违法记录的承诺书(原件);(6)具有良好的商业信誉和健全的财务会计制度承诺书资格承诺函(原件);(7)本项目为专门面向中小企业采购,投标供应商提供《中小企业声明函》(工程类):工程的施工单位全部为符合政策要求的中小企业;(8)采购代理机构查询供应商信用记录,查询时间为投标截止后,中国政府采购网(www.ccgp.gov.cn)或“信用中国”网站(http://www.creditchina.gov.cn )查询供应商信用记录;被人民法院列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单及其他不符合《政府采购法》第二十二条规定条件的供应商禁止参加政府采购活动(处罚期限届满的除外)。

        三、获取采购文件

        时间:2022年10月20日  至 2022年10月27日,每天上午9:00至12:00,下午12:00至17:00。(北京时间,法定节假日除外)

        地点:邮箱获取或网上下载

        方式:投标人提供本项目特定资格要求中前3条材料(复印件加盖公章扫描件)发送至邮箱993540917@qq.com登记报名并获取采购文件或网上下载。

        售价:¥0.0 元(人民币)

        四、响应文件提交

        截止时间:2022年10月31日 14点30分(北京时间)

        地点:灵武市招投标交易服务中心四楼(灵武市人民路61号)。

        五、开启

        时间:2022年10月31日 14点30分(北京时间)

        地点:灵武市招投标交易服务中心四楼(灵武市人民路61号)。

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜


        1、本次公告只在中国政府采购网(www.ccgp.gov.cn)发布。

        2、响应文件的提交地点为灵武市招投标交易服务中心四楼(灵武市人民路61号),逾期送达的或者未送达指定地点的响应文件,招标人不予受理。

        注:请各响应供应商在报名结束至开标前随时关注中国政府采购网(www.ccgp.gov.cn)“澄清/变更”公告栏。项目有可能进行时间或内容上的调整,调整内容只在“澄清/变更”公告栏中以公告形式公示。代理机构不再以其他方式通知。如因自身原因未及时关注招标公告或变更(澄清、补充等)公告从而导致响应失败,后果自行承担。



        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:灵武市民政局      

        地址:灵武市民族街与惠民路交叉路口向北100米         

        联系方式:马主任 0951-4758972      

        2.采购代理机构信息

        名 称:宁夏鼎合元招投标代理有限公司            

        地 址:宁夏灵武市南门车管所斜对面高兴产业园东三号营业房             

        联系方式:郭阳 0951-4676486            

        3.项目联系方式

        项目联系人:马主任

        电 话:  0951-4758972

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + + + + + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/112.html b/news/112.html new file mode 100644 index 0000000..a574f89 --- /dev/null +++ b/news/112.html @@ -0,0 +1,362 @@ + + + + +江西南昌某单位标牌标识采购项目竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        江西南昌某单位标牌标识采购项目竞争性谈判公告

        +
        +
        +
        +  2022-10-27 阅读:14 +
        +
        +

        项目概况

        某单位标牌标识采购项目 采购项目的潜在供应商应在中化商务电子招投标平台(e.sinochemitc.com)获取采购文件,并于2022年11月10日 09点30分(北京时间)前提交响应文件。


        一、项目基本情况

        项目编号:2022-JKBFAE-W3005

        项目名称:某单位标牌标识采购项目

        采购方式:竞争性谈判

        预算金额:46.6200000 万元(人民币)

        最高限价(如有):46.6200000 万元(人民币)

        采购需求:

        合同履行期限:合同签订之日起 30 天内完成交货并安装完毕

        本项目( 不接受  )联合体投标。


        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:(一)国有企业;事业单位;军队单位;成立3年以上的非外资企业。(二)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业的生产场经营地址或者注册登记地址为同一地址的,非国有销售型企业的股东和管理人员(法定代表人、董事、监事)之间存在近亲属、相互占股等关联的(含不同企业股东在同一企业任职),历史股东和管理人员存在关联的,也不得同时参加同一包的采购活动。近亲属指夫妻、直系血亲、三代以内旁系血亲或近姻亲关系。(三)未被“信用中国”网站列入失信被执行人、重大税收违法失信主体名单,未被列入政府采购严重失信行为记录名单,未被列入军队供应商暂停名单,未在军队采购供应商失信名单禁入处罚期内。(四)本项目不接受联合体报价。(五)报价企业在履约环节不得违法分包,一经发现存在违法分包行为,分包和被分包企业均将受到相关处罚。

        三、获取采购文件

        时间:2022年10月28日  至 2022年11月04日,每天上午9:00至11:30,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:中化商务电子招投标平台(e.sinochemitc.com)

        方式:潜在投标人需先在中化商务电子招投标平台(e.sinochemitc.com)进行注册(免费),具体步骤请参考帮助中心-招投标指南。注册审核通过后,在申领时间内搜索项目编号(或项目名称),上传报名审核资料。审核通过后网上购买谈判文件,支付成功后,可下载谈判文件及增值税电子普通发票。未登录采购代理机构电子招投标平台获取谈判文件的投标人不能参与本项目的采购活动,采购代理机构有权拒收其递交的报价文件。获取谈判文件时如遇问题,可拨打技术支持电话:010-8639 1277。

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2022年11月10日 09点30分(北京时间)

        地点:中化商务有限公司(江西省南昌市红谷滩区金融大街777号博能金融中心17楼1704第一会议室)

        五、开启

        时间:2022年11月10日 09点30分(北京时间)

        地点:中化商务有限公司(江西省南昌市红谷滩区金融大街777号博能金融中心17楼1704第一会议室)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        潜在投标人需先在中化商务电子招投标平台(e.sinochemitc.com)进行注册(免费),具体步骤请参考帮助中心-招投标指南。注册审核通过后,在申领时间内搜索项目编号(或项目名称),上传报名审核资料。审核通过后网上购买谈判文件,支付成功后,可下载谈判文件及增值税电子普通发票。未登录采购代理机构电子招投标平台获取谈判文件的投标人不能参与本项目的采购活动,采购代理机构有权拒收其递交的报价文件。获取谈判文件时如遇问题,可拨打技术支持电话:010-8639 1277。

        报名审核资料:

        1.营业执照或事业单位法人证书复印件加盖公章(军队单位不需要提供);

        2.法定代表人资格证明书原件;

        3.法定代表人授权书原件;

        4.非外资企业或外资控股企业的书面声明(企业提供,事业单位、军队单位不需要提供);

        5.投标供应商主要股东或出资人信息;

        6.未被“信用中国”网站列入失信被执行人、重大税收违法失信主体名单,未被列入政府采购严重失信行为记录名单,未被列入军队供应商暂停名单,未在军队采购供应商失信名单禁入处罚期内的承诺书。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:某单位     

        地址:江西省南昌市        

        联系方式:/      

        2.采购代理机构信息

        名 称:中化商务有限公司            

        地 址:江西省南昌市红谷滩区金融大街777号博能金融中心17楼            

        联系方式:李翠然、戴奇良 0791-88862768            

        3.项目联系方式

        项目联系人:李翠然、戴奇良

        电 话:  0791-88862768

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/113.html b/news/113.html new file mode 100644 index 0000000..219ea8b --- /dev/null +++ b/news/113.html @@ -0,0 +1,362 @@ + + + + +安徽正式启用市际包车客运电子标志牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        安徽正式启用市际包车客运电子标志牌

        +
        +
        +
        +  2022-10-27 阅读:3 +
        +
        +

        近日,安徽省正式启用市际包车客运电子标志牌。

        包车(旅游)客运是常见的道路运输经营方式,根据相关规定,执行包车运输任务的车辆,应当随车携带纸质标志牌。启用电子标志牌后,驾驶员可使用“皖事通”手机程序,申领对应的电子标志牌。电子标志牌效力等同于原纸质牌证,通过二维码扫码方式辨认真假、完成执法监督核验。电子标志牌的使用,将有效解决纸质牌证容易损毁、途中无法变更申领等问题,进一步提升企业经营活力,促进包车(旅游)客运规范、有序发展。

        下一步,我省将根据市际包车客运电子标志牌使用情况,进一步完善相关政策和系统,探索在省际及县际县内等包车业务上逐步扩大电子标志牌的使用范围。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/114.html b/news/114.html new file mode 100644 index 0000000..388a18a --- /dev/null +++ b/news/114.html @@ -0,0 +1,362 @@ + + + + +九龙县乌拉溪镇河坝村村民委员会乌拉溪景区标示标牌建设项目竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        九龙县乌拉溪镇河坝村村民委员会乌拉溪景区标示标牌建设项目竞争性磋商

        +
        +
        +
        +  2022-10-27 阅读:13 +
        +
        +

        乌拉溪景区标示标牌建设项目 采购项目的潜在供应商应在成都市高新区天府大道北段1700号环球中心E1-2-1001B获取采购文件,并于2022年11月11日 10点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:JAT2022-JL1026001

        项目名称:乌拉溪景区标示标牌建设项目

        采购方式:竞争性磋商

        预算金额:49.7150000 万元(人民币)

        最高限价(如有):49.7150000 万元(人民币)

        采购需求:

        详见竞争性磋商文件

        合同履行期限:合同签订后60天内完工

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        本项目专门面向中小企业采购(监狱企业、残疾人福利性单位均视同小微企业),非中小企业参与的将视为无效投标。


        3.本项目的特定资格要求:(1)供应商具有国家行政主管部门颁发且在有效期内的市政公用工程施工总承包三级或以上资质证书;(2)供应商具有在有效期内的《安全生产许可证》;

        三、获取采购文件

        时间:2022年10月27日  至 2022年11月02日,每天上午9:00至12:00,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:成都市高新区天府大道北段1700号环球中心E1-2-1001B

        方式:现场办理:供应商现场获取磋商文件时应出示针对本项目的单位介绍信原件(须注明项目名称、项目编号、联系人及联系电话)、加盖单位公章的经办人身份证复印件、加盖单位公章的资质复印件。

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2022年11月11日 10点00分(北京时间)

        地点:成都市高新区天府大道北段1700号环球中心E1-2-1001B

        五、开启

        时间:2022年11月11日 10点00分(北京时间)

        地点:成都市高新区天府大道北段1700号环球中心E1-2-1001B

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        由于疫情原因,各位投标供应商请及时咨询开标场地社区、楼宇的最新防疫要求,做好疫情防控措施,否则将自行承担由此产生的一切责任与后果。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:九龙县乌拉溪镇河坝村村民委员会     

        地址:九龙县乌拉溪镇        

        联系方式:白先生/13348949258      

        2.采购代理机构信息

        名 称:四川吉安泰工程项目管理有限公司            

        地 址:成都市高新区天府大道北段1700号环球中心E1-2-1001A            

        联系方式:刘女士/028-83165936            

        3.项目联系方式

        项目联系人:刘女士

        电 话:  028-83165936

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/115.html b/news/115.html new file mode 100644 index 0000000..6950d2c --- /dev/null +++ b/news/115.html @@ -0,0 +1,362 @@ + + + + +南京六合区马鞍街道开展广告牌专项整治_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        南京六合区马鞍街道开展广告牌专项整治

        +
        +
        +
        +  2022-10-27 阅读:2 +
        +
        +

        为规范户外广告和店招标牌设置,消除安全隐患,提升街道文明环境,近日,南京六合区马鞍街道城管中队对辖区内破损店招广告进行集中整治。

          10月12日,马鞍中队开展破损店招标牌集中拆除行动。前期,城管队员联合城市治理志愿者和公众委员对沿街店家设置的店招标牌逐一排查登记,同时向店家普及店招标牌设置相关法律法规的标准要求,督促存在问题的店家及时整改,对自行整改有困难的店家,中队协助其整改到位。目前,已拆除破损店招8处。

          10月23日,马鞍中队网格化巡查时发现荣盛桥面路灯杆上广告牌表面出现破损,存在一定安全隐患。随后,中队组织人员对桥面上4处存在安全隐患的破损广告牌实施了拆除。

          下一步,马鞍中队将结合专项整治行动,严格落实精细化、网格化管理要求,不断完善店招标牌和户外广告治理机制,加大巡查整治力度,对破损的广告标牌做到及时发现、及时处理、及时拆除,不断提升城市形象。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/116.html b/news/116.html new file mode 100644 index 0000000..279ea0e --- /dev/null +++ b/news/116.html @@ -0,0 +1,362 @@ + + + + +崇川区文化遗产解读标牌项目的竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        崇川区文化遗产解读标牌项目的竞争性磋商公告

        +
        +
        +
        +  2022-10-27 阅读:5 +
        +
        +

        濠河沿线文化景观提升标牌项目的潜在供应商应在南通市崇川区人民政府网自行下载获取采购文件,并于2022年11月7日14时30分(北京时间)前提交响应文件。

        一、项目基本情况:

        项目名称:崇川区文化遗产解读标牌项目

        采购方式:竞争性磋商

        项目预算:10万元

        最高限价:10万元

        采购需求:详见磋商文件第三章

        合同履行期限:所有产品应于中标后30日内完成深度设计,待甲方确认设计稿后30日内完成供货、安装、调试及交付验收,具体时间节点根据采购人要求。

        本项目不接受联合体投标

        二、申请人的资格要求:

        1、具有独立承担民事责任的能力;具有良好的商业信誉和健全的财务会计制度;具有履行合同所必需的设备和专业技术能力;有依法缴纳税收和社会保障资金的良好记录;参加采购活动前三年内,在经营活动中没有重大违法记录。

        2、本项目的特定资格要求:

        (1)提供供应商法人或其他组织的营业执照复印件。

        (2)供应商法定代表人参加磋商的,必须提供法定代表人身份证明及法定代表人本人身份证复印件;非法定代表人参加磋商的,必须提供法定代表人签字或盖章的授权委托书及法定代表人、被授权人的两人身份证的复印件(格式参见第七章)。

        (3)供应商须提供参加采购活动前3年内在经营活动中没有重大违法记录的书面声明(原件)。(格式参见第七章)

        (4)供应商须提供资格文件声明函(原件)。(格式参见第七章)

        (5)未被“信用中国”网站(www.creditchina.gov.cn)列入失信被执行人、重大税收违法案件当事人名单、政府采购严重失信行为记录名单。

        (6)符合相关法律、法规规定的其他要求。

        【特别提醒】法定代表人为同一个人的两个及两个以上法人,母公司、全资子公司及其控股公司,都不得在同一采购项目相同标段中同时参加投标,一经发现,将视同围标处理。

        3、落实政府采购政策需满足的资格要求:本项目专门面向中小企业采购的项目,供应商须为中小微企业,根据《政府采购促进中小企业发展管理办法》(财库﹝2020﹞46 号)的规定提供《“中小企业声明函》。

        具体资格要求详见第七章中的“资格审查文件”。

        请供应商认真对照资格要求,如不符合要求,无意或故意参与磋商的,所产生的一切后果由供应商承担。若响应供应商提供虚假材料的,将作无效响应处理,并报财政部门将其列入政府采购黑名单。

        非采购人原因成交人放弃成交资格的,报财政部门将其列入政府采购黑名单。

        【特别提醒】单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参与同一采购项目相同标段的政府采购活动;为采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得再参加该采购项目的其他采购活动;如发现供应商递交的资格后审材料有弄虚作假行为,该供应商将记入不良记录,并上报有关部门,如已成交,采购人有权取消其成交资格,并由该供应商承担由此带来可能的一切责任和损失。

        参与本项目竞争性磋商响应的供应商,应依照规定提交各类声明函、承诺函(如涉有),不再同时提供原件备查或提供有关部门出具的相关证明文件。但本项目成交的供应商(以下称成交人),应做好提交声明函、承诺函相应原件的核查准备;核查后发现虚假或违背承诺的,将依照相关法律法规规定处理。

        三、获取采购文件

        时间:2022年10月26日至2022年11月7日

        方式:到“南通市崇川区人民政府网→我要看→公示公告栏”自行下载本项目磋商文件

        四、响应文件提交

        截止时间:2022年11月7日14时30分。

        地点:跃龙路38号南通国际大厦16楼1608会议室,如有变动另行通知。

        【特别提醒】请各潜在投标供应商实时关注南通市疫情防控要求,准备好行程码、健康码、开标截止时间之前48小时内核酸阴性证明(如有需要),参加投标的人员请配合现场工作人员的调度安排,携带有效身份证件,规范佩戴口罩,接受实名登记和体温检测后按规定入口进入。

        六、开启

        时间:2022年11月7日14时30分。

        地点:跃龙路38号南通国际大厦16楼1608会议室,如有变动另行通知。

        七、公告期限

        自本公告发布之日起3个工作日。

        八、其他补充事宜:无

        九、凡对本次采购提出询问,请按以下方式联系

        1、采购人信息

        名称:南通市崇川区文化和旅游局

        联系人:汤女士

        电话:0513-85128717

        2.代理机构:南通通城建设工程项目管理有限公司

        地址:南通市崇川区工农路156号鑫乾国际广场A座2202室

        联系人:崔永振

        联系电话:18862961365

        邮 箱:1346702320@qq.com

        3.项目联系方式:

        联系人:崔永振

        电话:18862961365

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/117.html b/news/117.html new file mode 100644 index 0000000..bb55575 --- /dev/null +++ b/news/117.html @@ -0,0 +1,362 @@ + + + + +G357东泸线起点新标志牌正式“上岗”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        G357东泸线起点新标志牌正式“上岗”

        +
        +
        +
        +  2022-10-27 阅读:2 +
        +
        +

        “我们村这条路居然是国道,改天沿着这条路开到云南去!”

        G357线0K+000M宫前村村口,周围居民在参观起点标志牌的同时发出感叹。

        近日,G357东泸线东山段起点陈城镇宫前村村口设立了国道起点标志牌。

        得益于前期公路部门与当地村委会、设计方的反复沟通修改,新设计的牌体一方面结合G357线道路信息与公路重点色,打造出兼具信息宣传与造型美观的宣传牌,以达到提高群众爱路护路意识,扩大公路影响力的目的;另一方面又结合地域文化特色、美观大方,更好地统筹协调海洋与渔业、人文资源与自然资源的关系,展现东山岛小渔村特点,形成一处矗立在宫前村村口独具特色打卡点。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/118.html b/news/118.html new file mode 100644 index 0000000..1b8e488 --- /dev/null +++ b/news/118.html @@ -0,0 +1,362 @@ + + + + +仪征拆除8处违规楼体高空位置户外广告牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        仪征拆除8处违规楼体高空位置户外广告牌

        +
        +
        +
        +  2022-10-28 阅读:9 +
        +
        +

        昨天上午8时30分,在仪征市解放东路东方曼哈顿小区北大门,仪征城管部门动用人员和机械将离地面15米高的某婚纱摄影店6个广告字体和两家装修公司的8个广告字体拆除,记者在现场看到,楼体上单个字体的长、宽大约80公分,不但影响市容,而且在大风暴雨等恶劣天气下容易引发安全隐患。

        记者随后采访了解到,前期,仪征城管局一中队已经对商家已下发整改通知,要求在规定时间内自行拆除。

        商家均认识到违规设置户外广告的错误,表示配合城管部门工作,但广告字体积大、重量重,需要高空作业,拆除难度较大,申请城管部门帮助拆除。

        当天在现场,5位工人依靠吊车、卡车等大型机械设备实施户外广告拆除作业,同时配备了安全绳、安全帽,并在楼下设立了围挡。经过上午3个多小时作业,悬挂在楼体上的14个广告字被拆除。

        户外广告是展示城市形象的名片,但只有规划合理、设置有序、布局科学的户外广告才有利于展现城市的管理水平和文明程度。

        连日来,仪征市城市管理局持续开展楼顶户外广告整治工作。

        “在整治行动前,我们对违规楼顶广告进行摸排统计,逐门逐户开展法规宣传。”仪征市城管局相关负责人介绍,该局根据违规户外广告具体特点,采取一处一策方式,进行“拔钉”处置。

        截至目前,已拆除建筑物楼顶大型广告牌8处,总面积约60平方米,真正让城市“天际线”更整洁、更明亮,彻底消除高空位置户外广告牌的安全隐患问题。

        “城管部门将对楼顶字的巡查列入常态化工作,持续对重点区域、反复区域加强日常巡查管控,持续推进违规楼顶广告招牌的拆除工作。”仪征市城管局相关负责人表示,城管部门将坚决拆除不符合设置标准的楼顶广告(招牌),杜绝新增的违规楼顶广告(招牌)。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/119.html b/news/119.html new file mode 100644 index 0000000..4a32554 --- /dev/null +++ b/news/119.html @@ -0,0 +1,362 @@ + + + + +京东方宣布研发出高透高亮 MLED“透视屏”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        京东方宣布研发出高透高亮 MLED“透视屏”

        +
        +
        +
        +  2022-10-28 阅读:1 +
        +
        +

        近日,BOE(京东方)在LED透明显示领域取得重要进展,创新研发出超高透过率主动式驱动MLED透明显示产品,透明度高达65%以上,亮度超过1000nit。

        透明区创新结构设计

        采用全新的像素结构优化设计方案,能够显著提高背板开口率,基于创新性的像素透明区设计,优化像素透明区膜层透过率,在保证背板高充电率、高均一性的前提下,实现了较高的光效,显示亮度可达1000nit以上,达到业内领先水平,并且基于像素级亮度控制实现10万:1超高对比度,使显示色彩更加丰富、准确和生动。

        优异的显示画质,强大的多媒体交互与实物展示效果叠加,为商业展览展示、车载HU示、AR眼镜等场景应用创新带来无限可能。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/12.html b/news/12.html new file mode 100644 index 0000000..f2bd4aa --- /dev/null +++ b/news/12.html @@ -0,0 +1,362 @@ + + + + +智能数字标牌有什么常见误区呢?_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        智能数字标牌有什么常见误区呢?

        +
        +
        +
        +  2022-04-30 阅读:6 +
        +
        +

        由于市场对智能数字标牌认可度越来越高,逐渐进入高峰期。那么在使用过程中难免会碰到一些误区。


        软件功能越丰富越好?

        智能数字标牌是一个长期的运用过程,注重的长远使用效果,而由于数字标牌行业技术更新的快速,许多用户在系统构建时盲目跟风的追求功能丰富性,造成投入成本的增加。从经济实惠的方向出发,功能够用就可以。但是,为了确保系统应用的长寿性,一定要保证系统的开放性,以保证系统的及时升级,满足最新的运用需求。

        播放器产品越小越好?

        在现实运用中,为了确保智能数字标牌的外形美观性,外形小巧的播放器产品变成了行业用户的宠儿,部分用户甚至秉持“越小越好”的挑选理念。实际上,播放器越小巧,安装越灵活,相对应的,要求也越高,进而造成了成本的提高。

        从技术层面而言,播放器的体积越小,散热设计就越困难,这就代表着并不是每个厂家都能完成符合运用需求的生产,目前市面上不缺假冒伪劣的产品,因而,为了更好地保证系统的平稳运行,用户在挑选产品一定要调查散热情况,切勿满足追求“小而美”。现实系统构建中,只需设计合理,播放器的体积无须最小,也能做到预计的效果。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/120.html b/news/120.html new file mode 100644 index 0000000..36a2330 --- /dev/null +++ b/news/120.html @@ -0,0 +1,362 @@ + + + + +洞察政务中心数字化转型之道,星际互动助力数字政务建设_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        洞察政务中心数字化转型之道,星际互动助力数字政务建设

        +
        +
        +
        +  2022-10-28 阅读:0 +
        +
        +

        近日,国办印发《关于加快推进“一件事一次办”打造政务服务升级版的指导意见》,提出要推动数字技术广泛应用于政府管理服务,优化业务流程、打通业务系统、强化数据共享,推动更多关联性强,办事需求量大的跨部门、跨层级政务服务事项实现“一件事一次办”,进一步提高企业和群众办事的体验感和获得感。

        在一个现代国家中,政府需要为居民提供基本的公共服务和公共产品,并保证其可及、质量与公平。而提供服务质量与服务效能——也就是办得好不好和办得快不快,是服务型政府的重要考量标准。加快推进“一件事一次办”,有助于降低制度性交易成本——其中既包括经济成本,也包括时间成本,提升服务体验,优化营商环境。

        “一件事一次办”并不是一个新鲜词儿。2021年8月颁布的《法治政府建设实施纲要(2021-2025年)》提出,要全面提升政务服务水平,完善首问负责、一次告知、一窗受理、自主办理等制度,加快推进政务服务“跨省通办”,到2021年年底基本实现高频事项“跨省通办”。大力推行“一件事一次办”,提供更多套餐、主题式集成服务。

        “一件事办一次”的加快推进,要以数字技术为支撑。用数字技术进行数据资源整合,打通政府各部门各条块各层级各自为政的状态,实现数据流转,释放数据价值,才能提升政府运行效率,让政府具备更好的服务能力。有专家表示,以数字技术建设服务型政府,将便于从中心化政府转向以市民居民为中心,将行政职能政府转向服务型政府,构建便利、高效、廉洁、公正政府形象,以此来优化营商环境,优化老百姓的生活环境。而数据共享、业务协同也有助于减少基层工作人员的重复录入填报材料的情况,减轻基层政府工作压力,提升工作效率。

        近年来,党中央、国务院从推进国家治理体系和治理能力现代化全局出发,准确把握全球数字化、网络化、智能化发展趋势和特点,围绕实施网络强国战略、大数据战略等作出了一系列重大部署。经过各方努力,各级政府业务信息系统建设和应用成效显著,数据共享和开发利用取得积极进展,一体化政务服务和监管效能大幅提升。

        在全国推行“一件事办一次”之前,有很多地区和部门已经开始了此类尝试。“最多跑一次”“一网通办”“一网统管”“一网协同”“借诉即办”等创新实践不断涌现,并产生了良好的社会效益。这种刀刃向内的改革符合以人民为中心的发展理念。政府部门换位思考、优化服务,站在申办人、申办企业的角度,细化场景、设计清单、提供服务,有助于群众厘清办事思路、明晰办事流程。唯其如此,群众才能在办事中少憋气、心顺畅,获得更大满足感。

        面向2035,国务院发布的《关于加强数字政府建设的指导意见》针对数字政府建设的实况与技术应用环境的变化,对互联网+监管、互联网+督查、基层治理、绿色双碳、政务云等的未来发展均提出了较为明确的要求。

        推进地理信息协同共享,提升公共服务能力,更好发挥地理信息的基础性支撑作用。从身份数字化到位置/空间的数字化,再到身份与空间的关系数字化,这不仅是过去十年移动互联网市场与平台经济发展的基本逻辑,同时也将成为未来数字公共服务持续升级的根本动力。

        通过对地理信息技术的应用和共享,将进一步优化和提升公共服务的普惠化、精准化、智能化供给功能。利用地理信息技术加持的数字孪生,面向政务服务与城市治理,也将更深入提升政务服务的“抓地能力”,在数字孪生平台对目标城市空间、部件、物体等的虚实映射、智能干预下,可以为城市服务和治理提供更有效的决策支持。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/121.html b/news/121.html new file mode 100644 index 0000000..3a93ce9 --- /dev/null +++ b/news/121.html @@ -0,0 +1,362 @@ + + + + +济南超算数字经济创新圈服务中心户外标识标牌制作安装竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        济南超算数字经济创新圈服务中心户外标识标牌制作安装竞争性磋商

        +
        +
        +
        +  2022-11-09 阅读:25 +
        +
        +

        【招标】济南超算数字经济创新圈服务中心户外标识标牌制作安装竞争性磋商公告
        项目所在地区:山东省,济南市,历城区
        一、招标条件
        本济南超算数字经济创新圈服务中心户外标识标牌制作安装已由项目审批/核准/备案 机关批准,项目资金来源为其他资金/,招标人为济南超算数字经济创新圈服务中心。本项 目已具备招标条件,现招标方式为其它方式。
        二、项目概况和招标范围
        规模:一、项目概况:济南超算数字经济创新圈服务中心户外标识标牌制作安装项目已 经批准建设,建设资金已落实,项目出资比例为100%,采购人为济南超算数字经济创新圈 服务中心。该项目已具备采购条件,现对该项目以竞争性磋商的方式择优选择一家施工单位。
        1.建设地点:济南市历城区;2.采购范围:济南超算数字经济创新圈服务中心户外标识标牌 的深化设计、制作、安装、调试、验收、保修等全部内容,详见竞争性磋商文件、图纸及清 单。3.质量标准:合格:4.标段划分情况:本项目分为一个标段:
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)不分标包:
        三、投标人资格要求
        (001不分标包)的投标人资格能力要求:
        1.供应商须具备合法营业执照及有效的安全生 产许可证,并在人员、设备、资金等方面具备相应的施工能力:
        2.资质要求:供应商须具有建筑工程施工总承包三级及以上资质或建筑装修装饰工程专业承包二级及以上资质;
        3.人员要求:拟担任本项目的项目经理须具有贰级及以上注册建造师证书(建筑工程专业)具备有效的安全生产考核合格证书证(B类):
        4.①供应商自2019年1月1日至今社会信誉自查承诺(盖公司公章); ②供应商需提供信息填报期间的“中国执行信息公开网”网站
        (http://zxgk.court.gov.cn/shixin/)查询本单位是否为失信被执行人的网页截图。采购 人应对属于限制参与工程建设项目投标活动失信被执行人依法依规予以限制: 5.本次采购不接受联合体投标;;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年11月14日09时00分到2022年11月18日17时00分
        五、投标文件的递交
        递交截止时间:2022年11月24日09时30分
        六、开标时间
        开标时间:2022年11月24日09时30分
        七、其他
        1、资格审查方式:资格后审。
        2、信息填报时间及方式:
        1.时间:2022年11月9日至2022年11月11日每日9:00至17:00时。
        2.方式及需要提交的材料:
        2.1资料顺序:
        1)供应商信息填报表;
        2)营业执照副本;
        3)资质证书及安全生产许可证;
        4)项目经理注册建造师证及安全生产考核合格证书(B类):
        5)自查承诺及信用中国截图;
        6)法定代表人身份证明文件及身份证或法人授权委托书及被授权人身份证。
        联系人:张工
        电话:17800272717
        邮箱:zmlds717@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/122.html b/news/122.html new file mode 100644 index 0000000..9f80979 --- /dev/null +++ b/news/122.html @@ -0,0 +1,362 @@ + + + + +珠海井岸镇道路标线、标牌等项目工程竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        珠海井岸镇道路标线、标牌等项目工程竞争性磋商公告

        +
        +
        +
        +  2022-11-09 阅读:4 +
        +
        +

        井岸镇道路标线、标牌等项目工程 采购项目的潜在供应商应在珠海市斗门区井岸镇井湾路113号B座410-1 广东致方工程咨询有限公司获取采购文件,并于2022年11月18日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:GDZF2022-126

        项目名称:井岸镇道路标线、标牌等项目工程

        采购方式:竞争性磋商

        预算金额:50.0000000 万元(人民币)

        采购需求:

        井岸镇辖区内增加道路标线、标牌等交通设施项目,详见招标文件第四部分中的“用户需求书”。

        最高限价:本项目采用费率报价,投标报价费率上限:95.00%。投标报价超过上限的视为无效投标文件。

        合同履行期限:合同签订生效之日起20个日历天完成供货及安装并通过验收 。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        1)供应商必须是具有独立承担民事责任能力的法人或其他组织(响应文件中须提供法人或其他组织的营业执照等证明文件,复印件加盖供应商公章);

        2)具有建设行政主管部门核发的市政公用施工总承包三级(或以上)资质。

        3)拟派项目负责人具有[市政公用工程]专业[二]级或以上注册建造师资格,广东省外企业拟派项目负责人具有建设行政主管部门颁发的[市政公用工程]专业[一]级注册建造师资格。拟派项目负责人在投标截止至中标公示结束期间没有担任在建项目的项目负责人或同时以项目负责人身份参加其他投标。

        4)具有有效的安全生产许可证。

        5)省外单位已在广东建设信息网(网址www.gdcic.net)进粤企业和人员诚信信息登记平台登记(提供广东建设信息网上进粤企业和人员诚信信息登记情况为正常登记的网页打印件加盖公章)。

        6)已在珠海市建设业务管理系统中完成诚信基本信息登记工作(提供珠海市建设业务管理系统诚信信息登记情况为审批通过的网页打印件加盖公章)。

        5)近三年以来(参加本采购项目活动之日开始计算;成立时间不足三年的,为成立时间以来)在经营活动中没有重大违法记录(提供声明函原件)。

        6)不属于失信被执行人(提供信用中国(http://www.creditchina.gov.cn/)下载的信用信息报告或提供http://zxgk.court.gov.cn/shixin/网站查询截图)。

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2022年11月08日  至 2022年11月14日,每天上午9:00至12:00,下午14:30至17:30。(北京时间,法定节假日除外)

        地点:珠海市斗门区井岸镇井湾路113号B座410-1 广东致方工程咨询有限公司

        方式:现场获取

        售价:¥500.0 元(人民币)

        四、响应文件提交

        截止时间:2022年11月18日 10点30分(北京时间)

        地点:珠海市斗门区井岸镇井湾路113号三友智创谷B座410-1(广东致方工程咨询有限公司)

        五、开启

        时间:2022年11月18日 10点30分(北京时间)

        地点:珠海市斗门区井岸镇井湾路113号三友智创谷B座410-1(广东致方工程咨询有限公司)评标室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        获取磋商文件方式:获取磋商文件时须提供以下资料(复印件加盖公章):

        (1)营业执照复印件;

        (2)法定代表人证明书(法定代表人办理时);

        (3)法定代表人证明书及法定代表人授权委托书(非法定代表人办理时);

        (4)办理人身份证复印件。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:珠海市斗门区井岸镇人民政府     

        地址:珠海市斗门区井岸镇        

        联系方式:张英钦 联系电话:0756-2786076      

        2.采购代理机构信息

        名 称:广东致方工程咨询有限公司            

        地 址:珠海市斗门区井岸镇井湾路113号B座410-1            

        联系方式:林银侦 联系电话:0756-5555778              

        3.项目联系方式

        项目联系人:林银侦

        电 话:  0756-5555778

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/123.html b/news/123.html new file mode 100644 index 0000000..c5569c1 --- /dev/null +++ b/news/123.html @@ -0,0 +1,362 @@ + + + + +厦门市图书馆文化艺术中心馆区标识标牌项目采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        厦门市图书馆文化艺术中心馆区标识标牌项目采购公告

        +
        +
        +
        +  2022-11-16 阅读:7 +
        +
        +

        厦门市图书馆文化艺术中心馆区标识标牌 采购项目的潜在供应商应在厦门万翔招标有限公司(厦门市湖里区机场北路476号四楼售标室)获取采购文件,并于2022年11月21日 14点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:XM2022-TZ0661

        项目名称:厦门市图书馆文化艺术中心馆区标识标牌

        采购方式:竞争性谈判

        预算金额:15.0000000 万元(人民币)

        最高限价(如有):15.0000000 万元(人民币)

        采购需求:

        厦门市图书馆文化艺术中心馆区标识标牌、数量:1批、简要技术需求:产品名称 阅览区吊牌 规格尺寸(宽*高)580*1600*100mm 材质样式 304不锈钢制作,双面镂空,内衬3mm厚亚克力,发白光,包含吊杆,汽车烤漆等,其他详见采购文件。市级资金。

        合同履行期限:样品符合采购人要求后,采购人下达生产通知书后10个日历日完成标识标牌制作,按照采购人进场安装通知后5个日历日完成安装并提交采购人验收。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        本项目专门面向中小企业采购,所报所有采购标的均为中小微企业制造,并提供中小企业声明函,非中小企业报价将被拒绝。

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2022年11月15日  至 2022年11月18日,每天上午8:30至12:00,下午14:00至17:30。(北京时间,法定节假日除外)

        地点:厦门万翔招标有限公司(厦门市湖里区机场北路476号四楼售标室)

        方式:现场购买或邮寄购买;咨询电话:王小姐0592-2219823;传真:0592-5706660-6969

        售价:¥50.0 元(人民币)

        四、响应文件提交

        截止时间:2022年11月21日 14点30分(北京时间)

        地点:厦门万翔招标有限公司------厦门市湖里区机场北路476号四楼开标厅

        五、开启

        时间:2022年11月21日 14点30分(北京时间)

        地点:厦门万翔招标有限公司------厦门市湖里区机场北路476号五楼评标室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1、保证金、文件费、服务费等费用:

        收款单位名称:厦门万翔招标有限公司;

        开户行:建行厦门自贸试验区航空港支行;

        账号:35101570201052504219;

        保证金事宜联系人:陈小姐0592-5703367;

        服务费事宜联系人:陈小姐0592-5703367

        友情提醒:

        ①本项目采用网下购买竞争性谈判采购文件,报价人必须按竞争性谈判采购文件要求递交纸质报价文件。

        ②欢迎投标人(报价人)对项目采购过程中公告发布、采购文件购买、保证金缴交和退还、服务费收取、中标(成交)通知书发放等环节的服务进行监督。有关上述事项的服务质量及态度的投诉请联系综合部黄经理(电话:0592-5705656),我们将竭诚为您提供最优质的服务。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:厦门市图书馆     

        地址:厦门市思明区体育路95号        

        联系方式:/      

        2.采购代理机构信息

        名 称:厦门万翔招标有限公司            

        地 址:厦门市湖里区机场北路476号            

        联系方式:黄超群,0592-2298125            

        3.项目联系方式

        项目联系人:洪小姐

        电 话:  0592-5762515

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/124.html b/news/124.html new file mode 100644 index 0000000..9a0cafe --- /dev/null +++ b/news/124.html @@ -0,0 +1,362 @@ + + + + +扬州市自然资源和规划局关于古树名木标识标牌设计及制作采购项目竞争性磋商采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        扬州市自然资源和规划局关于古树名木标识标牌设计及制作采购项目竞争性磋商采购公告

        +
        +
        +
        +  2022-11-16 阅读:6 +
        +
        +

        扬州市自然资源和规划局关于古树名木标识标牌设计及制作采购项目采购项目的潜在供应商应在邮箱下载获取采购文件,并于2022年11月28日14点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:YZRXZX-2022170

        项目名称:扬州市自然资源和规划局关于古树名木标识标牌设计及制作采购项目

        采购方式:竞争性磋商

        预算金额:15.6000000万元(人民币)

        最高限价(如有):15.6000000万元(人民币)

        采购需求:

        扬州市自然资源和规划局关于古树名木标识标牌设计及制作;具体内容及要求详见采购文件。

        合同履行期限:成交单位于2022年11月30日前完成设计方案且经采购人审核通过,2022年12月10日前完成全部制作及供货工作。

        本项目(不接受)联合体投标。

        二、申请人的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        根据《政府采购促进中小企业发展管理办法》的规定,本项目专门面向中小企业采购,供应商参加投标时须提供《中小企业声明函》(格式详见附件),《中小企业声明函》不符合要求或未提供的,投标响应文件无效。

        本项目采购标的按中小企业划分标准所属行业区分为其他未列明行业(中小微企业划型标准网址:http://www.ccgp.gov.cn/zcfg/mof/201310/t20131029_3587674.htm)。

        3.本项目的特定资格要求:/

        三、获取采购文件

        时间:2022年11月15日至2022年11月22日,每天上午9:00至11:30,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:邮箱下载

        方式:供应商如确定参加磋商,请如实填写《供应商参加磋商确认函》,打印后加盖公章,拍照或扫描发送至邮箱:zc@yzrxgc.cn(邮件标题为供应商公司全称+所投项目简称),代理机构将以邮件回复确认,如未收到回复邮件须电话联系代理机构以确认是否收到。磋商当日交付《供应商参加磋商确认函》原件,如供应商未按上述要求去做,将自行承担所产生的风险。有关本次磋商的事项若存在变动或修改,敬请及时关注“中国政府采购网”发布的信息或更正公告。

        售价:¥300.0元(人民币)

        四、响应文件提交

        截止时间:2022年11月28日14点00分(北京时间)

        地点:扬州仁信工程管理有限公司开标室(扬州市广陵区联谊路与开发东路交叉口东南角,苏高新“名泽园”南门10号商务楼二楼)

        五、开启

        时间:2022年11月28日14点00分(北京时间)

        地点:扬州仁信工程管理有限公司评标室(扬州市广陵区联谊路与开发东路交叉口东南角,苏高新“名泽园”南门10号商务楼二楼)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1、满足《中华人民共和国政府采购法》第二十二条规定,并提供下列材料:

        1.1磋商响应函(原件);

        1.2资格声明(原件);

        1.3若法定代表人参加磋商的,须提供本人身份证复印件(加盖供应商公章);若授权代表参加磋商的,须提供《法人授权书》原件和授权代表身份证复印件(加盖供应商公章);

        1.4营业执照副本或民办非企业单位登记证书或事业单位法人证书等相关身份证明材料(复印件加盖供应商公章);

        1.5供应商依法缴纳职工社会保障资金的证明材料(复印件加盖供应商公章)(税务、银行或社会保险基金管理部门出具的近三个月内任意一个月(2022年8月-2022年10月)缴纳职工社会保障资金的缴款凭证或缴款证明);

        1.6供应商近三个月内任意一个月(2022年8月-2022年10月)依法纳税的缴款凭证(复印件加盖供应商公章);

        1.7与上一条相对应的纳税申报表或经会计师事务所审计的2021年度财务报告(复印件加盖供应商公章);

        1.8供应商参加本次政府采购活动前3年内在经营活动中没有重大违法记录的书面声明(原件);

        1.9供应商信用承诺书(原件)。

        注一:如参加本项目的供应商为新成立公司(成立时间距开标时间不到1年)、个体工商户、自然人或事业单位等非企业法人,则无需提供上述1.5-1.7三项,本文件中所需法定代表人相关材料、盖章及签字等可用供应商相关负责人的相应材料代替。

        注二:响应文件的正本和副本中均须提供上述资格证明文件。资格证明文件须清晰可辨,若有缺失或不清晰,将导致磋商被拒绝且不允许在磋商开始后补正。

        2、集中考察或召开答疑会:无。

        3、本次磋商响应文件制作份数要求:一式叁份(壹份正本、贰份副本)。每份响应文件须清楚标明“正本”或“副本”字样。一旦正本和副本不符,以正本为准。

        4、本磋商文件中斜体下划线部分为实质性响应条件,为必须遵守的条件,如不满足将作无效响应文件处理。

        5、响应文件接收开始时间:2022年11月28日13点30分。

        6、凡现场递交响应文件并参加现场开标会的供应商相关人员,需携带《疫情防控期间供应商承诺书》原件出席,详见第六章。

        八、凡对本次采购提出询问,请按以下方式联系

        1.采购人信息

        名称:扬州市自然资源和规划局

        地址:扬州市文昌中路565号

        联系方式:——

        2.采购代理机构信息

        名称:扬州仁信工程管理有限公司

        地址:扬州市广陵区联谊路97#苏高新“名泽园”南门10号商务楼

        联系方式:陈工13092095037

        3.项目联系方式

        项目联系人:陈工

        电 话:0514-82101606

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/125.html b/news/125.html new file mode 100644 index 0000000..6a59260 --- /dev/null +++ b/news/125.html @@ -0,0 +1,362 @@ + + + + +银川市口腔医院鼓楼门诊院区标识标牌采购项目三次竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        银川市口腔医院鼓楼门诊院区标识标牌采购项目三次竞争性谈判公告

        +
        +
        +
        +  2022-11-16 阅读:7 +
        +
        +

        银川市口腔医院鼓楼门诊院区标识标牌采购项目 采购项目的潜在供应商应在宁夏亿汇项目管理有限公司获取采购文件,并于2022年11月21日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:NXYH-ZC-20220902

        项目名称:银川市口腔医院鼓楼门诊院区标识标牌采购项目

        采购方式:竞争性谈判

        预算金额:1.5170000 万元(人民币)

        最高限价(如有):1.5170000 万元(人民币)

        采购需求:

        详见谈判文件(采购预算金额为合计单价,详见谈判文件第四章)

        合同履行期限:合同签订后15日历天供货及安装。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        满足《中华人民共和国政府采购法》第二十一条。

        (1)中小微企业参加宁夏政府采购招投标活动,参照《财政部关于进一步加大政府采购支持中小企业力度的通知》(财库〔2022〕19号)和《宁夏回族自治区财政厅发展和改革委员会工业和信息化厅 住房和城乡建设厅交通运输厅水利厅公共资源交易管理局 中国人民银行银川中心支行关于落实政府采购促进中小企业发展有关措施的通知》(宁财(采)发〔2022 〕275号)文件执行,小型和微型企业的应提供《中小企业声明函》,对报价给予10%的扣除,用扣除后的价格参与评审。(专门面向中小企业采购的项目或者采购包,中小企业不再执行价格评审优惠扶持政策。)(2)监狱企业视同为小型、微型企业,监狱企业应提供证明文件,对报价给予10%的扣除,用扣除后的价格参与评审;残疾人企业应提供声明函,对报价给予10%的扣除,用扣除后的价格参与评审。(3)参照《宁夏回族自治区财政厅关于建立节能产品、环境标志产品政府采购执行机制的通知》宁财(采)发[2021]271号文件执行。 

        3.本项目的特定资格要求:(1)营业执照、税务登记证、组织机构代码证(三证合一只提供营业执照);(2)法定代表人授权书原件及被授权人身份证复印件(法定代表人直接投标可不提供,但须提供法定代表人身份证明);(3)供应商在中国政府采购网(www.ccgp.gov.cn)被列入政府采购严重违法失信行为记录名单,或在“信用中国”网站(www.creditchina.gov.cn)被列入失信被执行人、重大税收违法案件当事人名单,以及存在《中华人民共和国政府采购法实施条例》第十九条规定的行政处罚记录,投标将被认定为投标无效。如无法查询的行政事业单位或自然人等可不提供;(4)具有良好的商业信誉和健全的财务会计制度承诺书,须提供相应证明材料(亦可按照《宁财(采)发〔2021〕196号》文件或采购文件规定提供承诺书,格式及内容必须与文件规定一致,否则视为无效);(5)依法缴纳税收和社会保障资金承诺书(亦可按照《宁财(采)发〔2021〕196号》文件或采购文件规定提供承诺书,格式及内容必须与文件规定一致,否则视为无效);(6)参加政府采购活动前三年内,在经营活动中没有重大违法记录承诺书(亦可按照《宁财(采)发〔2021〕196号》文件或采购文件规定提供承诺书,格式及内容必须与文件规定一致,否则视为无效);(7)本项目专门面向中小企业采购,供应商须提供《中小企业声明函》。

        三、获取采购文件

        时间:2022年11月15日  至 2022年11月18日,每天上午8:30至12:00,下午14:00至18:00。(北京时间,法定节假日除外)

        地点:宁夏亿汇项目管理有限公司

        方式:请按资格要求中所要求的证件材料(复印件加盖公章)以邮件形式发往宁夏亿汇项目管理有限公司邮箱:nxyh202107@163.com(备注项目名称、联系人姓名及联系人电话);通过报名审核后,工作人员发送相关文件。

        售价:¥0.0 元(人民币)

        四、响应文件提交

        截止时间:2022年11月21日 10点30分(北京时间)

        地点:宁夏亿汇项目管理有限公司(宁夏银川市兴庆区新华东街650号隆鑫苑A2号楼A1座1101室)

        五、开启

        时间:2022年11月21日 10点30分(北京时间)

        地点:宁夏亿汇项目管理有限公司(宁夏银川市兴庆区新华东街650号隆鑫苑A2号楼A1座1101室)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本次公告在中国政府采购网、银川市口腔医院官网上发布,请各供应商在开标前随时关注以上网站公告栏。你所关注的项目有可能进行时间或内容上的调整,调整内容只在“澄清、变更”公告栏中以公告形式公示,采购代理机构不再以其他方式通知各供应商。如因自身原因未及时关注招标公告或变更(澄清、补充等)公告从而导致投标失败的,供应商自行承担后果。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:银川市口腔医院     

        地址:银川市金凤区正源北街157号        

        联系方式:李女士 09518647026      

        2.采购代理机构信息

        名 称:宁夏亿汇项目管理有限公司            

        地 址:宁夏回族自治区银川市兴庆区新华街街道新华东街650号隆鑫苑A2号楼A座1101室            

        联系方式:冯辉 13723310678            

        3.项目联系方式

        项目联系人:冯辉

        电 话:  13723310678

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/126.html b/news/126.html new file mode 100644 index 0000000..137f66e --- /dev/null +++ b/news/126.html @@ -0,0 +1,362 @@ + + + + +潮州开展大型户外广告设施专项整治,9月至今已拆除20多处_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        潮州开展大型户外广告设施专项整治,9月至今已拆除20多处

        +
        +
        +
        +  2022-11-16 阅读:9 +
        +
        +

        11月15日上午9时许,潮州市区潮枫路与新洋路交界处,施工人员在拆除一栋建筑物楼顶违规设置、存在安全隐患的大型户外广告牌。

        现场,施工人员手持工具对大型户外广告牌进行整块切割,待切割完毕,地面的大型吊装机立即启动,将广告牌缓缓从高层吊运至地面,再分割处理,整个施工过程现场秩序井然。

        这是潮州市城管执法局组织开展的大型户外广告设施专项整治行动。“当天的行动共出动执法人员8名,施工人员10名,大型吊装机一台以及器械一批,拆除大型户外广告牌3处。”潮州市城管执法局有关负责人介绍。

        据了解,专项整治行动自今年9月以来已开展3次,主要对城区重点区域部分违规设置且存在安全隐患、影响市容市貌的大型户外广告设施进行拆除。截至目前已拆除违规设置的大型户外广告设施20多处。

        上述负责人表示,专项整治行动旨在加强市中心城区户外广告管理,规范城市治理秩序,同时净化和规范户外广告市场,提升城市市容市貌品位。接下来,该局将加大对违规户外广告设施的打击力度,请广大户外广告设置者或使用人自觉遵守户外广告相关法律法规,提高依规申请设置、依责加强安全管理的意识。

        记者注意到,今年1月15日,《潮州市城区户外广告设施和招牌设置管理办法》正式施行。《办法》对大型户外广告设施、户外广告设施、招牌的定义均予以明确,并对三者的设置作了相应规定。

        今年1月15日,《潮州市城区户外广告设施和招牌设置管理办法》正式施行。

        其中,大型户外广告设施未经城市管理和综合执法主管部门批准不得擅自设置。其审批分为非临时性大型户外广告设置审批和临时性大型户外广告设置审批, 非临时性大型户外广告设施设置期限一般为两年,最长不超过五年;临时性大型户外广告设施的设置期限根据活动期限确定,最长不得超过两个月,但经市人民政府批准的全市性重大活动除外。

        非大型户外广告设施的设置应当符合户外广告设施设置要求,并在设置完毕之日起十日内,将设施具体位置、设置效果图、设置期限以及设置人相关信息等资料报区人民政府(管委会)城市管理和综合执法主管部门备案。

        招牌设置人应当在招牌设置完毕之日起七个工作日内向区人民政府(管委会)城市管理和综合执法主管部门办理备案,并提交有关材料。

        此外,单位和个人在城市建(构)筑物、设施上张挂、张贴宣传品等,应当经城市管理和综合执法主管部门或者其他有关部门批准。

        今年10月,《潮州市城区户外广告特许经营权项目实施方案》(征求意见稿)向社会公开征求意见。《方案》拟提出,由市政府或其授权机构依法将市城区户外广告特许经营权授予中标的特许经营者,并与中标的特许经营者签订特许经营协议。特许经营者依托自身专业优势与广告专业机构的合作,选择符合法律法规要求以及具有一定商业价值的户外广告公共资源点位,经法定程序,报经市政府或其授权机构审批同意后,投资、建设T型柱、版式广告、LED电子屏等广告载体并进行商业运营。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/127.html b/news/127.html new file mode 100644 index 0000000..1e9fddb --- /dev/null +++ b/news/127.html @@ -0,0 +1,362 @@ + + + + +2022年Q3中国大陆液晶数字标牌市场出货13.9万台,同比下滑62.5%_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年Q3中国大陆液晶数字标牌市场出货13.9万台,同比下滑62.5%

        +
        +
        +
        +  2022-11-17 阅读:442 +
        +
        +

        《科创板日报》16日讯,市调机构洛图科技(RUNTO)最新报告显示,2022年第三季度,中国大陆液晶数字标牌出货13.9万台,同比下降62.5%。前三季度累计出货不到39.8万台,同比2021年下滑55%,回落到2020年水平之下。全年市场出货看在69万台左右,同比2021年仍下滑40.2%。

        本报告中的液晶数字标牌范畴为户内和户外液晶数字标牌。户内液晶数字标牌包括梯媒和非梯媒产品,非梯媒产品包括立式、壁挂式、卧式数字标牌、电子水牌、海报机等。户外液晶数字标牌仅统计户外液晶数字标牌一体机产品,不包含LED屏,液晶拼接墙等大型显示产品。

        进入第三季度,虽然整体经济有所回升,但同时疫情多点散发背景下的中国消费市场仍存波动,复苏尚显乏力,各地项目也未能按时按量重启。此外,互联网行业受红利消失、业态激烈竞争、政策监管加强等各方面因素影响,早前广告投放活跃的品牌持续减投。各方面因素的综合影响下,当季的数字标牌市场虽然环比有所回暖,但相较去年同期,降幅依然巨大。

        2020-2022年中国大陆液晶数字标牌市场季度出货

        数据来源:洛图科技(RUNTO),单位:千台,%

        第三季度,户内液晶数字标牌出货占比97%;户外液晶数字标牌占比3%,户内户外出货占比结构变化较小,户内仍是主流。

        户内:下滑62%,40-49寸成第一尺寸段

        根据洛图科技(RUNTO)数据显示,2022年第三季度,户内液晶数字标牌出货13.5万台,同比下降62%。

        其中,梯媒显示设备出货3.6万台,占比27%,同比下滑41.2%,环比增长87.6%。尽管电梯媒体硬件出货不佳,但相较于整体广告大盘来说,品牌方对于电梯广告投放还是持相当高的认可度。根据市场调研,在今年1-8月与1-9月整体广告花费同比下滑的背景下,电梯数字媒体实现了逆势增长,其中1-8月同比上涨4.1%,1-9月上涨6.4%,幅度稳定上扬。

        2022年中国大陆电梯数字媒体广告花费同比变化

        数据来源:洛图科技(RUNTO)整理,单位:%

        同期,非梯媒产品出货9.8万台,占比73%,同比下降近66.4%。应用于企业的非梯媒数字标牌同比增加,而应用于商业与酒店地产、金融的产品则下滑显著。

        尺寸方面来看,户内主要应用以40-49寸为主,占到23.1%。其中应用于零售、百货的43寸产品出货最多,占比达20.8%。此外,50-59寸出货占比21.8%,主要是55寸产品,用于图书馆等文化行业做图书、文化发展史等的展示。

        2020-2022Q3中国大陆户内液晶数字标牌尺寸结构

        数据来源:洛图科技(RUNTO),单位:%

        户外:下滑73%,交通行业第四季度可期

        根据洛图科技(RUNTO)数据显示,2022年第三季度,户外液晶数字标牌出货为0.4万台,同比下降72.7%。户外出货相较去年同期的下滑仍然显著,但环比第二季度因城际交通恢复运营而在电子站牌等户外应用上则有所增长。上半年中国大陆在交通的基建措施力度很大,带来的行业增长效应或延迟体现,第四季度可以期望交通行业的增长。

        2020-2022Q3中国大陆户外液晶数字标牌市场出货量

        数据来源:洛图科技(RUNTO),单位:千台

        展望:全年看跌幅收窄至40%

        第三季度,中国消费整体转正,但幅度较弱,尤其是受疫情和房地产市场疲弱的影响,对居民收入增长、消费支出造成制约,进而数字标牌运营商缺乏信心。

        进入第四季度,政府已经采取了多项措施改善房地产和提振消费,以及 11月发布了《进一步优化新冠肺炎疫情防控工作的二十条措施》,对于国内外疫情防控措施进行优化,洛图科技(RUNTO)乐观预期,政策和经济在第四季度的复苏,能够在垂直市场有所体现;全年市场出货看在69万台左右,同比2021年仍下滑40.2%。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/128.html b/news/128.html new file mode 100644 index 0000000..016ba54 --- /dev/null +++ b/news/128.html @@ -0,0 +1,362 @@ + + + + +汶川县文化体育和旅游局汶川县阿尔沟旅游标示标牌采购项目竞争性磋商采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        汶川县文化体育和旅游局汶川县阿尔沟旅游标示标牌采购项目竞争性磋商采购公告

        +
        +
        +
        +  2022-11-17 阅读:4 +
        +
        +

        一、项目基本情况

        项目编号:N5132212022000214

        项目名称:汶川县阿尔沟旅游标示标牌采购项目

        采购方式:竞争性磋商

        预算金额:500,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:合同签订后15日内完成设计制作及安装

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目为专门面向中小企业采购项目。

        3.本项目的特定资格要求:

        采购包1:

        供应商及其法定代表人、主要负责人在参加本次政府采购活动前三年内无行贿犯罪记录。

        三、获取采购文件

        时间:2022年11月18日至2022年11月24日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2022年11月28日 10时00分00秒(北京时间)

        地点:成都市武侯区二环路南三段5号人南大厦B座8楼

        五、开启

        时间:2022年11月28日 10时00分00秒(北京时间)

        地点:成都市武侯区二环路南三段5号人南大厦B座8楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本项目采购过程中需要使用四川省政府采购一体化平台,登录方式及地址:通过四川政府采购网(www.ccgp-sichuan.gov.cn)首页供应商用户登录,供应商应当按照以下要求进行系统操作。

        (一)供应商应当自行在四川政府采购网-办事指南查看相应的系统操作指南,并严格按照操作指南要求进行系统操作。在登录、使用采购一体化平台前,应当按照要求完成供应商注册和信息完善,加入采购一体化平台供应商库。

        (二)供应商应当使用纳入全国公共资源交易平台(四川省)数字证书互认范围的数字证书及签章(以下简称“互认的证书及签章”)进行系统操作。供应商使用互认的证书及签章登录采购一体化平台进行的一切操作和资料传递,以及加盖电子签章确认采购过程中制作、交换的电子数据,均属于供应商真实意思表示,由供应商对其系统操作行为和电子签章确认的事项承担法律责任。

        已办理互认的证书及签章的供应商,校验互认的证书及签章有效性后,即可按照系统操作要求进行身份信息绑定、权限设置和系统操作;未办理互认的证书及签章的供应商,按要求办理互认的证书及签章并校验有效性后,按照系统操作要求进行身份信息绑定、权限设置和系统操作。互认的证书及签章的办理与校验,可查看四川政府采购网-办事指南。

        供应商应当加强互认的证书及签章日常校验和妥善保管,确保在参加采购活动期间互认的证书及签章能够正常使用;供应商应当严格互认的证书及签章的内部授权管理,防止非授权操作。

        (三)供应商应当自行准备电子化采购所需的计算机终端、软硬件及网络环境,承担因准备不足产生的不利后果。

        (四)采购一体化平台技术支持:

        在线客服:通过四川政府采购网-在线客服进行咨询

        400服务电话:4001600900

        CA及签章服务:通过四川政府采购网-办事指南进行查询

        汶川县财政局:0837-6223822

        计划备案编号:51322122210200001083[2022]00248 

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:汶川县文化体育和旅游局

        地址:汶川县威州镇树人大楼七楼

        联系方式:18190886091

        2.采购代理机构信息

        名称:成都千一工程项目咨询有限公司

        地址:成都市武侯区二环路南三段5号人南大厦B座8楼

        联系方式:028-61501001

        3.项目联系方式

        项目联系人:张先生

        电话:028-61501001

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/129.html b/news/129.html new file mode 100644 index 0000000..e73704d --- /dev/null +++ b/news/129.html @@ -0,0 +1,362 @@ + + + + +菏泽市某单位标识标语采购项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        菏泽市某单位标识标语采购项目公开招标公告

        +
        +
        +
        +  2022-11-17 阅读:1 +
        +
        +

        菏泽市某单位标识标语采购项目 招标项目的潜在投标人应在邮箱获取。获取招标文件,并于2022年12月09日 09点00分(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:2022-VGBNBP-W1003

        项目名称:菏泽市某单位标识标语采购项目

        预算金额:38.3923490 万元(人民币)

        最高限价(如有):38.3923490 万元(人民币)

        采购需求:

        标识标语设计、制作、安装,具体详见招标文件。

        合同履行期限:详见招标文件。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        /

        3.本项目的特定资格要求:本次招标要求潜在投标人具备本项目采购产品的供货能力和相应的售后服务能力,包括相应的设备和人员;财务要求:财务状况良好,需提供近三年度(自2019年至2021年)财务审计报告;4、在“信用中国”网站(www.creditchina.gov.cn)或中国政府采购网(www.ccgp.gov.cn)或中国执行信息公开网列入失信被执行人、重大税收违法失信主体、政府采购严重违法失信行为记录名单的投标人,不得参与本次招标活动;5、未暂停或取消菏泽市范围内招标项目的投标资格;6、遵守相关保密规定;7、本项目不接受联合体投标;8、资格审查方式:资格后审。

        三、获取招标文件

        时间:2022年11月18日  至 2022年11月24日,每天上午8:30至12:00,下午12:00至17:30。(北京时间,法定节假日除外)

        地点:邮箱获取。

        方式:请潜在投标人于2022年11月18日至2022年11月24日(法定公休日、法定节假日除外),每日上午08时30分至17时30分(北京时间)将以下资格证件原件扫描件发送至邮箱fzjthz00@163.com,备注联系方式,并电话告知招标代理机构: ①营业执照;②法定代表人身份证或授权委托书及授权委托人身份证;③财务审计报告;④信用信息平台查询结果网页截图。 注:①招标文件费300元/套,售后不退。 ②领取文件时的资料查验不代表投标人资格审查的最终通过或合格,投标人资格是否合格以开标后评标委员会组织的资格后审为准。

        售价:¥300.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2022年12月09日 09点00分(北京时间)

        开标时间:2022年12月09日 09点00分(北京时间)

        地点:法正项目管理集团有限公司开标室(菏泽市人民路数码大厦A座五楼)

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜


        法正项目管理集团有限公司受托就菏泽市某单位标识标语采购项目组织招标,现公开邀请符合要求的潜在投标人参加公开招标活动。

        一、招标人:菏泽市某单位

        地址:山东省菏泽市

        联系人:刘先生

        联系方式:0530-5039753

        招标代理机构:法正项目管理集团有限公司

        地  址:山东省菏泽市人民路数码大厦A座五楼

        联系人:张女士

        联系电话:18005306608

        二、项目概况

        1、项目名称:菏泽市某单位标识标语采购项目;

        2、项目编号:2022-VGBNBP-W1003;

        3、项目分包:1个标包;

        4、预算金额:383923.49元;

        5、建设内容:标识标语设计、制作、安装;

        6、工期:20日历天。

        三、投标人资格要求

        1、符合《中华人民共和国政府采购法》第二十二条的相关规定;

        (1)具有独立承担民事责任的能力;

        (2)具有良好的商业信誉和健全的财务会计制度;

        (3)具有履行合同所必需的设备和专业技术能力;

        (4)具有依法缴纳税收和社会保障资金的良好记录;

        (5)在参加政府采购活动前三年内,在经营活动中没有重大违法记录;

        (6)法律、行政法规规定的其他条件。

        2、本次招标要求潜在投标人具备本项目采购产品的供货能力和相应的售后服务能力,包括相应的设备和人员;

        3、财务要求:财务状况良好,需提供近三年度(自2019年至2021年)财务审计报告;

        4、在“信用中国”网站(www.creditchina.gov.cn)或中国政府采购网(www.ccgp.gov.cn)或中国执行信息公开网列入失信被执行人、重大税收违法失信主体、政府采购严重违法失信行为记录名单的投标人,不得参与本次招标活动;

        5、未暂停或取消菏泽市范围内招标项目的投标资格;

        6、遵守相关保密规定;

        7、本项目不接受联合体投标;

        8、资格审查方式:资格后审。

        四、招标文件的获取

        请潜在投标人于2022年11月18日至2022年11月24日(法定公休日、法定节假日除外),每日上午08时30分至17时30分(北京时间)将以下资格证件原件扫描件发送至邮箱fzjthz00@163.com,备注联系方式,并电话告知招标代理机构:

        ①营业执照;②法定代表人身份证或授权委托书及授权委托人身份证;③财务审计报告;④信用信息平台查询结果网页截图。

        注:①招标文件费300元/套,售后不退。

        ②领取文件时的资料查验不代表投标人资格审查的最终通过或合格,投标人资格是否合格以开标后评标委员会组织的资格后审为准。

        五、投标文件的提交

        详见招标文件。

        六、开标时间和地点

        详见招标文件。

        七、公告期限

        自本公告发布之日起5个工作日。

        八、发布公告的媒介

        本公告同时在中国政府采购网、军队采购网发布。

        2022年11月17日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/13.html b/news/13.html new file mode 100644 index 0000000..fe6671b --- /dev/null +++ b/news/13.html @@ -0,0 +1,362 @@ + + + + +科技在发展,数字标牌市场有多大?_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        科技在发展,数字标牌市场有多大?

        +
        +
        +
        +  2022-04-30 阅读:9 +
        +
        +

        科技在发展,世界在进步,数字标牌步入公共或商业领域作为广告应用,早已不知不觉布满我们生活中的许多空间。

        走进便利商店,你会发现数字标牌在播放店内讯息;走进电梯,你也会看到数字标牌在播放讯息或广告等等,那么,这种专为广告与讯息播放而设计的数字标牌市场到底有多大呢?

        据市场数据显示,国内数字标牌的销量将达到160万台。

        这些数字代表著两层意义:


        1、一个新兴的广告或讯息媒体,正随著数字标牌的普及而成为当红产业。

        2、有了广告产业作为后盾,随之而起的是一个结合专属显示器、媒体播放机、控制软件与人机系统整合的全新产业供应链。

        数字标牌通过以上原由正式开始部署时,企业用户就将面临着众多无穷无尽的选择。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/130.html b/news/130.html new file mode 100644 index 0000000..b22e6ec --- /dev/null +++ b/news/130.html @@ -0,0 +1,362 @@ + + + + +湖南银行益阳分行标识标牌制作及安装项目磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        湖南银行益阳分行标识标牌制作及安装项目磋商公告

        +
        +
        +
        +  2022-11-22 阅读:7 +
        +
        +

        一、招标条件
        本湖南银行股份有限公司益阳分行标识标牌制作及安装项目已由项目审批/核准/备案机关批准,项目资金来源为自筹资金148万元,招标人为华融湘江银行股份有限公司益阳分行。本项目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围规模:148万元
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)湖南银行股份有限公司益阳分行标识标牌制作及安装项目;
        三、投标人资格要求
        (001湖南银行股份有限公司益阳分行标识标牌制作及安装项目)的投标人资格能力要求:
        1、供应商基本资格条件:
        (1)具有独立法人资格并依法取得企业营业执照,营业执照处于有效期;(2)供应商参加本次采购活动前3年内没有重大违法记录的书面声明;
        2、供应商特定资格条件:
        (1)供应商近三年(以提交首次响应文件截止时间前36个月内为效,以合同签订时间为准)成功实施过一个单个合同金额45万元(含)以上的标识标牌类制作安装业绩【响应文件需提供标识标牌类制作安装合同复印件(含合同首页、服务内容页(含合同金额、服务内容)、甲乙双方签字盖章页,如合同内容无法体现单项合同金额的,则另则提付款证明材料(发票复印件、付款凭证等)并加盖供应商公章,未提供完整证明材料或材料内容不清晰的视为无效内容】;
        (2)与采购人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加本次投标 单位负责人为同一人或者存在控股、管理关系的不同单位,不得同时参加同一项目投标。
        (3)本项目不接受项目分包、转包。
        3、本项目不接受联合体投标。
        4、供应商可就湖南银行股份有限公司各分行标识标牌制作及安装项目中的任三个分行的项目进行投标,最多允许三个项目报名、中标。;
        本项目不允许联合体投标
        四、招标文件的获取
        获取时间:从2022年11月23日09时00分到2022年11月29日17时00分
        五、投标文件的递交
        递交截止时间:2022年12月04日08时30分
        六、开标时间及地点
        开标时间:2022年12月04日08时30分
        七、其他
        一、采购项目基本概况
        1、采购项目名称:湖南银行股份有限公司益阳分行标识标牌制作及安装项目
        2、采购编号:HRXJ-YY-2022-001
        3、采购方式:竞争性磋商
        4、采购预算:148万元
        二、采购项目内容与数量
        湖南银行股份有限公司益阳分行标识标牌制作及安装项目,详见本项目采购需求。
        请联系后获取详细的招标公告、报名表格、项目附件及相关文件等。
        联系人:赵 琳
        联系电话:185 1840 8518
        邮 箱:zqsd8518@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/131.html b/news/131.html new file mode 100644 index 0000000..e8fdc03 --- /dev/null +++ b/news/131.html @@ -0,0 +1,362 @@ + + + + +贵州装备制造职业学院标识导视系统项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        贵州装备制造职业学院标识导视系统项目招标公告

        +
        +
        +
        +  2022-11-22 阅读:4 +
        +
        +

        受贵州装备制造职业学院委托,对以下项目进行国内竞争性磋商采购,欢迎合格的供应商提交密封响应文件参与报价
        一、采购项目内容
        1、项目编号:GZ-2022-46321Y
        2、项目名称:贵州装备制造职业学院标识导视系统项目
        3、采购预算:50万元
        二、供应商资格要求
        1、具备本项目工程服务能力的国内供应商
        2、法定代表人为同一个人的两个及两个以上法人,母公司、全资子公司极其控股公司,不得同时参加本项目投标
        3、具备建设行政主管部门核发的建筑装修装饰工程专业承包二级及以上资质和具有有效的安全生产许可证
        4、本项目不接受联合体投标
        5、符合法律法规及磋商文件规定的相关要求
        三、获取竞争性磋商文件的时间、方式
        1、获取竞争性磋商文件的时间:2022年11月23日至2022年11月29日(每天09:00-12:00,14:00-17:00,节假日除外)
        2、获取竞争性磋商文件的方式:竞争性磋商文件以电子文档形式向供应商发售
        3、竞争性磋商文件的售价:每套人民币500元整(售后不退)
        4、获取竞争性磋商文件时需提供:(1)法人或其他组织的营业执照等证明文件或自然人身份证明复印件;(2)具备建设行政主管部门核发的建筑装修装饰工程专业承包二级及以上资质和具有有效的安全生产许可证复印件;(3)单位授权书及经办人身份证原件及复印件。(以上复印件均须加盖鲜章)
        四、提交响应报价文件时间及评审时间
        1、响应报价文件递交时间:2022年12月05日14:00~14:30(北京时间)
        2、评审时间:2022年12月05日14:30(北京时间)
        联系人:赵工
        电 话:13439916939
        电子邮箱:ztgx2008@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/132.html b/news/132.html new file mode 100644 index 0000000..45cdbdc --- /dev/null +++ b/news/132.html @@ -0,0 +1,362 @@ + + + + +大连地铁5号线标识标牌采购项目招标_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        大连地铁5号线标识标牌采购项目招标

        +
        +
        +
        +  2022-11-22 阅读:4 +
        +
        +

        一、招标条件
        本大连地铁5号线标识标牌采购项目已由项目审批/核准/备案机关批准,项目资金来源 为自筹资金305万元,招标人为中铁大连地铁五号线有限公司。本项目已具备招标条件,现 招标方式为公开招标。
        二、项目概况和招标范围
        项目编号:ZTDT5-YYZB-2022-07
        招标内容:大连地铁5号线全线18座车站、后关村车辆段、控制中心及主变电所标识 标牌的设计、打样、制造、供货、运输、布线、安装(因实际情况到货后部分货物需更换安 装地点,相应的搬运、安装、拆卸费用由投标人负责)、验收及售后服务等。(详细内容见招 标文件)
        注:1.招标文件中要求投标人须提供非进口产品,否则视为无效投标文件。(进口产品是指 通过中国海关报关验放进入中国境内且产自关境外的产品)
        2.投标人不能只对本项目个别品目进行投标,否则将被视为非响应性投标而被拒绝。
        三、投标人资格要求
        (001大连地铁5号线标识标牌采购项目)的投标人资格能力要求:(1)须在中国境内
        注册满足项目需求的生产厂家或经销商;
        (2)须具有良好的商业信誉和履行合同所必需的设备和专业技术能力:
        (3)投标人3年内在经营活动中没有重大违法记录;
        注:(1)本项目不接受联合体投标。
        (2)截止到开标时间前一日,在“信用中国”网站(www.creditchina.gov.cn)中列入失
        信被执行人名单的不得参与本项目。;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年11月22日09时00分到2022年11月29日16时00分
        五、投标文件的递交
        递交截止时间:2022年12月12日13时30分
        六、开标时间:2022年12月12日13时30分
        联系人:李 工
        电 话:156 0069 4001
        邮 箱:zbcg4001@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/133.html b/news/133.html new file mode 100644 index 0000000..f1dd7a9 --- /dev/null +++ b/news/133.html @@ -0,0 +1,362 @@ + + + + +天水市中西医结合医院医疗器械唯一标识系统采购项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        天水市中西医结合医院医疗器械唯一标识系统采购项目公开招标公告

        +
        +
        +
        +  2022-11-22 阅读:3 +
        +
        +

        天水市中西医结合医院招标项目的潜在投标人应在登录天水市公共资源交易中心网站免费下载获取招标文件,并于2022-12-14 09:00(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:TGZC2022-665

        项目名称:天水市中西医结合医院医疗器械唯一标识系统采购项目

        预算金额:65(万元)

        最高限价:65(万元)

        采购需求:医疗器械唯一标识系统1套。

        合同履行期限:按合同约定执行

        本项目(是/否)接受联合体投标:否

        二、申请人的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:1、具有合法有效的营业执照(副本)原件、组织机构代码证(副本)原件、税务登记证(副本)原件、开户许可证原件或三证合一的营业执照(副本)原件、开户许可证原件;2、投标人须提供“中国裁判文书网”无行贿犯罪档案查询结果(网页截图);3、本项目预留方式为全部面向小微企业预留比例为100%。供应商应当提供完整准确《政府采购促进中小企业发展管理办法》(财库〔2020〕46号)规定的《中小企业声明函》,本项目所属行业为服务,并对其真实性负责。4、本项目实行资格后审,不接受联合体投标。5、供应商须为未被列入“信用中国”网站、“信用甘肃” 网站及“信用天水”网 站记录失信被执行人或重大税收违法案件当事人名单或政府采购严重违法失信行为记录名单;不处于中国政府采购网政府采购严重违法失信行为信息记录中的禁止参加政府采购活动期间;未被列入“信用甘肃/(供应商所属省份)”网 站及“信用天水”网 站记录失信被执行人或财政性资金管理使用领域相关失信责任主体、统计领域严重失信企业及其有关人员等的方可参加本项目的投标。(以投标截止日当天在“信用中国”网站、中国政府采购网、“信用甘肃/ (供应商所属省份)”网站及“信用天水”网站查询结果为准,如相关失信记录失效,供应商需提供相关证明资料)。

        3.本项目的特定资格要求:/

        三、获取招标文件

        时间:2022-11-23至2022-11-29,每天上午00:00至12:00,下午12:00至23:59

        地点:登录天水市公共资源交易中心网站免费下载

        方式:登录天水市公共资源交易中心网站免费下载。投标人可访问“天水市公共资源交易中心”网站(http://ggzyjy.tianshui.gov.cn)点击对应的招标项目公告,免费获取招标文件,也可通过登录天水公共资源交易电子服务系统,在“投标管理”栏目“招标文件获取”子栏目下在线免费获取。

        售价:0(元)

        四、提交投标文件截止时间、开标时间和地点

        时间:2022-12-14 09:00

        地点:天水市公共资源交易中心第二开标厅(建设路185号原市政府政务大厅2楼第二开标厅)

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜


        ①天水市公共资源交易网:http://ggzyjy.tianshui.gov.cn/f

        ②信用中国”网站:https://www.creditchina.gov.cn

        ③中国政府采购网网址:http://www.ccgp.gov.cn/

        七、对本次招标提出询问,请按以下方式联系

        1.采购人信息

        名 称:天水市中西医结合医院

        地 址:甘肃省天水市麦积区渭滨北路西26号

        联系方式:0938-2655702

        2.采购代理机构信息

        名 称:甘肃华建项目咨询有限公司

        地 址:甘肃省天水市秦州区建设路185号

        联系方式:0938-8331354

        3.项目联系方式

        项目联系人:贾东

        电 话:0938-2655702

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/134.html b/news/134.html new file mode 100644 index 0000000..9694b48 --- /dev/null +++ b/news/134.html @@ -0,0 +1,362 @@ + + + + +昌乐县人民医院院内广告牌、标识牌采购及安装项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        昌乐县人民医院院内广告牌、标识牌采购及安装项目

        +
        +
        +
        +  2022-11-22 阅读:10 +
        +
        +

        一、招标条件
        本昌乐县人民医院院内广告牌、标识牌采购及安装项目己由项目审批/核准/备案机关批
        准,项目资金来源为自筹资金48.75万元,招标人为昌乐县人民医院.本项目己具各招标条
        件,现招标方式为其它方式:
        二、项目概况和招标范围
        规模:昌乐县人民医院院内广告牌、标识牌采购及安装
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)昌乐县人民医院院内广告牌、标识牌采购及安装项目:
        三、投标人资格要求
        (001昌乐县人民医院院内广告牌、标识牌采购及安装项目)的投标人资格能力要求:1
        满足“中华人民共和国政府采购法”第二十二条规定2.落实政府采购政策需满足的资格要
        求:根据财库[2020]46号“政府采购促进中小企业发展管理办法”本项目专门面向中小
        企业采购.3.本项目的特定资格要求:(1)须在中华人民共和国境内依法注册:(2)具备
        完成本项目的供货、安装能力:
        本项目不允19联合体投标.
        四、招标文件的获取
        获取时间:从2022年11月23日09时00分到2022年12月02日09时30分
        获取方式:线上领取或现场领取.获取采购文件时,供应商须携带:1)具有统一社会
        信用代码证的营业执照:2)法定代表人资格证明书;3)法定代表人授权委托书(法定代表人领取无须提供)。
        五、投标文件的递交
        递交截止时间:2022年年12月03日09时30分
        六、开标时间
        开标时间:2022年年12月03日09时30分
        联系人:夏工
        手 机:13241775805
        邮 箱:zb0019@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/135.html b/news/135.html new file mode 100644 index 0000000..ff5fbfc --- /dev/null +++ b/news/135.html @@ -0,0 +1,362 @@ + + + + +山东威海临港区医院项目标识导视工程招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        山东威海临港区医院项目标识导视工程招标公告

        +
        +
        +
        +  2022-11-22 阅读:14 +
        +
        +

        一、招标条件
        临港区医院项目标识导视工程已由项目审批/核准/备案机关批准,项目资金来源为自 筹资金273万元,招标人为威海市临港国有资产经营管理有限公司。本项目已具备招标条件, 现招标方式为公开招标。
        二、项目概况和招标范围
        规模临港区医院项目标识导视工程,位于威海临港区经济技术开发区台湾路南、威青 一级路西,主要内容包括室内导视灯箱、门牌、发光标识、指示牌等工程,具体详见工程量 清单。合同估算价273万元,计划工期60日历天,质量要求达到国家验收规范合格标准。
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)临港区医院项目标识导视工程施工及保修阶段;
        三、投标人资格要求
        (001临港区医院项目标识导视工程施工及保修阶段;)的投标人资格能力要求:
        1、投标人须具有独立承担民事责任的能力。
        2、投标人须具有良好的商业信誉和健全的财务会计制度。
        3、投标人须具有履行合同所必需的设备和专业技术能力。
        4、投标人及其法定代表人必须为非失信被执行人。
        5、投标人不得被工商行政管理机关在全国企业信用信息公示系统中列入严重违法失信企业名单。
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年11月21日17时30分到2022年11月28日17时30分
        获取方式需提供营业执照复印件一份,授权委托书原件一份,法定代表人身份证复印 件一份,授权代表身份证复印件一份(授权委托书需明确所授权代表联系电话及邮箱,复印 件加盖公章)。
        招标文件每套售价300元,售后不退。
        五、投标文件的递交截止时间:2022年12月13日14时30分
        六、开标时间:2022年12月13日14时30分
        联系人:侯 工
        手 机:15210675113
        邮 箱:ztbxx177@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/136.html b/news/136.html new file mode 100644 index 0000000..03229ad --- /dev/null +++ b/news/136.html @@ -0,0 +1,362 @@ + + + + +《绿色低碳标识白皮书》正式发布_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        《绿色低碳标识白皮书》正式发布

        +
        +
        +
        +  2022-11-28 阅读:3 +
        +
        +

        “十四五”时期,是我国应对气候变化、实现碳达峰目标的关键期和窗口期,也是工业实现绿色低碳转型的关键五年,发挥工业互联网等新一代信息技术与制造业融合已经成为推动工业领域绿色低碳发展的重要驱动力。工业互联网标识解析基础设施为绿色低碳产业发展提供重要抓手,通过兼容公、私有标识体系,解决数据难以完全统一的问题,打通产业链异构数据互通和共享,形成解决碳排放数据不可信、碳绩效评价不一致等问题的有效途径,为需求相关方绿色低碳管理决策提供可信监管支撑,推动绿色低碳高质量发展。

        11月24日,2022中国工业互联网标识大会(江苏)在南京成功举办。大会以“标识赋能产业 数智引领未来”为主题,由江苏省工业和信息化厅、江苏省通信管理局、中国信息通信研究院(以下简称“中国信通院”)主办。会上,工业互联网产业联盟标识工作组主席、中国信通院工业互联网与物联网研究所副总工刘阳,副主席、江苏中天互联科技有限公司总经理时宗胜,副主席、徐工汉云技术股份有限公司标识创新部部长徐清华共同发布了《绿色低碳标识白皮书》,中国信通院工业互联网与物联网研究所主任池程对白皮书进行了深度解读。

        白皮书全面剖析了全球绿色低碳发展现状、面临的困难和挑战,梳理了工业互联网标识解析等新一代信息技术对绿色发展的重要驱动力,系统阐述了绿色低碳标识提出的背景、思路和意义,并提出了绿色低碳标识体系架构和绿色低碳标识发展路径、策略建议。

        白皮书核心观点

        1.绿色低碳发展成为应对全球气候变暖的主旋律。绿色低碳发展不仅是减缓气候变化的客观需求,更是着力解决资源环境约束突出问题、实现经济发展方式转变的必然选择。美国、欧盟、日本等世界多国大力推进以高能效、低排放为核心的“低碳革命”,以抢占绿色经济先机和产业制高点。

        2.全球绿色低碳发展面临巨大挑战。新冠肺炎疫情和气候变化风险交织,全球绿色经济转型压力加剧;新发展阶段需求变化显著,高质量绿色发展任务艰巨;降碳与发展的协同路径还需探索,工业节能减排任重道远;工业化和信息化融合水平参差不齐,数字化赋能绿色化基础较弱。

        3.工业互联网标识解析赋能绿色低碳高质量发展。标识解析体系为产业链价值链协同共享提供重要入口,一是通过兼容公、私有标识体系,解决数据难以完全统一的问题;二是为数据的异构互联提供重要手段,打通产业链异构数据互通和共享;三是依托标识实现数据可信采集、汇聚和分析,提供监管支撑。

        4.强化与已有基础设施的融合发展。充分发挥与现有的工业互联网标识解析节点、星火链网等基础设施的融合发展,构建工业绿色低碳转型与工业赋能绿色发展相互促进、深度融合的现代化产业格局,面向重点行业提供咨询、检测、评估、认证等一揽子服务,探索绿色低碳星级认证与绿色金融、绿色信贷的结合方案。

        5.绿色低碳标识应加快推进应用实践推广。针对企业绿色低碳评价过程中存在的数据来源不真实、准确性差;碳排放管理能力不足、碳核查/评价工作机制不完善,行业缺乏统一的碳效评价指标体系;计算模型、计算方法具有较强的局限性等问题,强化绿色低碳标识的应用推广,解决企业绿色低碳发展过程中存在的难题。

        白皮书目录

        一、 标识赋能绿色低碳的意义和现状

        (一)全球绿色低碳发展现状

        (二)全球绿色低碳面临挑战

        (三)标识赋能绿色低碳的意义

        二、 绿色低碳标识体系架构及关键要素

        (一)概述

        (二)体系架构

        (三)标识编码

        (四)标识注册

        (五)数据模型

        (六)数据采集

        (七)可信存证

        三、绿色低碳标识应用场景探索

        (一)企业碳效评价

        (二)产品碳足迹追踪

        (三)工业资源综合利用

        (四)绿色低碳园区建设

        四、绿色低碳标识发展建议

        (一)深化核心技术创新,加快标准体系建设

        (二)完善基础设施建设,强化协同融合发展

        (三)打造行业应用标杆,完善低碳激励机制

        更多精彩,敬请阅读解读PPT


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/137.html b/news/137.html new file mode 100644 index 0000000..058ea18 --- /dev/null +++ b/news/137.html @@ -0,0 +1,362 @@ + + + + +中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目

        +
        +
        +
        +  2022-11-28 阅读:4 +
        +
        +

        招标编号:ZS-QCZH-H-2022-1003

        项目所在地区:内蒙古自治区

        一、招标条件

        本中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目已由项目审

        批/核准/备案机关批准,项目资金来源为其他资金/,招标人为中国银行股份有限公司内蒙古自治区分行。本项目已具备招标条件,现招标方式为公开招标。

        二、项目概况和招标范围

        规模:中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目

        范围:本招标项目划分为 1 个标段,本次招标为其中的:

        (001)中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目;

        三、投标人资格要求

        (001 中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目)的投标人

        资格能力要求:1.必须为中华人民共和国境内注册,依法设立、具有独立法人资格,且有能 力为本项目提供产品和服务的供应商,具有独立承担民事责任的能力。(提供营业执照复印 件并加盖公章)

        2.必须是招标货物的制作商,具有制作各类广告、标识的能力,直接拥有足够的制作后场

        (房产证/租赁合同/购置合同,现场照片),且配有稳定的技术熟练安装工人队伍(承诺书)。

        3.近三年(2019 年 10 月 1 日-至今)相同或类似广告产品合作业绩,包括但不限于标识、标 牌、灯箱等其他广告产品(提供合同或其他相关证明材料)。

        4.财务状况:近两年(2020 年 1 月 1 日-2021 年 12 月 31 日)财务状况良好(提供经外部审 计的财务报告以及开户行所在银行出具的资信证明,均为复印件并加盖公章)。

        5.信誉要求:近两年(2020 年-至今)招投标活动或服务过程中无不良行为,没有被相关主 管部门通报限制等。在“信用中国”中未被列入失信 被执行人名单(提供系统截屏证明并加盖公章)。

        6.单位负责人为同一人或者存在控股、管理关系的不同单位,含母公司与全资子公司或由其 控股的子公司(但国家控股的企业之间不因为同受国家控股而具有关联关系)不得参加本项目投标。

        7.法律、法规规定的其他条件。

        8.本次招标不接受联合体投标;

        本项目不允许联合体投标。

        四、招标文件的获取

        获取时间:从 2022 年 11 月 28 日 09 时 00 分到 2022 年 12 月 09 日 17 时 00 分

        获取方式:详见招标公共

        五、递交截止时间:2022 年 12 月 27 日 09 时 30 分

        六、开标时间:2022 年 12 月 27 日 09 时 30 分

        七、其他

        1.招标条件

        受中国银行股份有限 公司内蒙古自治区分行委托,就中国银行内蒙古分行营业网点营销设施及标识供应商选型入 围采购项目(招标编号:ZS-QCZH-H-2022-1003)进行国内公开招标,本项目资金已落实。 按照《中华人民共和国招标投标法》、《中华人民共和国招标投标法实施条例》等法律法规, 本项目已具备招标条件,现邀请合格的投标人前来投标,本项目采用纸质化招投标。

        2.项目概况与招标范围

        2.1 项目名称:中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目

        2.2 招标范围:中国银行内蒙古分行营业网点营销设施及标识供应商选型入围采购项目,具体

        内容详见招标文件。

        2.3 项目地点:招标人指定地点

        2.4 服务期限:合作期限三年

        2.5 标段划分:本项目不划分标段,具体如下:

        服务内容:行营业网点营销设施及标识供应商选型入围

        入围家数:入围供应商数量为 6 家,在合作期内,服务于全辖营业部的营业区、营业网点和离行式自助银行

        服务期限:合作期限三年

        其他:本项目采购模式为产品定价方式。最终执行价格为入围供应商各项报价的平均价格。

        3.投标人资格要求

        3.1 必须为中华人民共和国境内注册,依法设立、具有独立法人资格,且有能力为本项目提 供产品和服务的供应商,具有独立承担民事责任的能力。(提供营业执照复印件并加盖公章)

        3.2 必须是招标货物的制作商,具有制作各类广告、标识的能力,直接拥有足够的制作后场 (房产证/租赁合同/购置合同,现场照片),且配有稳定的技术熟练安装工人队伍(承诺书)。

        3.3 近三年(2019 年 10 月 1 日-至今)相同或类似广告产品合作业绩,包括但不限于标识、 标牌、灯箱等其他广告产品(提供合同或其他相关证明材料)。

        3.4 财务状况:近两年(2020 年 1 月 1 日-2021 年 12 月 31 日)财务状况良好(提供经外部 审计的财务报告以及开户行所在银行出具的资信证明,均为复印件并加盖公章)。

        3.5 信誉要求:近两年(2020 年-至今)招投标活动或服务过程中无不良行为,没有被相关 主管部门通报限制等。在“信用中国”中未被列入失 信被执行人名单(提供系统截屏证明并加盖公章)。

        3.6 单位负责人为同一人或者存在控股、管理关系的不同单位,含母公司与全资子公司或由 其控股的子公司(但国家控股的企业之间不因为同受国家控股而具有关联关系)不得参加本 项目投标。

        3.7 法律、法规规定的其他条件。

        3.8 本次招标不接受联合体投标

        4. 报名及招标文件的获取: 联系人: 张涛132 6116 9391

        4.1 符合上述条件的投标人可在 2022 年 11 月 28 日至 2022 年 12 月 9 日,每个工作日上午 9:00—11:30 时,下午 2:00—5:00 时报 名材料或将报名所需材料逐页复印加盖公章并扫描转为一个 PDF 格式文件发送到 邮箱获取招标文件。

        4.2 招标文件售价:1000 元,招标文件售后不退。

        注:报名时提供以下资料,报名材料均为复印件或扫描件加盖公章,资格文件不全者拒绝接 收,未按要求提交的报名资料一律退回。

        (1)法定代表人授权委托书;

        (2)营业执照副本;

        (3)制作商声明(格式自拟);

        (4)产品制作后场的房产证/租赁合同/购置合同以及现场照片;

        (5)配有稳定的技术熟练安装工人队伍的承诺书(格式自拟);

        (6)近三年(2019 年 10 月 1 日-至今)相同或类似广告产品合作业绩,包括但不限于标识、

        标牌、灯箱等其他广告产品(提供合同或其他相关证明材料);

        (7)提供经外部审计的财务报告以及开户行所在银行出具的资信证明;

        (8)在“信用中国”中未被列入失信被执行人名单

        网页截图;

        (9)不存在“单位负责人为同一人或者存在控股、管理关系的不同单位,含母公司与全资 子公司或由其控股的子公司(但国家控股的企业之间不因为同受国家控股而具有关联关系)” 的相关承诺,格式自拟;

        (10)“有能力为本项目提供产品和服务的供应商”的相关承诺,格式自拟;

        (11)投标人联系方式及邮箱。

        4.3 上述要求是对潜在投标人的基本要求,如按照行业及相关部门另有规定的遵循其规定, 投标人应提供相应的证明或资信材料。

        4.4 如果发现存在虚假资料取消其投标/中标资格,并承担相应法律责任,由此造成的后果由 投标/中标人自负。

        5、递交投标文件截止时间:2022 年 12 月 27 日 上午 9:30 分(北京时间);

        6.投标样品

        样品规格:详见附件。

        备注:投标人应在规定的时间内到指定地点领取招标文件,须先进行供应商登记注册并办理备案,如在规定时间内未领取招标文件并登记备案的供应商均无资格参加该项目的投标。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/138.html b/news/138.html new file mode 100644 index 0000000..45e6365 --- /dev/null +++ b/news/138.html @@ -0,0 +1,362 @@ + + + + +陕西省内公路沿线新建8座充电站标识广告牌制作、安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        陕西省内公路沿线新建8座充电站标识广告牌制作、安装项目招标公告

        +
        +
        +
        +  2022-12-08 阅读:99 +
        +
        +

        招标编号:正衡招字-[2022]-994号
        项目所在地区:陕西省
        一、招标条件
        本陕西省内公路沿线新建8座充电站的品牌形象标准化装修及64座充电站的标识广告 牌制作、安装项目已由项目审批/核准/备案机关批准,项目资金来源为其他资金自筹,招标 人为陕西省石油化工工业贸易有限公司。本项目已具备招标条件,现招标方式为公开招标。 二、项目概况和招标范围
        规模:项目概况:陕西省内公路沿线8座充电站的品牌形象标准化装修及64座充电站 的标识广告牌制作、安装项目,具体内容详见清单。招标范围:本项目共划分为二个标段, 其中一标段为宝鸡服务区1座充电站、洽川服务区1座充电站、天汉水城服务区2座充电站 共计4座充电站的品牌形象标准化装修,陕北区域28座充电站的标识广告牌制作、安装项 目;二标段为泾阳服务区2座充电站、高陵服务区2座充电站共计4座充电站的品牌形象 标准化装修,陕南关中区域36座充电站的标识广告牌制作、安装项目。
        范围:本招标项目划分为2个标段,本次招标为其中的:
        (001)陕西省内公路沿线新建8座充电站的品牌形象标准化装修及64座充电站的标识广 告牌制作、安装项目(一标段):(002)陕西省内公路沿线新建8座充电站的品牌形象标准 化装修及64座充电站的标识广告牌制作、安装项目(二标段); 三、投标人资格要求
        (001陕西省内公路沿线新建8座充电站的品牌形象标准化装修及64座充电站的标识广 告牌制作、安装项目(一标段))的投标人资格能力要求:3.1有合法有效的法定代表人授 权书及被授权人身份证(法定代表人参与仅需提供法人身份证明及身份证);3.2投标人须 是在中国境内依法注册成立并有效存续独立法人或其他组织,提供具有统一社会信用代码的 营业执照(或事业法人登记证书);3.3投标人须具备合法有效的安全生产许可证;
        3.4投标人须具备行政主管部门核发的建筑装修装饰工程专业承包二级及以上资质;3.5投 标人拟派项目经理必须为本企业注册的建筑工程专业二级(含二级)及以上注册建造师执业 资格,同时具备有效的安全生产考核合格证书(B证),且没有担任任何在建工程项目的项
        目经理;3.6企业基本信息及项目经理(注册建造师)执业基本信息应在“陕西省住房和城 乡建设厅(http://js.shaanxi.gov.cn/)陕西省建筑市场监管与诚信信息发布平台”可查 询3.7投标人不得列入信用中国(http://www.creditchina.gov.cn/)失信惩戒、不得列 入国家企业信用信息公示系统(http:/www.gsxt.gov.cn/index. html)严重违法失信企业 名单(黑名单)、不得列入中国执行信息公开(http://zxgk.court.gov.cn/)失信被执行人 名单(被执行人包括投标人、法定代表人)(提供以上三个网站四项内容查询结果截图)38 本项目不接受被列入延长石油集团失信交易商名单且在限制期限内的投标人投标;3.9本项 目不接受联合体投标,投标单位负责人为同一人或者存在控股、管理关系的不同单位,不得 同时参加本项目的投标。;
        (002陕西省内公路沿线新建8座充电站的品牌形象标准化装修及64座充电站的标识广 告牌制作、安装项目(二标段))的投标人资格能力要求:3.1有合法有效的法定代表人授 权书及被授权人身份证(法定代表人参与仅需提供法人身份证明及身份证);3.2投标人须 是在中国境内依法注册成立并有效存续独立法人或其他组织,提供具有统一社会信用代码的 营业执照(或事业法人登记证书);3.3投标人须具备合法有效的安全生产许可证;
        3.4投标人须具备行政主管部门核发的建筑装修装饰工程专业承包二级及以上资质;3.5投 标人拟派项目经理必须为本企业注册的建筑工程专业二级(含二级)及以上注册建造师执业 资格,同时具备有效的安全生产考核合格证书(B证),且没有担任任何在建工程项目的项 目经理;3.6企业基本信息及项目经理(注册建造师)执业基本信息应在“陕西省住房和城 乡建设厅(http://js.shaanxi.gov.cn/)陕西省建筑市场监管与诚信信息发布平台”可查 询;3.7投标人不得列入信用中国(http://www.creditchina.gov.cn/)失信惩戒、不得列 入国家企业信用信息公示系统(http:/www.gsxt.gov.cn/index. html)严重违法失信企业 名单(黑名单)、不得列入中国执行信息公开(http://zxgk.court.gov.cn/)失信被执行人 名单(被执行人包括投标人、法定代表人)(提供以上三个网站四项内容查询结果截图)38 本项目不接受被列入延长石油集团失信交易商名单且在限制期限内的投标人投标;3.9本项 目不接受联合体投标,投标单位负责人为同一人或者存在控股、管理关系的不同单位,不得 同时参加本项目的投标。;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年12月07日09时00分到2022年12月12日17时00分
        招标文件每套售价500元/标段,现金缴纳,售后不退。
        五、投标文件的递交
        递交截止时间:2022年12月30日09时30分
        六、开标时间
        开标时间:2022年12月30日09时30分
        联系人:王工
        电 话:15711420489
        邮 箱:hyzc36@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/139.html b/news/139.html new file mode 100644 index 0000000..a5c0a99 --- /dev/null +++ b/news/139.html @@ -0,0 +1,362 @@ + + + + +2022年市场持续低迷,2023年广告标识市场还有哪些机会?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年市场持续低迷,2023年广告标识市场还有哪些机会?

        +
        +
        +
        +  2022-12-08 阅读:166 +
        +
        +

        近三年来,受地缘冲突、疫情反复等复杂因素的影响,全球经济持续下行。对广告标识领域的冲击也显而易见,市场需求收缩、项目减少、销量下滑、产品涨价,整体延续低迷态势。特别是在地产、商业板块,标识市场形势较为严峻,但与此同时,也有品牌标识企业已积极展开“自救”,开拓新的业务和渠道,在部分市场领域实现双增。那么,通过对业内企业的沟通交流,锋标编辑整理这些标识增量市场都分布在哪些领域?希望通过企业成功案例为更多的决策者提供参考:

        首先:把握——“乡村振兴”机会

        从 2021 年底到今年年初,政府层面不断出台“乡村振兴”扶持政策,这就是趋势。乡村振兴之所以是趋势,不仅仅只有政策支持,同时市场规模和潜力巨大:中国城市的发展已经比较完善了,而大量的乡村价值并没有被利用起来,比如说乡村的生态环境、人居环境、物资保障等。所以,乡村的市场广阔。而且,目前覆盖全国的振兴乡村扶持项目正在源源不断地开发出来,并配套了上百项惠农项目和奖补资金,政府更是在近几年不断地出台相应的政策文件鼓励地方扩大农业农村领域专项债券投资规模,这也是广大乡村发展的大好机会那么,乡村振兴中哪些项目更有“钱”途,其实看政府扶持哪些项目就可以了。小编总结了一些政府重点扶持的乡村振兴项目类型,大家可以看一下:

        01乡村品牌打造

        指导意见着重提及了农业品牌打造,在近日,农业农村部提出《关于拓展农业多种功能,促进乡村产业高质量发展的指导意见》(简称“指导意见”)中指出,经营品牌化在乡村振兴项目中是长期趋势,那么在政府的指导文件下,势必将由原先散兵作战的乡村发展变成农村品牌建设的统一作战。现在就有很多的广告人为乡村打造了以智慧村牌 +智慧宣传栏 + 智慧展厅的乡村品牌输出。在指导意见中也提到要结合传统媒体和新媒体,多角度解读产业政策,推广典型模式,广告人带来的这些智慧乡村方案,全方位宣传乡村当地的风貌,村委领导班子,乡村振兴相关工作进展,打开了解村庄的窗口,促进村庄的招商引资,让乡镇品牌出村进城,打造智慧乡村典型。如今,广告标识人在新媒体上积累了大量的自媒体经验,同时在智慧乡村、智慧村牌、智慧美丽乡村宣传栏、智慧农耕展厅、农产品赋能上更是有着专业的实操经验。

        02“数字 + 智慧广告物料”

        过去的农产品包装只在外观好看和便于携带这两方面下功夫,而智慧型包装物则把包装裂变渠道,让包装物开口说话,让包装物变成移动的专卖店和业务员,正所谓包装即营销。这些“数字 + 智慧广告物料”取得的新成效、新经验,为各地乡村振兴提供了典型经验和创新做法。广告标识人在乡村振兴领域当中可以提供非常完善的理论以及完善的技术解决方案。作为广告标识人要时刻关注理解政策,因为所有的这些最终都会通过广告来落地。

        第二:“双碳经济”下广告标识的增量市场

        从“十四五”规划实施以来,“双碳”概念已经几乎席卷所有产业,成为各行各业的发展准则。2022 年,在城镇化下半场,城市更新也成为城市规划建设管理的主要工作。新时期有新要求,在“双碳”目标下,城市更新行动要注重绿色低碳的高质量发展,要坚持绿色引领,实现城市更新的技术体系新突破。而这一切,作为城市更新中重要的一环——标识产业来说,更应将“双碳”发展的理念融入创变的各个阶段,积极寻求绿色低碳时代下的新机遇。

        广告标识企业从首先可以从标识规划设计阶段开始注入低碳理念、第二通过原材料升级实现广告灯箱、标识招牌的增效节能,如光伏彩色标识标牌的研发和应用,通过对次级光伏模组的综合利用,制成符合户外图文展示功能的光电材料,实现图文内容展示兼具光伏发电、自发自用微电网功能,实现白天发电储能,夜晚量化展示的目标。广告标识 LED 光源产品的不断升级实现广告灯箱、标识招牌的增效节能等,通过实现“双碳效益”,让广告标识企业在未来的项目投标中获得更多的优势和话语权。

        第三:智能化升级

        “十四五”以来,数字化转型成为广告标识行业升级的重要趋势之一。在当前,智能化的发展在标识领域仍属高速发展时期,业界品牌 LED 光源、电源企业,智能标识系统软件等,业界品牌纷纷拥抱智能化。同时越来越多的标识产业链生产企业,通过升级智能化的生产、加工设备,有效的降低生产加工成本,在市场的价格竞争中,不仅仅赢得市场先机,同时在保证产品的质量、利润上获得双增效果。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/14.html b/news/14.html new file mode 100644 index 0000000..f4f406a --- /dev/null +++ b/news/14.html @@ -0,0 +1,362 @@ + + + + +一季度LCD爆发促智能投影市场涨22%,上半年逼近300万台_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        一季度LCD爆发促智能投影市场涨22%,上半年逼近300万台

        +
        +
        +
        +  2022-04-30 阅读:13 +
        +
        +

        根据洛图科技(RUNTO)最新的《中国智能投影零售市场月度追踪(China Smart Projector Retail Market Monthly Tracker)》报告,2022年一季度, 中国智能投影市场(不含激光电视)销量为132.3万台,同比增长22.1%;销额为26.4亿元,同比增长12.3% 。

        2021-2022年 中国智能投影市场分季度销量

          数据来源:洛图科技(RUNTO),单位:万台

          供需两端推高整体市场规模

          尽管国内疫情反复且多点散发,各地管控升级,导致工业生产、物流运输严重受阻,但智能投影仍然成为了消费电子中最耀眼的细分品类。洛图科技(RUNTO)认为,供需两端的变化正在推高整体市场规模:

          在需求端 ,消费者对家庭影音娱乐的需求呈现大屏化和追求极致体验的趋势,高性价比和便携的智能投影产品更受到青睐;疫情期间居家时间变长,智能投影让消费者在家即可获得教育、游戏、办公、健身的大屏体验,满足多元化需求的同时,也进一步加深了消费者对智能投影的认知。

          在供给端 ,新品牌进入潮仍在持续,包括三星、夏普等国际品牌、哈趣、酷开、猫王等新兴品牌,为市场带来信心和活力;投影技术、光源技术、镜头技术、人工智能、自动校正等方面不断进步,推动着产品创新升级;拼多多、抖音等线上新业态涌现的同时,线下门店也在加快建设,购物场景不断丰富。

          DLP和LCD份额发生翻转

          DLP技术凭借高对比度、高防尘性、高反应速度、低成本、小体积等优势,是智能投影的主流显示方式。根据洛图科技(RUNTO)线上数据显示,2020年之前,DLP技术一直占据着市场65%以上的份额。由于突发的新冠肺炎疫情和紧张的国际贸易关系,全球范围、全行业都出现了芯片短缺问题,智能投影行业也未能幸免,DLP技术份额不断下降,这一现象持续到2022年一季度,份额降至38% 。

          得益于DLP芯片的短缺,LCD技术获得了更多的发展空间,尤其是技术门槛较低的1LCD,不断有新的品牌进入,带动份额快速提升。根据洛图科技(RUNTO)线上数据,2022年一季度,LCD技术在智能投影线上零售市场份额达到62%,较去年同期增长18.6个百分点 ,销量同比大涨62.5%。

        中国智能投影市场分技术销量结构

          数据来源:洛图科技(RUNTO)线上数据,单位:%

          极米和微影分别占DLP/LCD市场首位

          整体市场集中度较低,且仍在下降。根据洛图科技(RUNTO)线上数据显示,2022年一季度,TOP4品牌为极米、微影、坚果、当贝,合计份额为38.8%,较去年同期下降8.5个百分点。

          DLP市场资源不断向头部品牌聚集,已发展为极高寡占型市场,第一季度CR4品牌为极米、坚果、当贝、小米,合计份额达到82.5% ,较去年同期增长11.4个百分点。

          极米保持行业龙头地位,以五成的份额遥遥领先于其它品牌,2022年其自研光机实现了中高端产品的全面导入,提升毛利率的同时减少外部依赖。坚果再度获得10亿元融资,产品上发布了与OPPO联名的P3S和莱卡调色的J10S,渠道上开设了首家线下坚果投影旗舰店,维持第二。当贝位列第三名,凭借高亮度、高端化产品、自研的定制化系统、应用端积累的用户等优势,销量同比增长近30%,销额排名上升至第二。小米逐渐从缺货的影响中恢复过来,尽管销量同比仍有所下滑,但排名回升至第四位。

          LCD品牌集中度明显低于DLP市场,第一季度CR4品牌为微影、轰天炮、瑞视达、嘉赫,合计份额仅为40.9% 。尽管LCD市场仍处于品牌混战的阶段,但也出现了一些可喜的变化:以小明、知麻、哈趣、康佳、联想等为代表的具有实力背景的新兴品牌和主流品牌增多,它们在技术研发和产品设计等方面投入更多,在渠道建设和售后服务等方面也更有保障。

          微影连续五个季度位居第一,但激烈的竞争下市场份额有所萎缩,一季度为15%,较去年同期下降5.6个百分点。与去年一季度相比,喜瑞、锐塔克、小明、知麻均为新晋品牌,喜瑞和锐塔克凭借1-2款高性价比产品抢占市场份额,小明和知麻则瞄准新一代年轻消费群体,迅速破圈。

        2022年一季度智能投影市场分技术别品牌份额

          数据来源:洛图科技(RUNTO)线上数据

          产品朝高亮、高清方向发展

          根据洛图科技(RUNTO)线上数据显示,2022年第一季度,中国智能投影市场上仍然以500流明以下亮度为主,份额达到66.9%,与去年同期增长1.2个百分点。亮度升级趋势明显,一方面,重点品牌如坚果、当贝、大眼橙均推出了亮度为2K流明以上的旗舰LED新品;另一方面,峰米、当贝主导的中长焦激光产品不断上量,推动2K流明以上份额接近一成,较去年同期增长4.1个百分点 。

        中国智能投影市场亮度销量结构

          数据来源:洛图科技(RUNTO)线上数据

          根据洛图科技(RUNTO)线上数据显示,2022年第一季度,智能投影市场中FHD为主销分辨率,随着LCD品牌FHD新品的增多,销量占比达到41.5% ,较去年同期增长2.0个百分点。UHD仍在缓慢推进中,市场份额仅为0.6%,较去年同期微增0.3个百分点。

        中国智能投影市场分辨率销量结构

          数据来源:洛图科技(RUNTO)线上数据

          预计2022年上半年销量近300万台

          宏观环境方面,多地发放绿色节能消费券,适用包括投影机在内的多类商品;品牌方面,仍会有新的品牌进入,带来增量的同时,市场竞争也更激烈;产品方面,优质产品供给不断丰富,亮度和分辨率持续升级,超短焦LED和中长焦激光投影占比扩大;应用场景方面,垂直/细分领域的投影产品正成为新的趋势,包括户外便携投影、游戏投影、教育投影、商务投影等;营销方面,品牌日、品牌直播、618年中大促等活动来袭,这些都将刺激消费者需求。

          但是,国内疫情仍在持续,国际形势依旧紧张,经济活力和居民消费意愿具备不确定性;液晶电视面板价格全尺寸下降,终端产品售价进入下行通道;DLP芯片缺货仍未出现明确的缓解,将对市场产生消极的影响。

          综上,洛图科技(RUNTO)预测,2022年上半年,中国智能投影市场销量逼近300万台,同比增长约30% 。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/140.html b/news/140.html new file mode 100644 index 0000000..8ce2b14 --- /dev/null +++ b/news/140.html @@ -0,0 +1,362 @@ + + + + +成都永安镇付家坝综合体打造定制标识标牌采购项目(二次)竞争性谈判采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都永安镇付家坝综合体打造定制标识标牌采购项目(二次)竞争性谈判采购公告

        +
        +
        +
        +  2022-12-26 阅读:8 +
        +
        +

        项目概况

        成都市双流区永安镇付家坝综合体打造定制标识标牌采购项目(二次)的潜在供应商应在四川省政府采购一体化平台项目电子化交易系统(以下简称“项目电子化交易系统”)获取采购文件,并于 2022年12月30日 10时30分 (北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:N5101162022000497

        项目名称:成都市双流区永安镇付家坝综合体打造定制标识标牌采购项目(二次)

        采购方式:竞争性谈判

        预算金额:485,071.97元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:签订合同后10日内完成并交付使用

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目专门面向中小企业采购。


        3.本项目的特定资格要求:

        采购包1:无


        三、获取采购文件

        时间:2022年12月27日至2022年12月29日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2022年12月30日 10时30分00秒(北京时间)

        地点:成都市双流区东升街道龙桥路6号宗申.赛纳维132栋7楼

        五、开启

        时间:2022年12月30日 10时30分00秒(北京时间)

        地点:成都市双流区东升街道龙桥路6号宗申.赛纳维132栋7楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本项目采购过程中需要使用四川省政府采购一体化平台,登录方式及地址:通过四川政府采购网(www.ccgp-sichuan.gov.cn)首页供应商用户登录,供应商应当按照以下要求进行系统操作。

        (一)供应商应当自行在四川政府采购网-办事指南查看相应的系统操作指南,并严格按照操作指南要求进行系统操作。在登录、使用采购一体化平台前,应当按照要求完成供应商注册和信息完善,加入采购一体化平台供应商库。

        (二)供应商应当使用纳入全国公共资源交易平台(四川省)数字证书互认范围的数字证书及签章(以下简称“互认的证书及签章”)进行系统操作。供应商使用互认的证书及签章登录采购一体化平台进行的一切操作和资料传递,以及加盖电子签章确认采购过程中制作、交换的电子数据,均属于供应商真实意思表示,由供应商对其系统操作行为和电子签章确认的事项承担法律责任。

        已办理互认的证书及签章的供应商,校验互认的证书及签章有效性后,即可按照系统操作要求进行身份信息绑定、权限设置和系统操作;未办理互认的证书及签章的供应商,按要求办理互认的证书及签章并校验有效性后,按照系统操作要求进行身份信息绑定、权限设置和系统操作。互认的证书及签章的办理与校验,可查看四川政府采购网-办事指南。

        供应商应当加强互认的证书及签章日常校验和妥善保管,确保在参加采购活动期间互认的证书及签章能够正常使用;供应商应当严格互认的证书及签章的内部授权管理,防止非授权操作。

        (三)供应商应当自行准备电子化采购所需的计算机终端、软硬件及网络环境,承担因准备不足产生的不利后果。

        (四)采购一体化平台技术支持:

        在线客服:通过四川政府采购网-在线客服进行咨询

        400服务电话:4001600900

        CA及签章服务:通过四川政府采购网-办事指南进行查询

        1.计划备案编号:51011622210200003178[2022]01092 。2.预算金额:48.507197万元;最高限价:48.507197万元。3.监督部门:成都市双流区财政局,联系电话:028-85804726。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:成都市双流区永安镇人民政府

        地址:成都市双流区永安镇学士街87号

        联系方式:13679009126

        2.采购代理机构信息

        名称:四川军贤工程项目管理有限公司

        地址:四川省成都市双流区成都市双流区东升街道龙桥路6号132栋7楼

        联系方式:028-86958918

        3.项目联系方式

        项目联系人:四川军贤工程项目管理有限公司

        电话:028-86958918

        四川军贤工程项目管理有限公司

        2022年12月26日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/141.html b/news/141.html new file mode 100644 index 0000000..d5a3cdf --- /dev/null +++ b/news/141.html @@ -0,0 +1,362 @@ + + + + +成都市龙泉驿区第一人民医院标识标牌制作服务采购项目公开招标废标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都市龙泉驿区第一人民医院标识标牌制作服务采购项目公开招标废标公告

        +
        +
        +
        +  2022-12-26 阅读:5 +
        +
        +

        一、项目基本情况

        采购项目编号:N5101122022000409

        采购项目名称:标识标牌制作服务采购项目

        二、项目终止的原因

        终止合同包:合同包1

        终止原因:现场递交文件的投标人不足三家,本项目废标

        三、其他补充事宜

        1、备案编号:51011222210200003325[2022]01162;

        2、本项目采购预算:100万元/年。

        3、监督部门:龙泉驿区财政局,联系电话:028-84636986;

        4、本项目需要落实的政府采购政策:促进中小企业发展、促进监狱企业发展、促进残疾人福利性单位发展、扶持不发达地区和少数民族地区。

        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名称:成都市龙泉驿区第一人民医院

        地址:四川省成都市龙泉驿区驿河3组201号(玉杨路与董郎路交叉口)

        联系方式:028-68238383

        2.采购代理机构信息

        名称:四川国际招标有限责任公司

        地址:中国(四川)自由贸易试验区成都市高新区天府四街66号2栋22层1号

        联系方式: 028-87797776转650

        3.项目联系方式

        项目联系人:吕女士

        电话: 028-87797776转650

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/142.html b/news/142.html new file mode 100644 index 0000000..e66deed --- /dev/null +++ b/news/142.html @@ -0,0 +1,362 @@ + + + + +云南云岭高速传媒有限公司广告牌喷绘及安装招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        云南云岭高速传媒有限公司广告牌喷绘及安装招标公告

        +
        +
        +
        +  2022-12-26 阅读:16 +
        +
        +

        一、招标条件
        本云南云岭高速传媒有限公司广告牌喷绘及安装项目己由项目审批/核准/备案机关批准,项目资金来源为其他资金/,招标人为云南云岭高速传媒有限公司。本项目己具备招标条件,现招标方式为其他方式。
        二、项目概况和招标范围
        规模:
        2.1、 项目名称:云南云岭高速传媒有限公司广告牌喷绘及安装项目(采购编号: AF-ZB2022090)
        2.2、服务内容:根据云南云岭高速传媒有限公司户外媒体广告画面制作安装业务实际需求情况完成广告媒体画面的制作、安装及拆除服务
        2.3、服务范围:承接云南云岭高速传媒有限公司单项合同金额不超过国家规定必须招标限额的广告牌喷绘及安装的项目
        2.4、服务地点:采购人指定地点
        2.5、服务周期:自合同签订之日起一年,如果出现国家政策变化或公司体制、结构、经营等状况发生变化时,采购人有权取消合作,或有权合理延长有效期,但延长期限不超过一年
        2.6、 质量标准:符合国家、地方及行业现行相关
        标准、规范,完全响应竞争性磋商文件的要求
        2.7、本项目选择一家单位进行广告牌喷绘及安装
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)云南云岭高速传媒有限公司广告牌喷绘及安装项目;
        三、投标人资格要求
        (001云南云岭高速传媒有限公司广告牌喷绘及安装项目)的投标人资格能力要求:
        3.磋商申请人资格要求
        3.1、 磋商申请人须在中华人民共和国境内注册,具有独立订立合同法人资格,具有独立承担民事责任、独立承担招标项目和独立订立、履行合同的能力,持有有效的多证合一工商营业执照,在人员、设备、资金等方面具备相应的服务能力;
        3.2、 提供近三年(2019年至2021年)经第三方审计的财务报表及审计报告复印件或公司财务报表复印件;若成立时间不足三年的,提供成立至今经审计的财务会计报表或公司财务报表复印件;财务状况良好;
        3.3、 信誉要求:磋商申请人近三年(2019年12月至今)没有处于被责令停业,磋商资格被取消,财产被接管、冻结、破产状态、责令停业阶段没有受到取消投标资格的行政处罚;
        未被列入失信被执行人、税收违法黑名单及失信惩戒(以信用中国的查询结果为准);无行政处罚,未被列入经营异常名录(已移出的除外)及严重违法失信企业名单(黑名单)信息(以“国家企业信用信息公示系统的查询结果为准,有采购人或采购代理机构在开标前查询);不存在其他失信、不良行为记录;
        3.4、磋商申请人及法定代表人近三年(2019年12月至今)无行贿犯罪记录(以中国裁判文书网的查询结果为准,采购人或采购代理机构在开标前查询);
        3.5、 项目组人员最低要求:①项目负责人1人,项目负责人需具备特种作业人员资格证或登高作业人员资格证;②项目组成员的组成(含项目负责人)不得少于7人;项目组成员的组中具备特种作业人员资格证或登高作业人员资格证的不少于4人。
        3.7、 磋商申请人须为一般纳税人,提供一般纳税人证明材料。
        3.6其他要求申请人应按照《中华人民共和国广告法》及相关管理规定,严格审核广告牌喷绘内容,若因喷绘内容触犯相关法律法规所产生法律纠纷的,申请人将依法承担法律责任。
        3.7本次磋商不接受联合体。
        本项目不允许联合体投标。
        四、招标文件的获取
        磋商申请人请于2022年12月21日至2022年12月27日.上午09:00时至12:00时,下午14:00时至17:00时,持法人身份证明书(原件)、法人授权委托书及法人或授权人身份证(原件)、营业执照(原件及加盖公章的复印件)获取竞争性磋商文件
        五、投标文件的递交截止时间: 2023年01 月03日14时30分
        联系人:刘 工
        手 机:157 0114 2008
        E_mail:ztgx2006@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/143.html b/news/143.html new file mode 100644 index 0000000..3a04ce9 --- /dev/null +++ b/news/143.html @@ -0,0 +1,362 @@ + + + + +北大荒集团召开品牌标识综合评估及优化推进工作会议_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        北大荒集团召开品牌标识综合评估及优化推进工作会议

        +
        +
        +
        +  2023-01-04 阅读:4 +
        +
        +

        为贯彻落实省委领导对北大荒集团品牌标识(Logo)的相关指示精神,1月4日上午,北大荒集团召开品牌标识综合评估及优化推进工作会议。北大荒农垦集团党委委员、副总经理唐浩出席会议并讲话。

        按照集团主要领导工作部署,集团委托中国农业大学国家农业市场研究中心韩一军教授团队对集团及骨干企业现有品牌标识进行综合评估,并详细介绍了品牌标识的调整方案,充分征求集团各相关部门和直属企业意见。

        会议指出,品牌是企业重要的无形资产,而品牌标识则是品牌资产的重要组成部分。随着“北大荒”及其子品牌价值的不断提升,品牌在整体营销工作中的重要地位也日益凸显。要着重研究在品牌建设规律中做好品牌标识的优化和微雕,使品牌标识能够突出企业的独特优势和战略定位,阐述企业的文化和内涵,表达企业的精神和特点,体现企业的担当和情怀。

        会议强调,品牌不是一成不变的,随时代趋势、市场、消费者变化而变化,品牌标识就是品牌优化的深层次内在。要以此次品牌标识评估和优化工作为契机,全面提升产品的市场认可度、渠道铺货率和品牌影响力,做好适应顾客需求观念的优化升级,切实将品牌力转化为产品力,将产品力转为为市场力。集团各部门、各企业务必形成合力,掌握优化原则,从品牌理念、价值观、产品定位、渠道、消费者等方面入手,力争得到市场认可,实现品牌标识的优化升级,全力保障此项工作顺利开展。

        集团相关单位及企业主要负责人就品牌标识的认知、标识优化升级分别发言。

        会议以视频形式召开,驻集团纪检监察组,集团相关部门及相关企业主要负责同志,中国农业大学国家农业市场研究中心韩一军教授团队参加会议。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/144.html b/news/144.html new file mode 100644 index 0000000..b7014ef --- /dev/null +++ b/news/144.html @@ -0,0 +1,362 @@ + + + + +资中县人民医院综合大楼标识导视系统项目采购更正公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        资中县人民医院综合大楼标识导视系统项目采购更正公告

        +
        +
        +
        +  2023-01-04 阅读:13 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:N5110252022000161

        原公告的采购项目名称:综合大楼标识导视系统项目

        首次公告日期:2022年12月28日

        二、更正信息:

        更正事项:采购文件

        更正内容:

        原公告的响应文件提交截止时间:2023-01-09 09:30:00,更正为:2023-01-10 09:30:00。

        原公告的开启时间:2023-01-09 09:30:00,更正为:2023-01-10 09:30:00。

        更正后的“分项报价明细表”和“最终/(第次)分项报价明细表”详见重新上传的采购文件

        其他内容不变

        更正日期:2023年01月04日


        三、其他补充事项

        1.本项目采购项目名称为:资中县人民医院综合大楼标识导视系统项目。

        2.监督管理部门信息:

        单位名称:资中县财政局;

        联系电话:0832-5602505或0832-5727889;

        联系地址:资中县水南镇水南上街91号;

        邮编:641200。

        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名称:资中县人民医院

        地址:资中县重龙镇迎宾路92号

        联系方式:0832-5518858

        2.采购代理机构信息

        名称:四川正久工程管理有限责任公司

        地址:四川省内江市东兴区大千路金科王府B3无单元3层3-3号

        联系方式:0832-5155122

        3.项目联系方式

        项目联系人:陈女士

        电话:0832-5155122

        四川正久工程管理有限责任公司

        2023年01月04日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/145.html b/news/145.html new file mode 100644 index 0000000..d0aeccd --- /dev/null +++ b/news/145.html @@ -0,0 +1,362 @@ + + + + +西安秦华燃气集团有限公司不锈钢地面标识牌采购招标_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        西安秦华燃气集团有限公司不锈钢地面标识牌采购招标

        +
        +
        +
        +  2023-01-04 阅读:14 +
        +
        +

        一、招标条件
        本西安秦华燃气集团有限公司不锈钢地面标识牌采购已由项目审批/核准/备案机关批 准,项目资金来源为自筹资金,
        招标人为西安秦华燃气集团有限公司。本项目己具备招标 条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:该型材料主要用于标识天然气管道走向、拐点、末端及安装三通等地点,
        常用规 格(100×25*1.2直径×高度*壁厚),材质S201不锈钢。
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)西安秦华燃气集团有限公司不锈钢地面标识牌采购:
        三、投标人资格要求
        (001西安秦华燃气集团有限公司不钠钢地需标识牌采购)的投标人资格能力要求:
        1.投标人须为具有有效的营业执照且为独立法人资格制造商;
        2.投标人须提供国家相关检测机构出具所采购S201型不锈钢板生产厂家的检验报告(或材质证书):
        3.投标人须提供投标产品2019年1月1日至今类似行业业绩(以合同为准);
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年01月04日09时00分到2023年01月10日17时00分
        招标文件每本售价500元/本,售后不退。
        五、投标文件的递交
        递交截止时间:2023年02月01日09时00分
        六、开标时间
        开标时间:2023年02月01日09时00分
        联系人: 肖 工
        联系人电话:188 0122 8227
        联系人邮箱:wgh188@126,com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/146.html b/news/146.html new file mode 100644 index 0000000..fe424ac --- /dev/null +++ b/news/146.html @@ -0,0 +1,362 @@ + + + + +2023年牧城公园标牌标识制作采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023年牧城公园标牌标识制作采购项目招标公告

        +
        +
        +
        +  2023-01-04 阅读:11 +
        +
        +

        一、招标条件
        本2023年牧城公园标牌标识制作采购项目已由项目审批/核准/备案机关批准,项目资 金来源为其他资金/,招标人为靖江市牧城景区管理中心。本项目已具备招标条件,现招标 方式为公开招标。
        二、项目概况和招标范围
        规模:小型
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)2023年牧城公园标牌标识制作采购项目;
        三、投标人资格要求
        (0012023年牧城公园标牌标识制作采购项目)的投标人资格能力要求:(1)法人或者 其他组织的营业执照等证明文件(提供供应商有效的营业执照副本复印件加盖公章);
        (2)具备履行合同所必需的设备和专业技术能力的证明材料;
        (3)参加政府采购活动前3年内在经营活动中没有重大违法记录的书面声明:
        (4)供应商未被列入“信用中国”网站(www.creditchina. gov.cn)失信被执行人名单、重 大税收违法失信主体;未被列入中国政府采购网(www.ccgp.gov.cn)政府采购严重违法失信 行为记录名单。查询结果存在供应商应被拒绝参与政府采购活动相关信息的,其资格审查不 合格;
        (5)具备法律、行政法规规定的其他条件的证明材料。
        (6)本项目不接受任何形式的联合体投标。
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年01月04日09时00分到2023年01月06日17时00分
        五、投标文件的递交
        递交截止时间:2023年01月12日15时00分
        六、开标时间
        开标时间:2023年01月12日15时00分
        联系人:万工
        电 话:18600773263
        邮 箱:wanming36@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/147.html b/news/147.html new file mode 100644 index 0000000..5c2b864 --- /dev/null +++ b/news/147.html @@ -0,0 +1,362 @@ + + + + +四川大学华西口腔医院标识标牌服务项目竞争性磋商废标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        四川大学华西口腔医院标识标牌服务项目竞争性磋商废标公告

        +
        +
        +
        +  2023-01-04 阅读:6 +
        +
        +

        一、项目基本情况

        采购项目编号:SCIT-FC(Z)-2022110046

        采购项目名称:四川大学华西口腔医院标识标牌服务项目

        二、项目废标/流标的原因

        递交响应文件的供应商不足三家,该项目采购失败。

        三、其他补充事宜

        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名 称:四川大学华西口腔医院     

        地址:四川省成都市市辖区人民南路三段14号        

        联系方式:高老师、王老师、苏老师 028-85501430      

        2.采购代理机构信息

        名 称:四川国际招标有限责任公司            

        地 址:中国(四川)自由贸易试验区成都市高新区天府四街66号2栋22层1号            

        联系方式:陈雨霏 028-87797107、028-87797776            

        3.项目联系方式

        项目联系人:敬女士

        电 话:  13219086239

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/148.html b/news/148.html new file mode 100644 index 0000000..03b1d78 --- /dev/null +++ b/news/148.html @@ -0,0 +1,362 @@ + + + + +商洛市妇幼保健院(新院区)维修提升项目室外标识标牌工程竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        商洛市妇幼保健院(新院区)维修提升项目室外标识标牌工程竞争性磋商公告

        +
        +
        +
        +  2023-01-04 阅读:5 +
        +
        +

        一、项目基本情况

        项目编号:SXHR-SL-CGZB-2023001

        项目名称:(新院区)维修提升项目室外标识标牌工程

        采购方式:竞争性磋商

        预算金额:325,891.01元

        采购需求:

        合同包1((新院区)维修提升项目室外标识标牌工程):

        合同包预算金额:325,891.01元

        合同包最高限价:325,891.01元

        本合同包不接受联合体投标

        合同履行期限:无

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        合同包1((新院区)维修提升项目室外标识标牌工程)落实政府采购政策需满足的资格要求如下:

        (1)《政府采购促进中小企业发展管理办法》的通知--财库[2020]46号?(2)财政部司法部关于政府采购支持监狱企业发展有关问题的通知--财库〔2014〕68号?(3)《国务院办公厅关于建立政府强制采购节能产品制度的通知》--国办发〔2007〕51号?(4)《财政部发展改革委生态环境部市场监督总局关于调整优化节能产品、环境标志产品政府采购执行机制的通知》--(财库[2019]9号)?(5)《关于印发环境标志产品政府采购品目清单的通知》--(财库〔2019〕18号)?(6)《关于印发节能产品政府采购品目清单的通知》--(财库〔2019〕19号)(7)《市场监督总局关于发布参与实施政府采购节能产品、环境标志产品认证机构名录的公告》—2019年第16号?(8)《财政部民政部中国残疾人联合会关于促进残疾人就业政府采购政策的通知》--(财库〔2017〕141号)(9)《关于运用政府采购政策支持乡村产业振兴的通知》(财库〔2021〕19号)(10)陕西省财政厅关于印发《陕西省中小企业政府采购信用融资办法》(陕财办采〔2018〕23号)?(11)《陕西省财政厅关于加快推进我省中小企业政府采购信用融资工作的通知》(陕财办采〔2020〕15号)(12)《关于进一步加强政府绿色采购有关问题的通知》(陕财办采〔2021〕29号)(13)财库[2022]19号?财政部关于进一步加大政府采购支持中小企业力度的通知(14)其他需要落实的政府采购政策。


        3.本项目的特定资格要求:

        合同包1((新院区)维修提升项目室外标识标牌工程)特定资格要求如下:

        1)具有独立承担民事责任能力的法人、其他组织或自然人,并出具合法有效的营业执照或事业单位法人证书等国家规定的相关证明,自然人参与的提供其身份证明;
        2)法定代表人或负责人授权书(附法定代表人或负责人身份证复印件)及被授权人身份证;(法定代表人或负责人直接参加投标只须提供法定代表人或负责人身份证);
        3)提供2021年度的财务审计报告(至少包括资产负债表和利润表,成立时间至提交投标文件截止时间不足一年的可提供成立后任意时段的资产负债表),或其基本存款账户开户银行出具的资信证明及基本存款账户开户许可证;
        4)提供投标截止日前近一年内任意一个月的纳税证明或完税证明(任意税种),依法免税的单位应提供相关证明材料;
        5)提供投标截止日前近一年内任意一个月的社会保障资金缴存单据或社保机构开具的社会保险参保缴费情况证明,依法不需要缴纳社会保障资金的单位应提供相关证明材料;
        6)提供具有履行合同所必需的设备和专业技术能力的承诺函;
        7)投标保证金缴纳凭证或担保机构出具的保函;
        8)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得参加同一合同项下的政府采购活动;
        9)参加本次政府采购活动前三年内在经营活动中没有重大违纪的书面声明;
        10)不得为“信用中国”网站(http://www.creditchina.gov.cn)列入“失信被执行人或重大税收违法案件当事人名单或政府采购严重违法失信行为记录名单”的供应商;
        11)供应商书面声明:供应商未为本项目提供整体设计、规范编制或者项目管理、监?理、检测等服务的书面声明;
        12)供应商须在陕西省政府采购(http://www.ccgp-shaanxi.gov.cn/)注册登记加入陕西省政府采购供应商库;
        13)本项目不接受联合体投标。
        14)本项目专门面向中小企业采购,供应商应为中型企业或小型、微型企业或监狱企业或残疾人福利性单位,投标时提供:《中小企业声明函》(格式见竞争性磋商文件)。


        三、获取招标文件

        时间: 2023年01月04日 至 2023年01月11日 ,每天上午 08:00:00 至 12:00:00 ,下午 14:00:00 至 17:00:00 (北京时间)

        途径:陕西省商洛市商丹园区高新管委会A202

        方式:现场获取

        售价: 500元

        四、提交投标文件截止时间、开标时间和地点

        时间: 2023年01月16日 15时30分00秒 (北京时间)

        提交投标文件地点:陕西省商洛市商丹园区高新管委会A202

        开标地点:陕西省商洛市商丹园区高新管委会A202

        五、公告期限

        自本公告发布之日起3个工作日。

        六、其他补充事宜

        购买招标文件时,请携带有效的单位介绍信及被介绍人身份证原件及复印件三份,加盖供应商公章(鲜章),缴费方式:现金。

        七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名称:商洛市妇幼保健院

        地址:商洛市商州区香菊路7号

        联系方式:13209143313

        2.采购代理机构信息

        名称:陕西恒瑞项目管理有限公司

        地址:陕西省商洛市商丹园区高新管委会A202

        联系方式:0914-2337550

        3.项目联系方式

        项目联系人:杨工

        电话:0914-2337550

        陕西恒瑞项目管理有限公司

        2023年01月04日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/149.html b/news/149.html new file mode 100644 index 0000000..e476f9b --- /dev/null +++ b/news/149.html @@ -0,0 +1,362 @@ + + + + +霞浦县禁养区标识、渔业专用通道界标维护项目公开招标招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        霞浦县禁养区标识、渔业专用通道界标维护项目公开招标招标公告

        +
        +
        +
        +  2023-01-12 阅读:4 +
        +
        +

        一、项目基本情况

        项目编号:[350921]CJZX[GK]2023001

        项目名称:霞浦县禁养区标识、渔业专用通道界标维护项目

        采购方式:公开招标

        预算金额:3,413,320.00元

        采购包1(霞浦县禁养区标识、渔业专用通道界标维护项目):

        采购包预算金额:3,413,320.00元

        采购包最高限价: 3,413,320.00元

        投标保证金: 34,133.00元

        采购需求:(包括但不限于标的的名称、数量、简要技术需求或服务要求等)

        本采购包不接受联合体投标

        合同履行期限:详见招标文件要求

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:无

        3.本项目的特定资格要求:

        采购包1:

        (1)投标人应具有港口与航道工程施工总承包叁级及以上资质等级证书和《施工企业安全生产许可证》。

        三、采购项目需要落实的政府采购政策

        进口产品:不适用

        节能产品:不适用

        环境标志产品:不适用

        信息安全产品:不适用

        信用记录:按照下列规定执行:(1)投标人应在(招标文件要求的截止时点)前分别通过“信用中国”网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)查询并打印相应的信用记录(以下简称:“投标人提供的查询结果”),投标人提供的查询结果应为其通过上述网站获取的信用信息查询结果原始页面的打印件(或截图)。(2)查询结果的审查:①由评标委员会通过上述网站查询并打印投标人信用记录(以下简称:“评标委员会的查询结果”)。②投标人提供的查询结果与评标委员会的查询结果不一致的,以评标委员会的查询结果为准。③因上述网站原因导致评标委员会无法查询投标人信用记录的(评标委员会应将通过上述网站查询投标人信用记录时的原始页面打印后随采购文件一并存档),以投标人提供的查询结果为准。④查询结果存在投标人应被拒绝参与政府采购活动相关信息的,其资格审查不合格。


        四、获取招标文件

        时间: 2023-01-12 至 2023-01-19 ,(提供期限自本公告发布之日起不得少于5个工作日),每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间,法定节假日除外)

        地点:招标文件随同本项目招标公告一并发布;投标人应先在福建省政府采购网(zfcg.czt.fujian.gov.cn)免费申请账号在福建省政府采购网上公开信息系统按项目下载招标文件(请根据项目所在地,登录对应的(省本级/市级/区县))福建省政府采购网上公开信息系统操作),否则投标将被拒绝。

        方式:在线获取

        售价:免费

        五、提交投标文件截止时间、开标时间和地点

        2023-02-03 09:10:00(北京时间)(自招标文件开始发出之日起至投标人提交投标文件截止之日止,不得少于20日)

        地点:福建省宁德市霞浦县人社局2楼(霞浦县公共资源交易中心)2号开标室(霞浦县公共资源交易中心)

        六、公告期限

        自本公告发布之日起5个工作日。

        七、其他补充事宜

        八、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名称:霞浦县海洋与渔业局

        地址: 霞浦县海洋与渔业局

        联系方式:15715022341

        2.采购代理机构信息(如有)

        名称:宁德市城建工程咨询管理有限公司

        地址:宁德市蕉城区万安西路12号7楼

        联系方式:15659335533

        3.项目联系方式

        项目联系人:林巧丹、卓玉春

        电话:0593-2767999、15659335533

        网址: zfcg.czt.fujian.gov.cn

        开户名:宁德市城建工程咨询管理有限公司


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/15.html b/news/15.html new file mode 100644 index 0000000..38a7f7d --- /dev/null +++ b/news/15.html @@ -0,0 +1,362 @@ + + + + +全球餐饮数字标牌行业市场运行现状及前景评估_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        全球餐饮数字标牌行业市场运行现状及前景评估

        +
        +
        +
        +  2022-04-30 阅读:25 +
        +
        +

        数字标牌是一种全新的媒体概念,指的是在大型商场、超市、酒店大堂、饭店、影院及其他人流汇聚的公共场所,通过大屏幕终端显示设备,发布商业、财经和娱乐信息的多媒体专业视听系统。其旨在特定的物理场所、特定的时间段对特定的人群进行广告信息播放的特性,让其获得广告的效应。在国外,还有人把它与纸张媒体、电台、电视和因特网并列,称之为第五媒体。

        第五媒体

        数字标牌可以使用静态或动态图形在同一块有限的屏幕中传达多条信息,没有声音也能传达有效信息。目前无论是在快餐店、高级餐厅还是休闲娱乐的地方,都有数字标牌,方便顾客更加直观的进行选择,节省时间,提高效率。它可以显示最新的菜单项、价格,同时还配有食物图片,方便添加新菜品、删除已经下架的菜品,甚至能够全天或按季节轮换菜单,以保证真实性。数字菜单提供有关菜品选择和促销的消息,可以实时更新。将传统菜单换成数字菜单后,每年可节省高达 2200 美元,无需纸质印刷,无需频繁更换安装,节省成本。快速的吞吐量和高效的客户服务至关重要,数字菜单可以极大地帮助员工提供优质服务,提升销售额。


        全球餐饮数字标牌行业发展现状


        北美是最大的市场,2015年市场份额为33.59%,2019年为31.34%,下降2.25%。近年来,亚太地区的需求逐渐增加并超过北美成为主要消费市场,2019年亚太市场份额为33.70%,位居第一。该行业集中度高,前三名分别企业是Samsung, LG Electronics以及 NEC Corporation,2019年市场份额分别为32.75%、8.67%、6.20%。


        受新冠肺炎疫情影响,2020年全球餐饮服务业受到严重打击。 虽然下游需求一直存在,但餐饮服务行业的产品需求在短期内必然会下降。2020年全球餐饮数字标牌行业市场价值2372.46百万美元,同比下降6.93%,主要系为有效防控疫情,各地餐饮业长期关店,消费者也有意识的避免到人群聚集的线下店铺就餐,虽然用餐需求仍然存在,但餐饮业客流大幅减少,下游行业需求的减少对餐饮数字标牌行业产生较大影响。


        全球餐饮数字标牌行业发展趋势


        随着时间的推移,运行数字标牌的软件变得越来越强大,由于软件技术的不断发展、对数据分析和内容管理的需求不断增加,以及需要定期购买和升级软件许可证,软件市场以较高的速度增长。硬件设备使用寿命长,所以下游客户购买频率较低。显示产品的不断进步为数字标牌提供了更高分辨率的屏幕,分辨率越高,就越能吸引消费者注意,有助于通过广告和促销吸引大量客户,以致市场上越来越多地采用数字标牌产品,这是市场增长的主要驱动力。


        中国、印度等人口密集地区对餐饮服务需求旺盛,近年来,这些地区的餐饮业发展迅速,外资品牌不断涌入,新兴品牌不断壮大,餐饮业发展迅速,传统的纸质菜单已不能满足人们用餐时对顾客体验的追求,电子菜单的出现,为人们点餐开辟了新的途径。它不仅使点餐高效便捷,而且克服了传统纸质菜单经常更换的难题,因此,数字标牌在中国等发展中国家需求旺盛,推动市场增长。


        餐饮行业市场集中度低,具有市场分散、地区差异大的特点,参与者大多是小型个体经营者或家族企业,传统菜单足够满足他们的需求。从区域上看,欧美等较为发达的地区,数字菜单的普及度和利用率较高,需求也较大。 因此,在小规模餐饮业集中和除欧美外的大部分地区,传统菜单替代品的威胁更大。目前,数字菜单板的主要用户是大型或中性餐饮企业,小型餐饮店或个人餐饮店使用较少,对于小店来说,传统菜单或者定制菜单可以满足他们的大部分需求,所以数字标牌行业很难在这部分企业打开市场。成本控制决定企业的竞争力,当数字标牌应用越来越广泛时,制造商也面临着成本问题。在巨大的商业利润背景下,数字标牌的维护、安装和运营成本成为首要考虑因素,降低数字标牌的安装和维护成本将成为重中之重。


        全球餐饮数字标牌行业2015年市场价值1893.48百万美元,2019年增至 2549.15百万美元,预计2025年有望增长至3225.39百万美元,2019到2025复合年增长率为6.34%。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/150.html b/news/150.html new file mode 100644 index 0000000..4ed21ef --- /dev/null +++ b/news/150.html @@ -0,0 +1,362 @@ + + + + +新疆医科大学第一附属医院标识、标牌制作项目(二次)竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        新疆医科大学第一附属医院标识、标牌制作项目(二次)竞争性谈判公告

        +
        +
        +
        +  2023-01-12 阅读:46 +
        +
        +

        项目概况

        新疆医科大学第一附属医院消防、治安类设备设施标识、标牌制作项目(二次) 采购项目的潜在供应商应在乌鲁木齐市鲤鱼山北路领世广场3号楼904室获取采购文件,并于2023年01月17日 11点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:HC-YXY-HW0011-02

        项目名称:新疆医科大学第一附属医院消防、治安类设备设施标识、标牌制作项目(二次)

        采购方式:竞争性谈判

        预算金额:25.0000000 万元(人民币)

        最高限价(如有):25.0000000 万元(人民币)

        采购需求:

        消防、治安类设备设施标识、标牌制作(详见招标文件)。

        合同履行期限:具体以与甲方签订的合同为准

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        1.投标人应符合《中华人民共和国政府采购法》第二十二条规定的条件;

        ①具有独立承担民事责任的能力;

        ②具有良好的商业信誉和健全的财务会计制度;

        ③具有履行合同所必须的设备和专业技术能力;

        ④有依法缴纳税收和社会保障资金的良好记录;

        ⑤参加政府采购活动前三年内,在经营活动中没有重大违法、犯罪记录;

        ⑥法律法规规定的其他条件。

        2.遵守国家法律、法规有关招标的规定。

        3.与采购人就本次招标的项目委托的咨询机构、招标代理机构、以及上述机构的附属机构没有行政或经济关联。

        4.单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得参加同一合同项下的政府采购活动。为采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得再参加该采购项目的其他采购活动; 供应商处于被责令停业、财产被接管、冻结和破产状态,以及投标资格被取消或者被暂停且在暂停期内。

        5.具有有效的营业执照(三证合一)

        6.须具备近一年财务审计报告或银行提供的资信证明(新公司从成立之日起算)。

        7.须具有近一年任意月纳税证明(新公司从成立之日起算)。

        8.近一年任意月法人或授权委托人人员社保明细证明(新公司从成立之日起算)。

        9.须具有履行合同所必须的设备和专业技术能力的承诺函。

        10.投标单位须为中小企业,提供《中小企业声明函》。        

        11.参加政府采购活动前3年内在经营活动中没有重大违法记录的书面声明。

        12.凡拟参加本次招标项目的供应商,如在“信用中国”网站(www.creditchina.gov.cn)和中国政府采购网(www.ccgp.gov.cn)被列入失信被执行人、税收违法黑名单、政府采购严重违法失信行为记录名单的(尚在处罚期内的),将拒绝其参加本次采购活动。

        13.落实政府采购政策需满足的资格要求:本项目专门面向中小微企业。

        3.本项目的特定资格要求:本项目专门面向中小微企业

        三、获取采购文件

        时间:2023年01月12日  至 2023年01月16日,每天上午10:00至14:00,下午15:00至19:00。(北京时间,法定节假日除外)

        地点:乌鲁木齐市鲤鱼山北路领世广场3号楼904室

        方式:线下获取

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年01月17日 11点00分(北京时间)

        地点:乌鲁木齐市鲤鱼山北路领世广场3号楼904室

        五、开启

        时间:2023年01月17日 11点00分(北京时间)

        地点:乌鲁木齐市鲤鱼山北路领世广场3号楼904室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1.具有有效的营业执照(三证合一)

        2.须具备近一年财务审计报告或银行提供的资信证明(新公司从成立之日起算)。

        3.须具有近一年任意月纳税证明(新公司从成立之日起算)。

        4.近一年任意月法人或授权委托人人员社保明细证明(新公司从成立之日起算)。

        5.须具有履行合同所必须的设备和专业技术能力的承诺函。

        6.投标单位须为中小企业,提供《中小企业声明函》。        

        7.参加政府采购活动前3年内在经营活动中没有重大违法记录的书面声明。

        8.凡拟参加本次招标项目的供应商,如在“信用中国”网站(www.creditchina.gov.cn)和中国政府采购网(www.ccgp.gov.cn)被列入失信被执行人、税收违法黑名单、政府采购严重违法失信行为记录名单的(尚在处罚期内的),将拒绝其参加本次采购活动。

        9.法定代表人身份证明及身份证或法定代表人授权委托书及委托代理人身份证

        有意参加本次招标项目的投标人应提供以上要求的所有证件资料,报名时请随身携带原件备查,复印件加盖公章留存,至华诚博远工程咨询有限公司(乌鲁木齐市鲤鱼山北路领世华府3号楼904室)购买招标文件。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:新疆医科大学第一附属医院     

        地址:新疆医科大学第一附属医院(乌鲁木齐市新医路393号苏园5号楼)        

        联系方式:叶老师、刘老师 0991-4366196      

        2.采购代理机构信息

        名 称:华诚博远工程咨询有限公司            

        地 址:乌鲁木齐市鲤鱼山北路领世华府3号楼904室            

        联系方式:刘宁 15999169190            

        3.项目联系方式

        项目联系人:刘宁

        电 话:  15999169190


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/151.html b/news/151.html new file mode 100644 index 0000000..5d527c5 --- /dev/null +++ b/news/151.html @@ -0,0 +1,362 @@ + + + + +上海长建路199号停车位改造及交通标识完善项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        上海长建路199号停车位改造及交通标识完善项目招标公告

        +
        +
        +
        +  2023-01-12 阅读:7 +
        +
        +

        一、招标条件
        长建路199号停车位改造及交通标识完善项目已由项目审批/核准/备案机关批准,项 目资金来源为自筹资金181.6945万元,
        招标人为上海宝山工业园投资管理有限公司。本项 目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:预算资金:资金已经落实。金额:181.6945万元
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)长建路199号停车位改造及交通标识完善项目:
        三、投标人资格要求
        (001长建路199号停车位改造及交通标识完善项目)的投标人资格能力要求:
        1、具有独立法人资格;
        2、本次招标要求投标人具备市政公用工程施工总承包三级及以上资质;近期内未发生重大 质量、安全事故和通报批评或卷
        入重大经济纠纷。并在人员、设备、资金等方面具有承担本 项目施工的能力。
        3、本次招标要求投标人拟派项目经理具有市政公用工程专业贰级及以上注册建造师执业资
        格,具备有效的安全生产考核合格证书;
        4、投标人具有有效的《安全生产许可证》;
        5、无严重违法失信行为记录;;
        本项目不允许联合体投标。
        四、招标文件的获取时间:从2023年01月12日09时30分到2023年01月16日16时00分
        五、投标文件的递交截止时间:2023年02月09日10时00分
        六、开标时间:2023年02月09日10时00分
        七、其他
        报名时需携带的资料:2.1、营业执照(副本);
        2.2、施工企业资质证书;
        2.3、安全生产许可证;
        2.4、施工项目经理执业资格证书及有效的安全生产考核合格证书(安全B证);
        2.5、法定代表人证明;法人授权委托书及被委托人身份证原件、复印件。
        标书费售价均为人民币1000元/本(售后不退)。
        联系人:侯 工
        手 机:15210675113
        邮 箱:ztbxx177@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/152.html b/news/152.html new file mode 100644 index 0000000..20b9111 --- /dev/null +++ b/news/152.html @@ -0,0 +1,362 @@ + + + + +临沭县临沭街道农业园及周边标识牌工程招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        临沭县临沭街道农业园及周边标识牌工程招标公告

        +
        +
        +
        +  2023-01-12 阅读:10 +
        +
        +

        招标编号:LYHF20230111 招标编码:CBL_20230111_106354782
        开标时间:2023-02-02 
        招标人:临沭县人民政府临沭街道办事处
        资金来源: 其它 投资金额:187.777485万元
        1.招标条件
        本招标项目临沭街道农业园及周边标识牌工程,己经相关部门批准建设,招标人为临沭县人民政府临沭街道办事处,建设资金:自筹资金。项目己具备招标条件,现对该项目的施工进行公开招标。
        2.项目概况与招标范围
        2.1工程地点:临沭街道农业园及周边;
        2.2规 模:详见工程量清单。
        2.3总 投资:187.777485万元
        2.4计划工期:计划从2023年02月06日至2023年02月15日止,共计10天。
        2.5招标范围:施工(具体依据施工图纸及工程量清单)。
        2.6标段划分:本工程共分一个标段。
        2.7工程质量要求达到合格标准。
        3.投标人资格要求
        3.1本次招标要求投标人具备市政公用工程施工总承包叁级及以上资质,与本工程规模类似的工程施工业绩,并在人员、设备、资金等方面具有相应的施工能力。
        3.2本次招标不可以组成联合体投标。
        3.3本次招标要求投标人拟派项目经理具备市政专业二级及以上注册建造师执业资格,具备有效的安全生产考核合格证书,且未担任其他在建工程项目的项目经理。
        3.4本工程对投标申请人的资格审查采用资格后审/合格制方式,主要资格审查标准和内容见招标文件中的资格审查文件,只有资格审查合格的投标申请人才有可能授予合同。
        4.投标报名
        凡有意申请报名者,请于2023年01月12日至2023年01月16日,每日上午08:30时至12:00时,下午14:00时至17:30时,(北京时间,下同),报名。投标单位报名时必须持其身份证、法定代表人证明书或法定代表人授权委托书、营业执照、在“信用中国”网站(www.creditchina.gov.cn)、中国执行信息公开网站、(http://zxgk.court.gov.cn)中国政府采购网(www.ccgp.gov.cn)、“中国裁判文书网(wenshu.court.gov.cn/)、未被列入失信被执行人名单、政府采购严重违法失信行为记录名单、无行贿记录等不良记录(以上资料均需提供复印件并加盖公司公章留存,资料不齐全的不予接收)。
        5.招标文件的获取
        5.1投标申请人请于2023年01月12日至2023年01月16日,每日上午08:30时至12:00时,下午14:00时至17:30时,报名购买招标文件。
        5.2招标文件售价300元/份,售后不退。
        6.投标文件的递交
        6.1投标文件递交的截止时间为2023年02月02日14时30分,
        6.2逾期送达的或者未送达指定地点的投标文件,招标人不予受理。
        报名材料扫描发送至邮箱(13621121064@163.com电话同步)并拨打电话确认获取《登记表》
        联系人/电话: 刘经理13621121064

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/153.html b/news/153.html new file mode 100644 index 0000000..9735715 --- /dev/null +++ b/news/153.html @@ -0,0 +1,362 @@ + + + + +保定市植物园选定园内指示牌及广告标识制作服务商项目比选公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        保定市植物园选定园内指示牌及广告标识制作服务商项目比选公告

        +
        +
        +
        +  2023-01-12 阅读:29 +
        +
        +

        招标编号:HBHY(2023)-05-05 招标编码:CBL_20230111_106355341
        开标时间:2023-02-01 
        招标人:保定市植物园
        资金来源: 其它
        本项目保定市植物园选定园内指示牌及广告标识制作服务商项目比选人为保定市植物园,项目资金为财政资金,该项目已具备比选条件,现委托河北华业招标有限公司对本项目进行公开比选。
        一、比选项目名称:保定市植物园选定园内指示牌及广告标识制作服务商项目
        二、比选人:保定市植物园
        三、项目地点:保定市植物园
        四、比选内容:本项目选取1家供应商,提供园内相关宣传栏、展板、标识牌、海报、画册、花事展出、文创用品、文创等方面的策划、设计、印刷、制作以及现场的安装布置等服务。
        五、服务期限:自供应商和比选人签订中标合同后一年
        六、质量标准:合格
        七、比选申请人资质要求:
        1.比选申请人具有独立法人资格的供应商,具备有效的营业执照,具备相应设计制作能力,并且具有良好的售后服务能力;
        2.比选申请人未被列入失信被执行人查询、及重大税收违法案件查询记录名单(查询地址为“信用中国”);
        3.本次比选不接受联合体投标。
        八、比选文件获取:
        比选申请人请持营业执照、法人身份证明或法人授权委托书及身份证原件及一份复印件(加盖比选申请人公章),于2023年1月12日至2023年1月18日上午9:00至11:30和下午14:30至17:30(北京时间)报名并购买比选文件,比选文件售价每份300元,售后不退。
        九、比选申请文件的递交:
        (1)递交比选申请文件截止时间:2023年2月1日09时00分
        (2)逾期送达或者未送达指定地点的比选申请文件,比选人不予受理。
        报名材料扫描发送至邮箱(13621121064@163.com电话同步)并拨打电话确认获取《登记表》
        联系人/电话: 刘经理13621121064

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/154.html b/news/154.html new file mode 100644 index 0000000..e516ea0 --- /dev/null +++ b/news/154.html @@ -0,0 +1,362 @@ + + + + +四川省人民医院全院标识标牌设计服务采购项目(二次)竞争性磋商成交公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        四川省人民医院全院标识标牌设计服务采购项目(二次)竞争性磋商成交公告

        +
        +
        +
        +  2023-01-12 阅读:8 +
        +
        +

        一、项目编号:N5100012022003287

        二、项目名称:全院标识标牌设计服务采购项目(二次)

        三、采购结果

        五、评审专家(单一来源采购人员)名单:

        梁永江(评审小组组长)、严合快、张果(采购人代表)

        六、代理服务收费标准及金额:

        代理服务费收费标准:

        本项目按照《四川省政府采购营商环境指标提升专项行动工作方案》中“成本+合理利润”原则,《国家计委关于印发(招标代理服务收费管理暂行办法)的通知》(计价格[2002]1980号)中《招标代理服务收费标准》规定的计费标准下浮20%向中标人收取招标代理服务费,代理服务费不足5000元的,按照5000元标准收取

        代理服务费金额:

        合同包1: 0.696万元。收取对象:中标(成交)供应商。

        七、公告期限

        自本公告发布之日起1个工作日。

        八、其他补充事宜

        1、计划备案号:51000022210200020197[2022]08113

        2、投诉受理单位:本采购项目同级财政部门,即四川省财政厅;联系电话:028-86723581、028-86723539、028-86723553

        九、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名称:四川省人民医院

        地址:四川省成都市青羊区一环路西二段32号

        联系方式:甘老师 028-87393484

        2.采购代理机构信息

        名称:四川轩辕招标代理有限公司

        地址:成都市锦江区墨香路87号8栋4楼

        联系方式:李老师 028-65731881

        3.项目联系方式

        项目联系人:李老师

        电话:028-65731881


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/155.html b/news/155.html new file mode 100644 index 0000000..d9df99c --- /dev/null +++ b/news/155.html @@ -0,0 +1,362 @@ + + + + +齐普光电广东某高新科技园项目正式落地_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        齐普光电广东某高新科技园项目正式落地

        +
        +
        +
        +  2023-01-12 阅读:2 +
        +
        +

        齐普光电室内显示产品以高端、稳定、节能等特点著称,多年来以可靠的品质助力我们的合作伙伴拿下了众多重要项目,常用于视频监控,指挥中心等对LED显示屏要求较高的场所。

        最近,齐普光电室内LED显示屏又现身广东某科技园名企项目,该项目为共计约20平方的C-Max室内P2.5项目。这块LED屏幕安装于客户展厅处,LED大屏需实现2个16:9画面分屏展示,和1个整体画面展示,并使用ipad实现无线切换视频源,实现多画面播放的同时,视频源的切换变得更加简单方便。

        而P2.5间距的C-Max,清晰地执行播放任务,使画面看起来鲜艳细腻,在企业形象展示,通知宣传,产品宣传等显示任务上,这块屏幕都是出色完成。

        安装作业中

        完成安装

        投入使用

        C-MAX是齐普光电十分畅销的一款室内LED显示屏,是深受全球用户喜爱的高性价比产品,C-Max配有P1.25~P4间距,满足了大部分的显示要求,重要的是,C-Max模组可以兼容P1.25~P4模组。例如,用户购买了C-Max-P4产品,使用一段时间后想换个小间距的,可以直接购入更小间距模组直接更换即可,极大节省了更新成本。

        同时,C-Max采用高精度压铸铝箱体,轻薄美观,可以实现完全前维护,节约大量的安装空间,省去了传统大箱体的臃肿。广泛用于礼堂舞台、会议室、宴会厅、展览演播厅、交通指挥、安防监控等场合。

        一款优秀的显示屏必定是长期的技术积累,齐普光电从事LED显示屏行业20余年,投入的人力物力不计其数,但创新无止境,使命践于行,齐普光电将继续加大研发生产能力,满足更多的市场需求。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/156.html b/news/156.html new file mode 100644 index 0000000..d3a18d5 --- /dev/null +++ b/news/156.html @@ -0,0 +1,362 @@ + + + + +我国显示面板产业规模跃居全球第一_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        我国显示面板产业规模跃居全球第一

        +
        +
        +
        +  2023-01-12 阅读:0 +
        +
        +

        作为数字时代信息呈现的主要载体和人机交互的基础窗口,近年来,我国新型显示产业不断跑出“加速度”、迈上“新台阶”,显示面板年产能达到2亿平方米,产业规模跃居全球第一,成为升级信息消费,壮大数字经济的重要力量。

          产业规模跃居全球第一。我国新型显示产业保持高速增长态势,产业营收规模屡创新高。中国光学光电子行业协会液晶分会统计数据显示,2021年,我国显示行业产值约5868亿元,较10年前增长近8倍;显示面板出货面积约1.6亿平方米,较10年前增长7倍以上;产业规模与显示面板出货面积在全球市场的占比分别提升到36.9%和63.3%,成为全球第一。

          关键核心技术不断取得突破。在LCD(液晶显示器)领域,国内企业已突破技术壁垒实现并跑,并在技术、产品、市场份额、成本、效率等方面形成领先竞争力,全球市占率超过70%。在OLED(有机发光二极管)领域,国内企业已掌握核心技术,并向高刷新率、像素排列等技术创新领域拓展,生产规模快速扩大。其中,中小型OLED市占率快速提升,统计显示,今年三季度,国产智能手机OLED面板市场份额已经占据全球市场的30%,比去年同期提升10个百分点。此外,在微显示、印刷显示、激光显示等新一代显示技术上,我国正在迎头赶上,技术和产业链突破在即。

          显示赋能作用不断拓展。新型显示产业有力支撑智能手机、电视、显示器、笔记本电脑、平板电脑等领域应用,在数字文旅、数字医疗,教育培训、汽车显示、数字装备等多个新兴产业中发挥了独特的作用,并为元宇宙、数字孪生等前瞻性的产业提供了物质基础和实现的路径。

          工信部有关负责人表示,接下来,将不断提升产业链、供应链韧性,全力攻克新型显示产业的关键核心技术,加强与人工智能、VR/AR、大数据、物联网等数字技术的深度融合,深化国际交流与合作,推动我国新型显示产业向价值链的中高端迈进。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/157.html b/news/157.html new file mode 100644 index 0000000..04dfb04 --- /dev/null +++ b/news/157.html @@ -0,0 +1,362 @@ + + + + +海信商用显示联合微软发布HiTeams应用,让世界看见更多中国大屏之美_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        海信商用显示联合微软发布HiTeams应用,让世界看见更多中国大屏之美

        +
        +
        +
        +  2023-01-12 阅读:3 +
        +
        +

        近日,海信商用显示与微软宣布达成生态合作,双方将借助海信商用显示Vision Hub智慧平板产品,基于微软Teams音视频能力,以及微软智能云Azure通信服务(Azure Communication Services,ACS)解决方案,推出HiTeams应用。这将有效提升海信商用显示屏在海外市场的竞争力,与此同时,海信也将成为国内首个在安卓大屏系统上与Teams建立合作的生态方,将与微软形成合力,让全球用户大屏协作更轻松。

        海信携手微软,为云上通信“搭好台”

        海信商用显示致力于打造成为商用显示领域的行业标杆,面向不同行业的应用场景,提供高质量的产品开发及提供系统的解决方案,也正不断加快海外商用显示业务的布局,聚焦欧洲、中东非区、亚太、美国等重点市场。当然,出海没有坦途,海信全球化战略顺利落地的背后,必然少不了技术合作伙伴的支持。

        海信Vision Hub智慧平板产品配备摄像头,主推音视频会议领域,需要搭载海外主流音视频软件。而Teams作为整合了音视频沟通、文档协作、应用扩展等多种功能的新一代生产力平台,已经成为了海外大量企业日常办公中不可或缺的沟通工具,每月活跃用户超2.7亿,遍布181个用户市场,支持 53种语言,每月一对一通话量超过10亿。数据显示,自2020年以来,全球范围内使用Teams的独立软件开发商(ISV),以及用户自定义App解决方案的月度活跃用户总数,增长了将近10倍,Teams成为中国企业全球化发展的有力助手。

        海信商用显示与微软进行生态合作,不仅将 Teams音视频能力融入海信Vision Hub智慧平板产品当中,双方也基于微软智能云Azure通信服务(Azure Communication Services,ACS),推出HiTeams应用,全球用户可以更方便、直接地通过海信商显大屏Android平台的Teams客户端参与远程视频会议,提升会议沟通效率。

        图: 微软智能云Azure通信服务(Azure Communication Services,ACS)

        顺滑与会及呼叫体验,HiTeams “唱好戏”

        全球混合办公趋势不断进化,绕不开优秀的硬件、极致流畅的软件。海信商用显示在努力发挥自身硬件优势的同时,也在与微软在内的生态伙伴一起,不断加强数字化能力,优化全球用户大屏会议使用体验。

        HiTeams应用使用微软Teams+ACS 会议和呼叫体验架构设计,用户可以通过多种方式加入Teams会议,包括以经过身份验证的Teams用户身份,通过Teams客户端加入,或者是以未经身份验证的匿名用户身份,通过 Teams 客户端加入等等。

        图:HiTeams APP一期效果图

        在预约性会议场景中,用户在HiTeams应用登陆,双方合作第一阶段将使用海信自有账号登录,第二阶段将可使用Teams账号登录。登陆之后,Teams用户发送带有Teams会议链接的邀请给到HiTeams,收到会议邀请后在大屏主页能够看到与会信息。点击大屏上“立即入会”按钮入会,到会议时间后,用户可通过触屏或者遥控器选择入会按钮,点击入会,使用方便快捷。

        对于即时性会议场景,即用户无需大屏实名登录,临时需要通过大屏与会的场景下,Teams会议链接可以通过Outlook或者Teams客户端生成,将生成链接通过消息推送方式推送给大屏会议APP。点击会议链接入会,大屏端和其他Teams终端均可点击此链接与会,便于用户随时随地加入会议。

        谈及此次合作,海信商显海外负责人Ray Guo表示:“作为中国企业出海的典型代表,海信持续加强在显示领域的应用拓展,B2B产业出海更是海信重要的战略发展方向。很高兴与微软达成生态合作,打造差异化的产品及技术,帮助海信在全球市场和世界舞台,不断提升影响力、品牌力和竞争力。”

        微软大中华区副总裁、解决方案事业部总经理马悦表示:“展望未来,微软还将与海信携手并进,在更多远期场景展开长远深入的合作。特别是在多屏互动场景下,实现集中式数据存储、平板和智能终端连接、通用操作系统,音频视频会议系统、随处访问文档信息、触摸感知、自然输入等,为全球商用显示领域提供更加优质中国产品及技术。”


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/158.html b/news/158.html new file mode 100644 index 0000000..a61c1ed --- /dev/null +++ b/news/158.html @@ -0,0 +1,362 @@ + + + + +邛崃市国有林场自然科普教育基地互动装置、标识标牌制作、安装(二次)竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        邛崃市国有林场自然科普教育基地互动装置、标识标牌制作、安装(二次)竞争性磋商公告

        +
        +
        +
        +  2023-01-31 阅读:5 +
        +
        +

        一、项目基本情况

        项目编号:N5101832022000185

        项目名称:邛崃市国有林场自然科普教育基地互动装置、标识标牌制作、安装。(二次)

        采购方式:竞争性磋商

        预算金额:753,900.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起45日

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目为专门面向中小企业、小微企业采购的项目(监狱企业、残疾人福利性单位均视同小微企业)


        3.本项目的特定资格要求:

        采购包1:无


        三、获取采购文件

        时间:2023年02月01日至2023年02月07日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年02月13日 10时30分00秒(北京时间)

        地点:邛崃市滨江路下段759号附301号(本项目开标室)

        五、开启

        时间:2023年02月13日 10时30分00秒(北京时间)

        地点:邛崃市滨江路下段759号附301号(本项目开标室)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1、本项目备案号:[51018322210200001309[2022]00632]。2、监督管理部门:邛崃市财政局   联系电话:028-88760252。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:邛崃市规划和自然资源局

        地址:邛崃市天庆街283号

        联系方式:18981836589

        2.采购代理机构信息

        名称:四川畅瑞招标代理有限公司

        地址:成都高新区府城大道西段399号7栋2单元17层1705号

        联系方式:18200412100

        3.项目联系方式

        项目联系人:孙女士

        电话:18200412100


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/159.html b/news/159.html new file mode 100644 index 0000000..c3e00c2 --- /dev/null +++ b/news/159.html @@ -0,0 +1,362 @@ + + + + +江油市应急管理局微型消防站装备及标识标牌采购(二次)竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        江油市应急管理局微型消防站装备及标识标牌采购(二次)竞争性磋商公告

        +
        +
        +
        +  2023-01-31 阅读:6 +
        +
        +

        一、项目基本情况

        项目编号:N5107812023000004

        项目名称:微型消防站装备及标识标牌采购(二次)

        采购方式:竞争性磋商

        预算金额:450,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起30日

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:


        本采购包属于专门面向中小企业采购(供应商结合自身实际,按照采购文件要求和关联格式要求,提供《中小企业声明函》、《残疾人福利性单位声明函》或者《监狱企业证明文件》进行响应)。


        3.本项目的特定资格要求:

        采购包1:

        (1)本项目不接受联合体磋商(供应商需提供非联合体参与磋商的承诺函);(2)供应商及其现任法定代表人、主要负责人不得具有行贿犯罪记录(供应商需提供无行贿犯罪记录的承诺函)。


        三、获取采购文件

        时间:2023年02月01日至2023年02月07日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年02月13日 13时30分00秒(北京时间)

        地点:通过项目电子化交易系统-投标(响应)管理在线提交响应文件

        五、开启

        时间:2023年02月13日 13时30分00秒(北京时间)

        地点:通过项目电子化交易系统-开标/开启大厅参与开启

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        采购监督机构:江油市财政局

        联系人:徐小斐       联系电话:0816-3250173

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:江油市应急管理局

        地址:江油市云帆路339号

        联系方式:0816-3320261

        2.采购代理机构信息

        名称:四川聚丰达工程管理服务有限公司

        地址:绵阳市高新区石桥铺东路中国科技城跨境电子商务产业园6栋502室

        联系方式:0816-2178328

        3.项目联系方式

        项目联系人:周浩

        电话:0816-3320261


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/16.html b/news/16.html new file mode 100644 index 0000000..152a13e --- /dev/null +++ b/news/16.html @@ -0,0 +1,362 @@ + + + + +“东数西算”对大屏显示需求拉动有多大?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        “东数西算”对大屏显示需求拉动有多大?

        +
        +
        +
        +  2022-04-30 阅读:18 +
        +
        +

         2022年2月17日,国家发改委、中央网信办、工信部、国家能源局四部门联合印发文件,启动建设国家 “东数西算”战略,同意在京津冀、长三角、粤港澳大湾区、成渝、内蒙古、贵州、甘肃、宁夏等8地建设数据集群。至此“东数西算”8大算力枢纽和10个集群全部落地,同时也成为今年上半年新基建的热点话题。

          “东数西算”就是通过构建数据中心、云计算、大数据一体化的新型算力网络体系,将东部算力需求有序引导到西部,优化数据中心建设布局,促进东西部协同联动。通俗地讲,即把东部的数据传输到西部进行计算和处理,如同南水北调、西电东送。

          但也并不是所有的 “ 东数 ” 都要 “ 西算 ” ,其中东部数据中心主要是匹配低时延业务,比如金融市场高频交易、虚拟现实 / 增强现实( VR/AR )、超高清视频、车联网、联网无人机、智慧电力、智能工厂、智能安防等。西部负责全国范围需后台加工、离线分析、存储备份等。

          “ 东数西算 ” 布局图

          备注:图片来源于网络

          “ 东数 ” 为什么要 “ 西算 ”

          1、 数字经济建设要求; 数字经济发展需要坚实的数字化基础设施,中国目前拥有覆盖好、速率高,稳定可靠的公众移动通信基础设施,成功带动ToC数字经济的规模化发展。但当面对企业客户的需求时,现有的基础设施能力就不一定达标了。无论是数字化连接成本,还是与通信网络、云计算能力的融合,乃至基础设施与应用的集成,必须再一次对数字化基础设施进行产业升级。

          2、 资源再分配,优化供需,促进绿色发展; 数据的存储和加工都产生着巨大能耗;一方面在一个数据中心的运营成本中,电力成本往往占到50%以上。在 2020 年的时候,国内的数据中心用电量已经占到了全社会总用电量的 2.7% ,总能耗超过 2000 亿千瓦时。 另一方面大型的数据中心一般都占用大量的土地资源,这也导致数据中心需要在租赁土地上花费不小的费用。而东部土地资源稀缺,租赁费用高,电力紧张且电价贵,平均气温高导致降温费用高。而西部的土地资源丰富,租赁费用低,电力丰富且价格低,全年温度低,降温费用少,具备发展数据中心、承接东部算力需求的潜力。

          那么 “ 东数西算 ” 的建设下跟大屏幕显示产品之间又有什么关系?

          在整体数据中心系统里,监控中心和数据指挥中心是重要的组成部分,而这其中便涉及 LED 和 LCD 拼接大屏产品,其中机房监控中心主要以液晶拼接为主,而总控的前端数据指挥中心屏幕早期以液晶拼接应用较多,而近年来受到 LED 小间距产品的持续替代,一方面由于此块屏幕应用一般面积较大,多在 20 ㎡以上,如果用液晶拼接产品则会产生较多的拼缝条数,同时面积越大,拼缝条数越多, LED 小间距的无缝优势得以充分凸显;另一方面观看此屏幕的坐席人员一般离屏幕的距离多在 2.5m 以上,大大弱化了 LED 小间距的观看颗粒感。

          备注:图片来源于网络

          “ 东数西算 ” 的建设下预计带动超 2 万个新增数据中心建设;

          根据我国生态环境部环境规划院统计测算,2021年国内数据中心机架规模达到543.6万架,预计到2025年,国内数据中心机架规模将达到759万架,较2021年增长40%;

          而2021年全国数据中心的数量预计在8.5万个左右,这样看目前平均每个数据中心的机架数量仅不到100个,以此推算预计到 2025 年全国数据中心数量将达 11 万 + ,则到 2025 年新增的数据中心数量在 2.5 万个左右;此外假设 2022-2025 年间原有的数据中心将有 30% 的改造更新需求,那整体来看未来数据中心释放的新增和改造数量将超 5 万个,场景数量的增加将大大拉动大屏幕显示产品的需求;

          Data source: DISCIEN

          在新增和改造场景数量下推算大屏幕拼接产品的潜力需求空间:潜在需求数字可观

          拼接将主力监控场景,以4*4的单体项目假设,假设在监控室渗透率为50%,在小面积数据中心指挥前台渗透率为15%,预计可带来530k+的新增需求;

          LED小间距主力前台数据指挥中心,以60%的渗透率,单体面积30㎡,单价5万/㎡进行假设,预计可带来超450亿的潜在需求,且微间距产品可重点跟进此类场景;

          整体来看, “ 东数西算 ” 建设下对于大屏幕拼接显示产品的需求拉动力较为明显;但从数据中心整个系统项目下看,其涉及基础网络、网络设备、 IT 设备、电力设备、制冷设备、软件系统等多产品链条的采购,且对解决方案的能力要求较高,而大屏幕产品采购仅占其中的一小部分,且以目前各大屏厂商的方案能力看,很难作为直接中标企业参与,需绑定运营商或者集成商,而传统的运营商如移动系、电信系、联通系将是主力参与企业,可重点关注。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/160.html b/news/160.html new file mode 100644 index 0000000..172cadd --- /dev/null +++ b/news/160.html @@ -0,0 +1,362 @@ + + + + +2023ISE展会,三星展示商用显示可持续发展新时代_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023ISE展会,三星展示商用显示可持续发展新时代

        +
        +
        +
        +  2023-01-31 阅读:9 +
        +
        +

        近日,三星在巴塞罗那举行的2023年欧洲视听和系统集成展会(ISE)上展示了全新一代商用显示器。在三星新环境战略的指导下,未来商用显示器将采用蕴含三星为维护生态友好所开发出的新一代技术。

        三星电子视觉显示业务执行副总裁Hoon Chung表示:“我们正致力于确保商用显示器可以最大限度减少对环境的影响,这是三星进一步迈向循环经济的一步。我们很高兴能在ISE上展示我们的愿景,即商用显示器是如何助力实现日常可持续发展,同时这也将为企业带来新的机遇。”

        着力发展与环境和谐共融的商用显示器技术

        在2023 ISE展会上,三星重点展示了其基于2022年9月宣布的最新环境战略所推出的可持续性举措。参观者能够看到,三星与环境和谐共存的愿景正在逐步变为现实。三星展示了商用显示器如何与生态和谐共存,这些举措分布于产品生命周期的五个阶段——采购、生产、分销、使用和回收。

        三星2023年全新智能商用显示器(QHC、QMC、QBC)厚度仅为28.5毫米,较之前的型号减少了40%。得益于此,产品生产后的运输所需集装箱数量相较以前可减少约20%。不仅如此,智能商用显示器通过采用亮度传感器,能够有效对周围光线环境做出反应,支持屏幕亮度自动调节,帮助用户自动化管理设备功耗。此外,用于产品后盖制造的树脂含有10%的消费后回收材料(PCM)。

        三星基于云端的MagicINFO解决方案能够优化远程管理流程,有助于用户高效管理多个商用显示设备和多样化的内容。用户能够通过远程管理功能便捷地监控所连接的设备数量、类型及故障,轻松管理不同设备,更能够对设备进行远程设置与操控,如屏幕亮度调节等。此外,该解决方案还提供其他功能,包括设备健康诊断包括用户通知、电缆连接、设备温度和网络中断等问题。

        在2023 ISE展会上,三星还单独开设了一个解决方案研讨区,向参观者介绍其最新的差异化技术。即将发布的商用显示器云端平台能够提供多样化的节能解决方案,使用户能够降低设备能耗。全新解决方案包括实时功耗监控、定时亮度调度、远程亮度调节和自动设备管理。这个综合平台将被整合并连接到LCD商用显示器、LED商用显示器和B2B电视,为用户提供跨终端的无缝体验。

        2023全新户外商用显示器——揭开大型LED显示屏和小型数字标牌的面纱

        三星在2023 ISE展会上发布全新商用显示器产品,全新户外LED商用显示器(型号:XHB系列)专为体育行业和标志性地标显示应用所打造。

        全新XHB系列产品较之前型号薄约一倍,可以实现无缝安装,并减少一半以上的安装时间以提高便利性。此外,能源利用效率的提高意味着XHB比其前身可减少超过15%的电力消耗,每年将可减少约2492吨二氧化碳排放,相当于约290,000棵30年树龄松树一年所吸收的二氧化碳量。

        为迎合电动汽车(EV)充电桩市场需求,三星推出了24英寸小型户外商用显示器(型号:OH24B)。随着电动汽车需求的持续增长,数字标牌产品在为企业和零售商带来销售机会的同时能够实现愉快的互动充电体验也非常重要。

        在不同环境条件下,三星户外商用显示器在耐久性和室外能见度方面都有着出色的表现。这种高适应性和多功能性由1,500尼特的峰值亮度和超薄的金属结构设计提供支持,产品具备防水、防尘、耐液体性(IP66防护等级)和IK-10级玻璃防护能力。显示器配备耐高温液晶面板,即使在强烈阳光下也能持久使用。此外,这款显示器还提供可拆卸的Wi-Fi/蓝牙配件,可根据安装条件优化接收速率。值得一提的是,这个小型商用显示器还拥有无与伦比的能源利用率,是行业内20英寸以上显示屏中功耗最低的产品(最高为90W),非常适合需要24小时连续运营和信息推送的电动汽车充电站场景。

        Flip Pro独家解决方案提升设备兼容性

        三星将推出一款专为“三星Flip”设计的全新解决方案,以满足教育工作者和企业多设备同时连接的需求。通过将PC与Flip连接,用户可以将PC中的内容或应用程序导入到Flip上。特别的是,解决方案可以实现在Flip屏幕上对PC进行反向控制。全新解决方案增强了远程协同的易用性,从而提供无障碍的工作环境。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/161.html b/news/161.html new file mode 100644 index 0000000..4ef3df3 --- /dev/null +++ b/news/161.html @@ -0,0 +1,362 @@ + + + + +宜宾市第一人民医院2023年日常零星标识标牌采购项目(二次)竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        宜宾市第一人民医院2023年日常零星标识标牌采购项目(二次)竞争性磋商公告

        +
        +
        +
        +  2023-01-31 阅读:42 +
        +
        +

        一、项目基本情况

        项目编号:N5115012022000408

        项目名称:2023年日常零星标识标牌采购项目(二次)

        采购方式:竞争性磋商

        预算金额:1,900,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起365日

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目专门面向中小企业采购。


        3.本项目的特定资格要求:

        采购包1:无


        三、获取采购文件

        时间:2023年01月31日至2023年02月07日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年02月13日 10时00分00秒(北京时间)

        地点:宜宾市翠屏区岷江新区华富戎州兴城3栋2层13号

        五、开启

        时间:2023年02月13日 10时00分00秒(北京时间)

        地点:宜宾市翠屏区岷江新区华富戎州兴城3栋2层13号

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1.监督部门:宜宾市财政局,财政监督电话:0831-8228012。2.计划备案号:51150022210200000802[2022]00601

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:宜宾市第一人民医院

        地址:宜宾市文星街65号

        联系方式:0831-8288103

        2.采购代理机构信息

        名称:融汇项目管理有限公司

        地址:成都市锦江区东大路318号IMP环球都汇广场15楼

        联系方式:028-67697399

        3.项目联系方式

        项目联系人:郭小琳

        电话:0831-7193268


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/162.html b/news/162.html new file mode 100644 index 0000000..e15e2dc --- /dev/null +++ b/news/162.html @@ -0,0 +1,362 @@ + + + + +AOC优化数字标牌产品线,全方位满足各行业场景应用需求!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        AOC优化数字标牌产品线,全方位满足各行业场景应用需求!

        +
        +
        +
        +  2023-01-31 阅读:8 +
        +
        +

        伴随着时代的飞速发展,数字标牌目前在各行业应用已然愈发广泛,不管是茶饮、餐饮门店,还是鞋服连锁,甚至是轨道交通、金融银行等,都可以见到数字标牌的身影。作为全球知名显示设备提供商及品牌商,AOC深谙数字标牌于行业的重要性,持续创新,优化完善自身标牌产品矩阵,推出韵彩、致彩、炫彩、翼彩、极彩、绘彩、酷彩、KA等系列产品,进而多维度、全方位、多元化满足不同行业客户对不同场景的应用需求!

        韵彩系列

        专柜展示晶彩出众

        AOC数字标牌韵彩系列涵盖A3、AE1H、AE1HW等产品,尺寸覆盖43~55英寸。其具备四等边设计,外观纤薄大气,简约时尚,不仅可打造震撼视效,也可满足新零售业态对高端显示设备的需求。同时还具备700nits高亮屏幕、高清画质等特性,可切实应用于高端卖场、奢侈品柜台、品牌连锁门店等场景。

        致彩系列

        餐饮门店连锁“大显身手”

        AOC数字标牌致彩系列涵盖F1H、F2H等产品,尺寸覆盖40~50英寸。其具备高清画质、700nits高亮屏幕、长久运行等特性,通过视频、滚播海报、动态模板等动态化内容和智能联屏/分屏展示,将店内的美食佳肴高清呈现,让美味呼之欲出,强化对消费者的视觉冲击和味觉诱惑,“引导”消费者进行点餐。

        炫彩系列

        灵活有度升级数字门店

        AOC数字标牌炫彩系列涵盖X3、X2-R、AE1、A1等产品,尺寸覆盖21.5~86英寸。其中,常规尺寸四等边设计标牌可应用于餐饮门店、茶饮门店、零售连锁、品牌体验店等场景,搭载CMS信发系统,及时对各类信息进行及时性更新替换,甚至针对特定时间段推送不同的促销信息,不仅能确保门店的“上新度”和“新鲜感”,更能有效节省门店打印制作物料的宣传成本。而小尺寸22A1标牌除应用于如上场景外,还可应用于生鲜菜场,实现信息的实时推送及管控。

        翼彩系列

        信发云系统 鞋服潮动力

        AOC数字标牌翼彩系列涵盖F1、X8-V、F2L、U3等产品,尺寸覆盖32~98英寸。其具备高清画质、长久运行、丰富拓展等特性,应用于鞋服连锁门店时,便于门店将服装发布会、新品美图、产品视频、新产品资讯、促销活动等素材实时发布及调整,实现内容便捷播放,赋予门店更加灵活的播放形式。同时还有利于节省门店运营成本,并实现快速上新及展示信息的统一化管理。98U3大尺寸标牌,则可应用于数字展厅、品牌体验店等场景,为线下体验店带来震撼视效的同时,还可大幅提高门店热度,让体验店成为购物营销活动的一部分。

        绘彩系列

        多色绘彩 为潮流门店增“靓”

        AOC数字标牌绘彩系列涵盖F3标牌产品,尺寸覆盖32~86英寸。其具备开阔视野、迅猛内芯、长久运行等特性,不仅可以通过磅礴画面展示,提高门店大气观感,还可以打造商业亮点,以炫酷视效引领时尚新潮流。

        极彩系列

        多元化广告展示 赋能智慧商超

        AOC数字标牌极彩系列为立式广告机,其涵盖S2、S2T等产品,尺寸覆盖43~65英寸。实际应用于餐饮门店、美妆、银行等场景中,可以通过高清画质、纤薄外观设计、长久开机、摆放灵活等优越性能满足不同场景的差异化应用需求。

        酷彩系列

        多维度监控 赋能智慧安防

        AOC数字标牌酷彩系列涵盖M1、F12等产品,尺寸覆盖21.5~43英寸,主要应用于公共安全/物业/零售监控、交通指挥中心调度、生产控制监控等场景中。通过全天候运行、广视角、节能减排、丰富接口等特性,便于洞察安全隐患,快速应对处理,实现风险防控,使安防监控一“幕”了然!

        KA系列

        智慧显示 玩转门店个性营销

        AOC数字标牌KA系列主要为双面屏与电子餐牌,两款均为700nits高亮产品。其中,双面屏双面高清显示,可广泛应用于酒店餐厅、银行大厅、连锁专柜、大型商超等场景中,以更灵活生动的展现手段,让展示环境更个性化、智能化。电子餐牌则不同于传统的静态纸质菜单以及灯箱台卡,应用于餐饮零售门店中不仅可以提高门店形象档次,还可以实现物料及时更新,减少门店宣传成本。

        ESL价签系列

        多色显示 快速变价 节能环保

        AOC ESL价签系列智能电子价签屏具备纤薄设计、多色显示、快速传输、节能省电等特性,应用于商场、超市、生鲜菜场、连锁药店等场景中,可以向消费者展示商品名称、价格、功能优势甚至是二维码等相关信息,商品信息还能通过手机或电脑远端发布,依托于云端&局域网多种网络方式云端发布变价,提升变价效率,实现快速变价。

        EPP系列

        多彩显示 节能环保

        AOC EPP系列彩色墨水屏标牌具备四等边设计、全彩显示、节能省电等特性,应用于美妆、鞋服等门店时,不仅可以营造高端大气的门店环境,还可以通过更立体逼真的视觉效果,聚焦消费者目光,提升消费者购物体验。

        未来,AOC还将持续以创新为源动力,致力于通过更丰富的标牌产品矩阵,深入挖掘各领域各场景的视讯痛点,深度整合核心诉求,驱动零售场景的智慧化转型升级!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/163.html b/news/163.html new file mode 100644 index 0000000..8de3032 --- /dev/null +++ b/news/163.html @@ -0,0 +1,362 @@ + + + + +ISE2023!海信商用显示携强大产品阵容惊艳亮相_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        ISE2023!海信商用显示携强大产品阵容惊艳亮相

        +
        +
        +
        +  2023-02-01 阅读:35 +
        +
        +

        1月31日至2月3日,2023年欧洲视听技术及系统集成展览会 (下称“ISE展会”)在西班牙巴塞罗那举行。据悉,本届ISE展会展出面积超52000㎡,吸引全球1000多家参展商参加。海信商用显示携旗下LED一体机 、LED显示产品解决方案 、全场景智慧平板 、数字标牌 等在内的最新产品和显示解决方案亮相展会,展示了海信在B2B领域的技术突破与实力。

          ISE展会是世界领先的视听及系统集成展览会,也是欧洲规模最大,最具商机的专业视听展会,代表着视听技术在商业领域的最高权威,是业界中最具影响力的行业组织。本次展会,海信展位面积达150㎡,精彩的展出内容吸引了众多专业人士及当地媒体参观体验。作为海信集团旗下B2B板块的核心力量,海信商用显示旨在结合办公、教育、机场、快餐连锁等不同领域的用户具体应用场景,提供完整且具体的海信商用显示解决方案,展示产品的应用效果和价值,为用户创造独特的交互体验。

          展会现场,海信商用显示带来了“豪华”产品阵容,为现场观众打造了沉浸式观看体验。其中,海信136吋LED一体机 一经亮相,就吸引了诸多目光。据了解,该款LED一体机主要面向会议室、阶梯教室、专家会商室等应用场景,革新了LED行业传统落后的技术方案,采用ASIC高精度控光芯片,可实现AI画质、MEMC、HDR等功能,为用户带来兼具智能化办公和出色视听体验的办公会议解决方案。

          此外,现场还展出了海信Vision Hub智慧平板 、海信Vision Flip数字标牌 等产品。作为提升企业办公效率的生产工具,海信Vision Hub智慧平板集远程 会议、书写、音视频 等多种功能于一体,在海外市场备受欢迎。在2023 ISE展会现场,参展观众借助海信Vision Hub智慧平板体验了书写批注、智能表格等功能,流畅、智能的体验引来连连赞叹。而作为海外市场的“明星产品”,海信Vision Flip数字标牌采用超薄超窄设计,支持横竖摆放,大容量存储,广视角、超高清、高亮显示,观看效果极佳。在公共交通、商超、餐饮、零售等场景,可实现公共信息展示、广告播放、菜单选餐、多媒体信发集控 等功能。

          值得一提的是,现场还首次公开展示了海信与微软生态合作的最新成果HiTeams应用 。此前,海信与微软达成生态合作,海信作为中国首个在安卓大屏端与Teams建立合作的生态方,将Teams的音视频能力成功融入到海信Vision Hub智慧平板产品中,全球用户可以更方便、直接地通过海信Vision Hub智慧平板安卓端Teams客户端参与远程视频会议,大大提升了会议沟通效率,参展观众连连赞叹。

          B2B产业出海是海信国际化的重要突破口。海信Vision Hub智慧平板、海信LED一体机、海信Vision Flip数字标牌等产品,展示了海信在B2B领域的技术突破。海信商用显示致力于打造成为商用显示领域的行业标杆,面向不同行业的应用场景,提供高质量的产品开发及提供系统的解决方案,自2017年布局海外市场以来,目前,海信商用显示产品已覆盖30多个国家和地区,并保障G20峰会等大型活动的圆满举行。

          未来,海信商用显示将持续深耕行业,把握产业发展机会,通过产、销、研一体化布局抓住区域发展机会,为客户呈现更加完备的产品及解决方案,站在技术前沿引领行业改变。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/164.html b/news/164.html new file mode 100644 index 0000000..523d951 --- /dev/null +++ b/news/164.html @@ -0,0 +1,362 @@ + + + + +上海庙经济开发区敖镇综合产业园户外亮化广告牌工程项目成交公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        上海庙经济开发区敖镇综合产业园户外亮化广告牌工程项目成交公告

        +
        +
        +
        +  2023-02-01 阅读:12 +
        +
        +

        一、项目编号:HXXM-2023-ZC006(招标文件编号:HXXM-2023-ZC006)

        二、项目名称:上海庙经济开发区敖镇综合产业园户外亮化广告牌工程项目

        三、中标(成交)信息

        供应商名称:内蒙古颐安园林绿化有限公司

        供应商地址:内蒙古自治区鄂尔多斯市东胜区伊煤路北36号街坊1号

        中标(成交)金额:19.4000000(万元)

        四、主要标的信息

        五、评审专家(单一来源采购人员)名单:

        张宇(采购代表)、崔红梅、张旭明

        六、代理服务收费标准及金额:

        本项目代理费收费标准:按《内蒙古自治区建设工程招标代理服务收费指导意见(试行)》内工建协(2016)17号文规定收费标准收取

        本项目代理费总金额:1.0000000 万元(人民币)

        七、公告期限

        自本公告发布之日起1个工作日。

        八、其它补充事宜


        九、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名 称:内蒙古鄂尔多斯上海庙经济开发区企业发展服务中心     

        地址:鄂托克前旗上海庙镇        

        联系方式:张先生15947369499      

        2.采购代理机构信息

        名 称:鄂托克前旗和信项目管理有限公司            

        地 址:鄂托克前旗敖勒召其镇珠和东街            

        联系方式:于先生 19904776268            

        3.项目联系方式

        项目联系人:张先生

        电 话:  15947369499

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/165.html b/news/165.html new file mode 100644 index 0000000..56384f5 --- /dev/null +++ b/news/165.html @@ -0,0 +1,362 @@ + + + + +湘潭多部门联合整治路域环境 拆除高速公路违规广告牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        湘潭多部门联合整治路域环境 拆除高速公路违规广告牌

        +
        +
        +
        +  2023-02-01 阅读:9 +
        +
        +

        为全力打造“畅、安、舒、美”路域环境,有效防范重特大道路交通事故的发生,近日,湘潭市岳塘区交通运输局联合市交通局运输局执法支队、高速公路路政执法大队、高速公路湘潭管理所、属地街道、村社等部门开展高速路域环境整治,成功拆除沪昆高速东往西K1062+700处脱焊立柱广告牌,及时消除安全隐患。

        行动中,各组人员各司其职,紧密配合,严格按照既定方案实施,完成了此次拆除工作。

        下一步,岳塘区交通运输局将持续开展交通问题顽瘴痼疾整治行动,当好护路先锋,为大力实施“一谷四区”战略、奋力打造“融城先锋首善岳塘”提供有力的交通保障。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/166.html b/news/166.html new file mode 100644 index 0000000..2b261f2 --- /dev/null +++ b/news/166.html @@ -0,0 +1,362 @@ + + + + +成都大学附属医院标识标牌设计制作安装服务采购项目(二次)竞争性磋商成交公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都大学附属医院标识标牌设计制作安装服务采购项目(二次)竞争性磋商成交公告

        +
        +
        +
        +  2023-02-03 阅读:14 +
        +
        +

        一、项目编号:N5101012022001613

        二、项目名称:标识标牌设计制作安装服务采购项目(二次)

        三、采购结果

        合同包1:

        供应商名称供应商地址中标(成交)金额
        成都诗翼广告装饰有限公司成都高新区天晖路360号13层12号2,250,000.00元

        四、主要标的信息

        合同包1:

        服务类(成都诗翼广告装饰有限公司)

        品目号品目名称采购标的服务范围服务要求服务时间服务标准金额(元)
        1广告服务标识标牌设计制作安装成都大学附属医院本部院区、铁二院分院院区,及采购人指定地点(成都市内)。(1)根据采购人指示制造。不容许裂缝或压弯形成印迹。需从后面切割模板外角。 (2)边缘:打磨并抛光光滑,不可有工程痕迹。 (3)焊接:焊缝的承载能力不得小于杆件的承载能力设计值,当焊缝长度不满足要求时应增设节点板,节点板的厚度等于焊件厚度。 (4)公差:尺寸变化在高度和长度上不超过0.8mm。 (5)钢板表面烤漆均匀,不允许有露底、起泡、裂纹、起皱、流疤和有直径大于0.8mm的杂质。折边要光挺、圆润,抛光后不得有勾、刺以防刮伤、擦伤。所有伸缩缝和变形缝,其最大变形值均满足特定的承载和位移设计要求。2年,合同1年1签。1.供应商须按照“采购清单”的相关要求制作标识标牌2.标识牌正面应平整光滑,边框线应匀称,平直。不能有断缺和弯折,周边平整,无毛边,不挂手3.标识牌上的文字要排列整齐,上下左右要协调,字面平整无瑕疵,安装过程中粘接剂不能溢出,不能有断裂和折痕4.标示牌制作色调要引人注目,清晰度高,颜色搭配合理匀称5.两种及以上色调的标识牌,分界线要整齐有序,颜色分明,不能有空隙,清晰度高2,250,000.00

        五、评审专家(单一来源采购人员)名单:

        朱珂函(采购人代表)叶芳唐家申

        六、代理服务收费标准及金额:

        代理服务费收费标准:

        按照采购文件要求以及成本加合理利润原则,由中标人在领取中标通知书前向代理机构交纳中标服务费。

        代理服务费金额:

        合同包1: 2万元。收取对象:中标(成交)供应商。

        七、公告期限

        自本公告发布之日起1个工作日。

        八、其他补充事宜

        1. 监督部门:成都市财政局;联系电话:028-61882648;2.备案编号:51010022210200011382[2022]03185;3. 供应商严禁提供虚假承诺,如提供虚假承诺将报告监管部门严肃追究法律责任;4.成交折扣率:51%。5. 本项目需要落实的政府采购政策:促进中小企业发展、促进监狱企业发展、促进残疾人福利性单位发展、扶持不发达地区和少数民族地区。

        九、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名称:成都大学附属医院

        地址:四川省成都市市辖区成都市二环路北二段82号

        联系方式:粟老师;028-86437232

        2.采购代理机构信息

        名称:四川国际招标有限责任公司

        地址:中国(四川)自由贸易试验区成都市高新区天府四街66号2栋22层1号

        联系方式:岳女士;13111896634

        3.项目联系方式

        项目联系人:岳女士

        电话:13111896634

        四川国际招标有限责任公司


        2023年02月03日


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/167.html b/news/167.html new file mode 100644 index 0000000..8a18a51 --- /dev/null +++ b/news/167.html @@ -0,0 +1,362 @@ + + + + +江西省瑞金市公安局交通管理大队某交通信号灯、施划安装标线标牌设备询价采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        江西省瑞金市公安局交通管理大队某交通信号灯、施划安装标线标牌设备询价采购公告

        +
        +
        +
        +  2023-02-03 阅读:5 +
        +
        +

        赣州天裕招标代理有限公司关于江西省瑞金市公安局交通管理大队红都大道与宝钢路等交叉路口安装(加装)交通信号灯、施划安装标线标牌及电子监控设备(项目编号:GZTY2022-RJ-X003)的询价采购公告

        项目概况

        红都大道与宝钢路等交叉路口安装(加装)交通信号灯、施划安装标线标牌及电子监控设备 招标项目的潜在投标人应在 江西省公共资源交易网(网址:http://www.jxsggzy.cn/web/) 获取招标文件,并于 2023年02月10日 09点30分 (北京时间)前递交投标文件。

        一、项目基本情况:

        项目编号:GZTY2022-RJ-X003

        项目名称:红都大道与宝钢路等交叉路口安装(加装)交通信号灯、施划安装标线标牌及电子监控设备

        采购方式:询价

        预算金额:1150000.00 元

        最高限价:1150000.00

        采购需求:


        采购条目编号采购条目名称数量单位采购预算(人民币)技术需求或服务要求
        瑞财购2023B000829181红都大道与宝钢路等交叉路口安装(加装)交通信号灯、施划安装标线标牌及电子监控设备11150000.00元详见公告附件


        合同履行期限:自《成交通知书》发出之日起30日内和甲方签订合同,并于签订合同之日起30日内交货安装调试完成。

        本项目不接受联合体投标。

        二、申请人的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定:(1)具有独立承担民事责任的能力;(2)具有良好的商业信誉和健全的财务会计制度;(3)具有履行合同所必需的货物和专业技术能力;(4)有依法缴纳税收和社会保障资金的良好记录;(5)参加政府采购活动前三年内,在经营活动中没有重大违法记录。2.落实政府采购政策需满足的资格要求:本项目专门面向中小企业采购项目。3.本项目的特定资格要求:无。4.响应人被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单及其他不符合《中华人民共和国政府采购法》第二十二条规定的响应人(处罚期限尚未届满),不得参加本项目的政府采购活动。

        三、获取采购文件:

        时间:2023年02月05日 08:30 至 2023年02月09日 17:30

        地点:江西省公共资源交易网(网址:http://www.jxsggzy.cn/web/)

        方式:使用CA数字证书报名及下载询价通知书

        售价:0.00元

        四、响应文件提交:

        2023年02月10日 09点30分 (北京时间)(从磋商文件开始发出之日起至供应商提交首次响应文件截止之日止不得少于10日;从谈判文件开始发出之日起至供应商提交首次响应文件截止之日止不得少于3个工作日;从询价通知书开始发出之日起至供应商提交响应文件截止之日止不得少于3个工作日)

        地点:赣州市公共资源交易中心瑞金市分中心(江西省瑞金市经开区(沙洲坝镇)胜利大道西(行政审批局3号楼2楼)),届时请响应人代表携带其本人身份证原件、响应文件出席询价会,逾期或不符合规定的响应文件恕不接受。

        五、开启:

        2023年02月10日 09点30分 (北京时间)

        地点:赣州市公共资源交易中心瑞金市分中心(江西省瑞金市经开区(沙洲坝镇)胜利大道西(行政审批局3号楼2楼)),届时请响应人代表携带其本人身份证原件、响应文件出席询价会,逾期或不符合规定的响应文件恕不接受。

        六、公告期限:

        自本公告发布之日起3个工作日。

        七、其他补充事宜:

        1、本项目响应保证金人民币贰万叁仟元整(¥23000.00元),响应人自行选择银行转账或电子保函方式提交响应保证金。银行转账方式:响应人采用银行转账方式的,应从各自银行基本账户转入赣州市公共资源交易中心瑞金市分中心虚拟账户,具体操作如下:登陆江西省公共资源交易系统,在“采购业务-网上确认”完成系统报名,然后在“金融服务保证金管理-保证金缴纳”获取缴纳保证金账号;缴纳完保证金后,务必登录到江西省公共资源交易系统中,点查询,查询保证金结果须为“足额有效保证金”(以实际到账时间为准),否则投标无效。响应文件中提供响应人提交响应保证金的凭证扫描件。未中标的响应人的响应保证金,在《成交通知书》发出之日起五个工作日内无息退还。成交人的响应保证金在采购合同签订后五个工作日内无息退还。电子保函方式:响应人以电子保函方式缴纳保证金的,电子保函的开具原则上按照《关于全市“不见面开标”项目缴纳投标保证金推行电子投标保函的通知》(赣市发改政策字〔2021〕206 号文)及《关于修改赣市发改政策字〔2021〕206 号有关内容的通知》(赣市发改政策字〔2022〕159 号)要求执行。响应人应在截止时间前登录“江西省公共资源交易平台-金融服务系统”按流程自主完成相关操作,完成投标保函的申请和递交。银行、融资担保公司、保险公司开具电子投标保函的格式仍按赣州市发展和改革委员会、赣州市公共资源交易管理办公室《关于规范全市公共资源交易投标保证金及推行电子投标保函的通知》(赣市发改政策字〔2020〕676 号,以下简称 676 号文)执行。响应人应当按照省公共资源交易平台金融服务系统中的流程操作,在系统中申请电子保函,在投标截止时间前完成电子保函的开立。项目评审以响应人提交至公共资源交易中心业务系统内的电子保函,作为保证金缴纳情况的唯一评审依据。未按上述约定要求提交电子保函的,将视为无效,由响应人自行负责。投标文件中须提供响应人开立的电子保函扫描件。 注:响应人应慎重考虑投标保证金缴纳时间,在投标保证金截止时间前因网络或其他原因而造成无法缴纳投标保证金的,其后果由响应人自负。成交人还须按成交金额的2%缴纳履约保证金(履约保证金以银行转账(电汇)、支票、汇票、本票或者金融机构、担保机构出具的保函等非现金形式提交),履约保证金由采购人收取,待成交人履行完合同约定权利义务事项后退还。2、本项目采用电子化开、评标模式,响应人须在响应截止时间前制作并上传电子响应文件(上传至江西省公共资源交易网)、携带加密 CA 数字证书(制作响应文件用 CA 数字证书)至开启现场解密电子响应文件。(如因响应人自身原因导致开启时无法解密电子响应文件,按无效响应处理)。响应人如遇到江西省公共资源交易网操作或响应文件制作软件问题可拨打江苏国泰新点软件有限公司技术支持电话 400-998-0000。3、政府采购政策:本项目将落实中、小、微企业(含监狱和戒毒企业、残疾人福利性单位)、节能、环保等政府采购政策,具体规定详见询价通知书。4、招标代理服务费:本项目将向成交人收取招标代理服务费,具体收费标准详见询价通知书。5、因系统推送原因导致中国政府采购网有可能显示公告概要预算金额和显示公告正文预算金额不一致的,以显示公告正文为准。

        八、凡对本次采购提出询问,请按以下方式联系:

        1.采购人信息

        名称:瑞金市公安局交通管理大队

        地址:瑞金市金龙工业园沙九路路口

        联系方式:0797-2508399

        2.采购代理机构信息

        名称:赣州天裕招标代理有限公司

        地址:瑞金市象湖镇八一北路中段(中国邮政银行二楼)

        联系方式:18172788553

        3.项目联系方式

        项目联系人:谢先生

        电话:18172788553


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/168.html b/news/168.html new file mode 100644 index 0000000..99f09fd --- /dev/null +++ b/news/168.html @@ -0,0 +1,362 @@ + + + + +成都双流国际机场股份有限公司2023年标识标牌采购项目公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都双流国际机场股份有限公司2023年标识标牌采购项目公告

        +
        +
        +
        +  2023-02-07 阅读:14 +
        +
        +

        一、招标条件
        本成都双流国际机场股份有限公司2023年标识标牌采购项目已由项目审批/核准/备案机关批准,项目资金来源为自筹资金60.63961万元,招标人为成都双流国际机场股份有限公司。本项目已具备招标条件,现招标方式为其它方式。
        二、项目概况和招标范围
        规模:公共服务标识标牌( 含点位标识、导向标识、信息板、平面布局图、警示及温馨提示等)的设计、制作、安装和维保。详情见比选文件第五章。
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)成都双流国际机场股份有限公司2023年标识标牌采购项目:
        三、投标人资格要求
        (001成都双流国际机场股份有限公司2023年标识标牌采购项目)的投标人资格能力要求:
        1.具有承担民事贵任的能力。
        2.具有良好的商业信誉和健全的财务会计制度。
        3.具有履行合同所必需的设备和专业技术能力。
        4.具有依法缴纳税收和社会保障资金的良好记录。
        5.参加本次采购活动前三年内,在经营活动中没有重大违法记录。
        6.法律、行政法规规定的其他条件。
        7.比选申请人单位及其现任法定代表人、主要负责人不得具有行贿犯罪记录。
        8.信誉要求比选申请人不得为信用中国网站中列入重大税收违法案件、政府采购严重违法失信当事人名单的供应商:不得为中国执行信息公开网站中列入失信被执行人名单的供应商。
        9.根据采购项目提出的特殊条件:
        9.1比选申请人为一般纳税人。
        说明:本项目不接受联合体比选申请。
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:2023年02月08日09时00分到2023年02月10日17时00分。
        获取方式:比选文件售价:人民币400元/份(比选文件售后不退,比选资格不能转让)
        注:获取比选文件时,比选申请人为法人或者其他组织的,需提供单位介绍信、经办人身份证明比选申请人为自然人的,需提供本人身份证明。
        五、投标文件递交截止时间: 2023年02月16日11时00分。
        六、开标时间: 2023年02月16日11时00分。
        注:请与联系人获取投标备案登记表
        联系人:徐 莉
        电话:18210207527
        邮箱:xszl851@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/169.html b/news/169.html new file mode 100644 index 0000000..bd83067 --- /dev/null +++ b/news/169.html @@ -0,0 +1,362 @@ + + + + +Valens推出多个面向企业、教育以及数字标牌应用的音视频连接解决方案_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        Valens推出多个面向企业、教育以及数字标牌应用的音视频连接解决方案

        +
        +
        +
        +  2023-02-07 阅读:7 +
        +
        +

        1月31日至2月3日,影音和汽车市场高速连接解决方案供应商Valens Semiconductor(纽约证券交易所代码:VLN)参加了于西班牙巴塞罗那举办的欧洲视听设备与信息系统集成技术展览会(ISE 2023)。Valens在展会上推出了三项新产品及功能,以满足企业、教育领域以及数字标牌等市场对于音视频连接不断增长的需求。

        在本次展会中,Valens对新产品视频会议多摄像头解决方案进行了概念验证,这是一种专业级USB Type-C接口的拓展解决方案,且有望成为新一代多人视频会议设备。此外,Valens还展示了来自HDbaseT联盟中25家领先音视频产品制造商的40多种兼容HDbaseT 3.0的产品,数量达去年的两倍以上。此外还展示了许多其他产品,分别来自于80多家HDbaseT联盟制造商。

        Valens高级副总裁兼影音主管Gabi Shriki说道:“随着Valens不断丰富其产品组合,并在此次ISE 2023上展示了最新研发成果,Valens再次引领了全球高速音视频连接市场的发展。本次展会中有大量音视频产品制造商展示了其兼容HDbaseT 3.0的产品,这是Valens VS3000系列产品拥有强大市场需求的有力证明。此外,新型视频会议多摄像头搭载了VA7000芯片组,这展示了Valens在不同领域应用其核心技术的创新。总体而言,市场对音视频解决方案的需求正在从企业、教育、政府扩展到工业、交通、医疗等其他应用或垂直领域。”

        Valens在ISE 2023展示了三项创新解决方案:

        突破性的视频会议多摄像头解决方案——搭载VA7000芯片组摄像头串行接口(CSI)扩展技术,CSI扩展技术支持高性能、无压缩、高性价比的多摄像头成像。在ISE 2023展会上,Valens对其进行了概念验证。

        新VS3000 Stello芯片组功能——该芯片组采用多芯片互连的DHDI(双HDbaseT数字接口),DHDI实现了Valens芯片在日益增长的统一通信与协作(UC&C)和数字标牌领域的全新应用。多芯片互连通过一根电缆有效地扩展简化网络拓扑结构。例如,当VS3000 Stello系列芯片应用于UC&C场景时,它可以扩展来自多种媒体源、显示器和其他附件的信号,这是下一代视频会议系统安装的关键。此外,它还可以应用于交通、零售、体育场馆、数字户外(DOOH)市场等领域的数字标牌。

        USB Type-C接口专业级扩展解决方案——该解决方案进一步扩大了USB- C接口在企业和教育领域的应用,同时支持供应商为UC&C自带设备(BYOD)开发创新产品。Valens HDbaseT技术扩展了USB-C连接器所携带的相同接口,为远距离单根电缆传输提供了可靠的选择。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/17.html b/news/17.html new file mode 100644 index 0000000..1dc2f7d --- /dev/null +++ b/news/17.html @@ -0,0 +1,362 @@ + + + + +2022年中国物联网行业市场前景及投资研究报告_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年中国物联网行业市场前景及投资研究报告

        +
        +
        +
        +  2022-04-30 阅读:10 +
        +
        +

        作为推动经济社会转型升级、培育经济增长新动能和构筑国际竞争新优势的重要途径,数字经济将是“十四五”时期经济社会发展的重要推动力。“十四五”规划纲要将数字经济独立成篇,描绘出未来5年数字中国建设的崭新蓝图。围绕数字经济发展,规划纲要圈定了物联网等七大重点产业。

          一、物联网定义

          物联网是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。

          物联网关键技术包括射频识别技术、传感网、M2M系统框架及云计算,具体如图所示:

          资料来源:中商产业研究院整理

          二、物联网行业发展政策

          近年来,中国物联网行业受到各级政府的高度重视和国家产业政策的重点支持。国家陆续出台了多项政策,鼓励物联网行业发展与创新,《关于印发“十四五”冷链物流发展规划的通知》《关于开展营商环境创新试点工作的意见》《关于印发物联网基础安全标准体系建设指南(2021版)的通知》等产业政策为物联网行业的发展提供了明确、广阔的市场前景,为企业提供了良好的生产经营环境。具体情况列示如下:

          资料来源:中商产业研究院整理

          三、物联网行业发展现状

          1.市场规模

          在政策与技术的支持下,中国物联网市场蓬勃发展。2020年中国物联网市场规模达1.66万亿元,同比增长10.67%。随着政策支持及技术的提升,物联网市场规模将继续增长,预计2022年将达2.1万亿元。

          数据来源:中商产业研究院整理

          2.产业结构

          物联网产业应用层和平台层贡献了最大的附加值,分别占比35%和34%;感知层中元器件种类多,产业价值大,占比达21%;传输层占比最少,仅有10%。

          数据来源:McKinney、中商产业研究院整理

          3.物联网终端连接数

          中国市场物联网终端连接情况与全球情况同步,GSMA预测到2025年,企业市场将占据物联网终端设备连接数一半以上的份额,就增速和规模而言,智能楼宇和智能制造是关键的垂直领域;消费者市场中,智能音箱和联网家用设备将引领增长,而家庭安全是最大的垂直市场。

          数据来源:GSMA、中商产业研究院整理

          4.企业数量

          近年来,物联网行业企业数量增速不断提升,2020年中国物联网累计企业达26.73万个。但由于物联网行业结构性供给过剩与短缺问题同时存在,企业实际盈利能力和物联网的应用渗透并未显著提升,预计未来新成立物联网企业增速将放缓。

          数据来源:中商产业研究院整理

          四、物联网行业重点企业

          1.广和通

          深圳市广和通无线股份有限公司致力于物联网与移动互联网无线通信技术和应用的推广及其解决方案的应用拓展,广和通在物联网产业链中处于网络层,并涉及与感知层的交叉领域,主要从事无线通信模块及其应用行业的通信解决方案的设计、研发与销售服务。

          2021年广和通实现营业收入41.09亿元,同比增长49.74%;实现归母净利润4.01亿元,同比增长41.2%。

          数据来源:中商产业研究院整理

          2.移远通信

          上海移远通信技术股份有限公司主营业务是从事物联网领域无线通信模组及其解决方案的设计、生产、研发与销售服务。主要产品类型包括GSM/GPRS模组(2G模组)、WCDMA/HSPA模组(3G模组)、LTE模组(4G模组)、LPWA模组、5G模组、GNSS定位模组、Wi-Fi模组以及天线等。

          2021年前三季度营业收入达74.76亿元,同比增长77.66%;实现归母净利润2.37亿元,同比增长89.6%。

          数据来源:中商产业研究院整理

          3.拓邦股份

          深圳拓邦股份有限公司主营业务为智能控制系统解决方案的研发、生产和销售,即以电控、电机、电池、电源、物联网平台的“四电一网”技术为核心,面向家电、工具、新能源、工业和智能解决方案等行业提供各种定制化解决方案。

          2021年拓邦股份实现营收77.67亿元,同比增长39.69%;实现归母净利润5.65亿元,同比增长6.2%。

          数据来源:中商产业研究院整理

          4.移为通信

          上海移为通信技术股份有限公司的主营业务为物联网终端设备研发、销售业务。公司的主要产品有车载信息智能终端、资产管理信息智能终端、个人安全智能终端、动物溯源管理产品。

          2021年前三季度移为通信实现营业收入6.03亿元,同比增长99.01%;实现归母净利润1.12亿元,同比增长79.87%。

          数据来源:中商产业研究院整理

          5.新大陆

          新大陆数字技术股份有限公司的主营业务是通过商户服务平台,产业横跨物联网、数字电视和环保科技三大领域。为商户提供第三方支付服务、金融服务等商户综合运用服务;为电子支付行业和信息识别行业客户提供终端产品和系统解决方案;为移动通信行业和高速公路行业客户提供软件和系统开发等信息化服务。

          2021年前三季度新大陆实现营业收入54.16亿元,同比增长9.79%;实现归母净利润4.96亿元,同比增长10.71%。

          数据来源:中商产业研究院整理

          五、物联网行业发展前景

          1.政策利好行业发展

          工信部等八部门联合印发《物联网新型基础设施建设三年行动计划(2021-2023年)》。目标到2023年底,在国内主要城市初步建成物联网新型基础设施,社会现代化治理、产业数字化转型和民生消费升级的基础更加稳固。强调在行业标准体系、网络数据安全、知识产权等方面不断完善提高,支持物联网健康发展。

          2.技术突破带动行业发展

          物联网行业发展的内生动力正在不断增强。连接技术不断突破,NB-Iot、eMTC、Lora等低功耗广域网全球商用化进程不断加速;物联网平台迅速增长,服务支撑能力迅速提升;区块链、边缘计算、人工智能等新技术题材不断注入物联网,为物联网带来新的创新活力。受技术和产业成熟度的综合驱动,物联网呈现“边缘的智能化、连接的泛在化、服务的平台化、数据的延伸化”等特点。各项技术不断突破带动行业不断发展。

          3.应用领域丰富,市场前景广阔

          随着物联网的快速发展,物联网在生活中的应用越来越广。物联网遍及智能交通、环境保护、政府工作、公共安全、工业监测、个人健康等多个领域。物联网应用领域丰富,市场需求逐渐被释放,市场前景广阔。

        免责声明:本文来源于中商产业研究院,本文仅代表作者个人观点,本站不作任何保证和承诺,若有任何疑问,请与本文作者联系或有侵权行为联系本站删除。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/170.html b/news/170.html new file mode 100644 index 0000000..9235fd3 --- /dev/null +++ b/news/170.html @@ -0,0 +1,362 @@ + + + + +小标牌撬动大产业,泰色水晶标2.23迪培思广告展约定你!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        小标牌撬动大产业,泰色水晶标2.23迪培思广告展约定你!

        +
        +
        +
        +  2023-02-07 阅读:8 +
        +
        +

        2023年对广告标识行业来说将是一个相当不错的年份,随着疫情管控全面放开后市场的回归和不断变化的客户需求,市场将迎来更多机遇,广告标识制作商如果能够顺应和把握行业发展趋势,新的一年将会获得较大的增长空间。

        水晶标目前已经成为业内认可的高级彩色标签,拥有美化产品外观以及品牌宣传的作用,而且高级彩色标签都贴在最醒目的位置,厂商对标签的品质颜色都会很注意,厂家需要商品在货架上脱颖而出所以必须在标签上下功夫,而水晶标比普通标签更加立体高级,更能获得消费者的喜爱,可见水晶标的市场还是大有可为。

        水晶标作为广告定制行业比较新颖的制作工艺,经过2年的发展,凭借工期短,一个起印无起订量以及颜值高等优势已经得到众多消费者的青睐,应用范围极广,市场前景广阔。是选择找渠道加工定制还是直接购买设备是广告定制商需要考虑的一个问题,抛开工艺问题,其实更加省心省事省钱的选择是寻找靠谱平台加工定制。

        泰色水晶标定制网是专业的水晶标加工定制平台,依托源头实力品牌工厂强大的设备质量以及加工生产能力,拥有严谨的定制流程以及专业完善的生产线,日产水晶标达10万枚以上,买家下单后即可开始定制生产,火速由平台发货至买家,可以做到24小时闪电直发。

        泰色水晶标定制网即将亮相2月23日于广州举行的迪培思广告展,有兴趣的朋友可以前往B18展位号一探究竟!将有专业人员为您解答相关问题!不见不散!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/171.html b/news/171.html new file mode 100644 index 0000000..23f38eb --- /dev/null +++ b/news/171.html @@ -0,0 +1,362 @@ + + + + +熵基科技:规划使用ChatGPT和AIGC布局“人工智能+数字标牌”云服务业务_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        熵基科技:规划使用ChatGPT和AIGC布局“人工智能+数字标牌”云服务业务

        +
        +
        +
        +  2023-02-07 阅读:9 +
        +
        +

        熵基科技在互动平台表示,公司自主知识产权的人工智能物联网Minerval 平台将会规划使用ChatGPT和AIGC作为公司战略布局的“人工智能+数字标牌”云服务业务,应用在智慧零售场景中AI和深度学习为数据驱动的智慧数字标牌平台;在场景对象的数据采集及建模,深度学习及体验,大数据服务中使用ChatGPT和AIGC,可以在对人及物品数字动态地图建模,推送有用的商品信息和品牌商广告推送及会员支付服务,赋能实现新零售OMO转型,创新价值在于人与场景的交互价值和场景赋能价值。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/172.html b/news/172.html new file mode 100644 index 0000000..6a1bb2c --- /dev/null +++ b/news/172.html @@ -0,0 +1,362 @@ + + + + +云南省烟草公司普洱市公司2023—2025年资料印刷及装订、标识标牌及展板制作服务项目变更公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        云南省烟草公司普洱市公司2023—2025年资料印刷及装订、标识标牌及展板制作服务项目变更公告

        +
        +
        +
        +  2023-02-07 阅读:8 +
        +
        +

        1.招标条件

        “云南省烟草公司普洱市公司2023—2025年资料印刷及装订、标识标牌及展板制作服务项目”已获批准,遵循《中华人民共和国招标投标法》、《中华人民共和国招标投标法实施条例》等有关法律法规规定现已具备招标条件。云南中咨海外咨询有限公司(以下简称:招标代理机构)受云南省烟草公司普洱市公司(以下简称:招标人)委托,对本项目进行公开招标,欢迎具有相应资格和能力的投标人参与投标,择优选定合格的投标人完成本项目服务工作。

        2.招标项目概况

        2.1项目名称:云南省烟草公司普洱市公司2023—2025年资料印刷及装订、标识标牌及展板制作服务项目。

        2.2项目编号:ZZ2300065B050023。

        2.3项目预算:该项目费用预算153.58万元/年,其中:市公司本部费用预算71.58万元,具体为:办公室用于市公司办公大楼企业文化建设和资料印刷装订费用预算10.30万元、卷烟营销中心零售终端建设宣传资料及标识标牌制作服务费40.00万元、物流分公司资料印刷装订及标识标牌制作费5.00万元、法规科A6大小的宣传册印刷装订费1.50万元、安全管理科印刷及装订安全生产责任书等资料及制作安全标识标牌费0.30万元、企管科采购档案卷宗印刷及装订费2.50万元、纪检监察科资料印刷装订及PVC展板制作费7.20万元、生产科资料印刷装订及雪茄烟合同本印刷费0.28万元、技术中心病虫害防治技术手册印刷装订费4.50万元;各县(区)分公司费用预算82.00万元,具体为:景东县分公司10.0万元、镇沅县20.00万元、景谷县8.00万元、墨江县11.00万元、宁洱县8.00万元、思茅区10.00万元、江城县6.00万元、澜沧县3.00万元、孟连县6.00万元。费用预算包括但不限于材料费、制作费、设计费、装卸费、运杂费、安装费、税金以及完成本项目发生的所有费用。

        2.4资金来源及落实情况:企业自筹,已落实。

        2.5标包划分:本项目共划分为九个标包,各标包划分情况如下:

        注:符合资格要求的投标人可参加本项目多个标包投标,也可同时中多个标包。

        2.6招标范围:按照招标人实际需求,为招标人提供资料印刷及装订、标识标牌及展板制作服务,具体服务要求详见招标文件第五章“采购清单及要求”。

        2.7服务期限:本项目一招三年(2023-2025年),自合同签订生效之日至2025年12月31日止)。项目管理实行合同一签三年,供应商一年一评价,评价不合格招标人有权终止合同。在服务期限内,如遇法律法规修改或招标人所属行业政策调整不能再使用“一招三年”采购模式,以及因服务内容、合同价格等变动较大或招标人另有需要的,招标人在合理期限内提前通知中标人,有权终止合同。

        2.8交货时间及地点要求:每次接到招标人业务通知,视情况紧急程度,正常情况下在2个小时内到达招标人指定地点领取资料,紧急情况下在1个小时内到达招标人指定地点领取资料,并在招标人指定的时间内交付服务成果资料。

        2.9服务质量要求:

        2.9.1资料印刷及装订服务质量要求:符合GB/T7705-2008、GB/T7706-2008、GB/T7707-2008、GB/T9851.6-2008、GB/T9851.7-2008标准的要求。

        2.9.2标识标牌及展板制作服务质量要求:

        2.9.2.1不应有扭曲变形和明显的凹陷、凸起;

        2.9.2.2清单内标识标牌及展板材料以采购人清单内指定材质为准;清单外标识标牌及展板材料以采购人提供的服务计划指定材质为准。

        2.9.2.3周边应平直,不应有明显的毛刺、齿形和波形。平面应平整光洁。边框线应匀称、平直,不应弯曲断缺。

        2.9.2.4字号、符号的大小和线条粗细应整齐醒目,排列匀称,不应断缺和模糊不清。

        2.9.2.5表面不应有裂纹和明显的擦伤丝纹以及有影响其清晰的锈迹、斑点、暗影。

        2.9.2.6涂镀层不应有气孔、气泡、雾状、污迹、皱纹、剥落迹象和明显的颗粒杂质。

        2.9.2.7粘贴标识标牌及展板不应出现折痕、皱纹、自卷、撕裂和粘结剂渗出等现象。

        2.9.2.8标识标牌及展板的颜色应清晰醒目,色泽均匀,不应有泛色。两种及两种以上颜色套印的,色彩间边缘应整齐、清晰,两色相接处不应有间隙。

        3.投标人资格要求

        3.1投标人为中华人民共和国境内注册的法人或其他组织或自然人,具备独立承担民事责任的能力,提供有效的营业执照,且提供有效的《印刷经营许可证》。

        3.2投标人具有良好的商业信誉和健全的财务会计制度,提供证明材料或承诺书。

        3.3具有依法缴纳税收和社会保障资金的良好记录,提供相关证明材料或承诺书。

        3.4投标人在劳动保护、节能减排与生态环境保护方面符合国家规定要求,提供承诺书。

        3.5具有履行合同所必需的设备和专业技术能力,提供相关证明材料或承诺书。

        3.6信誉要求:

        3.6.1信誉良好,没有处于被责令停业,投标资格被取消,财产被接管、冻结、破产状态,在参加投标活动前3年内没有重大违法记录;

        3.6.2在中国裁判文书网站查询,投标人及法定代理人无行贿行为记录;

        3.6.3投标人提供参加投标活动前3年内,未被列入“信用中国”网站“失信被执行人”、“政府采购严重违法失信记录名单”;未被列入国家企业信用信息公示系统“严重违法失信名单(黑名单)信息”。

        3.7在投标文件递交截止时间前,投标人及其法定代表人、主要负责人和实际控制人未被烟草行业采取禁入措施,未被招标人列入不合格供应商,提供承诺书。

        3.8投标人与招标人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加投标,否则相关投标无效;单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加本项目的投标,否则相关投标无效。

        3.9本项目不允许分包、转包。

        3.10本次招标不接受联合体投标。

        4.资格审查方式

        本项目资格审查方式采用资格后审。

        5.招标文件的获取

        5.1凡有意参加投标者,请于2023年2月7日至2023年2月13日17时00分,登录云南省公共资源交易信息网(进入后切换至普洱市),凭企业数字证书(CA)在网上获取招标文件及其它招标资料(含电子招标文件;未办理企业数字证书(CA)的企业需要按照云南省公共资源交易电子认证的要求,办理企业数字证书(CA),并在云南省公共资源交易信息网完成注册通过后,便可获取招标文件,此为获取招标文件的唯一途径。

        5.2招标文件(含电子招标文件)供投标人下载使用。

        5.3招标人不提供邮购招标文件服务。

        6.投标文件的递交

        6.1投标文件递交的截止时间(投标截止时间,下同)为2023年2月27日9时00分。

        6.2电子投标文件递交方式:

        网上递交:网上递交网址为:云南省公共资源交易信息网,进入后切换至普洱市,投标人须在投标截止时间前完成所有投标文件的上传。投标人根据拟要投标的项目,按照网上投标系统要求上传全部投标文件,投标文件上传后须自行检查投标文件的完整性并进行确认签名后,方完成全部投标文件网上上传操作。投标人可自行打印“上传投标文件回执”。投标截止时间前未完成投标文件传输的,视为撤回投标文件。

        7.发布公告的媒介

        本次招标公告同时在云南省公共资源交易信息网、中国招标投标公共服务平台、中国采购与招标网、中国烟草总公司外网、中国烟草总公司云南省公司外网上发布。

        8.联系方式

        招标人:云南省烟草公司普洱市公司

        地址:普洱市思茅区人民西路85号

        联系人:潘工、刘工

        招标代理机构:云南中咨海外咨询有限公司

        地址:云南省昆明市前兴路与广福路交叉路口中天融域17幢1单元4楼

        联系人:周磊、解亚洲、李林宁、周橼杰、李杰

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/173.html b/news/173.html new file mode 100644 index 0000000..b7e255a --- /dev/null +++ b/news/173.html @@ -0,0 +1,362 @@ + + + + +四川省第四人民医院零散标识标牌采购项目询价公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        四川省第四人民医院零散标识标牌采购项目询价公告

        +
        +
        +
        +  2023-02-07 阅读:1 +
        +
        +

        四川省第四人民医院零散标识标牌采购项目 采购项目的潜在供应商应在中航招标网(http://bid.aited.cn)获取采购文件,并于2023年02月10日 11点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:0730-236012CD0009

        项目名称:四川省第四人民医院零散标识标牌采购项目

        采购方式:询价

        预算金额:0.0000000 万元(人民币)

        采购需求:

        详见附件。

        合同履行期限:合同签订生效后一年有效,按采购人要求时间交货。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2023年02月07日 至 2023年02月09日,每天上午9:00至12:00,下午12:00至17:00。(北京时间,法定节假日除外)

        地点:中航招标网(http://bid.aited.cn)

        方式:凡有意参加本项目者,请登录中航招标网(http://bid.aited.cn)完成注册(无需办理付费会员),然后选择相应的项目缴费购买即可。提示:①付款时请使用网银支付,暂不接受支付宝、微信和手机APP付款;②我公司将为购买采购文件的供应商开具电子发票,并推送至供应商下单时预留的电子邮箱,请务必确保邮箱地址正确;③网站注册咨询电话:4006722788,项目具体事宜请咨询采购代理机构。

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年02月10日 11点00分(北京时间)

        地点:成都市高新区益州大道北段777号中航国际交流中心A座1502

        五、开启

        时间:2023年02月10日 11点00分(北京时间)

        地点:成都市高新区益州大道北段777号中航国际交流中心A座1502

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        最高限价:本项目实行单价限价,单价限价详见采购清单。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:四川省第四人民医院      

        地址:成都市锦江区城守东大街12号         

        联系方式:联系人:邓老师;联系电话:028-86728390      

        2.采购代理机构信息

        名 称:中航技国际经贸发展有限公司            

        地 址:成都市高新区益州大道北段777号中航国际交流中心A座1501-1502、1508-1510             

        联系方式:联系人:罗娟、刘丽;联系电话:028-86266522/86266520/86246522/83199376-612、639            

        3.项目联系方式

        项目联系人:罗娟、刘丽

        电 话:  028-86266522/86266520/86246522/83199376-612、639

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/174.html b/news/174.html new file mode 100644 index 0000000..955e9e5 --- /dev/null +++ b/news/174.html @@ -0,0 +1,362 @@ + + + + +南江县林业局南江县森林防火宣传标示牌项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        南江县林业局南江县森林防火宣传标示牌项目竞争性磋商公告

        +
        +
        +
        +  2023-02-08 阅读:9 +
        +
        +

        一、项目基本情况

        项目编号:N5119222022000158

        项目名称:南江县森林防火宣传标示牌项目

        采购方式:竞争性磋商

        预算金额:415,975.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:采购合同签订后180日历天内完成宣传标示牌制作、安装和验收。

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        见磋商文件


        3.本项目的特定资格要求:

        采购包1:

        见磋商文件


        三、获取采购文件

        时间:2023年02月09日至2023年02月15日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年02月20日 09时00分00秒(北京时间)

        地点:通过巴中市电子化政府采购系统提交。

        五、开启

        时间:2023年02月20日 09时00分00秒(北京时间)

        地点:通过巴中市电子化政府采购系统开启。

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        项目完成时间:采购合同签订后180日历天内完成宣传标示牌制作、安装和验收。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:南江县林业局

        地址:巴中市南江县米仓山大道南磷段258号

        联系方式:13908294266

        2.采购代理机构信息

        名称:四川省宇创工程项目管理咨询有限公司

        地址:四川省巴中市南江县四川省巴中市南江县集州街道光雾山大道朝阳段1号宏帆广场7楼29-30号

        联系方式:0827-8882166

        3.项目联系方式

        项目联系人:李女士

        电话:0827-8882166

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/175.html b/news/175.html new file mode 100644 index 0000000..e3eb607 --- /dev/null +++ b/news/175.html @@ -0,0 +1,362 @@ + + + + +岳阳市城市户外电子屏广告牌项目(九华山)采购安装项目重新立项项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        岳阳市城市户外电子屏广告牌项目(九华山)采购安装项目重新立项项目公开招标公告

        +
        +
        +
        +  2023-02-08 阅读:7 +
        +
        +

        岳阳市城市建设投资集团有限公司的岳阳市城市户外电子屏广告牌项目(九华山)采购安装项目重新立项进行公开招标采购,现邀请合格投标人参加投标。

        一、采购项目基本信息

        1、采购项目名称:岳阳市城市户外电子屏广告牌项目(九华山)采购安装项目重新立项

        2、政府采购计划编号:岳财市采计[2023]000333号 

        3、委托代理编号:HNHS-2022CG-073(2)

        4、采购项目预算:6061268.88元

        □支持预付款,预付比例:%

        5、本项目对应的中小企业划分标准所属行业:工业

        6、评标方法:□最低价法 ? 综合评分法

        7、合同定价方式: ? 固定总价 □固定单价 □成本补偿 □绩效激励

        8、合同履行期限:合同签订后90日历天内供货安装完毕并验收合格

        9、本项目分阶段要求投标人提供以下保证:

        □投标保证金:采购项目预算的  %;

        ?履约保证金:中标金额的5%;

        □预付款保证金:预付款的  %;

        □质量保证金:合同金额的  %;

        二、采购人的采购需求说明:

        1.节能产品实行强制采购的,需提供国家认证机构出具的、处于有效期内的节能产品证书。

        2.同意购买进口产品的,不限制满足采购需求的国内产品参与投标。

        三、采购项目需落实的政府采购政策:

        1、优先采购:节能产品、环境标志产品、两型产品享受加分或价格折扣。

        2、支持中小企业:中小企业享受预留采购份额或价格折扣。

        四、投标人的资格要求:

        1、投标人的基本资格条件:投标人必须是在中华人民共和国境内注册登记的法人、其他组织或者自然人,且应当符合《政府采购法》第二十二条第一款的规定。

        2、落实政府采购政策需满足的资格要求:

        □专门面向: □中小企业 □小微企业 □监狱企业 □福利性单位

        □强制分包:大型企业应将采购份额的     %分包给中小企业。

        3、供应商特定资格条件:

        投标人在信用中国网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)、湖南信用网(https://credit.fgw.hunan.gov.cn/)和湖南省政府采购网(www.ccgp-hunan.gov.cn)的查询中无重大失信等被禁止投标记录;提供查询结果截图打印件并加盖公章。

        4、单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加同一合同项下的政府采购活动。

        5、为本采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的,不得再参加此项目的其他采购活动。

        6、列入失信被执行人、重大税收违法失信主体名单、政府采购严重违法失信行为记录名单的,拒绝其参与政府采购活动。

        7、联合体投标。本次招标不接受联合体投标。

        五、获取招标文件的时间、期限、地点及方式

        1、凡符合投标资格要求并有意参加投标者必须办理数字CA,登录《岳阳市公共资源交易网》(http://ggzy.yueyang.gov.cn/)下载招标文件。投标人在网上注册应对所提供的证件和证明材料的真实性承担法律责任。办理数字CA地址:湖南省数字认证服务中心有限公司(民兴路与狮子山南路交叉口)庙坡碧玉湾(南门)43号门面,电话:0730-8181828。

        2、本次招标只支持网上支付标书费报名并从系统中下载招标文件。联系电话:0730-2966692 岳阳市公共资源交易中心

        3、招标文件售价:人民币0元/本,只支持网银支付。

        4、报名及招标文件提供下载期限:从2023年2月8日起至2023年2月27日止,每天9:00-17:00(北京时间),双休日及节假日除外,各投标人自行在以上网站下载或查阅招标相关文件和资料等,恕不另行通知,如有遗漏采购人、采购代理机构概不负责。

        5、电子招标文件获取方式:投标截止时间前,供应商进入“岳阳市公共资源交易网” (http://ggzy.yueyang.gov.cn/)登录“岳阳市公共资源交易中心电子交易平台”(http://222.242.228.197:8083/TPBidder/memberLogin)进行格式化电子招标文件的下载。本项目实行网上开评标、全流程电子化,具体操作方式详见岳阳市公共资源交易网服务指南全流程电子化招投标操作手册。

        六、投标文件的制作


        本招标项目采用电子化招标采购,请投标人在“岳阳市公共资源交易网” (http://ggzy.yueyang.gov.cn/)服务指南中及时下载安装最新版本“新点投标文件制作软件(岳阳版)”。参与投标的投标人需使用电子标书编制软件制作YYGCZF格式投标文件。本项目电子投标文件最大容量为200MB,超过此容量的文件将被拒绝。制作电子投标文件时,投标人须编制投标文件的内容目录和详细页码,其制作软件的下载安装和电子投标文件的制件说明(含电子签章的操作流程)可详见“岳阳市公共资源交易网” (http://ggzy.yueyang.gov.cn/)的服务指南《全流程电子化招投标操作手册》。

        七、投标文件的递交

        投标文件递交截止时间(投标截止时间,下同)2023年3月1日9时30分(北京时间),投标人应在投标截止时间前通过岳阳市公共资源交易平台递交数据电文形式的电子投标文件并完成在线签到。其递交的电子投标文件具备法律效力,逾期递交的电子投标文件,电子交易平台将予以拒收。

        八、投标文件的解密

        电子投标文件的解密截止时间为2023年3月1日10时00分(北京时间)(系统设置为开标后30分钟内),投标人可在单位在线解密,如在开标现场解密的请自备解密电脑和网络。投标人安排专人在网上进行开标签到,并按要求完成电子投标文件的远程解密,逾期未解密的,视为放弃投标资格。

        九、投标人澄清、补正和说明

        评标过程中,如评委专家要求投标人进行必要的澄清、说明和补正的,投标人应在线保持关注,及时登录岳阳市公共资源交易中心电子交易平台(http://222.242.228.197:8083/TPBidder/memberLogin)进行网上回复,并上传提交相关资料,逾期未回复的,视为放弃澄清、说明和补正的权利。

        十、公告期限

        1、本招标公告在中国湖南政府采购网(www.ccgp-hunan.gov.cn)发布。公告期限从本招标公告发布之日起5个工作日。

        2、在其他媒体发布的招标公告,公告内容以本招标公告指定媒体发布的公告为准;公告期限自本招标公告指定媒体最先发布公告之日起算。

        十一、询问及质疑

        1、投标人对政府采购活动事项如有疑问的,可以向采购人、采购代理机构提出询问。采购人、采购代理机构将在3个工作日内作出答复。

        2、投标人对电子交易平台办理CA证书、操作等如有疑问,请咨询电子交易平台服务机构。

        3、潜在投标人认为招标文件或招标公告使自己的合法权益受到损害的,可以在收到招标文件之日或招标公告期限届满之日起7个工作日内,按《湖南省财政厅关于印发<政府采购质疑答复和投诉处理操作规程>的通知》(湘财购〔2019〕20号)规定,以纸质书面形式向采购人、采购代理机构提出质疑。

        十二、投标说明

        1、本公告选项:?表示选择,□表示未选择。

        2、投标人参与政府采购活动,无需向采购人、代理机构、交易平台缴纳任何费用。

        十三、投标保证金

        根据岳财函【2020】46号文规定,本项目不要求缴纳投标保证金。

        十四、采购项目联系人姓名和电话:

        采购人:岳阳市城市建设投资集团有限公司

        地  址:岳阳市岳阳楼区科技信息大楼

        联系人:许峥

        联系电话:0730-8299370

        采购代理机构:湖南泓盛项目管理有限公司      

        地址:湖南省岳阳市岳阳楼区金鹗东路219号万象瑞城4栋1713室

        联系人:张燕

            联系电话:0730-8280355

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/176.html b/news/176.html new file mode 100644 index 0000000..716d085 --- /dev/null +++ b/news/176.html @@ -0,0 +1,362 @@ + + + + +东营银行青岛分行大尧三路支行装修、广告牌工程项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        东营银行青岛分行大尧三路支行装修、广告牌工程项目竞争性磋商公告

        +
        +
        +
        +  2023-02-08 阅读:80 +
        +
        +

        一、招标条件
        本东营银行青岛分行大尧三路支行装修、广告牌工程项目己由项目审批/核准/备案机关批准,项目资金来源为国有资金1235649.48万元,招标人为东营银行青岛分行。本项目已具备招标条件,现招标方式为其它方式。
        二、项目概况和招标范围
        规模:东营银行青岛分行大尧三路支行装修、广告牌工程项目范围:本招标项目划分为2个标段,本次招标为其中的:
        (001)东营银行青岛大尧三路支行装修工程;(002)东营银行青岛大尧三路支行广告牌工程;
        三、投标人资格要求
        (001东营银行青岛大尧三路支行装修工程)的投标人资格能力要求:1)在中华人民共和国境内注册的。
        2)招标公告发布之日前三年内无行贿犯罪等重大违法记录。
        3)第一包投标人须具有建筑装饰装修工程专业承包一级资质。
        4)通过“信用中国”网站查询,未被列入失信被执行人、重大税收违法案件当事人、严重违法失信行为记录名单。
        5)本项目不接受联合体投标。
        (002东营银行青岛大尧三路支行广告牌工程)的投标人资格能力要求:1)在中华人民共和国境内注册的。
        2)招标公告发布之日前三年内无行贿犯罪等重大违法记录。
        3)第一包投标人须具有建筑装饰装修工程专业承包一级资质。
        4)通过“信用中国”网站查询,未被列入失信被执行人、重大税收违法案件当事人、严重违法失信行为记录名单。
        5)本项目不接受联合体投标。
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年02月06日 09时00分到2023年02月10日16时30分
        每套人民币300元整,采购文件售后不退
        五、投标文件的递交
        递交截止时间:2023年02月16日 14时00分
        六、开标时间
        开标时间:2023年02月16日14时00分
        联系人:刘 工
        联系人电话:15210491817
        联系人邮箱:zbgs666@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/177.html b/news/177.html new file mode 100644 index 0000000..7eb9d25 --- /dev/null +++ b/news/177.html @@ -0,0 +1,362 @@ + + + + +遂宁市河东新区2023年上半年道路标识标牌项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        遂宁市河东新区2023年上半年道路标识标牌项目竞争性磋商公告

        +
        +
        +
        +  2023-02-09 阅读:17 +
        +
        +

        一、项目基本情况

        项目编号:N5109882023000003

        项目名称:河东新区2023年上半年道路标识标牌项目

        采购方式:竞争性磋商

        预算金额:658,553.24元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起365日

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目专门面向中小企业采购(监狱企业、残疾人福利性单位视同小型、微型企业)。


        3.本项目的特定资格要求:

        采购包1:

        供应商及其现任法定代表人、主要负责人在参加本次政府采购活动前不得具有行贿犯罪记录。


        三、获取采购文件

        时间:2023年02月10日至2023年02月16日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年02月20日 14时30分00秒(北京时间)

        地点:遂宁市新正工程项目管理有限公司二楼多功能会议室。

        五、开启

        时间:2023年02月20日 14时30分00秒(北京时间)

        地点:遂宁市新正工程项目管理有限公司二楼多功能会议室。

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本项目采购过程中需要使用四川省政府采购一体化平台,登录方式及地址:通过四川政府采购网(www.ccgp-sichuan.gov.cn)首页供应商用户登录,供应商应当按照以下要求进行系统操作。

        (一)供应商应当自行在四川政府采购网-办事指南查看相应的系统操作指南,并严格按照操作指南要求进行系统操作。在登录、使用采购一体化平台前,应当按照要求完成供应商注册和信息完善,加入采购一体化平台供应商库。

        (二)供应商应当使用纳入全国公共资源交易平台(四川省)数字证书互认范围的数字证书及签章(以下简称“互认的证书及签章”)进行系统操作。供应商使用互认的证书及签章登录采购一体化平台进行的一切操作和资料传递,以及加盖电子签章确认采购过程中制作、交换的电子数据,均属于供应商真实意思表示,由供应商对其系统操作行为和电子签章确认的事项承担法律责任。

        已办理互认的证书及签章的供应商,校验互认的证书及签章有效性后,即可按照系统操作要求进行身份信息绑定、权限设置和系统操作;未办理互认的证书及签章的供应商,按要求办理互认的证书及签章并校验有效性后,按照系统操作要求进行身份信息绑定、权限设置和系统操作。互认的证书及签章的办理与校验,可查看四川政府采购网-办事指南。

        供应商应当加强互认的证书及签章日常校验和妥善保管,确保在参加采购活动期间互认的证书及签章能够正常使用;供应商应当严格互认的证书及签章的内部授权管理,防止非授权操作。

        (三)供应商应当自行准备电子化采购所需的计算机终端、软硬件及网络环境,承担因准备不足产生的不利后果。

        (四)采购一体化平台技术支持:

        在线客服:通过四川政府采购网-在线客服进行咨询

        400服务电话:4001600900
         

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:遂宁市河东新区市政公用事务中心

        地址:遂宁市河东新区涪园路9号

        联系方式:0825-2911107

        2.采购代理机构信息

        名称:遂宁市新正工程项目管理有限公司

        地址:四川省遂宁市河东新区香林北路243号

        联系方式:0825-2922251

        3.项目联系方式

        项目联系人:郑女士

        电话:15082596661

        遂宁市新正工程项目管理有限公司

        2023年02月09日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/178.html b/news/178.html new file mode 100644 index 0000000..1474709 --- /dev/null +++ b/news/178.html @@ -0,0 +1,362 @@ + + + + +昆明市富滇银行总行新办公大楼标识标牌配置项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        昆明市富滇银行总行新办公大楼标识标牌配置项目招标公告

        +
        +
        +
        +  2023-02-09 阅读:27 +
        +
        +

        一、招标条件
        本富滇银行总行新办公大楼标识标牌配置项目已由项目审批/核准/备案机关批准,项目资金来源为自筹资金130万元,招标人为富滇银行股份有限公司。本项目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围1
        规模:详见招标公告
        范围:本招标项目划分为1个标段,本次招标为其中的:(001)富滇银行总行新办公大楼标识标牌配置项目;
        三、投标人资格要求
        (001 富滇银行总行新办公大楼标识标牌配置项目)的投标人资格能力要求:详见招标公告;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年02月10日09时00分到2023年02月16日17时00分
        五、投标文件的递交
        递交截止时间:2023年03月02日10时00分
        六、开标时间及地点
        开标时间:2023年03月02日10时00分
        七、其他
        1.招标条件
        2.项目概况与服务内容
        2.1项目名称:富滇银行总行新办公大楼标识标牌配置项目
        2.2招标范围:富滇银行总行新办公大楼标识标牌配置,主要的配置范围包含大堂形象LOGO展示、大堂区域标识指引、电梯厅标识、电梯高低区指示、各层电梯标号、办公区标识指引、功能房门牌、楼梯间楼层号等,共计约4800余个。(具体详见第四章“技术标准或服务要求1
        2.3资金来源:自筹,资金落实情况:已落实。
        —2.4招标控制价(价税合计):¥1291485.00元(大写:壹佰贰拾玖万壹仟肆佰捌拾伍整)2.5交货时间:30日历天内完成供货及安装。
        2.6交货地点:招标人指定地点。
        1 2.7质量要求:满足相关法律法规及招标人要求。
        2.8质保期:3年。
        3.投标人资格要求
        3.1投标人须为中华人民共和国境内登记注册的企业(事业)法人或其他组织,具备有效的营业执照(或其他类型法人机构法定证明文件)。
        3.2投标人未被列入中国执行信息公开网(http://zxgk.court.gov.cn/shixin/)“失信被 执行人名单”投标人在国家企业信用信息公示系统(www.gsxt.gov.cn)中未被列入严重违法失信企业名单(黑名单)且未被移出的不良情况(由招标代理公司在投标截止时间前一天查询并于评标当天将查询结果截图提交评标委员会)。
        3.3 具有健全的财务会计制度:2019年至2021年(年份要求)经第三方机构审计的审计报告及报表(包含资产负债表、现金流量表、利润表(或损益表或利润分配表))。【注:成立不足3年的,则提供成立至今的经会计师事务所审计的财务状况报告(包括但不限于资产负债表、现金流量表、利润表(或损益表或利润分配表));若为2022年新成立的公司,提供银行开具的资信证明文件或资金证明文件。】
        3.4 本次招标不接受联合体参加。
        注 ①与招标人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加投标;
        ②单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加同一招标项目(或同一标段)投标。
        4.资格审查方式:资格后审。
        5.招标文件的获取
        凡有意参加投标者,请于2023年2月10日至2023年2月16日(周末、法定节假日除外),每日上午09时00分至12时00分,下午13时30分至17时00分(北京时间)获取招标文件。
        招标文件 ¥600 每份,售后不退。
        获取招标文件时,须投标人加盖公章的营业执照复印件、法定代表人身份证明、法定代表人授权委托书、代理人身份证原件获取。
        6.投标文件的递交 1
        递交投标文件截止时间为2023年3月2日上午10时00分(北京时间)
        请联系后获取详细的招标公告、报名表格、项目附件及相关文件等。
        联系人:赵 琳
        联系电话:185 1840 8518
        邮 箱:zqsd8518@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/179.html b/news/179.html new file mode 100644 index 0000000..8f80136 --- /dev/null +++ b/news/179.html @@ -0,0 +1,362 @@ + + + + +冠捷科技:目前公司已推出了电子标牌、会议预约屏、公交信息牌等各类电子墨水屏产品_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        冠捷科技:目前公司已推出了电子标牌、会议预约屏、公交信息牌等各类电子墨水屏产品

        +
        +
        +
        +  2023-02-09 阅读:12 +
        +
        +

        有投资者向冠捷科技提问, 请问贵公司在电子纸领域是否有技术或业务上的突破?是否有计划在此领域扩大市场份额?

        公司回答表示,您好,公司始终着力于加大创造消费新场景的投资,创新打造智能化、数字化的全屏视讯生态。针对蓬勃发展的电子纸产业,公司早已紧随时代发展趋势,与全球电泳式电子纸显示技术领导厂商——E Ink元太科技展开协同深化合作,进军电子纸领域,深入拓展电子纸应用,着力于完善电子墨水屏相关的显示产品线布局。


        针对新零售、教育、政企办公、交通、医疗等行业领域,目前公司已推出了电子价签、电子标牌、电子桌牌、会议预约屏、床头卡&床尾卡、智能输液标签、病房门口屏、公交信息牌等各类电子墨水屏产品,搭配其成熟的软硬件一体化显示解决方案,可满足不同场景的应用需求。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/18.html b/news/18.html new file mode 100644 index 0000000..b99166f --- /dev/null +++ b/news/18.html @@ -0,0 +1,362 @@ + + + + +三思近1000㎡裸眼3D大屏,闪耀美国AT&T总部大楼_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        三思近1000㎡裸眼3D大屏,闪耀美国AT&T总部大楼

        +
        +
        +
        +  2022-05-01 阅读:210 +
        +
        +

        近期,一段视频在网上引起广泛关注——在金碧辉煌的四方体内,无数彩色的小球掉落,敲击在遍布四周的金属物体上,奏出一曲清脆悦耳的铃声,俨然一个巨大的八音盒,妙趣横生。

          这一栩栩如生的画面,上演于美国得克萨斯州的达拉斯市中心——全球知名通信公司AT&T总部大楼外墙的裸眼3D屏上 。这块近1000平米 的裸眼3D高清大屏 ,让整座大楼顿生活力,令所有看到它的人都赞叹不已。

          殊不知,这块位于大洋彼岸的科技杰作,正是由中国品牌——上海三思研发定制和生产的。

          AT&T大楼裸眼3D屏 / 图源美国SNADisplays

          作为全球知名的通信公司,AT&T意将其总部大楼打造成为“内外兼修”的视听体验殿堂,而这块裸眼3D大屏便是建筑的焦点之一。屏幕采用P6.67点间距,分辨率为3840×4752,总像素达1820万,是美国达拉斯市中心耀眼和备受瞩目的户外显示大屏之一。

          AT&T大楼 / 图源美国SNADisplays

          为营造出科技与人文和谐交融的沉浸式视听环境,该裸眼3D屏采用了L型折角的造型 ,采用 上海三 思自主研发定制的模块 ,设计成为1.6米半径的弧面,使画面能够无缝衔接,避免因90度折角造成画面折叠, 在展示时保持流畅和自然,更加赏心悦目。

          AT&T大楼 / 图源美国SNADisplays

          户外大屏的运行,稳定可靠至关重要。三思裸眼3D大屏具有IP65的防水防尘等级 ,能经受户外暴晒、大雨、灰尘等恶劣环境的考验,有效节省后期维护更换的成本;箱体在实现后维护的同时,还可实现 前维护 ,大大提高维修保养的方便性;模块级CPU处理技术 ,自动存储校正数据,并提高数据传输效率;显示模块独立连接 ,防止因单一模块故障引发连锁反应。所有技术叠加,保障运行稳定、安全可靠。

          AT&T大楼 / 图源美国SNADisplays

          在视听技术大行其道的今天,光与影、声与色,都能通过显示屏应用呈现于众,打造出潮流魔幻的体验场景。特别是极具创意的裸眼3D大屏和震撼的沉浸式视觉场景,正逐步成为塑造城市和品牌形象的主流方式之一。

          AT&T大楼 / 图源美国SNADisplays

          作为国家"百城千屏"8K LED显示屏制作商,上海三思已为美国哥伦布市会议中心3D人头雕塑、美国salesforce大楼“瀑布墙”、美国时代广场1600㎡弧形屏、沈阳中街500㎡裸眼3D屏、上海世博会国家电网馆“魔盒”等多项海内外大型工程提供了显示产品及创意解决方案,打造了一张又一张特色城市名片。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/180.html b/news/180.html new file mode 100644 index 0000000..371f2cd --- /dev/null +++ b/news/180.html @@ -0,0 +1,362 @@ + + + + +雄安新区永久基本农田保护标志牌设置工作招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        雄安新区永久基本农田保护标志牌设置工作招标公告

        +
        +
        +
        +  2023-02-11 阅读:14 +
        +
        +

        一、项目基本情况

        项目编号:HXZB2022-X1-00295-001

        项目名称:雄安新区永久基本农田保护标志牌设置工作

        预算金额:1840000

        最高限价(如有):1840000元

        采购需求:雄安新区永久基本农田保护标志牌设计、制作与安装。

        合同履行期限:服务期限:70天。

        本项目不接受联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:本项目专门面向中小企业采购,投标人应为中小企业(监狱企业、残疾人企业视为小型、微型企业)。

        3.本项目的特定资格要求:(1)单位负责人为同一人或者存在直接控股、管理关系的不同单位,不得同时参加本项目的投标;注:根据《财政部关于在政府采购活动中查询及使用信用记录有关问题的通知》(财库【2016】125号)及冀财采〔2020〕5号等相关文件要求,开标当日将通过“中国执行信息公开网”(http://zxgk.court.gov.cn/)、“信用中国”网站(www.creditchina.gov.cn)、“中国政府采购网”(http://www.ccgp.gov.cn/)查询供应商是否列入失信被执行人、重大税收违法案件当事人名单(税收违法黑名单)、政府采购严重违法失信行为记录名单(处罚期限尚未届满的)。查询到供应商列入失信被执行人、重大税收违法案件当事人名单(税收违法黑名单)、政府采购严重违法失信行为记录名单(处罚期限尚未届满的)的,将否决其投标文件。

        三、获取招标文件

        时间:2023年02月11日至2023年02月17日,每天上午8:30至12:00,下午12:00至17:00(北京时间,法定节假日除外)

        地点:雄安新区公共资源交易服务平台(http://www.xaprtc.com/)及惠招标电子招投标交易平台( http://www.hbidding.com)两个平台网站(缺一不可)。

        方式:其它

        售价:0元

        四、提交投标文件截止时间、开标时间和地点

        2023年03月07日09点30分(北京时间)

        地点:惠招标电子招投标交易平台。(本次招标采用全流程电子化形式,供应商不参与现场开标,需远程解密。)

        五、公告期限

        自本公告发布之日起5个工作日。

        十、其他补充事宜

        1、未在雄安新区公共资源交易服务平台注册供应商的潜在供应商,请在获取招标文件截止时间前登录“雄安新区公共资源交易服务平台” (http://www.xaprtc.com/),点击首页左下方的“供应商”按钮访问“雄安新区公共资源电子交易平台-招标投标交易平台-用户登录”,在登录界面点击“新用户注册”进行免费注册和登记信息。已完成注册的供应商不必重复注册。注册时请将相关证件原件进行扫描上传。网上提交相关信息和资料,档案状态栏变为有效后,即可参与投标。供应商按项目从“雄安新区公共资源交易服务平台”网上完成关注,并下载招标文件。在获取招标文件截止时间前如因投标单位自身的原因未能在有效时间内完成注册,并从网上完成关注本项目并下载招标文件,将导致获取招标文件不成功,其后果由投标单位自负。2、供应商须在惠招标电子招投标交易平台(http://www.hbidding.com)完成注册。未经注册的投标单位按照惠招标-帮助中心说明进行注册。惠招标电子招投标交易平台技术支持及问题咨询联系方式:4007809998。3、供应商须在“雄安新区公共资源交易服务平台”、“惠招标电子招投标交易平台”两个平台网站(缺一不可)自主网上关注、下载招标文件及相关资料,并及时查看有无澄清和修改。供应商需要在雄安新区公共资源交易服务平台及时查看有无澄清及修改,对招标文件有疑问或异议的,可以在招标文件规定的时间内通过雄安新区公共资源交易服务平台提出。潜在供应商如未同时在“雄安新区公共资源交易服务平台”和“惠招标电子招投标交易平台”下载相关资料,或未获取到完整资料,导致投标无效的,自行承担责任。4、本公告发布媒体:中国政府采购网、中国河北政府采购网、雄安新区公共资源交易服务平台、惠招标电子招投标交易平台同时发布。5、雄安新区公共资源交易中心为政府采购全流程监督工作提供场地,监管部门工作人员应实时监督各参与主体的行为并依法合规进行处理。6、根据疫情防控需要,若不能按时开标则另行提前通知延后的具体开标时间。7、采购人名称由河北雄安新区管理委员会规划建设局变更为河北雄安新区管理委员会自然资源和规划局。

        十一、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名 称:河北雄安新区管理委员会规划建设局

        地    址:河北省容城县白洋淀大道办公区

        联系方式:0312-5628620

        2.采购代理机构信息(如有)

        名 称:河北宏信招标有限公司

        地 址:河北省石家庄市新华区合作路68号新合作广场B座14层

        联系方式:0312-5675070

        3.项目联系方式

        项目联系人:吴红亮、楚胜男、杨超

        电 话:0312-5675070

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/181.html b/news/181.html new file mode 100644 index 0000000..a201bac --- /dev/null +++ b/news/181.html @@ -0,0 +1,362 @@ + + + + +河南省肿瘤医院标识标牌及印刷类物品制作供应商招标项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        河南省肿瘤医院标识标牌及印刷类物品制作供应商招标项目

        +
        +
        +
        +  2023-02-13 阅读:10 +
        +
        +

        河南省肿瘤医院标识标牌及印刷类物品制作供应商招标项目,采购人为河南省肿瘤医院,项目已具备采购条件,现对该项目进行竞争性磋商,诚邀合格的供应商参加。
        一、项目概况
        1、项目名称:河南省肿瘤医院标识标牌及印刷类物品制作供应商招标项目
        2、项目编号:2023-010
        3、采购方式:竞争性磋商
        4、预算金额:约 1400000元/年,每家不超 1000000元
        5、采购需求
        5.1 采购内容:河南省肿瘤医院标识标牌及印刷类物品制作供应商招标项目,遴选 2家印刷服务公司;标识标牌和印刷品的种类、年使用量、参数要求、服务要求详见磋商文件第四章采购人需求;
        5.2 服务地点:采购人指定地点;
        5.3 质量要求:满足采购人要求;
        5.4 服务期限:三年,合同一年一签,一年一考核,达到考核标准才可续签下一年合同;
        6、合同履行期限:同合同有效期
        7、是否接受进口产品:否
        二、供应商资格要求1、符合《中华人民共和国政府采购法》第二十二条规定;
        1.1具有独立承担民事责任的能力;(法人或者其他组织的有效的营业执照等证明文件)
        1.2具有良好的商业信誉和健全的财务会计制度;(提供 2019年度、2020年度、2021年度任意一年经审计的财务年审报告,成立时间较短不能提供的,应提交开户银行出具的资信证明)
        1.3具有履行合同所必须的设备和专业技术能力;(提供证明材料或承诺,格式自拟)
        1.4有依法缴纳税收的良好记录;(提供近一年内(任意 1个月)供应商缴纳税收凭据,依法免税的,应提供相应文件证明)
        1.5参加政府采购活动前三年内,在经营活动中没有重大违法记录;(提供书面声明)
        2、信誉要求:根据《关于在政府采购活动中查询及使用信用记录有关问题的通知》(财库[2016]125号)的规定,通过“信用中国”网站跳转至“中国执行信息公开网”查询“失信被执行人”,通过“信用中国”网站查询“重大税收违法失信主体”,通过中国政府采购网查询“政府采购严重违法失信行为记录名单”。
        3、单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加同一项目投标。(提供供应商在“国家企业信用信息公示系统”查询的公司基本信息、股东信息及股权变更信息网上截图);
        4、本项目不接受联合体投标。
        三、磋商文件获取时间:2023年 2月 13日至 2023年 2月 17日,每日上午 08时 00分至 12时 00分,下午 14时 30分至 17时 30分(北京时间,法定节假日除外)
        方式:各潜在供应商无须到现场获取采购文件,凡有意参加的供应商,须在采购文件获取时间内将加盖公章的法定代表人授权委托书或法定代表人身份证明及法定代表人身份证及被授权人的身份证复印件、采购文件费缴纳证明(发送时邮件标题注明项目名称、供应商名称及联系方式)发至邮箱,并电话告知采购代理机构。采购代理机构收到资料后将采购文件电子版发回至供应商邮箱。
        售价:采购文件售价 300元,售后不退。供应商采用银行转账方式转入采购代理机构指定账户,转账时备注供应商名称+项目名称。
        四、响应文件的递交
        1、响应文件递交的截止时间(投标截止时间,下同)为 2023年 2月 23日 9时 30分(北京时间)。
        2、逾期送达的或者未送达指定地点的响应文件,采购人不予受理
        报名资料发送至邮箱(zbgsbj@163.com)获取投标报名表
        联系人:徐经理
        手 机:15600047262
        联系人:刘工
        手 机:13021234884
        邮 箱:zbgsbj@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/182.html b/news/182.html new file mode 100644 index 0000000..1b35b9b --- /dev/null +++ b/news/182.html @@ -0,0 +1,362 @@ + + + + +乐陵农商银行日常印刷品供应商入围项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        乐陵农商银行日常印刷品供应商入围项目公开招标公告

        +
        +
        +
        +  2023-02-13 阅读:9 +
        +
        +

        一、招标条件
        乐陵农商银行日常印刷品供应商入围项目已由项目审批/核准/备案机关批准,项目资金来源为其他资金详见招标文件,招标人为山东乐陵农村商业银行股份有限公司。本项目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:详见招标文件范围:本招标项目划分为 1 个标段,本次招标为其中的: (001)乐陵农商银行日常印刷品供应商入围项目;
        三、投标人资格要求
        (001 乐陵农商银行日常印刷品供应商入围项目)的投标人资格能力要求:1、投标人须在中国境内注册;具备履行本项目合同所必须的人员,设备及专业技术能力;2、单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加同一合同项下的招标活动;3、在“信用中国”网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)“信用山东”网站(www.creditsd.gov.cn)中被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的投标人,不得参加本次招标活动;4、参加本次采购活动前三年内,在经营活动中没有重大违法记录;5、本项目不接受联合体投标;6、法律法规合格投标人的其他要求、规定。;本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从 2023 年 02 月 10 日 12 时 00 分到 2023 年 02 月 17 日 18 时 00 分
        报名所需资料(提供以下资料原件的复印件并加盖公章):1)营业执照、税务登记证、组织机构代码证(或三证合一的营业执照);1)营业执照、税务登记证、组织机构代码证(或三证合一的营业执照);售价:300 元/份,招标文件售出不退;注:因系统注册、报名信息提交后须审核,请各投标人(供应商)注意报名时限,因投标人(供应商)自身原因线上报名贻误导致报名不成功的,投标人(供应商)自行承担责任。
        五、投标文件的递交截止时间:2023 年 03 月 03 日 09 时 30 分
        六、开标时间:2023 年 03 月 03 日 09 时 30 分
        七、其他
        (一)项目概况:本次采购需求种类包含但不限于宣传折页、宣传展板、宣传条幅、公示牌、会议桌签、日常单据、门牌等;为保证日常印刷品需求多样性和时效性,本次采购拟入围 4 家供应商。
        (二)服务期限:2 年
        (三)标段划分:本项目一个标包
        (四)公告期限:2023 年 02 月 10 日至 2023 年 02 月 17 日
        联系人:侯 工
        手 机:15210675113
        邮 箱:ztbxx177@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/183.html b/news/183.html new file mode 100644 index 0000000..d6002cd --- /dev/null +++ b/news/183.html @@ -0,0 +1,362 @@ + + + + +情人节周生生“饰”爱,数字标牌玩转视觉营销_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        情人节周生生“饰”爱,数字标牌玩转视觉营销

        +
        +
        +
        +  2023-02-14 阅读:16 +
        +
        +

        珠宝行业“饰”爱,数字标牌营销

        周生生

        一键开启2.14浪漫之旅

        情人节将至,在这个浪漫的节日里,空气中都弥漫着粉红气息!珠宝行业即将迎来黄金时期,用户购买需求急剧上升,如何抓住情人节,抢占营销c位,来看看黄金行业巨头周生生是怎么做的。


        「周而复始生生不息」是周生生创办人的命名理念,不断努力创新的周生生,以其敏锐的商业触觉洞悉市场趋势,于各大城市积极布局,深入发展。周生生门店现已经过数字化升级,门店沿袭一贯的优雅大方气质,结合数字化升级后带来的用户视觉互动感,为消费者带来耳目一新的购物体验。


        周生生是如何整装待发,玩转营销的呢?

        Valentine‘s Day


        产品展示

        01.打造个性化门店,提升体验感

        门店体验感升级,提供珠宝个性化消费场景,提供多场景化消费感受。机器支持投屏,可进行现场求婚。打造店内产品与消费者相融合的新消费模式

        02.门店营销快速推陈出新产品

        珠宝首饰款式和设计更新迭代快,在展示外在美方面表现突出,其高端展示方式效果好,快速更换展示新品,提升品牌的SKU商品展现率

        03.品牌在众多门店中脱颖而出

        选用仙视LED屏突出单品,炫酷大屏,一眼吸睛,利用数字化动态屏幕显示,吸引消费者,在众多珠宝品牌中脱颖而出,提升店铺销售额





        2.14

        情人节

        提升品牌形象

        高端的商品展示在数字标牌中不仅便利、能够刺激消费者的购买欲,而且能够借此提高企业产品和品牌的形象。选取其中符合消费者的购买习惯和门店定位的模板与营销策略运营产品的特征,从审美角度对产品的展示进行艺术的加工,来取得更大的效益。





        大屏营销

        提高珠宝附加值

        在数字标牌中播放代言明星的相关视频和海报,提高产品影响力,让珠宝的传播力和影响力更加广泛。针对目标消费群次,利用加强商品视觉效果的展示,引导顾客购物,符合品牌调性,实现产品与服务升值。


        播放周生生品牌的发展史,保护企业的信用,提高珠宝的可信度,使消费者易于接收珠宝的各种信息,打造品牌心智,增添购买机遇,制造潜在利润。

        长久以来,仙视零售显示整体解决方案服务商始终以创新为源动力,打造第三空间体验,线下门店的品牌塑造和长期维系用户忠诚度。致力于通过更丰富的标牌产品矩阵,深入挖掘各领域各场景的痛点,深度整合核心诉求,为客户实行定制化的解决方案,帮助达到“千人千面”的营销效果。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/184.html b/news/184.html new file mode 100644 index 0000000..5ae6fa3 --- /dev/null +++ b/news/184.html @@ -0,0 +1,362 @@ + + + + +利川市委宣传部新时代文明实践中心整体标识标牌(项目)竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        利川市委宣传部新时代文明实践中心整体标识标牌(项目)竞争性磋商公告

        +
        +
        +
        +  2023-02-14 阅读:24 +
        +
        +

        一、项目基本情况
        1、项目编号:LBX-ES-2023005
        2、采购计划备案号:无
        3、项目名称:新时代文明实践中心整体标识标牌(项目)
        4、采购方式:竞争性磋商
        5、预算金额:39.916956(万元)
        6、最高限价:39.916956(万元)
        7、采购需求:
        新时代文明实践中心整体标识标牌(项目)的建设内容,具体详见设计图纸及工程量清单全部内容。
        8、合同履行期限:20日历天
        9、本项目(是/否)接受联合体投标:否
        10、是否可采购进口产品:否
        11、本项目(是/否)专门面向中小微企业:是
        二、申请人的资格要求
        1、满足《中华人民共和国政府采购法》第二十二条规定,即:
        (1)具有独立承担民事责任的能力;
        (2)具有良好的商业信誉和健全的财务会计制度;
        (3)具有履行合同所必需的设备和专业技术能力;
        (4)有依法缴纳税收和社会保障资金的良好记录;
        (5)参加政府采购活动前三年内,在经营活动中没有重大违法记录;
        (6)法律、行政法规规定的其他条件。
        2、单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加本项目同一合同项下的政府采购活动。
        3、为本采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的,不得再参加本项目的其他招标采购活动。
        4、未被列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重违法失信行为记录名单。
        5、落实政府采购政策需满足的资格要求:
        根据《政府采购促进中小企业发展管理办法》(财库〔2020〕46号)规定,本项目专门面向中小企业采购。根据工业和信息化部国家统计局国家发展和改革委员会财政部《中小企业划型标准规定》(工信部联企业〔2011〕300 号)的规定,提供所属行业中小企业声明函。
        6、本项目的特定资格要求:
        6.1、供应商需具备相关经营范围的营业执照。
        6.2、根据恩施州人社发【2016】23号“关于落实《恩施州建设领域劳动者工资支付保障实施办法》相关规定的意见”及此意见的补充通知(恩施州人社发【2017】35号)规定,本项目竞标人到递交磋商响应文件时间截止时,无因拖欠劳动者工资受到行政处理处罚且在行政处理处罚期限内的或无因拖欠劳动者工资经人民法院判决且未执行完毕的或未自觉履行完毕的情形(竞标人应作出承诺,否则竞标人的竞标将被拒绝)。
        6.4竞标人需提供未被“信用中国”网站(http://www.creditchina.gov.cn)和“中国政府采购网”(www.ccgp.gov.cn)网站列入“失信被执行人”、“重大税收违法案件当事人名单”、“政府采购严重违法失信名单”,(竞标人应提供网站查询截图并加盖公章,查询时间须是本项目发布公告之日起,方可有效。否则投标人的竞标申请将被拒绝)。
        三、获取采购文件
        1、时间:2023年02月13日至2023年02月17日,每天上午08:30至12:00,下午14:30至17:30(北京时间,法定节假日除外)
        2、方式:
        持获取登记表(现场填写或邮件索取)、法人授权委托书原件、经办人身份证、营业执照副本、组织机构代码证、税务登记证(或三证合一的营业执照)、中小企业声明函,全部资料加盖单位鲜章的复印件一套获取招标文件,或通过邮箱提交相关文件的扫描件加盖公章,然后致电确认获取文件信息,经确认后发送磋商文件,因扫描件不清晰导致无法获取文件的后果,由投标人自行承担。
        3、售价:0(元)
        四、响应文件提交
        1、开始时间:2023年02月22日08点30分(北京时间)
        2、截止时间:2023年02月22日09点00分(北京时间)
        五、开启
        1、时间:2023年02月22日09点00分(北京时间)
        六、公告期限
        自本公告发布之日起3个工作日。
        联系人:刘工
        联系电话:135-2104-0942
        电子邮箱:zbcg558@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/185.html b/news/185.html new file mode 100644 index 0000000..c78d491 --- /dev/null +++ b/news/185.html @@ -0,0 +1,362 @@ + + + + +AOC炫彩系列X2-R数字标牌,打造“商业亮点”!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        AOC炫彩系列X2-R数字标牌,打造“商业亮点”!

        +
        +
        +
        +  2023-02-14 阅读:17 +
        +
        +

        数字化多媒体时代,数字标牌已在绝大多数领域取代传统标牌,并广泛应用于政府机关、酒店、商场、写字楼、医院、高档小区、高尔夫球场、高档俱乐部等场景,发挥着不可或缺的重要作用。AOC旗下炫彩系列X2-R数字标牌,即凭借着简约外观、高清画质、长久运行等特性,充分满足各行业用户的应用需求,切实打造“商业亮点”!

        卓越性能

        信息展示灵活从容

        不同于传统标牌,炫彩系列X2-R数字标牌采用窄边框四等边设计,外观简约大气,进行多联屏云拼接,画面展示更完整,视觉效果更震撼。同时,考虑到商业内容展示越清晰,更能吸睛夺目,聚集人气,X2-R数字标牌具备4K高清分辨率,加上10.7亿显示色数,精准展现任何图像细节,带来逼真的显示效果,让画面显示细腻、纤毫毕现、栩栩如生。

        许多商业场景中光亮度较高,如果选用屏幕亮度较低的标牌产品,屏幕内容显示往往难以看清,影响消费者体验。X2-R数字标牌具有500nit高亮度显示,即便是应用于商场之类高亮的场景下,依旧可以清晰显示相关信息,满足店铺展示、公共显示等严苛应用场景的需求。7×24小时工作,工业寿命达50000小时,同时可支持休眠/唤醒功能,则充分适用于便利店、快餐店等长时间营业的商超、餐饮门店及机场、车站等全天候运行的公共场所。不仅如此,X2-R数字标牌还有着许多丰富、特色、使用的功能。如按键锁功能,开启后按键遥控器、外接按键、USB键盘和鼠标都会被锁定,应用于公共场所时可以有效防止未授权人员擅自操作。支持本地多媒体播放及U盘播放,即插即播,信息展示随心所欲。

        广泛应用

        迎合多场景需求

        结合X2-R数字标牌的功能特性,一起来看看其在企业展厅、餐饮门店、潮服门店、轨道交通、医疗监控等场景中的实际应用。

        企业展厅应用

        在日趋激烈的市场环境下,越来越多的企业开始着重于企业展厅的建设与打造,其不仅可以塑造良好的品牌形象,更能创造沉浸式的展览氛围,从而有效达到宣传营销的目的。X2-R数字标牌尺寸涵盖65~86英寸,大尺寸大屏幕,可充分升级智慧展厅,打造震撼视效。同时,X2-R数字标牌搭载CMS信发系统,灵活展示企业背景、发展战略、产业布局、建设项目等信息,便于参观客户对企业发展及优势有更清晰的理解与认知。

        餐饮门店应用

        通过X2-R数字标牌搭建多联屏,不仅能够提升大气观感,还能实时从云端便捷推送如品牌背景、产品促销、新品上市等信息,实现门店信息智慧化、高清化、高亮化展示,进一步聚焦消费者目光。同时,在确保门店促销及餐品等信息及时更新的同时,还能有效节省门店在人力物料方面的持续性投入成本。

        潮服门店应用

        针对鞋服专卖等门店,可将X2-R数字标牌以横竖屏的方式灵活壁挂展示,再搭载CMS信发系统,便于专卖店实时发布与调整如新品资讯、产品视频、促销活动等内容,赋予门店更加灵活的形象展示。此外,动态化的内容呈现,视觉效果更立体逼真,利于聚焦消费者目光,提升购物体验。

        智慧医疗应用

        应用于医疗各诊室科室场景中,X2-R数字标牌可通过与医院系统相连,实时呈现门诊排队信息,实现候诊人群的提前排队等候,有助缓解患者就医等候焦虑,并提醒使患者及时做好就诊准备,强化就诊患者服务体验。同时数字标牌还可以实时展示医疗大数据,甚至对医院重要区域进行监控调度,及时洞察安全隐患并作出决策。

        轨道交通应用

        X2-R数字标牌应用于公共交通领域,可集站点动态显示与城市信息系统联动等功能于一体,让出行者轻松掌握轨交航空等线路信息,即时接收旅游动态,进一步提升车站机场的智慧化、品质化、精细化服务水平。

        值得一提的是,长久以来AOC始终在不断完善数字标牌产品矩阵,通过更强大、更灵活、更全面的数字标牌,用以满足更多细分行业应用需求,赋能企业数字化转型升级!


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/186.html b/news/186.html new file mode 100644 index 0000000..d5008f2 --- /dev/null +++ b/news/186.html @@ -0,0 +1,362 @@ + + + + +杭州城西科创大走廊开展“迎亚运” 国际化标识提升行动_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        杭州城西科创大走廊开展“迎亚运” 国际化标识提升行动

        +
        +
        +
        +  2023-02-15 阅读:11 +
        +
        +

        2月13日上午,杭州城西科创大走廊管委会和市城管局联合召开动员会,正式启动城西科创大走廊“迎亚运”国际化标识提升行动。


        标识系统是基础性公共服务设施,也是国际化城市建设的重要切入点,城西科创大走廊作为举全市之力打造“面向世界、引领未来、服务全国、带动全省”的高水平现代化引领区,开展国际化标识提升行动是打造创新策源地、建设城市新中心的自身要求,也是展现“诗画江南”美好形象浓厚亚运氛围的重要举措。

        提升行动将坚持“高标准、高质量、国际化”目标原则,落实大走廊重要场所国际化标识全覆盖的要求,进一步提升大走廊交通枢纽、道路系统和公交地铁站点等场所国际化标识系统建设改造,因地制宜设立多语种图文标识系统,做到设置规范、图形通用、译写准确、信息清晰、美观大方,营造良好市容市貌秩序环境,塑造高水平的城市国际化形象。


        杭州城西科创大走廊党工委委员、管委会副主任陈白磊表示,此次提升行动将对照《杭州城市国际化标识系统导则》的要求,聚焦大走廊核心区主要道路沿线、西站枢纽、公交地铁站点等场所,开展全要素国际化打造,推动大走廊国际化迈入更高的水平。

        杭州市城管局党组成员、副局长宋晓青表示:“我们将把工作重心从‘高数量’转移到‘高质量’、从‘抓面’调整到‘破点’,建立攻坚工作机制,统筹协调各部门、各责任单位,逐个快速破解难题。”


        为了使这项工作取得实效,大走廊管委会和杭州市城管局邀请热心市民共同参与标识标牌问题查找,如发现大走廊范围内标识标牌存在外文译写错误、污损缺失、指示方位错误等问题,市民可以通过“浙里办”搜索“城市治理有奖举报”进入平台反映。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/187.html b/news/187.html new file mode 100644 index 0000000..acbf03f --- /dev/null +++ b/news/187.html @@ -0,0 +1,362 @@ + + + + +上海市松江区水利工程管理所水闸标准化标牌制作竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        上海市松江区水利工程管理所水闸标准化标牌制作竞争性磋商

        +
        +
        +
        +  2023-02-15 阅读:14 +
        +
        +

        项目概况

        水闸标准化标牌制作 采购项目的潜在供应商应在上海市松江区鼎源路618弄79号获取采购文件,并于2023年02月28日 09点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:ZC-01-23045

        项目名称:水闸标准化标牌制作

        采购方式:竞争性磋商

        预算金额:46.2500000 万元(人民币)

        最高限价(如有):46.2500000 万元(人民币)

        采购需求:

        对水闸标准化标牌进行设计、制作、安装,具体项目内容、采购范围及所应达到的具体要求,以本文件相应规定为准。

        合同履行期限:2023年6月30日前完成全部服务内容

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        本采购项目执行政府采购有关鼓励支持节能产品、环境认证产品以及支持中小企业、福利企业等的政策规定。

        3.本项目的特定资格要求:(1)投标截止时间前三年内未被列入“信用中国”网站(www.creditchina.gov.cn)失信被执行人、重大税收违法案件当事人、政府采购不良记录名单、失信惩戒名单和中国政府采购网(www.ccgp.gov.cn)政府采购严重违法失信行为记录名单的供应商;(2)在中华人民共和国境内注册,具有独立的法人资格;(3)本项目不接收联合体参与磋商。(4)本项目专门面向中小微企业采购(事业单位、社会组织等非企业性质的供应商不享受中小企业扶持政策,但事业单位、社会组织等非企业主体提供全部由中小企业制造的货物参加货物采购项目的除外)。

        三、获取采购文件

        时间:2023年02月16日  至 2023年02月22日,每天上午9:00至11:00,下午13:00至16:00。(北京时间,法定节假日除外)

        地点:上海市松江区鼎源路618弄79号

        方式:符合资格的供应商应当在2023年2月16日至2023年2月22日期间(工作日上午9:00-11:00,下午13:00-16:00,法定节假日除外)携带如下报名资料到上海市松江区鼎源路618弄79号1楼报名,逾期不予受理。1.营业执照原件及复印件加盖公章; 2.投标人在“信用中国网”【通过“信用服务”栏分别查询失信被执行人、重大税收违法案件当事人、政府采购不良记录名单、失信惩戒名单截图】、“中国政府采购网”查询页面网页截图并加盖公章(依法不纳入信用中国网和中国政府采购网查询系统的单位应当提供加盖单位公章的近三年内无被列入失信被执行人、重大税收违法案件当事人、政府采购不良记录名单、失信惩戒名单的承诺函)(可选择)。3.投标人在“国家企业信用信息公示系统(www.gsxt.gov.cn)”通过“信息打印”生成的查询报告打印件并加盖公章(至少包括:营业执照信息、股东及出资信息、主要人员信息、行政处罚信息、纳入严重违法失信企业名单(黑名单)信息、纳入经营异常名录信息等,未纳入国家企业信用信息公示系统的供应商请自行提供股东及出资信息证明公示系统的供应商请自行提供股东及出资信息证明)(可选择)。4.授权代表报名:法定代表人授权书原件和被授权代表人身份证原件及复印件加盖公章及授权代表近6个月内任意一个月社保证明(或劳动合同);法定代表人报名:法定代表人证明书和法定代表人身份证原件及复印件加盖公章。5.提交反映财务状况、缴纳税收和社会保障资金情况的书面声明,加盖公章。

        售价:¥600.0 元(人民币)

        四、响应文件提交

        截止时间:2023年02月28日 09点30分(北京时间)

        地点:上海市松江区鼎源路618弄79号

        五、开启

        时间:2023年02月28日 09点30分(北京时间)

        地点:上海市松江区鼎源路618弄79号

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本次招标公告及变更事项(若有)仅在“中国政府采购网http://www.ccgp.gov.cn/”发布,请各投标人及时关注。其他网站转载、复制、其他途径发布的与本次招标项目有关的任何信息,本公司都不予认可。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:上海市松江区水利工程管理所     

        地址:上海市松江区松汇中路363号        

        联系方式:刘志强021-57811930      

        2.采购代理机构信息

        名 称:上海科瑞真诚建设项目管理有限公司            

        地 址:上海市松江区鼎源路618弄79号            

        联系方式:胡兰021-67720522            

        3.项目联系方式

        项目联系人:胡兰

        电 话:  67720522

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/188.html b/news/188.html new file mode 100644 index 0000000..e53a4e5 --- /dev/null +++ b/news/188.html @@ -0,0 +1,362 @@ + + + + +唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目公开招标公告

        +
        +
        +
        +  2023-02-15 阅读:35 +
        +
        +

        唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目 招标项目的潜在投标人应在河北至诚工程项目管理有限公司招标代理部获取招标文件,并于2023年03月07日 09点00分(北京时间)前递交投标文件。


        一、项目基本情况

        项目编号:2023-JQ58-W1001

        项目名称:唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目

        预算金额:54.0000000 万元(人民币)

        最高限价(如有):54.0000000 万元(人民币)

        采购需求:

        项目名称: 唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目

        项目编号:  2023-JQ58-W1001  

        项目概况:

        投标注意事项:本项目两个包段同时招标,一个投标人可以同时报名两个包段。开、评标顺序按一、二包段依次进行,投标单位在本次招标的两个标段中,可以同时中两个标段。参标供应商必须就该分包内的全部招标内容及服务进行投标。


        合同履行期限:甲方下达订单后45-50日历天内到货安装并通过验收

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

                (一)符合《中华人民共和国政府采购法》第二十二条资格条件:

        1.具有独立承担民事责任的能力;

        2.具有良好的商业信誉和健全的财务会计制度;

        3.具有履行合同所必需的设备和专业技术能力,且具备相应的专业深化设计能力;

        4.有依法缴纳税收和社会保障资金的良好记录;

        5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;

        6.法律、行政法规规定的其他条件。

        (二)国有企业;事业单位;军队单位;成立三年以上的非外资控股企业。

        (三)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业的生产场经营地址或者注册登记地址为同一地址的,非国有销售型企业的股东和管理人员(法定代表人、董事、监事)之间存在近亲属、相互占股等关联的,也不得同时参加同一包的采购活动。近亲属指夫妻、直系血亲、三代以内旁系血亲或近姻亲关系。

        (四)未被列入政府采购失信名单、军队供应商暂停名单,未在军队采购失信名单禁入处罚期内,未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人。

        (五)本项目不接受联合体投标。

        (六)投标供应商在履约环节不得违法分包,一经发现存在违法分包行为,分包和被分包企业均将受到相关处罚。

        (七)本项目特定资质:投标供应商具备专业的深化设计能力,能够根据采购单位采购清单内容进行合理深化设计,且达到甲方满意。


        3.本项目的特定资格要求:投标供应商具备专业的深化设计能力,能够根据采购单位采购清单内容进行合理深化设计,且达到甲方满意

        三、获取招标文件

        时间:2023年02月14日  至 2023年02月20日,每天上午9:00至11:30,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:河北至诚工程项目管理有限公司招标代理部

        方式:投标人携带资料赴报名现场,经审查合格后领取招标文件

        售价:¥200.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2023年03月07日 09点00分(北京时间)

        开标时间:2023年03月07日 09点00分(北京时间)

        地点:采购人会议室

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜


        招标文件申领时间、地点、方式

        (一)申领时间: 2023 年 2 月 14 日至 2 月 20 日,每日上午 9 :00 至 11 : 30 ,下午 14 : 00 至 17 : 00 (北京时间,法定节假日除外)。

        (二)申领地点:  河北至诚工程项目管理有限公司招标代理部  。

        (三)申领招标文件时需提供以下资料:

        1.营业执照或事业单位法人证书复印件加盖公章(军队单位不需要提供);

        2.法定代表人资格证明书原件;

        3.法定代表人授权书原件;

        4.非外资企业或外资控股企业的书面声明(企业提供,事业单位、军队单位不需要提供);

        5.投标供应商主要股东或出资人信息;

        6.未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重失信行为记录名单,未被列入军队供应商暂停名单,未在军队采购供应商失信名单禁入处罚期内的承诺书;

        (四)申领方式

        投标人携带资料赴报名现场,经审查合格后领取招标文件。

        (五)招标文件售价:200元/包段(现金),售后不退。

        投标开始和截止时间及地点、方式

        投标开始时间: 2023 年 3 月 7 日 8 时 00 分(北京时间)。

        投标截止时间: 2023 年 3 月 7 日 9 时 00 分(北京时间)。

        投标地点: 采购人会议室 。

        投标方式:由投标供应商法定代表人或授权代表现场递交投标文件。

        开标时间、地点

        开标时间: 2023 年 3 月 7 日 9 时 00 分(北京时间)。

        开标地点:  采购人会议室  。

        八、现场勘察

        不组织。

        九、标前答疑会

        不组织。

        十、本采购项目相关信息在《军队采购网》(www.plap.cn)和 中国政府采购网 上发布。

        十一、采购机构联系方式

        采购人:唐山市路南区某医院

        地址:唐山市路南区

        联系人:戚助理

        办公电话:0315-4465098

        十二、采购代理机构联系方式

        采购代理机构:河北至诚工程项目管理有限公司

        联 系 人: 左钊、刘月香

        办公电话:0315-2060017

        传 真:0315-2060005

        地 址:河北省唐山市路北区裕华嘉苑二期综合楼

        十三、监督部门联系方式

        项目监督人:孙助理

        办公电话:0315—4465077

        采购机构:路南区某医院

                                

        采购代理机构:河北至诚工程项目管理有限公司

                                                                       2023 年 2 月 14 日



        七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名 称:唐山市路南区某医院     

        地址:唐山市路南区        

        联系方式:戚助理,17717779788      

        2.采购代理机构信息

        名 称:河北至诚工程项目管理有限公司            

        地 址:河北省唐山市路北区裕华嘉苑二期综合楼            

        联系方式:左钊,0315-2060017            

        3.项目联系方式

        项目联系人:戚助理

        电 话:  0315-8188657


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/189.html b/news/189.html new file mode 100644 index 0000000..144d2e0 --- /dev/null +++ b/news/189.html @@ -0,0 +1,362 @@ + + + + +最新《北京市户外广告设施设置专项规划(2022年—2035年)》正式对外公布_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        最新《北京市户外广告设施设置专项规划(2022年—2035年)》正式对外公布

        +
        +
        +
        +  2023-02-15 阅读:4 +
        +
        +

        2月13日

        《北京市户外广告设施设置专项规划(2022年—2035年)》

        在市城市管理委官网正式对外公布

        资料图 摄:徐英波/北晚在线供图

        01

        长安街及文保单位等禁设商业户外广告

        按照城市空间结构和区域功能定位不同,全市将划分商业户外广告设施禁止设置区域、限制设置区域和允许设置区域。

        例如,政务区域、文物保护区域、生态保护区域将严格控制设置户外广告设施,而商业区域内则将鼓励设置形式丰富多元、体现特色活力的户外广告设施。

        “禁止设置区域”,主要展现庄重、恢弘、肃静的风貌环境,是保障中央政务环境、保护历史文化名城、维护生态环境安全的重点区域,因此禁止设置商业户外广告设施。

        比如,天安门广场、中南海及故宫周边区域;长安街及其延长线;湿地、风景名胜区的管理范围内;文物保护单位、历史建筑的保护范围内都属于禁止设置商业户外广告设施的区域。

        “限制设置区域”将根据控制严格程度分为两级,限制设置一级区域和二级区域,通过控制商业户外广告设施的类型、面积、高度、色彩、亮度等指标,引导设置与区域功能、风貌特点相符合的户外广告设施。

        比如,二环路沿线;城市副中心行政办公区;南北中轴线及其延长线;中心城区的集中建设区等,都属于限制设置商业户外广告设施的区域。

        “允许设置区域”主要围绕推动“两区”建设和培育建设国际消费中心城市的重点区域,在设施类型、面积、高度、色彩、亮度等指标上,给予设置人更大的创意设计空间,引导设置多元化的户外广告设施,营造浓郁商业氛围。其中,地区活力消费圈;文化、体育、科技、商务会展等产业园区;城市消费中心和特色消费街区等,均是允许设置商业户外广告设施的区域。

        能否设置户外广告设施,还与用地功能和产业发展相关联。北京由严到松,将设置户外广告设施的功能用地一共划分为四类,确保户外广告设施设置与载体用地功能相一致。

        城镇社区服务设施用地、农村社区服务设施用地、园地等,属于一类功能用地,将控制设置户外广告设施。

        工业用地、物流仓储用地、公园绿地、广场用地等,属于二类功能用地,可以适度设置。

        文化用地、体育用地、商务金融用地、城市轨道交通用地、交通场站用地、城镇道路用地、公路用地、机场用地等,则属于三类功能用地,合理设置户外广告设施即可。

        商业用地、娱乐用地等,属于四类功能用地,可以多样设置户外广告设施。

        02

        13大重点区域设广告各有“规矩”

        核心区、副中心、长安街及延长线、中轴线、二三环、三山五园等13大区域如何设置户外广告设置,规划均一一予以明确。

        以城市副中心为例,大运河两岸设置户外广告设施,宜结合滨水景观要素以自然简约风格为主。

        长安街延长线三环内路段禁止设置商业户外广告设施;三环至五环段,不宜规划设置落地式户外广告设施,宜采用传统风格、现代中式风格,不采用动态照明。

        传统中轴线及在设置户外广告设施时,应以“中而古、中而新”的方式,展现传统中轴线历史文化价值;照明宜暖黄光为主,彰显中轴国之正中的夜间观景界面。

        二环路沿线宜采用平行附着式广告设施、橱窗广告设施、品牌集中展示广告设施等,少而精设置;高度宜控制在建筑18米以下区域;风格与环线两侧历史人文景观和现代首都风貌融合呼应。

        而在三山五园区域,则要将户外广告设施融入山水田园风光,色彩与北京独特的“灰韵环绕”城市色彩氛围及景观生态相协调。

        03

        广告牌不能用指路牌颜色

        规划还特别提出了“户外广告设施设置负面清单”,明确了一些设置规则。

        负面清单提出,在建筑物顶部或者超出建筑物顶部,不得设置户外广告设施。

        如妨碍安全视距,对行人、驾驶员产生眩光或是影响道路通行,也不得设置户外广告设施。设置户外广告设施还不得使用与道路交通指示标志一致或相近的颜色等。

        负面清单列出了一系列妨碍他人生产生活的情形,明确要求,如有此类情形不得设置户外广告设施。

        比如,播放声音妨碍他人生产生活的户外广告设施;利用激光投影广告设施在居住建筑投影广告,或者未经产权人同意在其他建筑投影广告;在居民楼、学校、幼儿园、医院、养老院100米范围内,正向面对居民楼、学校、幼儿园、医院、养老院设置户外广告电子显示屏;遮挡居民楼、学校、幼儿园、医院、养老院等建筑的通风、采光等情况,均不得设置。

        此外,如有破坏城市景观的情形,也不得设置户外广告设施。

        例如,设置大型高立柱户外广告设施、走字屏户外广告设施;影响植物生长,损毁公共绿地、古树名木;在建筑物门窗玻璃内外粘贴广告等,均被列入了负面清单。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/19.html b/news/19.html new file mode 100644 index 0000000..ba5e77e --- /dev/null +++ b/news/19.html @@ -0,0 +1,362 @@ + + + + +视颐数字标牌服务国防科大数字图书馆_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        视颐数字标牌服务国防科大数字图书馆

        +
        +
        +
        +  2022-05-01 阅读:12 +
        +
        +

        近期,国防科技大学数字图书馆项目完成了验收工作,项目中涵盖了视颐钻石款全系列数字标牌终端:壁挂一体机、触摸查询一体机和立式一体机等,系统则是采用国内知名的数字图书馆品牌——超星。当纸质图书遇到数字显示技术,新老媒介相互衬托,馆内科技氛围倍增,信息传达与交互也高效起来!

        视颐钻石款数字标牌一体机,边框采用黑色铝型材,正面钢化玻璃采用倒角技术,在光线下棱角分明,加上超薄的设计,给人一种高贵的气质。产品被安装在图书馆电梯口,办公区,接待台和大厅内等地方,凭借声色合一的视听冲击,渲染数字科技氛围,给读者带来全新的文化体验。

          触摸查询机

          为充分传播馆内信息,这些标牌一体机采用了信发+交互的两种技术。楼道和电梯口的大屏,接待台的大屏采用安卓信发方案,每层电梯的大屏主要播放本层的空间布局,图书类型,馆藏功能和馆内通知等,主要起到导引和通知通告的作用;而接待台和国内立柱上大屏则播放服务台公告,失物招领,馆内活动,以及近期借阅热榜、借还书曲线图等数据信息;一楼大厅的触摸查询机,以及办公区的立式机柜则安装了馆内触摸查询系统,图书馆历史,文献资源,教学支持,以及图书索引、数据库导航等均可在大屏内触摸交互。

          作为数字内容展示与交互的媒介,数字标牌在图书馆终端信息化建设方面具有很多优势:第一,信息展示与及时传达功能,如图书馆历史、功能特色介绍、通知通告、日常活动、楼层导引等信息都能及时便捷地发布出来;第二,触摸查询功能,如图书期刊查询和文献资料的查询等,方便读者快捷查询;第三,数据显示与管理,数字墙可以显示借还书的实时情况,热榜,读者进馆数量及类比表等等,同时方便馆长数据化管理;第四,安装方便,在大厅、楼层、楼道、立柱、接待台,甚至是图书室都方便安装。

        此次由视颐和超星携手共同打造的硬件方案及软件方案得到馆方的高度认可,为大学内的师生提供了全新的图书馆大屏信息服务新模式。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/190.html b/news/190.html new file mode 100644 index 0000000..200e3dd --- /dev/null +++ b/news/190.html @@ -0,0 +1,362 @@ + + + + +数字化智能标识,助力行业差异化发展_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字化智能标识,助力行业差异化发展

        +
        +
        +
        +  2023-02-17 阅读:10 +
        +
        +

        智能数字化标识牌在某些领域正发挥着十分重要的作用。作为数字化服务终端承载和表现形式之一,智能数字化标识牌除了在公共信息的发布方面作用显著,在购物中心、商业综合体、连锁门店等零售实体方面,它的使用也大大改善了用户体验,助力实现差异化发展。

        01 智能标识牌是政策导向的必然。

        2020年两会,备受关注的“新基建”首次写入政府工作报告,“加强新型基础设施建设,激发新消费需求,助力产业升级”。

        2022年的两会上,“关键核心技术攻关”,“专精特新”、“数字经济”、“传统产业升级”、“绿色低碳技术”等两会热词,已经清晰勾勒出国家经济奋进的坐标,也标注着产业发展的方向。

        02 智能标识牌更符合功能性需求。

        随着技术的快速创新迭代和数字显示屏的普遍应用,表达形式丰富灵活的数字标牌脱颖而出,成为更优秀的标识导视载体选择。在融入园区环境的同时信息指引醒目、清晰,易于被到访者识别,提升品牌传播力。

        03 智能标识牌更加契合年轻化需求。

        随着时代的发展,新中产阶级及新生代群体逐渐成为消费主力军,为兴趣买单,为体验付费是他们的主流消费方式。购物中心正在被赋予更多期待,新潮体验、场景互动、社交打卡等都是年轻人注重的新型购物休闲方式。

        同时,从公共信息的发布来讲,与传统静态海报对比,智能数字化标识牌可以及时更新;从成本和效益来讲,智能数字化标识标牌的建设不仅可以解决商场广告物料更换费时费力的问题,更可以大范围的营造科技视觉体验感,或形成联动的精细化品牌宣传,赢得更多年轻消费者的青睐。

        数字智能标识+人工智能相结合的方式将会是智慧时代的主流方向之一,将紧随未来标识设计趋势,将科技融入导视系统,提升企业在标识设计上的核心竞争力,用科技连接与服务客户。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/191.html b/news/191.html new file mode 100644 index 0000000..1318157 --- /dev/null +++ b/news/191.html @@ -0,0 +1,362 @@ + + + + +某部营区室外标识标牌采购项目竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        某部营区室外标识标牌采购项目竞争性磋商

        +
        +
        +
        +  2023-02-19 阅读:5 +
        +
        +

        项目概况

        某部营区室外标识标牌采购项目 采购项目的潜在供应商应在四川智维工程项目管理有限责任公司(攀西国际商贸城C塔楼九楼)获取采购文件,并于2023年03月02日 09点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:ZCZWZB-【2023】005

        项目名称:某部营区室外标识标牌采购项目

        采购方式:竞争性磋商

        预算金额:44.7978530 万元(人民币)

        最高限价(如有):44.7978530 万元(人民币)

        采购需求:

        详见磋商文件

        合同履行期限:20日历天

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        详见磋商文件

        3.本项目的特定资格要求:供应商需提供建筑工程施工总承包三级及以上资质并具备有效期内的安全生产许可证复印件

        三、获取采购文件

        时间:2023年02月20日  至 2023年02月24日,每天上午9:00至12:00,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:四川智维工程项目管理有限责任公司(攀西国际商贸城C塔楼九楼)

        方式:现场报名

        售价:¥400.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月02日 09点30分(北京时间)

        地点:四川智维工程项目管理有限责任公司(攀西国际商贸城C塔楼九楼)

        五、开启

        时间:2023年03月02日 09点30分(北京时间)

        地点:四川智维工程项目管理有限责任公司(攀西国际商贸城C塔楼九楼)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        磋商文件自2023年02月20日至2023年02月24日上午09:00-12:00,下午 14:00-17:00(北京时间,法定节假日除外)在四川智维工程项目管理有限责任公司(攀西国际商贸城C塔楼九楼)报名领取。

        本项目磋商文件有偿获取,磋商文件售价:人民币400元/份。(报名费不退还、报名资格不能转让)

        报名方式:现场报名,报名咨询电话:18783366910

        获取磋商文件时,应提交以下资料:①现场报名时,供应商为法人或者其他组织的,必须携带单位介绍信原件、经办人身份证复印件(加盖公司公章);供应商为自然人的,只需提供本人身份证明。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:某部      

        地址:某部        

        联系方式:郭助理、13357362169      

        2.采购代理机构信息

        名 称:四川智维工程项目管理有限责任公司            

        地 址:西昌市攀西国际商贸城C塔楼九楼            

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/192.html b/news/192.html new file mode 100644 index 0000000..a433682 --- /dev/null +++ b/news/192.html @@ -0,0 +1,362 @@ + + + + +蓬溪县第二人民医院综合楼建设项目(二期)标识标牌采购(三次)竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        蓬溪县第二人民医院综合楼建设项目(二期)标识标牌采购(三次)竞争性磋商公告

        +
        +
        +
        +  2023-02-20 阅读:48 +
        +
        +

        一、项目基本情况

        项目编号:N5109212022000087

        项目名称:综合楼建设项目(二期)标识标牌采购(三次)

        采购方式:竞争性磋商

        预算金额:805,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起30日

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:无

        3.本项目的特定资格要求:

        采购包1:无

        三、获取采购文件

        时间:2023年02月21日至2023年02月27日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年03月03日 10时00分00秒(北京时间)

        地点:四川省遂宁市河东新区任家渡A区11栋二层3-5号

        五、开启

        时间:2023年03月03日 10时00分00秒(北京时间)

        地点:四川省遂宁市河东新区任家渡A区11栋二层3-5号

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        根据《四川省财政厅关于推进四川省政府采购供应商信用融资工作的通知》(川财采[2018]123号)文件要求,有融资需求的供应商可根据四川政府采购网公示的银行及其“政采贷”产品,自行选择符合自身情况的“政采贷”银行及其产品,凭中标(成交)通知书向银行提出贷款意向申请(具体银行详见四川政府采购网“政采贷”信息或咨询蓬溪县财政局采监部门0825-5413628)。

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/193.html b/news/193.html new file mode 100644 index 0000000..56ac142 --- /dev/null +++ b/news/193.html @@ -0,0 +1,362 @@ + + + + +更新标牌、完成外立面提升,河庄开展公厕提升专项行动_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        更新标牌、完成外立面提升,河庄开展公厕提升专项行动

        +
        +
        +
        +  2023-02-20 阅读:8 +
        +
        +

        “小厕所,大民生。”小小的一座公厕,不仅为市民提供方便,更是一座城市卫生水平、文明程度的缩影。

        近日,钱塘区河庄街道围绕“美丽杭州”创建暨“‘迎亚运’城市环境大整治、城市品质大提升”的工作目标,以薄弱点为抓手,开展公厕提升专项行动。

        在本次行动过程中,河庄街道环卫所对集镇公厕进行一一排摸,排摸内容包含:公厕内部设施设备、公厕指示牌、标识牌等,并对破损设备及时维护更换,共更新7座公厕的标识标牌,完成1座公厕的外立面提升。

        比如,在河景路上的一处公厕,工作人员增加保洁频次,同时,提升公厕外部环境,确保无乱堆乱放,周边环境无垃圾、杂草等。

        下一步,河庄街道将继续高标准、严要求积极推进公厕提升工作,为“美丽杭州”增色添彩。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/194.html b/news/194.html new file mode 100644 index 0000000..5563dc9 --- /dev/null +++ b/news/194.html @@ -0,0 +1,362 @@ + + + + +梅县区传统村落数字化影像库和保护范围标志牌建设项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        梅县区传统村落数字化影像库和保护范围标志牌建设项目招标公告

        +
        +
        +
        +  2023-02-20 阅读:5 +
        +
        +

        一、项目基本情况

        项目编号:GDYF2023004

        项目名称:梅县区传统村落数字化影像库和保护范围标志牌建设项目

        采购方式:公开招标

        预算金额:2,299,968.00元

        采购需求:

        合同包1(梅县区传统村落数字化影像库和保护范围标志牌建设项目):

        合同包预算金额:2,299,968.00元

        本合同包不接受联合体投标

        合同履行期限:自合同签订生效之日起90天内完成本项目

        二、申请人的资格要求:

        1.投标供应商应具备《政府采购法》第二十二条规定的条件,提供下列材料:

        1)具有独立承担民事责任的能力:在中华人民共和国境内注册的法人或其他组织或自然人, 投标(响应)时提交有效的营业执照(或事业法人登记证或身份证等相关证明) 副本复印件。分支机构投标的,须提供总公司和分公司营业执照副本复印件,总公司出具给分支机构的授权书。

        2)有依法缴纳税收和社会保障资金的良好记录:提供投标截止日前6个月内任意1个月依法缴纳税收和社会保障资金的相关材料。 如依法免税或不需要缴纳社会保障资金的, 提供相应证明材料。

        3)具有良好的商业信誉和健全的财务会计制度:供应商必须具有良好的商业信誉和健全的财务会计制度(提供2021年经第三方会计师事务所出具的审计报告(须包含资产负债表、利润表、现金流量表、附注)的复印件或者提供自本招标公告发布之日起由投标人基本开户银行出具的资信证明扫描件) 。

        4)履行合同所必需的设备和专业技术能力:按投标(响应)文件格式填报设备及专业技术能力情况。

        5)参加采购活动前3年内,在经营活动中没有重大违法记录:参照投标(报价)函相关承诺格式内容。 重大违法记录,是指供应商因违法经营受到刑事处罚或者责令停产停业、吊销许可证或者执照、较大数额罚款等行政处罚。(根据财库〔2022〕3号文,“较大数额罚款”认定为200万元以上的罚款,法律、行政法规以及国务院有关部门明确规定相关领域“较大数额罚款”标准高于200万元的,从其规定)

        2.落实政府采购政策需满足的资格要求: 无。

        3.本项目的特定资格要求:

        合同包1(梅县区传统村落数字化影像库和保护范围标志牌建设项目)特定资格要求如下:

        (1)供应商未被列入“信用中国”网站(www.creditchina.gov.cn)“记录失信被执行人或重大税收违法案件当事人名单或政府采购严重违法失信行为”记录名单;不处于中国政府采购网(www.ccgp.gov.cn)“政府采购严重违法失信行为信息记录”中的禁止参加政府采购活动期间。(以资格审查人员于投标(响应)截止时间当天在“信用中国”网站(www.creditchina.gov.cn)及中国政府采购网(http://www.ccgp.gov.cn/)查询结果为准,如相关失信记录已失效,供应商需提供相关证明资料)。

        (2)单位负责人为同一人或者存在直接控股、 管理关系的不同供应商,不得同时参加本采购项目(或采购包) 投标(响应)。 为本项目提供整体设计、 规范编制或者项目管理、 监理、 检测等服务的供应商, 不得再参与本项目投标(响应)。 投标(报价) 函相关承诺要求内容。

        三、获取招标文件

        时间: 2023年02月20日 至 2023年02月27日 ,每天上午 00:00:00 至 12:00:00 ,下午 12:00:00 至 23:59:59 (北京时间,法定节假日除外)

        地点:广东省政府采购网https://gdgpo.czt.gd.gov.cn/

        方式:在线获取

        售价: 免费获取

        四、提交投标文件截止时间、开标时间和地点

        2023年03月13日 15时00分00秒 (北京时间)

        递交文件地点:梅州市梅江区三角镇客都大道智慧广场B座402号

        开标地点:梅州市梅江区三角镇客都大道智慧广场B座402号

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        1.本项目采用电子系统进行招投标,请在投标前详细阅读供应商操作手册,手册获取网址:https://gdgpo.czt.gd.gov.cn/help/transaction/download.html。投标供应商在使用过程中遇到涉及系统使用的问题,可通过020-88696588 进行咨询或通过广东政府采购智慧云平台运维服务说明中提供的其他服务方式获取帮助。

        2.供应商参加本项目投标,需要提前办理CA和电子签章,办理方式和注意事项详见供应商操作手册与CA办理指南,指南获取地址:https://gdgpo.czt.gd.gov.cn/help/problem/。

        3.如需缴纳保证金,供应商可通过"广东政府采购智慧云平台金融服务中心"(http://gdgpo.czt.gd.gov.cn/zcdservice/zcd/guangdong/),申请办理投标(响应)担保函、保险(保证)保函。

        本项目开标方式为现场电子开标:

        (1)供应商在开标当日须携带数字证书(即CA证书)到现场开标,如因自身原因未携带数字证书导致逾期未解密投标文件的,将作无效响应处理。

        温馨提示:本项目的招标文件由智慧云平台系统自动生成,若PDF版本与Word版本内容有不一致时,应以PDF版本的招标文件为准。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/195.html b/news/195.html new file mode 100644 index 0000000..28ff07e --- /dev/null +++ b/news/195.html @@ -0,0 +1,362 @@ + + + + +订做高质感门头招牌广告怎样才能做到效果才与众不同_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        订做高质感门头招牌广告怎样才能做到效果才与众不同

        +
        +
        +
        +  2023-02-20 阅读:13 +
        +
        +

        想让自己的店铺招牌比别人的好,效果比别人好,质感比别人好,教你几招,保证你的招牌广告让人过目不忘。

        不管是门头招牌还是公司招牌,招牌制作效果直接关系到生意的好坏,做得好的招牌也非常多,如何订做质感好的招牌广告,找标牌网总结出以下几点:

        1.适用性

        再好的设计师如果设计出来的招牌广告是不适用,也等于白设计;举个例子,现在很多年轻的设计师总喜欢用一些标新立异的材质来做广告招牌,但他们没有去招牌制作工厂看看招牌制作工艺是怎样的,结构是否能行得通,就设计出来非常稀奇古怪的招牌。如果设计出来的招牌适用性不强,那么就要多了解一下招牌有哪些制作工艺。当然创新是好事,没有设计师的创新,也不会有好的新品出来。在鼓励设计师创新的同时,也一定要注意招牌的适用性。

        2.经济性

        招牌的设计不一定追求多么奢侈,但一定是根据不同环境和规格大小,以及空间可视度等,多个要素结合来进行设计。目前市面上比较经济适用的是铝塑板底或是扣板底加LED发光字的组合方式。它既能出效果,又能方便维护,而且使用寿命长等特点。如果在室内的招牌,也可以设计背打光发光的招牌,就像上面的照片展示。发光字采用金属电镀背装亚克力反透光,放在室内或是半户外的环境使用,既有质感,又能晚上发光,而且经济又实惠。

        3.高识别性

        做招牌广告就是要区别于其他人的广告牌,所以在订做招牌广告的时候,设计广告招牌一定要注意它的高识别性。这里不得不提一下我们通常所说的LOGO设计,招牌的标志设计也是提高识别度的好方法。通常是根据行业不同,设计出个性化的LOGO标识,既能体现业主的品位,又能起到营销的作用。它是我们商业行为中不可缺少的帮手。

        4.传播性

        招牌不仅仅是店铺的门脸,也是顾客认识和记忆的介质。招牌广告的好坏直接关系到店铺生意的好坏,一个好的广告招牌能起到提高30%营收的效果。所以在设计招牌广告的时候,一定要注重它的传播性。在设计广告招牌的时候一定要清晰明了,千万不要让顾客去猜,开一家店,要么是卖产品要么卖服务,所以店的名字尤其重要。设计招牌字体时一定要注意它的大小和颜色。可以用形状的内容来表达,优秀的设计师一定是注意颜色搭配和字体设计的。最好再配一句口号,浅显易懂的口号。

        5.安全性

        定做招牌很多人只关心它的设计效果,却忽略了它的安全要素。特别是门头招牌,出入安全在当今时代显得尤其突出。很多店铺的门头,被转租了多少家,每一家在做招牌的时候,只为了节省成本,不停的在原有招牌表面做铝塑板或是贴纸。根本没搞清楚原招牌里面的结构和用材,往往节省了成本,招牌出问题时却花去更多。全国各地的媒体报道数不胜数,在此提醒大家一定要注意要订做招牌的时候一定要把原有的铁架重新拆了重做。虽然个人建议有点极端,但至少是不愿意看到有因为不注重而导致的安全事故发生。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/196.html b/news/196.html new file mode 100644 index 0000000..b745f86 --- /dev/null +++ b/news/196.html @@ -0,0 +1,362 @@ + + + + +《烟台市户外广告和牌匾标识设置管理办法》于2023年1月1日起施行_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        《烟台市户外广告和牌匾标识设置管理办法》于2023年1月1日起施行

        +
        +
        +
        +  2023-02-20 阅读:49 +
        +
        +

        《烟台市户外广告和牌匾标识设置管理办法》(以下简称《办法》)于2023年1月1日起施行。除了未实行城市化管理的村居外,烟台市城市规划区及其他实行城市化管理的区域均纳入《办法》的适用范围。相较于以往,《办法》明确了户外广告和门头牌匾的设置规范,尤其是规定“禁止超出建筑物顶部设置牌匾标识。属于坡屋顶的,不得超过屋檐设置”,打造晴朗天际线。

        如何区分户外广告和门头牌匾?

        门头房上的店名是户外广告还是牌匾标识?都有哪些规定?《办法》 针对市民关心的问题,对户外广告和牌匾标识设置进行了明确定义。

        市城管局数字化管理服务中心工作人员介绍,户外广告和牌匾标识是两个不同的概念,但有些时候由于设置形式或位置等影响,两者容易发生混淆。

        按照《办法》规定,“户外广告设置,是指利用建(构)筑物、场地、设施、交通工具等户外载体设置灯箱、霓虹灯、电子显示装置、展示牌、实物造型或者以其他形式向户外发布广告信息的行为”。户外广告的本质是向户外发布广告信息,即使户外广告设置在门头上方,也不能认定为牌匾标识。

        “牌匾标识设置,是指企事业单位、社会团体和个体工商户在其办公、生产经营场所建(构)筑物外立面或用地范围内设置表明其名称、字号、标识等内容的牌匾等设施的行为”。也就是说,牌匾标识的本质是表明其名称、字号、标识等内容,不能宣传产品及其他内容。牌匾标识通常设置在门楣上方,所以习惯上称为门头牌匾。但特殊情况下,牌匾标识可以设置在其他地方,比如设置于地面的独立式牌匾标识、垂直于墙面设置的牌匾以及办公、生产经营场所在建筑 2 层、3 层的在自身沿街外立面范围内设置 1 块牌匾标识等等,这些都不能认定为户外广告。但这些特殊位置设置的牌匾标识应当符合户外广告和牌匾标识设置详细规划或户外广告和牌匾标识的区域性实施方案。

        《办法》要求,户外广告和牌匾标识设置详细规划或户外广告和牌匾标识的区域性实施方案尚未出台的,应提前征得城市管理部门同意。

        户外广告设置规范有哪些?

        《办法》规定了设置户外广告和牌匾标识应当符合的5条要求:“符合户外广告和牌匾标识设置专项规划、实施方案和技术规范,并符合城市容貌标准;与城乡容貌、周边环境相适应,兼顾昼夜景观;倡导环保绿色,鼓励使用新技术、新工艺、新材料;不得破坏建(构)筑物结构安全和整体效果,不得影响建(构)筑物采光、通风和消防等功能的正常使用;大型户外广告设施应当按照要求设置,并标注许可编号和设置单位。”其中前4条是对户外广告(包括大型和中、小型户外广告)和牌匾标识设置提出的共同要求,第5条针对的是大型户外广告。

        大型户外广告设置,根据住建部颁布的《中华人民共和国城市容貌标准》规定,广告设施与标识按面积大小分为大型、中型、小型,大型广告设施与标识为任一边长大于等于4米或面积大于等于10平方米。

        《办法》规定“设置大型户外广告设施应当依法向所在地具有相应审批权限的行政审批服务或者城市管理行政主管部门提出书面申请,获得户外广告设施设置许可证。未经许可,任何单位和个人不得擅自设置大型户外广告设施”。

        鉴于楼顶广告对城市天际线有不良影响,且存在一定安全隐患;大型立柱式广告、条幅广告影响市容环境,《办法》规定“禁止设置楼(屋)顶广告。城市建成区范围内禁止设置大型立柱式广告和条幅广告”。

        牌匾标识设置规范有哪些?

        《办法》规定“牌匾标识设置应当一店一牌,并与街区、建(构)筑物等城市容貌及周围环境相协调”。牌匾标识设施宽度不应超过自身沿街门面宽度。

        为避免同一场所(建筑物)牌匾标识设置杂乱无章,《办法》规定“多个单位共用一个场所(建筑物)的,应当由该场所(建筑物)所有人或者管理人按照规定对牌匾标识设置进行整体布局和设计”,但整体布局和设计必须符合规划和牌匾标识设置导则。

        为打造我市清朗天际线,同时消除安全隐患,《办法》规定“禁止超出建筑物顶部设置牌匾标识。属于坡屋顶的,不得超过屋檐设置”。具体来讲,设置于建筑顶层的牌匾标识设施上缘不应超出建筑檐口或女儿墙上沿;设置于其他层的牌匾标识设施上缘不应超出上层窗台或阳台下沿线;牌匾标识设施高度与所在楼层层高比例不宜超过 1:3。

        户外广告和牌匾标识的维护管理是如何规定的?

        《办法》明确了户外广告和牌匾标识设置人是户外广告和牌匾标识安全管理的责任人,规定责任人应当履行以下安全管理责任:“(一)明确安全管理人员,建立安全责任、安全隐患排查治理等安全管理制度;(二)在设置户外广告和牌匾标识的施工期间,采取安全保障措施,并在现场明显位置设置警示标志;(三)每月对户外广告和牌匾标识进行安全检查,气象部门发布台风、大风黄色以上预警或者暴雨红色预警信号等时,及时进行安全检查,并做好台账记录;(四)对户外广告和牌匾标识进行安全检查时,发现不符合安全规定或者存在安全隐患的,立即采取加固或者拆除等安全防范措施”。

        《办法》还明确了设置人的日常管理和维护保养责任,规定“设置人应当负责户外广告和牌匾标识的日常管理和维护保养,保持户外广告和牌匾标识完好整洁,确保符合城市容貌标准。对出现破损、倾斜、残缺、污损、褪色、灯光显示不全等情形的,设置人应当及时修复或者更新”。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/197.html b/news/197.html new file mode 100644 index 0000000..86c94b8 --- /dev/null +++ b/news/197.html @@ -0,0 +1,362 @@ + + + + +会议办公中为什么要使用电子桌牌?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        会议办公中为什么要使用电子桌牌?

        +
        +
        +
        +  2023-02-20 阅读:30 +
        +
        +

        近年电子纸显示技术凭借着类纸显示、低功耗节能、长久续航等与生俱来的“绿色属性”,积极助力中国双碳战略深耕的同时,自身产业也迎来了蓬勃发展。其中,电子会议桌牌凭借着多色显示、双面展示、绿色环保、智能护眼等优势特性,正逐渐取代传统纸质桌牌,在各类会议场景中得到广泛应用。

        此次以AOC旗下智慧电子墨水屏会议桌牌为例,一起来看看为什么在众多会议办公场景中,电子桌牌相较传统桌牌的实际应用优势。

        优 势 一

        展示内容快速编辑 

        传统桌牌多采用打印、彩印、刻字等方式,然后再经手工裁剪安装,费时费力不说,出现纰漏也不容易及时更正。但是采用AOC会议桌牌即可实现对展示内容的快速编辑及替换,其支持安卓/IOS双系统,可使用手机APP蓝牙刷新电子桌牌画面,并内置丰富的模板和自定义设计,可根据实际需求进行快速编辑。即便会议过程中出现临时参会人员变更,也可快速更改相关展示信息,应用更灵活,操作更便捷。

        优 势 二

        节能省电绿色环保

        传统纸质桌牌大多是一次性的,用完即丢,不符合当下节能减排以及环保的要求,用于更高级别场合时也略显档次不足。AOC会议桌牌则可以支持长久使用,其每天刷新2次,超1年使用寿命,可以有效实现低功耗节能显示,长时间续航,提供绿色环保无纸化办公应用体验。

         

        优 势 三

        会议桌面美观整洁 

        多数场景下使用电子桌牌,不仅是为了使用桌牌的众多人性化功能,还有一方面因素即在于为了让会议现场更加美观。AOC会议桌牌都是采用简约商务白外观设计,时尚轻薄,稳固美观,可以有效提升政企单位形象。而且电子桌牌在使用时无需外接电源,不必担心理线繁乱,电池供电后即可正常使用,画面刷新后定格,可长久无功耗展示,使用时不仅能让参会人员享受便捷功能,也能使得会议桌面始终保持整洁美观,优化会议桌面,提高会议过程中的愉悦性。

        优 势 四

        画面显示丰富舒适

        传统桌牌显示不仅色彩过于单一乏味,而且在环境较暗的会议场景中使用根本无法看清桌牌上打印的内容。使用AOC会议桌牌则不必担心这个问题,其采用红黄黑白四色双稳态电子墨水屏,可以提供更多的色彩搭配,而且拥有亮态、暗态两种不同状态,可以更好地根据会议现场环境来进行调整。AOC会议桌牌还采用易显技术,无蓝光闪屏干扰,观看更安心舒适,提供如阅读纸张一般的视觉体验。

        优 势 五

        数据远距离快速传输 

        在进行相关展示内容编辑及发布时,不必担心距离过远而断开连接。AOC会议桌牌的数据传输可以支持超10米的远距离传输,而且传输速率更快,即便是开会时发现展示资料有所遗漏,也能马上进行编辑传输来进行信息补充,应用灵活从容。

        专注会议应用,赋能无纸化办公!作为全球知名显示设备提供商及品牌商,长久以来AOC始终致力于颠覆传统,打造更高效智能的企业会议办公新生态。而会议桌牌的推出及应用,正可以丰富会议场景,进一步带来便捷化、智能化、无纸化的智慧办公新体验!


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/198.html b/news/198.html new file mode 100644 index 0000000..81bccd4 --- /dev/null +++ b/news/198.html @@ -0,0 +1,362 @@ + + + + +会议平板成“香饽饽”多玩家“角力”会议平板_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        会议平板成“香饽饽”多玩家“角力”会议平板

        +
        +
        +
        +  2023-02-20 阅读:3 +
        +
        +

        对于职场人来说,开会是必不可少的环节,提起周例会、月例会,相信每一位职场人都不会感到陌生。不过,开会虽然并不是什么新鲜议题,但随着科技的进步与发展,“普普通通”的会议也因为越多越多的科技产品逐渐被应用至会议室场景中,而发生了一些“不一般”的改变。

          比如,此前频频出现在会议室中的投影仪、白板等办公设备,正在逐渐被新兴的办公会议设备——会议平板所替代。与此同时,随着越来越多的企业客户选择会议平板,整个会议平板行业也乘势而起,实现了蓬勃发展。

          会议平板成“香饽饽”

          在多方因素的共同影响下,会议平板这一办公会议设备不仅实现了快速发展,更是一度成为大热风口。据洛图科技(RUNTO)发布的相关报告显示,2021年,中国大陆大尺寸交互平板出货总量突破200万,达到202万台,同比增长19.3%。其中,商用交互平板的出货量达到66.4万台,同比增长53.6%。

          一来,远程办公需求增加,带动了会议平板需求量的增长。受疫情影响,人们的办公方式逐渐由线下办公朝着线上办公过渡,得益于此,远程办公的需求量也出现大幅度增长。据艾媒咨询数据显示,2020年新春期间中国远程办公人员超过3亿人,远程办公企业规模超过1800万家。在此背景下,会议场景也逐渐由本地会议室转移至线上会议室,而能够满足企业远程办公需求的会议平板,也逐渐获得了企业客户的认可,进入了发展快车道。

          二来,智慧办公、混合办公等新型办公模式逐渐深入人心,企业对会议平板的接受度也日渐提升。如今进入了后疫情时代,疫情对会议平板的“加持”影响逐渐退去。不过,智慧办公、混合办公等新的办公模式逐渐兴起,会议平板作为高效的办公工具,极大地提升了员工的办公效率,并且随着会议平板产品的不断打磨优化,会议平板的体验感和使用场景也得以不断升级扩展,企业客户对会议平板的认可度、接受程度正在逐渐提高。

          三来,会议平板集成了多种功能,可满足企业多种会议需求。据悉,会议平板集成了投影机、电子白板、幕布、音箱、电视、OPS电脑等诸多会议室办公设备为一体,具备高质量显示、触控书写、无线传屏、远程视频等多种功能,能够较为全面地满足企业的多样化会议需求。

          与此同时,会议平板能够解决传统会议中所存在的痛点问题,助力企业会议“提效”。比如,会议平板自带白板功能,不仅书写速度快,擦除同样方便,解决了传统会议场景中会议白板面积有限且擦拭难的问题;会议平板多为超清画质,画面清晰且色彩明亮,解决了投影设备受光线影响大、清晰度有限的问题;会议平板的投屏功能则能够将手机、电脑等终端设备中的文件、PPT等资料投屏至平板上,在较短时间内实现文件共享,从而提升会议效率。

          MAXHUB、皓丽“身经百战”

          在多方因素的共同作用下,会议平板呈现出较好的发展势头,而会议平板领域也迎来了众多参与者,竞争愈发如火如荼。而在一众行业参与者中,以MAXHUB、皓丽为代表的老牌厂商,可以说是会议平板行业的佼佼者。

          首先,老牌商用显示厂商入局时间早,具有先发优势。比如,康冠科技在2014年就推出了以生产销售智能会议平板为主的自有品牌“皓丽”。视源股份则是早在2011年就率先发布了国内第一代会议平板产品,是国内会议平板的先驱;并在2017年对外发布了“MAXHUB”品牌。经过在会议平板领域多年的深耕,以及在技术层面的不断创新与突破,以MAXHUB、皓丽为代表的会议平板行业先行者积累下了大量经验,并跻身行业前列。

          例如,据洛图科技(RUNTO)数据显示,2022年一季度,视源股份旗下MAXHUB连续保持行业首位,市占率达25%,同比上升5.7个百分点,市场份额的增长幅度最大;康冠股份旗下皓丽再次回归第二位,市占率约13%,增长了4.6个百分点。

          其次,老牌商用显示厂商瞄准细分市场,搭建了较为完善的产品矩阵,以全方位满足用户的差异化需求。事实上,MAXHUB在2020年就发布了V5系列会议平板产品矩阵,通过7款智能会议平板新品,全面覆盖细分化会议场景。无独有偶,皓丽也打造了细分化的会议平板矩阵,以适应不同会议场景。以此前发布的2022年度新品为例,皓丽推出了会议平板、商用会议电视、LED巨幕屏、投屏器、会议盒子等5款产品,可满足不同的会议场景和硬件条件。

          最后,MAXHUB、皓丽等先行者还深入行业,打造智慧解决方案,为企业赋能。事实上,早在2019年,MAXHUB就已经深入金融、医疗、新零售、政务等多行业探索智慧协同场景服务了。经过对各行业需求、痛点进行充分调研之后,MAXHUB也正式发布了医疗、金融、新零售、党建四大智慧行业解决方案。稍有不同的是,皓丽则能够根据消费者实际需求的不同,为其打造专属解决方案。据悉,目前皓丽已为30多个行业和应用场景提供全套解决方案。

          华为、联想“技术突围”

          现如今,跨界好似已经成为了各行业企业心照不宣的选择,会议平板行业也迎来了一批跨界玩家。比如,华为就在2020年4月推出了“IdeaHub系列企业智慧屏”产品,进军会议平板领域。联想也针对传统会议所存在的痛点问题,推出了联想thinkplus会议平板。而以华为、联想为代表的科技企业,选择布局会议平板也是有所倚仗的。

          一方面,凭借着深厚的技术积累,科技巨头可快速进入会议平板领域。与MAXHUB、皓丽等先行者相比,华为、联想等新玩家虽然不具备先发优势,但其所拥有的技术底蕴,足以支撑其快速推出会议平板产品。并且,科技巨头还能够利用自身技术优势,推出有别于其他同类型产品的会议平板。

          比如,华为此前发布的企业智慧屏就集投屏、书写合一的智慧平板、智能云会议、大屏App应用为一体,可满足企业会议室、开放办公区等多场景的智慧办公需求。联想的thinkplus会议平板不仅搭载了4K可变焦广角摄像头、智能声源定位、12阵列智能降噪麦克风等配件,其自研的智慧白板功能,更是能够为用户带来便捷、高效的使用体验。

          另一方面,科技巨头也能以技术优势为依托,加快会议平板产品的推新速度。比如,在今年的新品发布会上,华为不仅发布了业界首款搭载Harmony OS的新一代办公宝IdeaHub S2系列,同时还发布了华为会议平板IdeaHub B2系列。联想也有联想thinkplus会议平板 T86Pro、联想thinkplus会议平板SE系列等多款产品,可供用户根据实际情况进行选择。随着华为、联想等新进入玩家不断丰富产品线,也能逐渐扩大用户覆盖范围,增强自身在会议平板领域的影响力。

          创维、海信“经验加持”

          在众多布局会议平板领域的玩家中,家电企业的身影也是频频出现。据洛图科技(RUNTO)数据显示,2021年商用交互平板在国内出货量TOP5分别为:MAXHUB、华为、海信、皓丽和创维。其中海信和创维均为家电企业,可见家电企业已经成为会议平板市场颇为重要的一方势力。而入局会议平板市场不久的家电企业之所以会取得如此成绩,也与多方因素有关。

          一是,有硬件制造经验。创维、海信都是知名的家电巨头,在行业内深耕多年,其产品矩阵也覆盖电视、洗衣机、冰箱、厨卫等诸多电器品类,在硬件制造方面有着深厚的经验与积累。而会议平板也属于硬件产品,创维、海信等家电巨头多年来所积累下来的硬件制造经验也能够迁移至会议平板这一产品上面,打造出质量过硬的会议平板产品。

          二是,有渠道优势。就当前情况来看,会议平板的销售渠道可以分为线上和线下,而线下销售渠道是商用会议平板的主要销售渠道。创维、海信等家电巨头常年进行销售渠道建设,线下渠道资源积累丰富,而借助这些渠道优势,创维、海信等家电巨头所推出的会议平板产品也能触及到更多的用户群体,从而助推其会议平板业务的发展。

          三是,有完善的售后服务网络。除了产品质量与功能之外,服务也是众多用户选择会议平板品牌的重要考量因素之一,因此售后服务也是格外重要的一环。而创维、海信等家电巨头早已搭建起了完善的售后服务网络,比如,创维集团就拥有遍布全国两千多个地方的成熟高效售后服务网点。而创维商用、海信商用能以此为依托,提升其售后服务能力,为会议平板用户答疑解惑,提供高质量、专业的售后服务。

          总的来说,会议平板的普及以及应用,对于企业会议“提效”起到了积极的推动作用。伴随着企业数字化转型这一大趋势,会议平板仍然具备可观的潜在需求。与此同时,会议平板行业竞争升温,无论是老牌商用显示厂商还是科技厂商,亦或是家电厂商,仍需不断探索、精进自身,以便在后续竞争中占据优势。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/199.html b/news/199.html new file mode 100644 index 0000000..185f1ab --- /dev/null +++ b/news/199.html @@ -0,0 +1,362 @@ + + + + +小间距LED行业稳步发展,2023年市场整体向好!_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        小间距LED行业稳步发展,2023年市场整体向好!

        +
        +
        +
        +  2023-02-20 阅读:94 +
        +
        +

        回顾2022

          挑战虽在,机遇并存

          2022年受疫情影响,虽然LED显示市场整体不达预期,但是资本投资热度依然不减。2022年投向Mini/Micro LED等领域的新增投资超过了700亿元人民币。设备、基板材料等Mini/Micro LED配套产业链也成为2022年投资的重点之一。此外,2022年,搭载Mini LED背光的终端新品超过了100余款,远远超过了2021年全年的数量。

          数据来源:高工LED

          2022年小间距LED行业进入由起步探索走向规模发展的新阶段,在虚拟拍摄、影院屏、裸眼3D、体育赛事屏、户外广告屏以及元宇宙XR/VR/AR技术等诸多领域都保持着强劲的成长渗透率,涌现出很多极具前瞻性与代表性的典型应用案例,未来前景可期。

          冬奥会

          2022年冬奥会开闭幕式上,巨型LED地砖屏、梦幻五环、冰立方、冰瀑布、雪花型火炬台等技术,向全世界展现了一个个叹为观止的画面,LED显示屏也因此更加“出圈”,被更多人了解和深入探究。

          户外裸眼3D

          2022年,从日本东京新宿站街头的巨大三色猫,再到国内重庆解放碑的机器狗,成都太古里的宇宙飞船等网红景点的出现,使得裸眼3D技术在室内外广告领域的再度火热,成为细分应用领域内的又一吸睛类别。

          元宇宙XR技术

          2022年,“元宇宙”概念兴起并逐渐走向应用,LED显示屏作为XR技术的主要显示介质,是搭建XR虚拟影棚的关键硬件设备,从上游LED器件封装到下游应用设备调试,XR技术的快速发展对显示屏端、封装端、内容制作端等产业链各环节提出了新要求和新挑战,同时也为未来LED显示屏行业发展储备了新的市场动能。

          世界杯

          2022年卡塔尔世界杯随处可见LED显示屏的身影,有近十家企业为世界杯赛事提供了显示相关设备,各大体育场馆内,从围栏屏再到计分直播大屏, LED显示屏企业用实力显示证明了LED显示屏的强有力存在。

          立足2023

          潜力无限,大有可为

          目前,小间距LED作为未来LED显示屏的主要推动力,整体渗透率占比不足50%,仍处于较低水平,未来的市场渗透率有望持续提升;据高工产业研究院预计,2025年全球小间距LED市场规模将达35亿美元,2027年将达到100亿美元大关,未来的市场发展潜力十分巨大。

          飞利浦商显作为行业内知名的全屏商用产品及解决方案提供商,精准洞悉小间距LED行业发展趋势,凭借自身在LED显示行业的丰富经验,创新推出飞晶Pro COB系列 全倒装mini LED显示屏及专业视频控制器P-box系列,致力为政务数字化、新能源、数字金融、智慧交通、广电传媒、文博文旅、高端酒店及零售、会展等行业提供专业化、一体化、定制化解决方案。

          在刚刚结束的中国数字音视工程行业2022年度评选中,飞利浦不负众望,斩获 “COB小间距-产品创新奖”,成功获得行业及市场的一致认可;同年11月,飞利浦携手东方明珠与书怀文化,共建国内首座元宇宙“4R云原生美术馆”,飞利浦主要负责为 “云原生美术馆”的整体建设,及东方明珠广播电视塔入口处零米大厅的LED互动巨幕,提供专业化、定制化、软硬件一体化的智慧显示产品及方案,积极探索多元化社交场景,给用户带来更高品质的观展体验。

          在万象更新、火力全开的2023年,飞利浦将联动多方资源和力量,加速全产业链布局进程,以最先进、最前沿的数字化科技与制造技术为“源动力”,持续推进专业LED显示市场主体的发展壮大。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/2.html b/news/2.html new file mode 100644 index 0000000..ba14ec3 --- /dev/null +++ b/news/2.html @@ -0,0 +1,362 @@ + + + + +TCL华星入选Brand Finance全球电子家电品牌价值50强_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        TCL华星入选Brand Finance全球电子家电品牌价值50强

        +
        +
        +
        +  2022-04-23 阅读:11 +
        +
        +

        近日,英国品牌评估机构“品牌金融”(Brand Finance)发布2022“全球电子家电品牌价值50强”排行榜(Electronics & Appliances 50 2022),苹果、三星、华为名列前三。50大电子家电品牌总价值7544亿美元,其中20个中国品牌总价值1533亿美元,占比20.3%。而TCL华星作为半导体显示领域领先企业之一,品牌价值大涨81%,与北美、西欧、日韩等地的国际消费电子厂商同场竞技榜上有名,让品牌的强势发展吸引了更多关注。

        Brand Finance作为一家在全球处于领导地位的独立品牌价值和战略咨询机构,是世界五大品牌价值评估权威机构之一,其公布的全球榜单因其专业性和独立性而受到全球上市公司的广泛认可。此次,TCL华星榜上有名也证明了自身深厚的品牌综合实力,而之所以能在群雄环伺的电子家电品牌中脱颖而出、赢得权威机构的高度认可,得益于品牌自身多年来在科技领域的深耕不辍。

        作为全球半导体显示龙头之一,TCL华星以深圳、武汉、惠州、苏州、广州、印度为基地,拥有9条面板生产线、5座模组厂,投资金额超2600亿元。多年来,TCL华星始终将自主创新作为企业发展的生命线,积极布局新型半导体显示技术、工艺和材料,构建了从效率领先到产品技术领先的竞争优势。

        在技术布局方面,TCL华星重点推进LCD、印刷OLED/QLED、Mini LED 及 Micro LED 等新型显示技术的开发和商业化应用,致力于打造更多元的屏显技术,赋能全新交互场景,领航新视界;在产品覆盖上,除了传统TV、手机产品外,TCL华星进一步布局包括高端旗舰车载、笔电、平板、VR显示面板等产品线,并大力提升产品轻薄化,致力为用户提供更轻便的使用体验,给产业发展带来新增长引擎。

        2021年,TCL华星在TV面板市场份额全球第二,55吋产品份额全球第一,65吋和75吋产品份额全球第二,在8K和120Hz高端电视面板市场份额全球第一;商显产品出货量全球第二,其中,交互白板市场份额位居全球第一,数字标牌全球第二,拼接屏全球第四;高端电竞产品市场份额全球第二,34吋与49吋电竞带鱼屏出货量全球第一,27吋与32吋电竞屏出货量全球第二;LTPS平板面板出货量全球第一;LTPS笔电面板出货量全球第二;小尺寸LTPS手机面板与柔性OLED手机面板出货量全球前四。

        不仅如此,根据世界知识产权组织(WIPO)公布的2021年PCT国际专利申请排名榜单显示,TCL华星2021年公开的PCT国际专利1954件,位列2021年全球企业PCT公开专利排行榜第8位,位列2021年中国企业第4位,这也标志着TCL华星坚持自主创新道路,实现在屏显技术层面的崛起与领先。

        如今,TCL华星已从行业跟跑者转变成领导者,作为业内高质量发展的典范,TCL华星以领先的品质优势与顶尖的创新技术树立了中国显示行业的标杆。希望未来,在全球电子产业的竞争中,TCL华星能拿出更多丰硕成果,代表中国科技向世界展示出更多底气与自信!

        +
        +反对 0举报 0 +收藏 1 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/20.html b/news/20.html new file mode 100644 index 0000000..1498e38 --- /dev/null +++ b/news/20.html @@ -0,0 +1,362 @@ + + + + +Datavideo全新4K 可视化触控一体机即将上市_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        Datavideo全新4K 可视化触控一体机即将上市

        +
        +
        +
        +  2022-05-01 阅读:16 +
        +
        +

        静待了2年多的NAB 展会终于在美国的拉斯维加斯翘首登场,Datavideo洋铭如约而至。本次展会上,Datavideo展示多项极具创意的新产品和应用型系统解决方案,其中最吸睛的当属Datavideo这款轻便型、功能强大的4K可视化触控一体机SHOWCAST 100,它适用于会议录播、报告厅音视频系统建设、政企培训、在线课程制作、可视化广播及多机位现场节目制作等,集成专业的4K一站式音视频制作解决方案。

          SHOWCAST 100 是什么?

          Datavideo SHOWCAST 100 4K 可视化触控一体机是Datavideo首款支持4K 50/60p视频输出的一体机,具备高分辨率画面与流畅操作性能。除此之外,Datavideo SHOWCAST 100更将视频切换、摄像机控制、直播、录像、字幕、触摸屏控制和混音七大功能集成于一体,具备大而明亮的14英寸大型触摸屏,赋予操作者在大型触控面板上通过虚拟按钮也能流畅操作切换台的功能,就像操作平板电脑一样的迅速与直观。这款设备兼容 Datavideo 4K云台摄像机、4K录像机、4K 监视器,可构建完整的一站式4K视频制作解决方案。

        内建云台摄像机控制功能,只需一根网线即可控制云台摄像机转动及其他参数设定,最多可连接三台云台摄像机,共可储存12个预设位,操作者如同拥有12 个景别,应用时快速调取,使拍摄更高效。

          SHOWCAST 100内建的网络直播编码器具备双平台直播功能,一键按下即可轻松直播。除了可以进行一般的16:9视频直播之外,通过9:16竖屏直播更能抓住手机用户的眼球。包括重要的视频备份需求,也早已在产品设计者的考虑之中。在节目制作中,SHOWCAST 100能以 H.264/AVC编码格式录制视频备份,若结合dvCloud串流直播平台,则可在云端进行备份及直播,重要数据万无一失。您更可直接在SHOWCAST 100 上进行混音工作,支持四轨混音器与加嵌音源,让画面与声音相辅相成,时刻呈现精彩。

        “SHOWCAST 100 是操作简单、直观的 4K 60p 一体机,对于寻求大型现场制作解决方案的专业视频工作者而言,SHOWCAST 100无疑是具备了高画质、精简人力且高性价比等优势!”Datavideo美国总经理Craig Moffat 兴奋地说道,“世界上没有其他 4K60p 硬件切换台能够媲美SHOWCAST100,可通过内建14英寸触控屏幕同时操控多台云台摄像机与切换多信号画面。”

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/200.html b/news/200.html new file mode 100644 index 0000000..ffb0139 --- /dev/null +++ b/news/200.html @@ -0,0 +1,362 @@ + + + + +2022年中国大陆液晶数字标牌市场总结与展望_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年中国大陆液晶数字标牌市场总结与展望

        +
        +
        +
        +  2023-02-22 阅读:57 +
        +
        +

        根据洛图科技(RUNTO)发布的《中国大陆液晶数字标牌市场分析季度报告(China LCD Digital Signage Market Analysis Quarterly Report)》,2022年,中国大陆液晶数字标牌出货50.3万台,同比下降56.4%,是疫情前后的近年来最低水平。

        2022年,内因外因联动效应,中国整体经济增幅压缩显著,各行各业预算吃紧。尤其是,疫情持续起伏不定导致全国范围内上至企业、下至个人,均对整体环境表示悲观,消费需求严重释放不足,此外,互联网巨头缩减支出,扩张降温,多重因素影响下,数字标牌行业景气度直线下降。

        分场景来看,本报告中的液晶数字标牌分为户内和户外液晶数字标牌。户内液晶数字标牌包括梯媒和非梯媒产品,非梯媒产品包括立式、壁挂式、卧式数字标牌、电子餐牌、电子水牌、海报机等。户外液晶数字标牌产品仅统计户外液晶数字标牌一体机产品,不包含LED屏,液晶拼接墙等大型显示产品。

        统计范围内,户内液晶数字标牌出货占比97%,户外液晶数字标牌占比3%。户内出货占比相较2021年上升1.6个百分点,户外占比相应的下滑则主要由于旅游业、社区建设、城市交通、商业地产等持续受到疫情的全面重创,应用需求不足。

        2019-2022年 中国大陆液晶数字标牌市场出货量

        数据来源:洛图科技(RUNTO),单位:千台,%

        户内:梯媒设备长期低迷;尺寸集中于43和55寸

        根据洛图科技(RUNTO)数据显示,2022年户内液晶数字标牌出货48.8万台,同比下降55.7%。其中梯媒占比19.7%,同比上升1.4个百分点,非梯媒占比80.3%。

        梯媒显示设备出货9.6万台,同比下滑52.3%。两大梯媒传媒巨头在2018年的客户抢夺大战中,进行了大规模的点位扩张;之后则开始长时间的低效点位优化,因而梯媒显示设备市场随大盘下跌。

        非梯媒显示设备出货39.2万台,同比下降56.4%。2022年的出货主要以用于产品宣传的壁挂广告机为主,占比46.8%,其次是较多用于百货服饰中商品展示的立/竖式广告机,占比34.9%。

        尺寸方面来看,户内的应用主要以40-49与50-59寸为主,其占比分别为22.8%、23.5%,具体又以43寸与55寸占比最高。2022年各地的党史宣传火热,55寸等用于党建宣传室的产品需求旺盛,而43寸则是以企业宣传展示、零售百货应用最为广泛。

        2019-2022年中国大陆户内液晶数字标牌尺寸段结构

        数据来源:洛图科技(RUNTO),单位:%

        户外:下滑71%,Q2最严重;社区建设占比22%

        根据洛图科技(RUNTO)数据显示,2022年户外液晶数字标牌出货为1.5万台,同比下降71.1%,其中以疫情影响出行最严重的二季度下滑最甚。

        户外广告机的应用集中在社区、交通、商业地产和旅游及展馆,其中社区占比22%,同比上升将近4个百分点。“十四五”城乡社区服务体系建设规划中对于智慧社区发展提出明确指示,要带动社区智慧化改造。智慧社区中,依托广告机进行信息、资讯发布,是很重要的社区公共服务的体现。

        2019-2022年中国大陆户外液晶数字标牌市场出货量

        数据来源:洛图科技(RUNTO),单位:千台,%

        展望:疫情消退,2023年强劲恢复,增长33%

        随着疫情情况稳定、明朗化,封控时代已经过去。长期积压的休闲娱乐、旅游度假、民俗体验等消费领域迎来强劲复苏,将带动各行各业回暖反弹。

        2023年,中国数字标牌市场的增长点展望在商业百货零售、会展、交通和企业宣传行业。进入一季度,企业政府展厅、体育活动中心等细分场景已经收获不少需求;全年来看,洛图科技(RUNTO)乐观预测,2023年,中国数字标牌行业发展将强劲恢复,整体出货量达到67万台,同比增长33.2%。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/201.html b/news/201.html new file mode 100644 index 0000000..33510c7 --- /dev/null +++ b/news/201.html @@ -0,0 +1,362 @@ + + + + +“聚焦仙视,闪耀C位”,MxxGUQ云数字标牌来了!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        “聚焦仙视,闪耀C位”,MxxGUQ云数字标牌来了!

        +
        +
        +
        +  2023-02-22 阅读:30 +
        +
        +

        近日,仙视发布新品MxxGUQ云数字标牌,以及产品功能特点。以创新产品为特色,侧重于解锁更多商显新可能以及消费者个性化体验提升。

        我们通过产品的更新迭代、出色的技术,帮助用户打造定制化体验。今年,不负众望,仙视持续开拓创新,步履不停,通过云端智能化实现数字标牌高质量的提升,期待为零售商提供更多简化选择。

        作为知名商显设备提供商及品牌商,Goodview深谙数字标牌于行业的重要性,在继续完善自身产业线的同时,推出MxxGUQ云数字标牌,用以应对多场景应用需求,为行业客户提供更多选择。

        来一起看看MxxGUQ系列有什么价值呢?

        配置升级,稳定输出

        系统配置大大提升,最新兼容性和稳定性系统再升级,在原先基础上性能提升5倍以上。帮助零售商稳定输出,轻松应对换季更新和活动营销换新,强劲出众更从容。

        高画质,强吸引力

        升级后的画面更具活力,高色准如电影质感般精彩。智能PQ调节,还原真实色彩,针对草地、天空、森林、建筑物等可智能调节PQ参数,让画面和内容传达更加清晰逼真,十米开外也能准确获取门店内容,让消费者优先选择门店消费。

        此款还加入了帧漂移技术,有效预防门店屏幕静态残影和灼伤,长时间运行可靠保障、稳定性强,不担心死机。

        高工艺,提升门店形象

        超窄边框,定义时尚新形态,提升门店形象;屏幕灵活拼接,不受空间设计影响,显示屏与空间感完美融合,嵌墙安装也无需考虑遥控遮挡问题。可根据多场景灵活开启或关闭,横竖屏可自适应,就算在琳琅满目的门店中也能出类拔萃。

        SaaS云服务,集中管理与发布

        SaaS云服务OTA智能升级,提高工作效率从接单到出餐,让每次数据变化,都发挥价值。不同类型门店、设备形态统一管理发布策略记忆,一键完成终端管理。无惧成千上万家门店,统一远程管理,智能控制发布。

        信息保护,智能安全

        普通的数字标牌开机后需要调试信号源,选择开机通道,繁琐费力。仙视数字标牌开机自启,通道记忆,省时省力,智能高效,满足不同场景客户。

        信息安全再升级:遥控锁、键盘锁、USB识别开关由运维管理者统一操作,有效防止信息泄露和恶意入侵。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/202.html b/news/202.html new file mode 100644 index 0000000..bb2f072 --- /dev/null +++ b/news/202.html @@ -0,0 +1,362 @@ + + + + +昆山市震川社区卫生服务中心新中心标识标牌采购竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        昆山市震川社区卫生服务中心新中心标识标牌采购竞争性谈判公告

        +
        +
        +
        +  2023-02-22 阅读:8 +
        +
        +

        新中心标识标牌采购 采购项目的潜在供应商应在江苏省苏州市昆山市前进东路888号四幢三单元四楼获取采购文件,并于2023年03月01日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:HSRY2023-ZG-004

        项目名称:新中心标识标牌采购

        采购方式:竞争性谈判

        预算金额:49.0000000 万元(人民币)

        采购需求:

        新中心标示标牌采购(详见招标文件)

        合同履行期限:合同签订后30个日历天

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        /

        3.本项目的特定资格要求:1、本项目采用资格预审,供应商在购买标书时须向招标代理机构提供以下资格预审材料复印件加盖公章单独装订成册(要求的原件另附)一式两份,只有通过资格预审的供应商方可以报名购买招标文件,如有伪造或虚报,则招标代理机构有权取消该单位的报名资格。1.1、供应商具有独立承担民事责任的能力;(提供法人或者其他组织的营业执照等证明文件)1.2、供应商具有良好的商业信誉和健全的财务会计制度;(提供参加本次政府采购活动前的财务报告或者银行出具的资信证明)1.3、供应商有依法缴纳税收和社会保障资金的良好记录;(提供参加本次政府采购活动前依法缴纳税收和社会保障资金的相关材料)1.4、、如非法人到场报名的,还须提供法人授权委托书、法人身份证复印件、被授权委托人身份证复印件。授权委托代理人必须为供应商在职人员(提供近三个月社保证明材料);1.5、供应商如有不良行为的,在公示期间,招标人拒绝其投标报名;1.6、供应商参加政府采购活动前三年内,在经营活动中没有重大违法记录;(提供声明函,格式自拟。重大违法记录是指供应商因违法经营受到刑事处罚或者责令停产停业、吊销许可证或者执照、较大数额罚款等行政处罚)1.7、本次招标不接受联合体投标

        三、获取采购文件

        时间:2023年02月22日  至 2023年02月24日,每天上午9:00至11:30,下午13:30至16:30。(北京时间,法定节假日除外)

        地点:江苏省苏州市昆山市前进东路888号四幢三单元四楼

        方式:现场购买

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月01日 10点30分(北京时间)

        地点:江苏省苏州市昆山市前进东路888号四幢三单元四楼

        五、开启

        时间:2023年03月01日 10点30分(北京时间)

        地点:江苏省苏州市昆山市前进东路888号四幢三单元四楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        /

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:昆山市震川社区卫生服务中心     

        地址:昆山市震川社区卫生服务中心    

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/203.html b/news/203.html new file mode 100644 index 0000000..1f32256 --- /dev/null +++ b/news/203.html @@ -0,0 +1,362 @@ + + + + +西安市中心医院标识标牌采购项目采购更正公告(第一次)_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        西安市中心医院标识标牌采购项目采购更正公告(第一次)

        +
        +
        +
        +  2023-02-23 阅读:7 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:ZMZB2022ZXYY-282

        原公告的采购项目名称:标识标牌(一级、二级、三级导向标识)采购项目

        首次公告日期:2023年02月15日

        二、更正信息:

        更正事项:采购公告

        更正原因:

        补充采购要求

        更正内容:

        1.采购要求增加“六、其它要求(清单)”,具体详见附件1;

        2.更正分项报价表,具体详见附件2

        其他内容不变

        更正日期:2023年02月23日

        三、其他补充事项

        (1)时间:上午09:00--12:00,下午13:30--17:00(工 作 日),现场领取磋商文件时请携带单位介绍信原件、身份证原件及复印件加盖公章,谢绝邮递。(2)在采购文件获取时间内通过电子邮箱发送电子版报名资料的方式获取采购文件,供应商出具的对领取人的授权委托书或介绍信以及领取人的身份证,加盖公章后以扫描件形式发送至shanxizhuoming_zb@163.com邮箱,(邮件标题命名格式为“供应商名称+联系人+联系电话+项目名称”),磋商文件将通过邮箱发送,无须现场领取。(3)请供应商按照陕西省财政厅关于政府采购供应商注册登记有关事项的通知中的要求,通过陕西省政府采购网(http://www.ccgp-shaanxi.gov.cn/)注册登记加入陕西省政府采购供应商库。

        四、凡对本次公告内容提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/204.html b/news/204.html new file mode 100644 index 0000000..68697ca --- /dev/null +++ b/news/204.html @@ -0,0 +1,362 @@ + + + + +商业场所数字标牌系统怎么才能更加吸引人?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        商业场所数字标牌系统怎么才能更加吸引人?

        +
        +
        +
        +  2023-02-23 阅读:5 +
        +
        +

        现如今商业综合体和购物中心等大型商业场所层出不穷,大家在商业购物中心时通常需要智能数字标识系统和商业场所导视牌作为购物的首要指引,附带LED高清数字海报屏的商场数字标牌能够快速报吸引人们的注意力,当然,也有一些商家选择用自有的智能电子水牌或户外广告机,这就意味着商业场所数字标牌亟需特定元素来引人注目,并给连锁门店或商铺带来更多客流量,商业场所数字标牌系统对用户更具吸引力的方法可以参考下面几点:

        1,商业数字标识设置用户奖励机制,奖励用户对购物中心数字标识牌广告的持续关注,建议可以在标识信息展示页面或是宣传视频的篇尾处添加一个二维码,这样用户可使用移动端扫描二维码以获取更多商业场所相关信息,或选择展示可在商场内门店的在线门店兑换的折扣码,这是吸引用户时刻关注商业场所数字标牌的切入点。

        2,商业场所智能导视系统显示相关视频,商业数字标牌系统规划设计时可设置动态视频展现,可以让用户驻足并认真观看数字标识标牌所展示的趣味内容,并不只是一味的产品促销广告信息,比如商业综合体连锁店数字侧招或数字广场屏可设置展示最新时装秀的精彩镜头,模特在T台上走秀,穿着店内现有的服装,立马给人一种身临其境的既视感。

        3,商场智能标识需具有交互性,商业场所数字标牌系统提升交互体验比单方面突出其产品更有立竿见影的效果,应用智能标识系统的触摸数字屏,其导航菜单系统方便用户详细了解商场有关促销产品和活动信息。

        从广义上看,商业场所追求的大客流和用户追求的体验度看似矛盾,但商业场所数字标牌系统让两者能和谐共存,同时给用户带来视觉层面的震撼体验,更深入地吸引用户参与到交互环节,使得用户和商业数字标识联动起来,加之在各种商业竞争日益激烈的大环境下,商户都迫切希望能够通过合理方式吸引更多用户的关注,进而将用户转化为直观经济价值的体现。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/205.html b/news/205.html new file mode 100644 index 0000000..64741b1 --- /dev/null +++ b/news/205.html @@ -0,0 +1,362 @@ + + + + +南充嘉陵:免费为企业制作户外广告 鼓励优质企业扩能增产_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        南充嘉陵:免费为企业制作户外广告 鼓励优质企业扩能增产

        +
        +
        +
        +  2023-02-23 阅读:35 +
        +
        +

        2月21日,四川尚好茶业有限公司董事长刘露民从成都返回南充时,看到沪蓉高速公路嘉陵段附近山头上有一块关于公司宣传的单立柱广告牌,鲜活的广告词和精美的画面吸引了他的注意,但公司并没有在这里制作广告牌。通过多方了解才知道,今年2月,南充市嘉陵区委、区政府决定,为辖区内的优质企业制作户外广告,投放点涵盖了沪蓉高速公路沿线和城区单立柱广告牌、城市过街天桥、宣传橱窗、配电箱栅栏、非机动车停车位围栏等,多达220多处。

        2022年,由于疫情等原因,嘉陵区内企业产销受到不同程度的影响,但是吉利四川商用车公司全年产销整车3万多台、增长228%,四川燕京啤酒逆势上扬、产值税收实现双提升,凸酒技改迁建即将竣工、产能加快恢复。本次嘉陵区选出了吉利汽车、尚好茶业、凸酒酒业、燕京啤酒以及5家丝纺服装企业,为他们免费制作户外广告,鼓励优质企业扩能增产,带动在建项目建成投产,为南充加快建设区域制造中心贡献嘉陵力量。

        嘉陵城区干道旁的四川燕京啤酒广告

        据负责此次广告设计的南充嘉融文化传媒有限公司市场部负责人介绍,该公司接到设计广告的委托后,在嘉陵区融媒体中心的指导下,查阅大量的企业资料,认真研究产品特征,精心策划广告制作方案,设计过程中精益求精,所有设计数易其稿,修改最多的达到20多版。

        “广告内容太符合我们的企业文化、产品特征、销售期待了,说明了设计方是用心用情制作的。”刘露民坦言,此前尚好茶业公司推出过自己设计的户外广告,但没有此次广告词精炼、画面冲击力强、广告安装覆盖面广。

        “区委、区政府务实的服务,提振了企业发展的信心。”刘露民说,目前尚好茶业公司桑产业融合示范区即将竣工投产,公司获得发明专利45项,转化高新技术成果13项,创新推出桑叶茶用、食用、饲用等新型桑产业发展模式,桑茶和桑叶粉产量、产值、品质均位居全国第一。

        嘉陵城区干道旁的广告牌

        据了解,今年嘉陵区启动实施“十大工程”,包含制造业“过千亿”工程,深入实施主导产业提质倍增、“贡嘎培优”“珠峰攀登”和成长型中小企业“提质壮干”计划,奋力打造两大千亿级和三大百亿级产业集群,确保今年规上工业增加值增长10.5%以上,2026年规上工业总产值突破1000亿元。此次为企业打广告是嘉陵区推进“三大行动”中作风建设年行动的具体体现,纳入免费广告制作的9家企业是制造业“过千亿”工程的主力军。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/206.html b/news/206.html new file mode 100644 index 0000000..bb83cd1 --- /dev/null +++ b/news/206.html @@ -0,0 +1,362 @@ + + + + +2022年全年中国大陆户内数字标牌品牌销量显示仙视稳居第一_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年全年中国大陆户内数字标牌品牌销量显示仙视稳居第一

        +
        +
        +
        +  2023-02-24 阅读:30 +
        +
        +

        Goodview行业市占率稳居第一,推动行业持续发展!近日,据数据《DISCIEN-2022Q4中国户内&户外DS市场研究报告》报告中指出,2022年全年中国大陆户内数字标牌品牌销量显示仙视稳居第一,头部企业依托其核心竞争力、核心优势保持14年持续领先地位。

        值得注意的是,在经济下行的情况下,数字标牌行业市占率第一的Goodview,今年全年再次交出了一份令人喜出望外的答卷。在《DISCIEN-2022Q4中国户内&户外DS市场研究报告》的报告中,Goodview 以高达12.4%的市场占有率继续领跑,强势保持行业第一地位,头部领先优势持续渗透不断扩大。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/207.html b/news/207.html new file mode 100644 index 0000000..aa1ea58 --- /dev/null +++ b/news/207.html @@ -0,0 +1,362 @@ + + + + +六安裕安城管:户外广告标牌实行“备案制”办理_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        六安裕安城管:户外广告标牌实行“备案制”办理

        +
        +
        +
        +  2023-02-24 阅读:19 +
        +
        +

        为持续深化“一改两为”全面提升工作效能,扎实推进为民服务落实落细,裕安区城管局对“设置大型户外广告及悬挂张贴宣传品”招牌标识给于“备案制”办理。

        根据相关文件精神,裕安区城管局持续推进优化审批服务,做好“四送一服”及“放管服”工作,向“让群众少跑腿”和“一次不要跑”目标推进,对“设置大型户外广告及悬挂张贴宣传品”招牌标识,标准门头招牌,整街规模一致,给于“备案制”办理,经过一年来区城管局窗口审批办理的试行,得到企业、群众一致认可。截至目前,“备案制”办理已按简化流程审批办理116件。

        “备案制”办理优化审批流程,比纸质材料线下走流程简便很多,企业、群众通过安徽政务服务网或皖事通APP网上自主申报,承诺申请内容真实有效,不影响交通和消防安全,给予备案办理,现场及时办结,属地执法机构积极做好监管服务工作。(徐先进)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/208.html b/news/208.html new file mode 100644 index 0000000..7322357 --- /dev/null +++ b/news/208.html @@ -0,0 +1,362 @@ + + + + +浅谈未来我国标识标牌的发展_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        浅谈未来我国标识标牌的发展

        +
        +
        +
        +  2023-02-24 阅读:8 +
        +
        +

        随着城市建设的不断加快,标识标牌逐渐被人们所重视。标识标牌作为公共环境的重要组成部分,除了满足社会生活的基本需要,还是城市地域文化和时代精神的体现和标志。标识标牌的功能性、地域性、艺术性、与环境的配合度都是衡量其是否适用的重要因素。在国际标识标牌向着多元化、智能化、标准化、艺术化和景观化发展的今天,我国标识标牌该如何发展值得思考?

        标识标牌是公共空间及景观环境的重要组成部分,是城市规划设计的细化和深入。城市规划和设计考虑了人活动的一定规律,但是不可能充分考虑到人活动的偶然性,这些矛盾和具体问题很大程度上依靠标识标牌来进行改善和解决。标识标牌主要用于协调城市环境、公共空间和人群行为三者的关系,满足人群对城市公共生活的基本需求,提高人的生活质量,创造人与人、人与物之间的交流媒介,以此来引导健康、积极的社会生活方式。因此,未来我国标识标牌主要的发展方向为标识标牌一体化设计。

        标识标牌一体化设计主要可概括为两个方面,一是标识标牌功能一体化,即通过合理的设计,将现有的标识标牌功能进行组合、重组,使原本仅具备单项功能的标识标牌功能多样化,以实现空间、资源利用最大化;二是城市与标识标牌一体化,即标识标牌需与周边环境进行配套设计,以城市的历史人文情怀孕育街道家具的独创性,以标识标牌的艺术性提升城市审美与品味。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/209.html b/news/209.html new file mode 100644 index 0000000..2ebb275 --- /dev/null +++ b/news/209.html @@ -0,0 +1,362 @@ + + + + +川北医学院附属医院宣传品制作、标识标牌维护服务项目采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        川北医学院附属医院宣传品制作、标识标牌维护服务项目采购公告

        +
        +
        +
        +  2023-02-24 阅读:43 +
        +
        +

        受川北医学院附属医院(采购人)委托,拟对川北医学院附属医院宣传品制作、标识标牌维护服务项目采用竞争性磋商方式进行采购,特邀请符合本次采购要求的供应商参加本项目的竞争性磋商。
        一、采购项目基本情况
        1.项目编号:SQJC-2023-0093号。
        2.采购项目名称:川北医学院附属医院宣传品制作、标识标牌维护服务项目。
        3.采购人:川北医学院附属医院。
        二、资金情况
        资金来源及金额:已落实。
        三、采购项目简介:
        川北医学院附属医院拟采购宣传品制作、标识标牌维护服务项目,本项目为1个包。
        (详见磋商文件第五章)。
        四、供应商邀请方式
        五、供应商参加本次采购活动应具备下列条件
        1、满足《中华人民共和国政府采购法》第二十二条规定;
        2、落实采购政策需满足的资格要求:无;
        3、本项目的特定资格要求:无。
        六、禁止参加本次采购活动的供应商
        为采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得参加本采购项目。供应商为采购人、采购代理机构在确定采购需求、编制磋商文件过程中提供咨询论证,其提供的咨询论证意见成为磋商文件中规定的供应商资格条件、技术服务商务要求、评审因素和标准、采购合同等实质性内容条款的,视同为采购项目提供规范编制。
        七、磋商文件获取:
        磋商文件自2023年2月27日至2023年3月3日每日上午09:00- 12:00,下午14:30- 17:00(北京时间,法定节假日除外)发售。磋商文件售价:人民币300元/份。
        获取方式:(1)现场获取,获取磋商文件时,经办人员应当现场提交以下资料:供应商为法人或者其他组织的,需提供单位介绍信或法人授权书(需注明项目名称、项目编号及包号、介绍信或授权书的有效期)、授权代表身份证(留加盖公司公章的复印件)、报名登记表(见附件,该附件不作为采购文件内容仅作为报名资料,此表可提前准备也可现场填写);供应商为自然人的,需提供本人身份证明(留本人签字的复印件)、报名登记表(见附件,该附件不作为采购文件内容仅作为报名资料,此表可提前准备也可现场填写)。
        (2)网络获取:经办人员应当将资料扫描件发送至邮箱,待采购代理机构邮件通知审核资料结果无误后可进行转账。原件于递交响应文件当天交至采购代理机构处。注:①供应商报名时须如实填写项目信息及供应商信息,如信息有变更请于报名截止时间前书面通知代理机构进行变更登记,如因供应商提供的信息错误导致对其参加的采购活动有影响,后果由供应商自行承担。②报名资料的递交时间以邮件到达时间为准,报名完成以转账到账时间为准;文件售卖截止时间邮件未到达的供应商或文件售卖截止时间未转账的供应商不得参加本次采购活动。提交资料包括:供应商为法人或者其他组织的,需提供单位介绍信或法人授权书(需注明项目名称、项目编号及包号、介绍信或授权书的有效期)、授权代表身份证复印件并加盖公司公章、报名登记表(发送资料后回传);供应商为自然人的,需提供本人身份证明复印件、报名登记表(发送资料后回传)。
        八、递交响应文件截止时间:2023年3月9日9:30:00(北京时间)。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/21.html b/news/21.html new file mode 100644 index 0000000..2917fb2 --- /dev/null +++ b/news/21.html @@ -0,0 +1,362 @@ + + + + +市场监管总局:进一步优化广告产业发展环境_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        市场监管总局:进一步优化广告产业发展环境

        +
        +
        +
        +  2022-05-01 阅读:16 +
        +
        +

        据市场监管总局网站消息,近日,市场监管总局印发《“十四五”广告产业发展规划》,系统谋划“十四五”时期推动广告产业高质量发展相关工作。 《规划》提出广告产业向专业化和价值链高端延伸、产业发展环境进一步优化等发展目标。

        《规划》明确了“十四五”时期广告产业发展坚持正确导向、坚持服务大局、坚持新发展理念、坚持规范发展、坚持更好满足美好生活需要等基本原则,提出了广告产业向专业化和价值链高端延伸、产业发展环境进一步优化、发展质量效益明显提升、产业创新能力和服务能力不断提高、广告法制体系进一步完善、广告作品质量进一步提升、广告市场秩序持续向好等发展目标。

        为推动广告产业高质量发展,《规划》从把牢政治方向维护正确导向、优化政策供给激发产业活力、鼓励创新驱动促进产业升级等方面部署了10大重点任务,并设置了公益广告振兴行动、广告领域“放管服”改革、广告产业高质量发展引领工程、广告产业服务能力提升行动、广告法律法规体系的健全完善、广告监管能力提升行动、广告领域人才培养行动7个专项行动。

        《规划》强调,要通过加强组织领导、健全保障体系、强化评估考核来加强组织实施。(完)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/210.html b/news/210.html new file mode 100644 index 0000000..e7c92da --- /dev/null +++ b/news/210.html @@ -0,0 +1,362 @@ + + + + +盘锦市人民防空标识标牌制作安装竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        盘锦市人民防空标识标牌制作安装竞争性谈判公告

        +
        +
        +
        +  2023-02-24 阅读:8 +
        +
        +

        一、项目基本情况

        项目编号:JH22-211100-03518

        项目名称:人民防空标识标牌制作安装

        采购方式:竞争性谈判

        包组编号:001

        预算金额(元):350,000.00

        最高限价(元):350,000

        采购需求:查看

        合同履行期限:详见采购文件

        需落实的政府采购政策内容:促进中小企业、支持监狱企业、促进残疾人就业、支持脱贫攻坚等相关政策

        本项目(是/否)接受联合体投标:否

        二、供应商的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定。

        2.落实政府采购政策需满足的资格要求:详见采购文件

        3.本项目的特定资格要求:详见采购文件

        三、政府采购供应商入库须知

        参加辽宁省政府采购活动的供应商未进入辽宁省政府采购供应商库的,请详阅辽宁政府采购网 “首页—政策法规”中公布的“政府采购供应商入库”的相关规定,及时办理入库登记手续。填写单位名称、统一社会信用代码和联系人等简要信息,由系统自动开通账号后,即可参与政府采购活动。具体规定详见《关于进一步优化辽宁省政府采购供应商入库程序的通知》(辽财采函〔2020〕198号)。

        四、获取采购文件

        时间:2023年02月15日 00时00分至2023年02月22日 13时30分(北京时间,法定节假日除外)

        地点:线上获取

        方式:线上

        售价:免费

        五、响应文件提交

        截止时间:2023年02月22日 13时30分(北京时间)

        地点:辽宁政府采购网

        六、开启

        时间:2023年02月22日 13时30分(北京时间)

        地点:盘锦市大洼区东华路77号

        七、公告期限

        自本公告发布之日起3个工作日。

        八、质疑与投诉

        供应商认为自己的权益受到损害的,可以在知道或者应知其权益受到损害之日起七个工作日内,向采购代理机构或采购人提出质疑。

        1、接收质疑函方式:线上或书面纸质质疑函

        2、质疑函内容、格式:应符合《政府采购质疑和投诉办法》相关规定和财政部制定的《政府采购质疑函范本》格式,详见辽宁政府采购网。

        质疑供应商对采购人、采购代理机构的答复不满意,或者采购人、采购代理机构未在规定时间内作出答复的,可以在答复期满后15个工作日内向本级财政部门提起投诉。

        九、其他补充事宜

        详见采购文件

        十、对本次招标提出询问,请按以下方式联系

        1.采购人信息

        名  称: 盘锦市住房和城乡建设局

        地  址: 辽东湾新区创业中心D座4段15楼

        联系方式: 0427-2812000

        2.采购代理机构信息

        名  称: 盘锦市公共采购交易中心(盘锦市行政审批服务中心)

        地  址: 大洼区东华路77号

        联系方式: 0427-8650051

        邮箱地址: 无

        开户行: 无

        账户名称: 无

        账号: 无

        3.项目联系方式

        项目联系人: 李程

        电  话: 0427-8650081

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/211.html b/news/211.html new file mode 100644 index 0000000..02367cc --- /dev/null +++ b/news/211.html @@ -0,0 +1,362 @@ + + + + +四川省人民医院全院标识标牌设计服务采购项目(四次)竞争性磋商采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        四川省人民医院全院标识标牌设计服务采购项目(四次)竞争性磋商采购公告

        +
        +
        +
        +  2023-02-26 阅读:8 +
        +
        +

        一、项目基本情况

        项目编号:N5100012022003287

        项目名称:全院标识标牌设计服务采购项目(四次)

        采购方式:竞争性磋商

        预算金额:700,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:政府采购合同签订后2年

        本项目是否接受联合体参与:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:无

        3.本项目的特定资格要求:

        采购包1:无

        三、获取采购文件

        时间:2023年02月27日至2023年03月06日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取采购文件

        方式:在线获取

        售价:0元

        四、响应文件提交

        截止时间:2023年03月09日 10时00分00秒(北京时间)

        地点:成都市锦江区墨香路87号8栋4楼

        五、开启

        时间:2023年03月09日 10时00分00秒(北京时间)

        地点:成都市锦江区墨香路87号8栋4楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1、计划备案号:51000022210200020197[2022]08113;

        2、投诉受理单位:本采购项目同级财政部门,即四川省财政厅;

        联系电话:028-86723581、028-86723539、028-86723553

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/212.html b/news/212.html new file mode 100644 index 0000000..2f024ed --- /dev/null +++ b/news/212.html @@ -0,0 +1,362 @@ + + + + +伊金霍洛旗工人文化宫标识标牌制作及安装项目采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        伊金霍洛旗工人文化宫标识标牌制作及安装项目采购公告

        +
        +
        +
        +  2023-02-26 阅读:13 +
        +
        +

        关于、伊金霍洛旗工人文化宫标识标牌制作及安装项目
        招标人:伊金霍洛旗工人文化宫
        资金来源: 国内政府资金 投资金额:50.0526万元
        受伊金霍洛旗工人文化宫委托,采用竞争性磋商的方式对伊金霍洛旗工人文化宫标识标牌制作及安装项目进行采购。欢迎符合资格条件的供应商前来报名参加。
        一、项目概况
        1、项目名称:伊金霍洛旗工人文化宫标识标牌制作及安装项目;
        2、项目地点:伊金霍洛旗工人文化宫;
        3、预算金额:500526元;
        4、采购范围:拟对伊金霍洛旗工人文化宫室内标识标牌制作及安装,具体内容详见工程量清单;
        5、计划工期:15日历天;
        6、质量要求:满足国家和地区相关规定、规范要求。
        二、供应商资格要求
        1、供应商应满足《中华人民共和国政府采购法》第二十二条规定的条件;
        (1)具有独立承担民事责任的能力;
        (2)具有良好的商业信誉和健全的财务会计制度;
        (3)具有履行合同所必需的设备和专业技术能力;
        (4)有依法缴纳税收和社会保障资金的良好记录;
        (5)参加政府采购活动前三年内,在经营活动中没有重大违法记录;
        (6)法律、行政法规规定的其他条件。
        2、供应商须是在中华人民共和国境内注册且营业执照具有与本项目相关的经营范围;
        3、供应商未被列入失信执行人、税收违法黑名单、政府采购严重违法失信行为记录名单。(以通过“信用中国”网站和“中国政府采购网”网站查询的信用记录为准)
        4、本项目不接受联合体投标。
        三、获取采购文件时间
        符合上述条件的供应商可在2023年02月24日至2022年03月02日,每个工作日上午09:00—12:00时,下午14:00—17:00,获取采购文件。
        报名时,报名人需要提供以下材料;
        1、报名人出示身份证原件;
        2、报名人出具经法定代表人签字、公司盖章的“授权委托书”;
        3、提供经国家工商机关年检合格有效的营业执照副本;
        4、其他材料;
        注:(1)证件原件是指原发证机关所发证件,扫描件、公证件及加盖公章的复印件、彩喷件一律不视为原件。(2)证件原件的复印件内容须与原件一致,否则不予接收。(3)以上资料报名须提供副本原件及加盖投标企业公章的复印件一式叁份(A4纸)。
        四、采购文件售价
        本次采购文件售价为500元人民币,售后不退。
        五、递交响应文件截止时间、开标时间
        递交响应文件截止时间:2023年03月06日9:30前
        开标时间:2023年03月06日9:30

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/213.html b/news/213.html new file mode 100644 index 0000000..a79c59e --- /dev/null +++ b/news/213.html @@ -0,0 +1,362 @@ + + + + +守护市民“头顶上”的安全,武汉江汉区清除26处楼顶违规广告牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        守护市民“头顶上”的安全,武汉江汉区清除26处楼顶违规广告牌

        +
        +
        +
        +  2023-02-27 阅读:2 +
        +
        +

        违规楼顶广告不仅影响“天际线”颜值,而且存在安全隐患。连日来,江汉区城管部门组织违规楼顶广告清理行动,先后拆除了6处楼顶(墙面)广告牌。

        2月21日,在江汉区满春街,街道综合执法中心组织力量对中山大道附近一处酒店楼顶广告进行了拆除。路长王洪涛多次上门与经营者积极沟通,坚持“教育、整治”并行原则,做好宣传教育工作,为确保拆除过程安全,拆除当日,王洪涛来到楼顶,反复叮嘱施工人员注意安全,拆除工作顺利完成。

        2月22日晚,花楼水塔街对一处违规楼体广告牌进行了拆除。为保障拆除工作的安全进行,街道聘请专业拆除工程队进行高空作业,严格遵守安全操作流程,调用吊车对楼顶广告实施拆除。街道综合执法中心相关人员表示,今年以来,花楼水塔街道持续加大违规广告拆除力度,目前已拆除大型违规广告六处,总拆除面积90余平方米。

        江汉区城管执法局景观查违科相关人员表示,2023年1月以来,江汉区共拆除违规户外广告26处。将继续以“清顶、净面、美楣、畅路”为目标,持续开展整治,维护好城市“天际线”,守护市民“头顶上”的安全。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/214.html b/news/214.html new file mode 100644 index 0000000..66cd826 --- /dev/null +++ b/news/214.html @@ -0,0 +1,362 @@ + + + + +承德市旅游和文化广电局全市大型户外旅游宣传广告牌采购项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        承德市旅游和文化广电局全市大型户外旅游宣传广告牌采购项目公开招标公告

        +
        +
        +
        +  2023-02-27 阅读:4 +
        +
        +

        一、项目基本情况

        项目编号:ZC130800202300129001001

        项目名称:承德市旅游和文化广电局全市大型户外旅游宣传广告牌采购项目

        预算金额:1402405.43

        最高限价(如有):1402405.43

        采购需求:“全市大型户外旅游宣传广告牌采购项目”主要内容包括承德市全域旅游景区分布图、承德乡村旅游民宿分布图、承德旅游资源简介、承德温泉旅游医养养老产业资源简介、县域特色民宿分布图与承德区域农业品牌推介宣传专栏等内容策划设计与制作安装。在民宿聚集区、游客服务中心、交通要道等14个地点布置全市大型户外旅游宣传广告牌,包含广告牌展示内容设计(平面设计、三维设计、施工图)与品牌策划,达到乡村旅游民宿宣传引流的目的。

        合同履行期限:合同签订后50个工作日内完成广告牌的造型和内容设计、品牌策划及供货安装。

        本项目不接受联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:本项目专门面向中小企业采购

        3.本项目的特定资格要求:无

        三、获取招标文件

        时间:2023年02月28日至2023年03月06日,每天上午8:30至12:0,下午12:01至17:30(北京时间,法定节假日除外)

        地点:登录全国公共资源交易平台(承德市)(http://xzspj.chengde.gov.cn/ggzy)下载文件

        方式:其它

        售价:0

        四、提交投标文件截止时间、开标时间和地点

        2023年03月21日09点30分(北京时间)

        地点:全国公共资源交易平台(承德市)(http://xzspj.chengde.gov.cn/ggzy/index)网上开标

        五、公告期限

        自本公告发布之日起5个工作日。

        十、其他补充事宜

        十一、对本次招标提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/215.html b/news/215.html new file mode 100644 index 0000000..ea41084 --- /dev/null +++ b/news/215.html @@ -0,0 +1,362 @@ + + + + +湖北宜都推出“升级包” 优化户外广告空间布局_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        湖北宜都推出“升级包” 优化户外广告空间布局

        +
        +
        +
        +  2023-02-27 阅读:1 +
        +
        +

        今年年初以来,湖北省宜都市城市管理执法局共清除楼顶违规大型户外广告牌14处、楼顶违规镂空广告牌27处。但在推进过程中,解放大厦楼顶违规镂空广告牌的清除工作却一度陷入僵局。

          据介绍,解放大厦楼顶原设置有3处镂空广告牌,城管执法队员多次上门为楼内商户详细讲解城区户外广告管理有关规定和要求,但商户们始终没有给出一个明确的清除时间。“有部分商户向我们反映,楼顶广告牌清除后,无法快速吸引顾客,可能会对收入造成影响。”相关负责人说。

          为此,宜都市城市管理执法局推出户外广告“升级包”,用落地集约式广告牌代替楼顶镂空广告牌,这种更美观、更时髦的户外广告设施既可以吸引顾客目光,也不会污染城市的立面空间。

          此后,城管执法队员逐一向楼内商户介绍了户外广告“升级包”的设置方案。经过几天的考虑,商户们纷纷打消了心中的顾虑,明确了统一的清除时间。在城管执法队员和专业拆除工人的密切配合下,解放大厦楼顶的违规镂空广告牌终于全部清除。

          相关负责人表示,将继续加大户外广告“升级包”推广力度,按照“一街一处”的标准,优先在交通枢纽、大型商超等人流量较为集中的区域,用落地集约式广告牌逐步替代楼顶违规户外广告设施,在加快推进城区违规户外广告设施清零的同时,持续优化户外广告空间布局。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/216.html b/news/216.html new file mode 100644 index 0000000..3fcf72e --- /dev/null +++ b/news/216.html @@ -0,0 +1,362 @@ + + + + +古蔺县人民医院新院区标识标牌采购安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        古蔺县人民医院新院区标识标牌采购安装项目招标公告

        +
        +
        +
        +  2023-02-28 阅读:5 +
        +
        +

        一、项目基本情况

        项目编号:N5105252023000031

        项目名称:新院区标识标牌采购安装项目

        采购方式:公开招标

        预算金额:3,100,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:自合同签订之日起365日

        本项目是否接受联合体投标:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目为专门面向中小企业采购项目,服务应全部由符合政策要求的中小企业承接(注:监狱企业、残疾人福利性单位视同小型、微型企业)。


        3.本项目的特定资格要求:

        采购包1:

        参加本项目政府采购活动的供应商单位及其现任法定代表人/主要负责人不得具有行贿犯罪记录。


        三、获取招标文件

        时间:2023年03月01日至2023年03月07日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取招标文件

        方式:在线获取

        售价:0元

        四、提交投标文件截止时间、开标时间和地点

        时间:2023年03月21日 10时00分00秒(北京时间)

        提交投标文件地点:泸州市佳乐世纪城16号楼1007室

        开标地点:泸州市佳乐世纪城16号楼1007室

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        根据《四川省财政厅关于推进四川省政府釆购供应商信用融资工作的通知》(川财采﹝2018﹞123号)文件,为助力解决政府采购成交供应商资金不足、融资难、融资贵的困难,促进供应商依法诚信参加政府采购活动,有融资需求的供应商可登录四川政府釆购网—金融服务平台,选择符合自身情况的“政采贷”银行及其产品,凭项目成交结果、成交通知书等信息在线向银行提出贷款意向申请、查看贷款审批情况等。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/217.html b/news/217.html new file mode 100644 index 0000000..39ab35d --- /dev/null +++ b/news/217.html @@ -0,0 +1,362 @@ + + + + +保山市隆阳区人民医院异地迁建标识标牌系统及泛光照明工程招标_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        保山市隆阳区人民医院异地迁建标识标牌系统及泛光照明工程招标

        +
        +
        +
        +  2023-02-28 阅读:36 +
        +
        +

        招标编号:BSJDZB 2023-04
        项目所在地区:云南省,保山市
        一、招标条件
        本隆阳区人民医院异地迁建项目标识标牌系统及泛光照明工程已由项目审批/核准/备案机关批准,项目资金来源为国有资金945万元,招标人为保山建投昌源建设工程有限公司。本项目已具备招标条件,现招标方式为邀请招标。
        二、项目概况和招标范围
        规模 隆阳区人民医院异地迁建项目标识标牌系统及泛光照明工程位于云南省保山市隆阳区,建设内容为:(1)1标段为标识标牌系统,暂估价585万元。完成隆阳区人民医院异地迁建项目标识标牌系统方案设计、深化设计工作,包含但不限于:①楼层平面图、各楼层科室分部总索引、病房牌、医院专科专家介绍牌、楼层号牌及电梯牌、温馨公益标识牌、公共安全标识牌、消防疏散标识牌、医院简介标牌等户内导向标识②医院建筑分布总平面、户外交通导向牌等户外导向标识。(2)2标段为泛光照明工程,暂估价360万元。完成隆阳区人民医院异地迁建项目泛光照明工程方案设计、深化设计工作,包含但不限于:建筑外立面及屋顶泛光照明及警示照明。(3)完成经主体设计单位确认的深化设计施工图所示的标识标牌系统及泛光照明工程的采购安装、调试工作,并对实施范围内的质量、安全、工期、验收、质量保修等全面负责。
        范围:本招标项目划分为2个标段,本次招标为其中的:(001)标识标牌系统;(002)泛光照明工程:
        三、投标人资格要求
        (001标识标牌系统)的投标人资格能力要求:
        (1)具备有效营业执照的独立法人资格企业;
        (2)财务要求:提供企业2021年财务报表(新成立企业无需提供);
        (3)信誉要求 投标人没有处于被责令停业、投标资格被暂停或取消、财产被接管、冻结、破产等状态;近三年(2020年1月1日至今)没有骗取中标和严重违约、没有被项目所在地政府或国家部委禁止市场准入等情形;投标人当前未有不良记录。提供信誉承诺;
        (4)投标人不得和招标人存在利害关系,单位负责人为同一人、或者存在控股、管理关系
        的不同单位、或同一母公司下的多家子公司,均不得同时参加同一标段投标或者未划分标段的同一招标项目投标。;
        (002泛光照明工程)的投标人资格能力要求:
        (1)具备有效营业执照的独立法人资格企业;
        (2)资质条件:具备建设行政主管部门核发的建筑工程施工总承包叁级及以上资质或市政公用工程总承包叁级及以上资质或城市及道路照明工程专业承包贰级及以上资质,且具备有效的安全生产许可证;
        (3)财务要求:提供企业2021年财务报表(新成立企业无需提供);
        (4)信誉要求:投标人没有处于被责令停业、投标资格被暂停或取消、财产被接管、冻结、破产等状态;近三年(2020年1月1日至今)没有骗取中标和严重违约、没有被项目所在地政府或国家部委禁止市场准入等情形;投标人当前未有不良记录。提供信誉承诺;
        (5)项目经理:具备建筑工程专业或市政公用工程专业或机电工程专业注册建造师二级及以上注册证,并取得安全生产考核合格证书;
        (6)投标人不得和招标人存在利害关系,单位负责人为同一人、或者存在控股、管理关系的不同单位、或同一母公司下的多家子公司,均不得同时参加同一标段投标或者未划分标段的同一招标项目投标。;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年02月27日08时30分到2023年03月03日17时30分
        招标文件售价1200元/份,售后不退。
        五、投标文件的递交
        递交截止时间:2023年03月20日15时00分
        六、开标时间
        开标时间:2023年03月20日15时00分
        七、其他
        隆阳区人民医院异地迁建项目标识标牌系统及泛光照明工程邀请招标公告
        1.招标条件
        2.项目概况
        隆阳区人民医院异地迁建项目标识标牌系统及泛光照明工程位于云南省保山市隆阳区,建设内容为:(1)1标段为标识标牌系统,暂估价585万元。完成隆阳区人民医院异地迁建项目标识标牌系统方案设计、深化设计工作,包含但不限于:①楼层平面图、各楼层科室分部总索引、病房牌、医院专科专家介绍牌、楼层号牌及电梯牌、温馨公益标识牌、公共安全标识牌、消防疏散标识牌、医院简介标牌等户内导向标识 ②医院建筑分布总平面、户外交通导向牌等户外导向标识。(2)2标段为泛光照明工程,暂估价360万元。完成隆阳区人民医院异地迁建项目泛光照明工程方案设计、深化设计工作,包含但不限于:建筑外立面及屋顶泛光照明及警示照明。(3)完成经主体设计单位确认的深化设计施工图所示的标识标牌系统及泛光照明工程的采购安装、调试工作,并对实施范围内的质量、安全、工期、验收、质量保修等全面负责。
        3.标段划分:该项目划分为2个标段,1标段为标识标牌系统,暂估价585万元,2标段为泛光照明工程,暂估价360万元。
        4.投标人资格要求
        1标段:
        (1)具备有效营业执照的独立法人资格企业;
        (2)财务要求:提供企业2021年财务报表(新成立企业无需提供);
        (3)信誉要求 投标人没有处于被责令停业、投标资格被暂停或取消、财产被接管、冻结、破产等状态;近三年(2020年1月1日至今)没有骗取中标和严重违约、没有被项目所在地政府或国家部委禁止市场准入等情形;投标人当前未有不良记录。提供信誉承诺;
        (4)投标人不得和招标人存在利害关系,单位负责人为同一人、或者存在控股、管理关系的不同单位、或同一母公司下的多家子公司,均不得同时参加同一标段投标或者未划分标段的同一招标项目投标。
        2标段:
        (1)具备有效营业执照的独立法人资格企业;
        (2)资质条件:具备建设行政主管部门核发的建筑工程施工总承包叁级及以上资质或市政公用工程总承包叁级及以上资质或城市及道路照明工程专业承包贰级及以上资质,且具备有效的安全生产许可证;
        (3)财务要求:提供企业2021年财务报表(新成立企业无需提供);
        (4)信誉要求:投标人没有处于被责令停业、投标资格被暂停或取消、财产被接管、冻结、破产等状态;近三年(2020年1月1日至今)没有骗取中标和严重违约、没有被项目所在地政府或国家部委禁止市场准入等情形;投标人当前未有不良记录。提供信誉承诺;
        (5)项目经理:具备建筑工程专业或市政公用工程专业或机电工程专业注册建造师二级及以上注册证,并取得安全生产考核合格证书;
        (6)投标人不得和招标人存在利害关系,单位负责人为同一人、或者存在控股、管理关系的不同单位、或同一母公司下的多家子公司,均不得同时参加同一标段投标或者未划分标段的同一招标项目投标。
        5.公告时间及招标文件获取
        5.1 公告时间:2023年2月27日8时30分至2023年3月3日17时30分(五个工作日)。
        5.2 招标文件获取 请被邀请的投标人于公告时间内由法定代表人或其委托代理人提供营业执照、安全生产许可证、项目经理注册建造师证书及安全生产考核合格证书复印件加盖鲜章购买招标文件。招标文件售价1200元/份,售后不退。
        6.投标文件的递交

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/218.html b/news/218.html new file mode 100644 index 0000000..f900dd9 --- /dev/null +++ b/news/218.html @@ -0,0 +1,362 @@ + + + + +北海市黄码医院二病区(儿童医院)标识标牌等配套设施采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        北海市黄码医院二病区(儿童医院)标识标牌等配套设施采购项目招标公告

        +
        +
        +
        +  2023-03-01 阅读:40 +
        +
        +

        项目概况

        北海市黄码医院二病区(儿童医院)标识标牌等配套设施采购项目 招标项目的潜在投标人应在供应商登录政采云平台(https://www.zcygov.cn/)在线自行下载采购文件获取招标文件,并于2023年03月22日 09点00分(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:BHZC2023-G1-00013-GXCP

        项目名称:北海市黄码医院二病区(儿童医院)标识标牌等配套设施采购项目

        预算金额:297.3883300 万元(人民币)

        最高限价(如有):297.3883300 万元(人民币)

        采购需求:

        名称:北海市黄码医院二病区(儿童医院)标识标牌等配套设施采购项目

        数量:1。

        预算金额(元):2973883.30元

        简要规格描述或项目基本概况介绍、用途:北海市黄码医院二病区(儿童医院)标识标牌等配套设施采购项目1项,需进一步了解详细内容,详见采购文件。

        合同履行期限:自签订合同之日起30日内完成设计、制作、安装等工作。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        非专门面向中小企业采购的项目

        3.本项目的特定资格要求:/

        三、获取招标文件

        时间:2023年03月02日  至 2023年03月08日,每天上午0:00至12:00,下午12:00至23:59。(北京时间,法定节假日除外)

        地点:供应商登录政采云平台(https://www.zcygov.cn/)在线自行下载采购文件

        方式:供应商登录政采云平台(https://www.zcygov.cn/)在线自行下载采购文件;未注册的供应商可在政采云平台完成注册后再进行文件下载。如在操作过程中遇到问题或需技术支持,请致电政采云客服热线:400-881-7190。提示:供应商只有在“政采云平台”完成获取招标文件申请并下载了招标文件后才视作依法获取招标文件(法律法规所指的供应商获取招标文件时间以供应商完成获取招标文件申请后下载招标文件的时间为准)。

        售价:¥0.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2023年03月22日 09点00分(北京时间)

        开标时间:2023年03月22日 09点00分(北京时间)

        地点:通过政采云平台(网址:http://www.zcygov.cn)实行在线开标

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        七、对本次招标提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/219.html b/news/219.html new file mode 100644 index 0000000..d805dc8 --- /dev/null +++ b/news/219.html @@ -0,0 +1,362 @@ + + + + +山东黄金集团2023年度办公用品、标识标牌采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        山东黄金集团2023年度办公用品、标识标牌采购项目招标公告

        +
        +
        +
        +  2023-03-01 阅读:40 +
        +
        +

        山东黄金集团建设工程有限公司2023年度办公用品、标识标牌及工装供应商框架入库采购项目招标公告
        (招标编号:HYHA2023-0315)
        项目所在地区:山东省
        一、招标条件
        本山东黄金集团建设工程有限公司2023年度办公用品、标识标牌及工装供应商框架入 库采购项目已由项目审批/核准/备案机关批准,项目资金来源为其他资金/,招标人为山东 黄金集团建设工程有限公司。本项目已具备招标条件,现招标方式为公开招标。 二、项目橱况和招标范围
        规模:山东黄金集团建设工程有限公司2023年度办公用品、标识标牌及工装供应商柜 架入库采购项目已由项目审批/核准/备案机关批准,项目资金来源为自筹资金,招标人为山 东黄金集团建设工程有限公司。本项目已具备招标条件,招标方式为公开招标。
        范困:本招标项目划分为4个标段,本次招标为其中的:
        (001)办公设备类;(002)办公耗材类;(003)工装;(004)标识标牌类;
        三、投标人资格要求
        (001办公设备类)的投标人资格能力要求:1.投标人应为具有独立法人资格的生产厂家 或代理商。
        2.代理商须出具生产厂家的有效授权书。
        3.投标人在“中国执行信息公开网”网站(http://zxgk.court.gov.cn/shixin/)中未被列 为失信被执行人。
        4.本项目不接受联合体投标。;
        (002办公耗材类)的投标人资格能力要求:1.投标人应为具有独立法人资格的生产厂家 或代理商。
        2.代理商须出具生产厂家的有效授权书。
        3.投标人在“中国执行信息公开网”网站(http://xxgk.court.gov.cn/shixin/)中未被列 为失信被执行人。
        4.本项目不接受联合体投标。;
        (003工装)的投标人资格能力要求;1.投标人应为具有独立法人资格的生产厂家或代理
        商。
        2.代理商须出具生产厂家的有效授权书。
        3.投标人在“中国执行信息公开网”网站(http://zxgk.court.gov.cn/shixin/)中未被列 为失信被执行人。
        4.木项目不接受联合体投标。
        (004标识标牌类)的投标人资格能力要求:1.投标人应为具有独立法人资格的生产厂家 或代理商。
        2.代理商须出具生产厂家的有效授权书。
        3.投标人在“中国执行信息公开网”网站(http://xxgk.court.gov.cn/shixin/)中未被列 为失信被执行人。
        4.本项目不接受联合体投标。;
        本项日不允联合体投标。
        四、招标文件的获取
        获取时间:从2023年03月01日09时00分到2023年03月06日17时00分
        五、投标文件的递交
        道交截止时间:2023年03月31日09时00分
        六、开标时间
        开标时间:2023年03月31日09时00分
        七、其他
        山东黄金集团建设工程有限公司2023年度办公用品、标识标障及工装供应商框架入库
        采购项目
        招标公告
        一、招标条件
        山东黄金集团建设工程有限公司2023年度办公用品、标识标牌及工装供应商框架入库采购 项目已由项目审批/核准/备案机关批准,项目资金来源为自筹资金,招标人为山东黄金集团 建设工程有限公司。本项目已具备招标条件,招标方式为公开招标。
        二、项日概况与招标范围
        1.项目名称山东黄金集团建设工程有限公司2023年度办公用品、标识标牌及工装供应商
        框架入库采购项目
        2.招标范围:
        标段标段名称 标段内容
        1办公设备类电脑、打印机等
        2办公耗材类办公用品、纸张、墨盒等
        3工装工装
        4标识标牌类办公标牌、宣传册等
        2.1本次招标为供应面战略入库招标,在有效期内,中标入库的单位才有资格参与山东黄金
        集团建设工程有限公司本次招标范围内的材料采购,具体供货改量、供货期等以山东黄金集 团建设工程有限公司每一次需求计划为准。
        3.质量要求:合格。
        4.交货地点:每次实际采购的交货地点以招标人的实际订单为准。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/22.html b/news/22.html new file mode 100644 index 0000000..4707c7f --- /dev/null +++ b/news/22.html @@ -0,0 +1,362 @@ + + + + +数字标牌是如何在商场极尽所能发挥优势的?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌是如何在商场极尽所能发挥优势的?

        +
        +
        +
        +  2022-05-04 阅读:5 +
        +
        +

        数字标牌优势多多,但是如何将其发挥并带来收益才是使用者最关心的:

        1、傻瓜式操作让信息实时更新不是难事

        数字标牌广告机的系统云端管理,随时随地进行广告内容的更新。

        2、数字标牌并不是越多越好

        一方面,过多的屏幕会分散消费者的注意力,影响顾客的消费体验,另一方面,屏幕越多就意味着投资越多。商家应该根据店铺的大小、功能区域的划分及特定需求,设置数字标牌的数量。服装店内的数字标牌应该尽量选择竖屏,这样更利于展示服装的整体效果;就餐区域的数字标牌则更应该考虑的是人们在坐下时的视线水平。当然,显示屏也并非越大越好,如果店铺面积本来就很小,而屏幕过大,则会产生强烈的压迫感。

        3、切忌内容过于丰富及庞大的信息量

        繁杂的信息会打乱消费者的思维,将瞬间的消费冲动转移。尽量做到信息的一致性和引导性,牵引消费者的购物心理。展示信息应做可视性强,图片及动态画面为主体要素,文字作辅助说明,这样做的目的是将消费者的潜在消费意识转化主动咨询。

        4、合理的区分播放内容

        面向店铺外受众的数字标牌的内容应该以品牌介绍为主,媒体推广、明星代言、品牌发布会等,而店铺内的数字标牌应该以某一产品系列为主要内容,当季新品、店长推荐、镇店之宝等等。在休息区域可以根据受众进行相关信息推送,时下流行、新闻时事、全球热点、网络要闻等。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/220.html b/news/220.html new file mode 100644 index 0000000..0a1a240 --- /dev/null +++ b/news/220.html @@ -0,0 +1,362 @@ + + + + +唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目更正公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目更正公告

        +
        +
        +
        +  2023-03-01 阅读:45 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:2023-JQ58-W1001      

        原公告的采购项目名称:唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目公开招标公告      

        首次公告日期:2023年02月14日      

        二、更正信息

        更正事项:采购公告

        更正内容:

        唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目暂停公告

        1.项目名称:唐山市路南区某医院标识标牌、灯箱展板及立体字采购项目

        2.项目编号:2023-JQ58-W1001

        3.暂停内容:

        本项目原定于2023年3月7日上午9:00开标,由于工作冲突等原因,本项目延期开标,具体开标时间请及时关注后续公告,其它事项不变。

        4. 其它补充事宜:

        本暂停公告为招标文件的组成部分,招标文件如涉及上述内容的应作相应调整和修改﹐若本暂停公告与原招标文件内容有不一致之处,应以本暂停公告为准。

        采购机构联系方式

        采购人:唐山市路南区某医院

        联系人:戚助理

        办公电话:0315-4465098

        采购代理机构联系方式

        采购代理机构:河北至诚工程项目管理有限公司

        联 系 人: 左钊、刘月香

        监督部门联系方式

        项目监督人:孙助理

        办公电话:0315—4465077

        2023年3月1日

        更正日期:2023年03月01日 

        三、其他补充事宜

        本暂停公告为招标文件的组成部分,招标文件如涉及上述内容的应作相应调整和修改﹐若本暂停公告与原招标文件内容有不一致之处,应以本暂停公告为准。

        四、凡对本次公告内容提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/221.html b/news/221.html new file mode 100644 index 0000000..5244457 --- /dev/null +++ b/news/221.html @@ -0,0 +1,362 @@ + + + + +宜昌博物馆标识标牌服务商采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        宜昌博物馆标识标牌服务商采购项目招标公告

        +
        +
        +
        +  2023-03-02 阅读:5 +
        +
        +

        一、项目基本情况
        1、项目编号:[2023]-007
        2、项目名称:宜昌博物馆标识标牌服务商采购项目
        3、采购方式:竞争性磋商
        4、采购需求:宜昌博物馆标识标牌采购,根据采购人要求进行标识标牌采购及安装。(具体要求详见第三章采购需求)
        5、合同履行期限:自合同签订之日起两年。
        6、本项目(是/否)接受联合体投标:否
        7、是否可采购进口产品:否
        二、申请人的资格要求
        1、满足《中国政府采购法》第二十二条规定,即:
        (1)具有独立承担民事责任的能力;
        (2)具有良好的商业信誉和健全的财务会计制度;
        (3)具有履行合同所必需的设备和专业技术能力;
        (4)有依法缴纳税收和社会保障资金的良好记录;
        (5)参加政府采购活动前三年内,在经营活动中没有重大违法记录;
        (6)法律、行政法规规定的其他条件。
        2、单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加本项目同一合同项下的政府采购活动。
        3、为本采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的,不得再参加本项目的其他招标采购活动。
        4、未被列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重违法失信行为记录名单。
        5、落实政府采购政策需满足的资格要求:无。
        6、本项目的特定资格要求:无。
        三、获取采购文件
        1、时间:2023年03月03日至2023年03月09日,每天上午08:30至12:00,下午14:00至17:30(北京时间,法定节假日除外)
        2、方式:获取磋商文件时请提供法定代表人或委托代理人的身份证明文件原件(法定代表人资格证明书或法定代表人授权委托书)以及本人第二代有效居民身份证原件。
        3、售价:400(元)
        四、响应文件提交
        1、开始时间:2023年03月14日09点00分(北京时间)
        2、截止时间:2023年03月14日09点30分(北京时间)
        五、开启时间:2023年03月14日09点30分(北京时间)
        六、自本公告发布之日起3个工作日。
        七、其他补充事宜
        供应商的法定代表人或授权委托代理人应提供身份证明文件(法定代表人身份证明或法人授权委托书)和第二代有效身份证原件;

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/222.html b/news/222.html new file mode 100644 index 0000000..99793e8 --- /dev/null +++ b/news/222.html @@ -0,0 +1,362 @@ + + + + +宁波非道路移动机械标牌及电子标签制作项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        宁波非道路移动机械标牌及电子标签制作项目公开招标公告

        +
        +
        +
        +  2023-03-02 阅读:16 +
        +
        +

        项目概况

        非道路移动机械标牌及电子标签制作项目 招标项目的潜在投标人应在浙江天诚工程咨询有限公司(宁波市鄞州区江南路599号科技大厦四楼招标代理部)获取招标文件,并于2023年03月13日 09点00分(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:TC【2023】QT1022号

        项目名称:非道路移动机械标牌及电子标签制作项目

        预算金额:36.0000000 万元(人民币)

        采购需求:

        非道路移动机械标牌及电子标签制作,具体详见采购需求。预算资金为36万元,其中环保标牌制作24万,电子标签制作12万元。

        合同履行期限:合同生效之日起至合同全部履约完毕止

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:无

        三、获取招标文件

        时间:2023年03月02日  至 2023年03月09日,每天上午9:00至11:00,下午14:00至16:30。(北京时间,法定节假日除外)

        地点:浙江天诚工程咨询有限公司(宁波市鄞州区江南路599号科技大厦四楼招标代理部)

        方式:2、获取方式可采用:将报名资料现场或邮寄快递至浙江天诚工程咨询有限公司(宁波市鄞州区江南路599号科技大厦四楼招标代理部)。 3、采购文件售价:500元人民币,须以现金或对公转账方式(不支持支付宝、微信支付)打入以下账户,售后不退。 收款人:浙江天诚工程咨询有限公司 开户银行:宁波银行国家高新区支行营业部 行号:3133 3208 2512 银行账号:500101220014198540263 4、报名资料为①法定代表人授权委托书、被授权人身份证;②企业营业执照、开户许可证复印件;③报名费缴款凭证。上述资料均须加盖供应商公章。

        售价:¥500.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2023年03月13日 09点00分(北京时间)

        开标时间:2023年03月13日 09点00分(北京时间)

        地点:浙江天诚工程咨询有限公司开标室(宁波市鄞州区江南路599号科技大厦五楼)

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        1、供应商认为采购文件使自己的权益受到损害的,可以自获取采购文件之日或者采购文件公告期限届满之日(公告期限届满后获取采购文件的,以公告期限届满之日为准)起7个工作日内,对采购文件需求的以书面形式向采购人提出质疑,对其他内容的以书面形式向采购人和采购代理机构提出质疑。质疑供应商对采购人、采购代理机构的答复不满意或者采购人、采购代理机构未在规定的时间内作出答复的,可以在答复期满后十五个工作日内向同级政府采购监督管理部门投诉。质疑函范本、投诉书范本请到浙江政府采购网下载专区下载。

        2、落实的政策:对小微企业的产品给予价格优惠(监狱企业、残疾人福利性单位视同小微企业);

        3、本次政府采购活动相关信息发布媒体为:中国政府采购网,信息发布视同送达所有潜在投标人。

        4、且未列入“www.creditchina.gov.cn、www.ccgp.gov.cn”网站失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信记录名单在禁止参加采购期限的供应商【以投标截止日当天采购代理机构在“信用中国”网站(www.creditchina.gov.cn)及中国政府采购网查询结果为准,如相关失信记录已失效,供应商需提供相关证明资料】;

        七、对本次招标提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/223.html b/news/223.html new file mode 100644 index 0000000..9036ecd --- /dev/null +++ b/news/223.html @@ -0,0 +1,362 @@ + + + + +哈尔滨市延寿生态环境局秸秆禁烧路灯杆广告牌采购项目竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        哈尔滨市延寿生态环境局秸秆禁烧路灯杆广告牌采购项目竞争性磋商

        +
        +
        +
        +  2023-03-02 阅读:10 +
        +
        +

        项目概况

        秸秆禁烧路灯杆广告牌采购项目 采购项目的潜在供应商应在黑龙江中卿工程项目管理有限公司(哈尔滨市南岗区泰山路113号703室)获取采购文件,并于2023年03月14日 09点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:ZQGC-CG-2023-009

        项目名称:秸秆禁烧路灯杆广告牌采购项目

        采购方式:竞争性磋商

        预算金额:19.3400000 万元(人民币)

        最高限价(如有):19.3400000 万元(人民币)

        采购需求:

        合同履行期限:合同签订后30日内供货及安装完毕

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:3.1、申请人需为具有独立法人资格的供应商或其他组织或自然人,具备有效的营业执照或事业单位法人证书,并在人员、设备、资金等方面具有承担本项目的能力;3.2信誉要求:3.2.1拟参加本项目的潜在供应商应未被列入“失信被执行人”和“重大税收违法案件当事人名单”、“政府采购严重违法失信行为记录名单”,以信用中国官方网站(http://www.creditchina.gov.cn)查询结果为准,被列入上述名单的供应商不得参加本项目投标;3.2.2供应商及其法定代表人、拟派项目负责人近3年(2020年03月02日至响应文件递交截止时间)不得有行贿犯罪记录,否则将被拒绝投标,以中国裁判文书网(http://wenshu.court.gov.cn)查询结果为准。3.3资格审查方式:本项目采用资格后审方式,主要资格审查标准、内容等详见采购文件,只有资格审查合格的供应商才有可能被授予合同;3.4与采购人存在利害关系可能影响采购公正性的法人、其他组织或者个人,不得参加投标;单位负责人为同一人或者存在控股、管理关系的不同单位,不得同时参加同一采购项目投标;同一公司具有独立法人的子公司同时参加同一采购项目投标时最多不得超过两家(以投标登记的先后顺序为准)。

        三、获取采购文件

        时间:2023年03月03日  至 2023年03月09日,每天上午9:00至12:00,下午12:00至16:00。(北京时间,法定节假日除外)

        地点:黑龙江中卿工程项目管理有限公司(哈尔滨市南岗区泰山路113号703室)

        方式:现场获取采购文件

        售价:¥0.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月14日 09点00分(北京时间)

        地点:哈尔滨市南岗区泰山路113号703室开标大厅

        五、开启

        时间:2023年03月14日 09点00分(北京时间)

        地点:哈尔滨市南岗区泰山路113号703室开标大厅

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1、发布公告的媒介:

        本项目招标公告在:中国政府采购网(http://www.ccgp.gov.cn/)上发布。

        2、采购项目需要落实的政府采购政策:本次采购执行政府强制采购节能产品、鼓励环保产品、支持中小微企业、促进残疾人就业、支持监狱和戒毒企业、扶持不发达地区和少数民族地区以及限制采购进口产品等相关政策,供应商需满足相应资格要求,详见磋商文件。

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/224.html b/news/224.html new file mode 100644 index 0000000..8355603 --- /dev/null +++ b/news/224.html @@ -0,0 +1,362 @@ + + + + +中国邮政集团有限公司杭州市分公司网点室内广告牌采购项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国邮政集团有限公司杭州市分公司网点室内广告牌采购项目

        +
        +
        +
        +  2023-03-02 阅读:3 +
        +
        +

        根据《中国邮政集团有限公司浙江省分公司采购管理办法》等有关规定,就中国邮政集团有限公司杭州市分公司网点室内广告牌采购项目进行公开招标,欢迎国内合格的供应商前来投标。

          一、项目名称:中国邮政集团有限公司杭州市分公司网点室内广告牌采购项目;

          二、项目编号:HZPOST-HW-2023002;

          三、项目概况:杭州地区网点室内广告牌采购及设计、配送安装;

          四、资金来源:企业自筹;

          五、采购内容及相关要求:

          (一)本项目共计1个合同包,选取1名中标供应商。

        备注:

          (1)投标人须以“合同包”为单位参加本项目的投标,并且以“合同包”为单位提供投标文件,不接受选择性报价。

          (2)具体采购数量以实际数为准,采购人不做承诺。合同履行期间,甲方有权因业务发展需要就外包网点进行增减,但须提早一个月书面通知乙方(结算费用按中标价格同比例调整),乙方须及时调整人员安排。

          (二)服务期限:2年。合同到期前经采购方审核通过,且双方协商一致,合同可再续签一年。

          (三)报价:包括人员费用、设计费、安装费、配送费、企业管理费、税金、利润等相关一切费用;具体制作清单见附件:中国邮政杭州市分公司网点室内广告牌需求清单。

          (四)所提供货物保修期为半年。

          (五)供应商须在收到采购人订单之日起5个工作日内完成安装。

          (六)项目地址:杭州地区行政区域范围内所有邮政网点。

          (七)需求单位:中国邮政集团有限公司杭州市分公司。

          (八)中国邮政杭州市分公司网点室内广告牌需求清单

          六、投标人资格条件:

          (一)投标人为在中华人民共和国境内登记注册、具有独立法人资格、根据中华人民共和国有关法律合法成立并存在的企业,或有总公司法人授权的分公司;

          (二)投标人必须为增值税一般纳税人;

          (三)投标人应具有近两年同类型项目业绩合同;

          (四)投标人应遵守有关的国家法律、法规和条例,近三年内在经营活动中没有重大违法违规记录;

          (五)投标人未被列入“信用中国”网站(www.creditchina.gov.cn)、“失信被执行人”、“重大税收违法案件当事人名单”;

          (六)被列入浙江省邮政分公司供应商黑名单的投标人,禁止参加本项目;

          (七)本项目不接受具有投资参股关系的关联企业,或单位负责人为同一人(或为近亲属关系),或者存在控股、管理关系的不同单位,参加本项目的投标;

          (八)与邮政无投资关系且存在以下情况的,不得参加采购活动:邮政领导人员及其亲属和其他特定关系人、邮政员工持股(限非上市公司),以个人身份(组织委派的除外)担任法人、董事长、总经理、监事的企业,以及邮政所属工会或员工集体出资成立的企业;

          (九)本项目不接受联合体投标,并且不得将本项目内容以任何方式进行转包、分包。

          七、招标文件的获取:

          获取时间:2023年3月1日起至2023年3月6日每天9:00-17:00(双休日及法定节假日除外)。

          线上获取方式:登录《中国邮政电子采购与供应平台》(网址:https://cg.11185.cn)线上报名获取招标文件。获取方式方式如下:(1)未在该平台注册并办理CA证书的投标人,请先行注册并办理CA证书,通过线上方式自行获取招标文件,已在平台注册并办理CA证书的投标人,可直接登录平台获取招标文件;(2)中标文件获取步骤:首先进入《中国邮政电子采购与供应平台》https://cg.11185.cn首页-用户中心-下载中心-下载操作手册(详细阅读,根据操作手册完成注册、登录、CA办理、平台相关应用的安装使用),然后查找对应项目-投标人报名(请务必按要求填写相关信息,并上传报名资料的原件扫描件)-等待审核-审核通过后-标书购买-确认标书费-投标人下载招标文件)。CA办理请根据中国邮政电子采购与供应平台操作手册的要求完成。平台服务电话:400-080-9508(周一-周五9:00-17:00),CA服务电话:400-7888-550。

          报名资料:

          1.招标文件发(售)登记表(加盖公章);

          2.法定代表人身份证明(加盖公章);

          3.法定代表人授权委托书(加盖公章);

          4.有效的营业执照复印件(加盖公章);

          5.银行开户许可证复印件(加盖公章)。

          招标文件售价300元/本,售后不退。

          打款账号:

          收款单位(户名):中国邮政集团有限公司杭州市分公司

          开户银行:工行城站支行

          银行账号:1202027719900020055

          打款时注明项目编号+用途。

          注册成功的潜在投标人,请务必在招标文件售卖截止时间前,登录系统选择项目、购买招标文件,购买时间截止后,将不能购买,即不能参加此次招标活动,由此造成的后果由投标人承担。

          八、投标截止时间:2023年3月21日9时30分

          九、开标时间及地点

          1.本项目采用线上线下并行的方式进行开标。开标现场递交纸质版投标文件,同时使用CA证书在“中国邮政电子采购与供应平台”(网址:https://cg.11185.cn)线上进行电子版投标文件现场(远程)签订及解密。

          2.开标时间:2023年3月21日9时00分(北京时间);电子版投标文件现场解密截止时间为:开标时间后(不超过30分钟)自行进行投标文件解密,解密截止时间之后仍未按规定完成解密的投标人,则开标以递交的纸质版投标文件为准,未递交纸质版投标文件的投标人将被否决。投标人须自行承担互联网网络及运行环境不畅、介质损坏等因素造成的风险。

          3.开标地点:杭州市上城区花园兜街221号中国邮政集团有限公司杭州市分公司10楼1016会议室。

          十、投标保证金:

          20000元/家,应于开标截止前将投标保证金以银行电汇或网银(公对公转账形式)直接缴入以下指定账户。

          支付形式:电汇、转账

          收款单位(户名):中国邮政集团有限公司杭州市分公司

          开户银行:工行城站支行

          银行账号:1202027719900020055

          打款时注明项目编号+投标保证金。

          十一、监督部门

          本招标项目的监督部门为中国邮政集团有限公司杭州市分公司综合办。

          十二、公告发布媒介

          中国邮政门户网站、中国招标投标公共服务平台

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/225.html b/news/225.html new file mode 100644 index 0000000..68bf72d --- /dev/null +++ b/news/225.html @@ -0,0 +1,362 @@ + + + + +北京生命科技研究院标识标牌与展板设计、采购及安装招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        北京生命科技研究院标识标牌与展板设计、采购及安装招标公告

        +
        +
        +
        +  2023-03-07 阅读:14 +
        +
        +

        北京生命科技研究院标识标牌与展板设计、采购及安装招标公告
        招标编号:ZDJHZB-2023-021
        项目所在地区:北京市
        一、招标条件
        北京生命科技研究院标识标牌与展板设计、采购及安装招标人为北京生命科技研究院有限公司,招标项目资金来自自有资金,出资比例为100%。本项目已具备招标条件,现进行公开招标。
        二、项目概况
        2.1招标范围:北京生命科技研究院标识标牌与展板设计、采购及安装;
        2.2投标质量:合格,符合招标人要求;
        2.3设计、供货及安装期:合同签订后15日历天内完成设计、供货及安装工作;
        2.4标段划分:本项目共分1个标段。
        三、投标人资格要求
        3.1注册于中华人民共和国境内,具有独立承担民事责任能力的法人,具有有效的企业营业执照;
        3.2财务要求:投标人提供经会计师事务所或审计机构审计过的2021年度的财务审计报告,成立年限不足或无财务审计报告的需提供基本账户开户银行出具的资信证明;
        3.3投标人提供2022年1月1日以来至少一个月纳税证明材料和社会保障资金缴纳证明资料(如依法免税或不需要缴纳社会保障资金的,应提供相应文件证明);
        3.4信誉要求:
        (1)投标人应提供通过《中国裁判文书网》查询的自身企业、法定代表人、授权委托人自2020年1月1日以来在已生效的刑事判决书或刑事裁定书中不存在行贿犯罪记录的承诺书。存在行贿犯罪记录的投标人,不得参与本次招投标活动。【查询渠道:《中国裁判文书网》首页—高级检索—选择刑事案由—贪污贿赂罪—行贿罪、对有影响力的人行贿罪、对单位行贿罪、单位行贿罪,文书类型—判决书及裁定书;查询时间为自公告发布之日起至投标截止时间前】。
        (2)投标人未被列入《信用中国》网站“异常经营名录”、“重大税收违法失信主体”;未被列入《中国执行信息公开网》网站“失信被执行人名单”;不处于《中国政府采购网》“政府采购严重违法失信行为信息记录”中的禁止参加政府采购活动期间。(以代理机构于投标截止日当天在《信用中国》、《中国执行信息公开网》网站及《中国政府采购网》查询结果为准,信用记录截止时间为投标截止时间;如相关失信记录已失效,投标人需提供相关证明资料);
        (3)投标人提供近三年来在经营活动中没有骗取中标和严重违约及重大质量问题书面承诺。
        (4)投标人、法定代表人、项目负责人、授权委托人应未在烟草行业或招标人发布的行贿行为投标人名单禁入期限内。行贿人担任法定代表人、主要负责人或实际控制人的其他企业均不得参与本次投标。招标人及招标代理机构将对投标人信息进行核查,对行贿投标人及行贿人存在“换马甲”“换壳”行为参与本招标项目的,将拒绝其投标。
        (5)单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加同一标段投标或者未划分标段的同一招标项目投标(提供《国家企业信用信息公示系统》中加盖投标人公章查询网页截图,查询时间为招标公告发布日期之后)。
        3.5本次招标不接受联合体投标。
        四、招标文件的获取
        4.1获取时间:2023年3月8日至2023年3月14日,上午9:00时到12:00时,下午14:00时到17:30时(节假日、双休日除外)。
        4.2获取方式:郑州经济技术开发区现场获取。招标文件售价300元/套,招标文件售后不退。
        4.3获取招标文件时须提交以下证明文件:
        ①营业执照复印件(加盖公章);
        ②如法定代表人参加投标,提供加盖公章的法定代表人身份证明复印件及身份证复印件;如法定代表人委托代理人参加投标,提供加盖公章的法定代表人身份证明复印件、法人授权委托书(委托书包含联系方式)、被授权人身份证复印件。
        五、投标文件的递交
        5.1投标文件递交截止时间:2023年3月28日9时30分(北京时间)
        5.2投标文件递交方式:现场递交
        5.3投标文件递交地点:郑州高新技术开发区
        5.4逾期送达的投标文件或者未送达指定地点的投标文件,招标人不予受理。
        六、开标时间及地点
        6.1开标时间:2023年3月28日9时30分(北京时间)
        6.2开标地点:郑州高新技术开发区

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/226.html b/news/226.html new file mode 100644 index 0000000..f8810d5 --- /dev/null +++ b/news/226.html @@ -0,0 +1,362 @@ + + + + +孝河花园A区项目标识标牌制作安装项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        孝河花园A区项目标识标牌制作安装项目竞争性磋商公告

        +
        +
        +
        +  2023-03-07 阅读:29 +
        +
        +

        一、项目概况
        孝河花园A区项目标识标牌制作安装项目的采购人为天元建设集团有限公司,项目资金来自企业自筹。项目地址位于临沂市兰山区白沙埠镇茶山七路与孝河四路交汇东南;该项目已具备采购条件,现就上述项目进行竞争性磋商采购,欢迎符合条件的潜在供应商参加本次活动。
        二、项目基本情况
        1、项目名称:孝河花园A区项目标识标牌制作安装项目
        2、项目类别:货物类
        3、采购方式:竞争性磋商
        4、采购内容:孝河花园A区项目标识标牌制作安装所有相关内容(以发包图纸和工程量清单内容为准)。
        5、预算金额:21.4447万元。
        6、工期: 30 日历天,自满足进场条件时算起。
        7、质量要求:符合现行有效的相关国家规范和行业标准。
        三、供应商资格条件
        1. 供应商须在中国境内注册,具有独立承担民事责任能力及具有合法制造或销售本项目所需产品及提供售后服务的能力的法人单位或其他组织。
        2.在“信用中国”网站(www.creditchinA.gov.cn)等信用查询渠道未列入严重失信主体名单;在中国裁判文书网上无行贿犯罪记录。
        3.本项目不允许联合体投标。
        4.法律、法规及磋商文件规定的其他内容。
        四、投标报名及磋商文件领取
        1、时间:2023年 03月06日至2023年03月10日(上午8:30时-11:30时,下午14:00时-17:00时;法定节假日除外)
        2、只有资料齐全且符合规定的企业才能获取磋商文件,文件资料费300元/份。
        所需的资料如下:
        (1)营业执照。
        (2)法人代表证明或法人授权委托书及其身份证。
        (3)投标人在“信用中国”网站(www.creditchina.gov.cn)或“信用中国”各省级网站未被列入严重失信主体名单(须附完整的《法人和其他组织信用信息概况》);
        (4)在中国裁判文书网上无行贿犯罪记录证明(提供查询结果网页截图);
        五、投标文件提交
        1.投标截止日期:2023年03月16日14:30时。
        2.逾期送达的或者未送达指定地点的投标文件,采购人不予受理。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/227.html b/news/227.html new file mode 100644 index 0000000..fc9f144 --- /dev/null +++ b/news/227.html @@ -0,0 +1,362 @@ + + + + +宜昌博物馆标识标牌服务商采购项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        宜昌博物馆标识标牌服务商采购项目竞争性磋商公告

        +
        +
        +
        +  2023-03-07 阅读:4 +
        +
        +

        一、项目基本情况
        1、项目编号:SZQL-YCCG[2023]-007
        2、项目名称:宜昌博物馆标识标牌服务商采购项目
        3、采购方式:竞争性磋商
        4、采购需求:宜昌博物馆标识标牌采购,根据采购人要求进行标识标牌采购及安装。(具体要求详见第三章采购需求)
        5、合同履行期限:自合同签订之日起两年。
        6、本项目(是/否)接受联合体投标:否
        7、是否可采购进口产品:否
        二、申请人的资格要求
        1、满足《中华人民共和国政府采购法》第二十二条规定,即:
        (1)具有独立承担民事责任的能力;
        (2)具有良好的商业信誉和健全的财务会计制度;
        (3)具有履行合同所必需的设备和专业技术能力;
        (4)有依法缴纳税收和社会保障资金的良好记录;
        (5)参加政府采购活动前三年内,在经营活动中没有重大违法记录;
        (6)法律、行政法规规定的其他条件。
        2、单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加本项目同一合同项下的政府采购活动。
        3、为本采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的,不得再参加本项目的其他招标采购活动。
        4、未被列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重违法失信行为记录名单。
        5、落实政府采购政策需满足的资格要求:无。
        6、本项目的特定资格要求:无。
        三、获取采购文件
        1、时间:2023年03月03日至2023年03月09日,每天上午08:30至12:00,下午14:00至17:30(北京时间,法定节假日除外)
        2、方式:获取磋商文件时请携带法定代表人或委托代理人的身份证明文件原件(法定代表人资格证明书或法定代表人授权委托书)以及本人第二代有效居民身份证原件。
        3、售价:400(元)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/228.html b/news/228.html new file mode 100644 index 0000000..c43930e --- /dev/null +++ b/news/228.html @@ -0,0 +1,362 @@ + + + + +铜陵市人民医院标识标牌设计、制作及安装项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        铜陵市人民医院标识标牌设计、制作及安装项目竞争性磋商公告

        +
        +
        +
        +  2023-03-08 阅读:59 +
        +
        +

        铜陵市人民医院标识标牌设计、制作及安装项目 采购项目的潜在供应商应在安徽蓝天工程造价咨询有限公司301室获取采购文件,并于2023年03月17日 09点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:蓝天招代【2023】第19号

        项目名称:铜陵市人民医院标识标牌设计、制作及安装项目

        采购方式:竞争性磋商

        预算金额:29.0000000 万元(人民币)

        最高限价(如有):29.0000000 万元(人民币)

        采购需求:

        铜陵市人民医院标识标牌设计、制作及安装项目,具体详见项目需求。

        合同履行期限:一年(按合同约定设计、制作及安装)

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        本项目非专门面向中小企业采购。原因说明:按照本办法规定预留采购份额无法确保充分供应、充分竞争,或者存在可能影响政府采购目标实现的情形,对此项内容如有质疑可以书面形式向采购人提出。

        对此项内容如有质疑可以书面形式向采购人提出。

        3.本项目的特定资格要求:无4、供应商存在以下不良信用记录情形之一的,不得推荐为中标候选供应商;(1)供应商被人民法院列入失信被执行人的;(2)供应商被工商行政管理部门列入企业经营异常名录的;(3)供应商被税务部门列入重大税收违法案件当事人名单的;(4)供应商被政府采购监管部门列入政府采购严重违法失信行为记录名单的。

        三、获取采购文件

        时间:2023年03月08日  至 2023年03月16日,每天上午9:00至12:00,下午13:00至17:00。(北京时间,法定节假日除外)

        地点:安徽蓝天工程造价咨询有限公司301室

        方式:本项目可采用现场报名或网上报名,有意向的投标人可委派代表持法定代表人授权委托书原件,本人身份证原件及加盖单位公章的复印件到安徽蓝天工程造价咨询有限公司现场报名,地点为铜陵市北京西路655号。采用网上报名的请电话联系采购代理机构并提供报名资料的扫描件及接收电子招标文件的邮箱。采购文件如有修正,将在该网站补充公告栏公布,与本采购文件具有同等效力。

        售价:¥500.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月17日 09点00分(北京时间)

        地点:安徽蓝天工程造价咨询有限公司五楼开标室

        五、开启

        时间:2023年03月17日 09点00分(北京时间)

        地点:安徽蓝天工程造价咨询有限公司五楼开标室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/229.html b/news/229.html new file mode 100644 index 0000000..133f1bb --- /dev/null +++ b/news/229.html @@ -0,0 +1,362 @@ + + + + +北京市房山区良乡医院良乡医院外科综合楼等室内标识标牌竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        北京市房山区良乡医院良乡医院外科综合楼等室内标识标牌竞争性磋商

        +
        +
        +
        +  2023-03-08 阅读:10 +
        +
        +

        良乡医院外科综合楼等室内标识标牌 采购项目的潜在供应商应在北京市丰台区汽车博物馆东路盈坤世纪G座902获取采购文件,并于2023年03月20日 13点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:DFHZ14-DL-2023-006

        项目名称:良乡医院外科综合楼等室内标识标牌

        采购方式:竞争性磋商

        预算金额:98.8000000 万元(人民币)

        最高限价(如有):98.8000000 万元(人民币)

        采购需求:

        合同履行期限:50个工作日完成供货及安装

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        1)具有独立法人资格,具有独立承担民事责任的能力。

        2)具有良好的商业信誉和健全的财务会计制度。

        3)具有履行合同所必需的设备和专业技术能力。

        4)具有依法缴纳税收和社会保障资金的良好记录。

        5)参加政府采购活动前三年内,在经营活动中没有重大违法记录。

        6)法律、行政法规规定的其他条件。

        2.1 中小企业政策

        □本项目不专门面向中小企业预留采购份额。

        R本项目专门面向  £中小 R小微企业  采购。即:提供的货物全部由符合政策要求的中小/小微企业制造、服务全部由符合政策要求的中小/小微企业承接。

        2.2 其它落实政府采购政策的资格要求:/。

        3.本项目的特定资格要求:1)具有独立的法人资格,有独立承担民事责任的能力,须提供有效的统一社会信用代码的营业执照(或事业单位法人证书);2)在“信用中国”网站被列为失信被执行人、税收违法黑名单及在“中国政府采购网”网站中被列入政府采购严重违法失信行为记录名单的供应商,不得参与本项目; 3)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得参加同一合同项下的政府采购活动。除单一来源采购项目外,为采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得再参加该采购项目的其他采购活动;4)本项目不接受联合体投标。

        三、获取采购文件

        时间:2023年03月09日  至 2023年03月15日,每天上午9:30至11:30,下午13:30至16:30。(北京时间,法定节假日除外)

        地点:北京市丰台区汽车博物馆东路盈坤世纪G座902

        方式:现场购买采购文件时需携带以下资料(材料均需加盖供应商公章): a.投标人营业执照复印件; b.采购文件购买人员的法定代表人授权委托书原件及供应商法定代表人、被授权人身份证复印件; 供应商前来购买采购文件前可与项目联系人联系,确认购买采购文件事宜。

        售价:¥500.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月20日 13点30分(北京时间)

        地点:北京市丰台区汽车博物馆东路盈坤世纪G座903会议室

        五、开启

        时间:2023年03月20日 13点30分(北京时间)

        地点:北京市丰台区汽车博物馆东路盈坤世纪G座903会议室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/23.html b/news/23.html new file mode 100644 index 0000000..450d49d --- /dev/null +++ b/news/23.html @@ -0,0 +1,362 @@ + + + + +商业数字标牌相比传统标识牌的优势主要有哪些?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        商业数字标牌相比传统标识牌的优势主要有哪些?

        +
        +
        +
        +  2022-05-04 阅读:15 +
        +
        +

        商业数字标牌是智慧商场信息化落地里面一个重要的具体产品,怎么个具体法呢?就是当人们从传统标识标牌的思维里面跳出来,当数字标牌展现在用户面前的时候,可以给用户是视觉层面的震撼,同时也可以更加深入的吸引用户参与到交互环节,让用户与机器联动起来,这对于年青一代来说是个很有趣的体验,在各种商业竞争日益激烈的当前,运营商都希望可以通过合理的方式吸引到更多的用户,并且将用户转化为直接的经济价值。目前不少的智慧商场信息化方案五花八门,涉及到的落地产品种类繁多。

        我们今天选取其中一个比较有代表性的类别数字标牌来分析,从甲方关注的点开始,相对于传统的机械型标牌,商业数字标牌主要有一个4个优势:

        1、可以给用户一种新鲜感,用户审美疲劳是每个行业都面临的问题,所以,越是竞争激烈的领域,运营商越需要出奇制胜,怎么做呢,当然是要改变传统的思维,但是思维的改变很难让用户直接感知到,通过实物的形式来创造变化是相对比较容易的,数字标牌取代一部分传统标牌可以让用户有一种全新的视觉体验,从感官层面上就把用户的注意力吸引过来了。

        2、用户参与度更强,体验更好,如果用户需要实际参与到与数字标牌的交互,比如触屏操控,或者是扫码的模式来参与,都可以自助的进行一些商业行为的具体动作,无需外界的参与和干扰,用户可能会对自助服务有一种更好的获得感和成就感。

        3、多媒体展示,素材呈现方式多样化,数字标牌通常可以展示文字,图片,音频,视频等等素材,这是传统的机械标牌无法实现的,所以,相比传统的标牌,数字标牌是多媒体呈现的方式,素材也是多样化的,根据实际场景需求来确定。

        4、更好提升商业场所的规格,在一些高端商业综合体购物中心里面,我们发现数字标牌的出现的频率远远超过传统的中小型商超,这也从侧面反映了数字标牌可以提升商业场所的规格,虽然商业场所的规格是多种因素综合决定的,但是,积少成多,每个因素都不容忽视。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/230.html b/news/230.html new file mode 100644 index 0000000..fb48c11 --- /dev/null +++ b/news/230.html @@ -0,0 +1,362 @@ + + + + +北京生命科技研究院标识标牌与展板设计、采购及安装_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        北京生命科技研究院标识标牌与展板设计、采购及安装

        +
        +
        +
        +  2023-03-08 阅读:28 +
        +
        +

        招标编号:ZDJHZB-2023-021
        开标时间:2023-03-28
        招标人:北京生命科技研究院有限公司
        资金来源:其它
        项目所在地区:北京市
        一、招标条件
        北京生命科技研究院标识标牌与展板设计、采购及安装招标人为北京生命科技研究院有限公司,招标项目资金来自自有资金,出资比例为100%。本项目已具备招标条件,现进行公开招标。
        二、项目概况
        2.1招标范围:北京生命科技研究院标识标牌与展板设计、采购及安装;
        2.2投标质量:合格,符合招标人要求;
        2.3设计、供货及安装期:合同签订后15日历天内完成设计、供货及安装工作;
        2.4标段划分:本项目共分1个标段。
        三、投标人资格要求
        3.1注册于中华人民共和国境内,具有独立承担民事责任能力的法人,具有有效的企业营业执照;
        3.2财务要求:投标人提供经会计师事务所或审计机构审计过的2021年度的财务审计报告,成立年限不足或无财务审计报告的需提供基本账户开户银行出具的资信证明;
        3.3投标人提供2022年1月1日以来至少一个月纳税证明材料和社会保障资金缴纳证明资料(如依法免税或不需要缴纳社会保障资金的,应提供相应文件证明);
        3.4信誉要求:
        (1)投标人应提供通过《中国裁判文书网》查询的自身企业、法定代表人、授权委托人自2020年1月1日以来在已生效的刑事判决书或刑事裁定书中不存在行贿犯罪记录的承诺书。存在行贿犯罪记录的投标人,不得参与本次招投标活动。【查询渠道:《中国裁判文书网》首页—高级检索—选择刑事案由—贪污贿赂罪—行贿罪、对有影响力的人行贿罪、对单位行贿罪、单位行贿罪,文书类型—判决书及裁定书;查询时间为自发布之日起至投标截止时间前】。
        (2)投标人未被列入《信用中国》网站“异常经营名录”、“重大税收违法失信主体”;未被列入《中国执行信息公开网》网站“失信被执行人名单”;不处于《中国政府采购网》“政府采购严重违法失信行为信息记录”中的禁止参加政府采购活动期间。(以代理机构于投标截止日当天在《信用中国》、《中国执行信息公开网》网站及《中国政府采购网》查询结果为准,信用记录截止时间为投标截止时间;如相关失信记录已失效,投标人需提供相关证明资料);
        (3)投标人提供近三年来在经营活动中没有骗取中标和严重违约及重大质量问题书面承诺。
        (4)投标人、法定代表人、项目负责人、授权委托人应未在烟草行业或招标人发布的行贿行为投标人名单禁入期限内。行贿人担任法定代表人、主要负责人或实际控制人的其他企业均不得参与本次投标。招标人及招标代理机构将对投标人信息进行核查,对行贿投标人及行贿人存在“换马甲”“换壳”行为参与本招标项目的,将拒绝其投标。
        (5)单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加同一标段投标或者未划分标段的同一招标项目投标(提供《国家企业信用信息公示系统》中加盖投标人公章查询网页截图,查询时间为招标发布日期之后)。
        3.5本次招标不接受联合体投标。
        四、招标文件的获取
        4.1获取时间:2023年3月8日至2023年3月14日,上午9:00时到12:00时,下午14:00时到17:30时(节假日、双休日除外)。
        4.2获取方式:郑州经济技术开发区现场获取。招标文件售价300元/套,招标文件售后不退。
        4.3获取招标文件时须提交以下证明文件:
        ①营业执照复印件(加盖公章);
        ②如法定代表人参加投标,提供加盖公章的法定代表人身份证明复印件及身份证复印件;如法定代表人委托代理人参加投标,提供加盖公章的法定代表人身份证明复印件、法人授权委托书(委托书包含联系方式)、被授权人身份证复印件。
        五、投标文件的递交
        5.1投标文件递交截止时间:2023年3月28日9时30分(北京时间)
        5.2逾期送达的投标文件或者未送达指定地点的投标文件,招标人不予受理。
        投标人请先电话联系获取《企业备案登记表》办理投标事宜。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/231.html b/news/231.html new file mode 100644 index 0000000..83e400d --- /dev/null +++ b/news/231.html @@ -0,0 +1,362 @@ + + + + +祁阳:重拳出击 坚决拆除违规广告标牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        祁阳:重拳出击 坚决拆除违规广告标牌

        +
        +
        +
        +  2023-03-08 阅读:4 +
        +
        +

        3月7日,祁阳市交通运输综合行政执法大队对辖区内G322国道、G356国道、木金公路、木进公路、X001线、X006线、X007线非公路标志标牌进行集中整治,净化公路通行环境。

        行动前,执法人员坚持“执法+普法”模式,对非公路标志设置者进行了公路法律法规宣传,耐心讲解擅自在公路沿线设置及悬挂广告、横幅、标志牌、乱搭乱建等行为给交通安全带来的危害和影响。通过执法人员的耐心讲解,设置者表示要积极配合非公路标志牌拆除和清理工作,共同维护良好的交通环境。

        执法中,执法人员每到一处拆除点,就放置反光锥桶等警戒设施,提醒过往车辆和行人注意安全,同时对拆除的非公路标志标牌进行及时清理,减少对过往车辆的通行影响。此次专项整治行动,共拆除挂式广告牌5块,其他类非公路标志牌12块。通过专项行动整治,有力地清除非公路标志,净化了路域环境,保障公路的安全和畅通。

        下一步,祁阳市交通运输综合行政执法大队将继续加强巡查力度,对涉及的非公路标志标牌,发现一处,清除一处,及时消除公路安全隐患,为广大群众营造畅通、安全、舒适的公路交通环境。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/232.html b/news/232.html new file mode 100644 index 0000000..b97a5b8 --- /dev/null +++ b/news/232.html @@ -0,0 +1,362 @@ + + + + +标识标牌制作服务采购项目公开招标招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        标识标牌制作服务采购项目公开招标招标公告

        +
        +
        +
        +  2023-03-09 阅读:20 +
        +
        +

        受福州市长乐区医院委托,福建锦鑫工程管理服务有限公司对[350182]JXGCGL[GK]2023001、标识标牌制作服务采购项目组织公开招标,现欢迎国内合格的供应商前来参加。标识标牌制作服务采购项目的潜在投标人应在福建省政府采购网(zfcg.czt.fujian.gov.cn)免费申请账号在福建省政府采购网上公开信息系统按项目获取采购文件,并于2023年03月30日 09时30分00秒(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:[350182]JXGCGL[GK]2023001

        项目名称:标识标牌制作服务采购项目

        采购方式:公开招标

        预算金额:2,926,408.00元

        采购包1(标识标牌制作):

        采购包预算金额:2,926,408.00元

        采购包最高限价: 2,926,408.00元

        投标保证金: 0元

        采购需求:(包括但不限于标的的名称、数量、简要技术需求或服务要求等)

        本采购包不接受联合体投标

        合同履行期限:60天

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:无

        3.本项目的特定资格要求:

        采购包1:

        (1)【本次拟采购产品若有属中国国家强制性产品认证(CCC)
        产品的,投标人须提供所投产品具有中国国家强制性产品认
        证(CCC)证书承诺函(格式自拟)或提供认证证书复印件。】;(2)关于“上一年度”描述修改为“2021?年度或?2022?年度”。
        本招标文件中若有与此处不一致的,以此处补充说明为准。;(3)根据《福州市财政局关于进一步推进政府采购领域优化营商
        环境工作的通知》(榕财采〔2021〕52?号)“四、简化资格
        证明材料”的规定,供?应?商?在?投?标?(响应)时,按照
        规定提供相关承诺函(详见附件)的,无需再提交财务状况、
        缴纳税收和社保资金缴纳等证明材料;采购人有权在签订合
        同前要求中标供应商提供相关证明材料以核实中标供应商
        承诺事项的真实性。供应商应当遵循诚实守信的原则,不得
        作出虚假承诺,承诺不实的,属于提供虚假材料谋取中标、
        成交,依法追究相关的法律责任。本招标文件中若有与此处
        不一致的,以此处补充说明为准。。

        三、采购项目需要落实的政府采购政策

        进口产品:无

        节能产品:适用于所有采购包

        环境标志产品:适用于所有采购包

        信息安全产品:无

        信用记录:按照下列规定执行:(1)投标人应在(招标文件要求的截止时点)前分别通过“信用中国”网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)查询并打印相应的信用记录(以下简称:“投标人提供的查询结果”),投标人提供的查询结果应为其通过上述网站获取的信用信息查询结果原始页面的打印件(或截图)。(2)查询结果的审查:①由评标委员会通过上述网站查询并打印投标人信用记录(以下简称:“评标委员会的查询结果”)。②投标人提供的查询结果与评标委员会的查询结果不一致的,以评标委员会的查询结果为准。③因上述网站原因导致评标委员会无法查询投标人信用记录的(评标委员会应将通过上述网站查询投标人信用记录时的原始页面打印后随采购文件一并存档),以投标人提供的查询结果为准。④查询结果存在投标人应被拒绝参与政府采购活动相关信息的,其资格审查不合格。

        四、获取招标文件

        时间: 2023-03-09 至 2023-03-16 ,(提供期限自本公告发布之日起不得少于5个工作日),每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间,法定节假日除外)

        地点:招标文件随同本项目招标公告一并发布;投标人应先在福建省政府采购网(zfcg.czt.fujian.gov.cn)免费申请账号在福建省政府采购网上公开信息系统按项目下载招标文件(请根据项目所在地,登录对应的(省本级/市级/区县))福建省政府采购网上公开信息系统操作),否则投标将被拒绝。

        方式:在线获取

        售价:免费

        五、提交投标文件截止时间、开标时间和地点

        2023-03-30 09:30:00(北京时间)(自招标文件开始发出之日起至投标人提交投标文件截止之日止,不得少于20日)

        地点:福建省福州市长乐区和谐路57号长乐区行政服务中心7-8层4号开标室

        六、公告期限

        自本公告发布之日起5个工作日。

        七、其他补充事宜

        八、对本次招标提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/233.html b/news/233.html new file mode 100644 index 0000000..5ff5be9 --- /dev/null +++ b/news/233.html @@ -0,0 +1,362 @@ + + + + +昆山市震川社区卫生服务中心新中心标示标牌竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        昆山市震川社区卫生服务中心新中心标示标牌竞争性谈判公告

        +
        +
        +
        +  2023-03-09 阅读:17 +
        +
        +

        新中心标示标牌 采购项目的潜在供应商应在江苏省苏州市昆山市前进东路888号四幢三单元四楼获取采购文件,并于2023年03月20日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:HSRY2023-ZG-007

        项目名称:新中心标示标牌

        采购方式:竞争性谈判

        预算金额:49.0000000 万元(人民币)

        最高限价(如有):49.0000000 万元(人民币)

        采购需求:

        新中心标示标牌采购(详见招标文件)

        合同履行期限:25日历日

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        /

        3.本项目的特定资格要求:1、本项目采用资格预审,供应商在购买标书时须向招标代理机构提供以下资格预审材料复印件加盖公章单独装订成册(要求的原件另附)一式两份,只有通过资格预审的供应商方可以报名购买招标文件,如有伪造或虚报,则招标代理机构有权取消该单位的报名资格。1.1、供应商具有独立承担民事责任的能力;(提供法人或者其他组织的营业执照等证明文件)1.2、供应商具有良好的商业信誉和健全的财务会计制度;(提供参加本次政府采购活动前的财务报告或者银行出具的资信证明)1.3、供应商有依法缴纳税收和社会保障资金的良好记录;(提供参加本次政府采购活动前依法缴纳税收和社会保障资金的相关材料)1.4、、如非法人到场报名的,还须提供法人授权委托书、法人身份证复印件、被授权委托人身份证复印件。授权委托代理人必须为供应商在职人员(提供近三个月社保证明材料);1.5、供应商如有不良行为的,在公示期间,招标人拒绝其投标报名;1.6、供应商参加政府采购活动前三年内,在经营活动中没有重大违法记录;(提供声明函,格式自拟。重大违法记录是指供应商因违法经营受到刑事处罚或者责令停产停业、吊销许可证或者执照、较大数额罚款等行政处罚)1.7、本次招标不接受联合体投标

        三、获取采购文件

        时间:2023年03月10日  至 2023年03月13日,每天上午9:00至11:30,下午13:30至16:30。(北京时间,法定节假日除外)

        地点:江苏省苏州市昆山市前进东路888号四幢三单元四楼

        方式:现场购买

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月20日 10点30分(北京时间)

        地点:江苏省苏州市昆山市前进东路888号四幢三单元四楼

        五、开启

        时间:2023年03月20日 10点30分(北京时间)

        地点:江苏省苏州市昆山市前进东路888号四幢三单元四楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/234.html b/news/234.html new file mode 100644 index 0000000..69aef28 --- /dev/null +++ b/news/234.html @@ -0,0 +1,362 @@ + + + + +陕西延长石油天然气股份有限公司2023年标识标牌框架协议采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        陕西延长石油天然气股份有限公司2023年标识标牌框架协议采购项目招标公告

        +
        +
        +
        +  2023-03-09 阅读:24 +
        +
        +

        招标编号:OITC-G230XA5007)
        项目所在地区:陕西省,延安市
        一、招标条件
        本陕西延长石油天然气股份有限公司2023年标识标牌框架协议采购项目已由项目审批 /核准/备案机关批准,项目资金来源为自筹资金378.54255万元,招标人为陕西延长石油天 然气股份有限公司。本项目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:2023年各站标识标牌,包括延川站、志丹站、杨家湾站、临镇站、安塞站等装 置区标识标牌(除党建类、宣传类、企业文化类以外)制作更换安装
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)陕西延长石油天然气股份有限公司2023年标识标牌框架协议采购项目:
        三、投标人资格要求
        (001陕西延长石油天然气股份有限公司2023年标识标牌框架协议采购项目)的投标人资格能力要求:
        1.投标人为具备承担招标项目能力的依法注册成立的境内法人或其他组织。法人或其他组织 投标的,提供有效的营业执照或事业单位法人证书分支机构投标的,提供有效的分支机构 营业执照,以及有效的总公司营业执照及总公司针对本项目的唯一授权书; 2.提供有效的基本账户开户许可证,或基本账户信息证明材料:
        3.具备一般纳税人资格,提供如税务机关出具的一般纳税人资格证明,或近期开具的增值税 专用发票,或税务机关官方网站一般纳税人查询记录截图等有效证明材料;
        4.投标人近三年(2020年1月1日至今)具有类似项目业绩至少一份(提供有效的合同复 印件和合同对应至少一张有效发票,以合同签订日期为准)。
        5.不得列入国家企业信用信息公示系统(http://www.gsxt.gov.cn/index.html) 严重违法 失信企业名单(黑名单)、不得列入信用中国(http://www.creditchina.gov.cn/)严重失 信主体名单、不得列入中国执行信息公开网(http://zxgk.court.gov.cn/shixin/)失信被 执行人名单(被执行人包括投标人、法定代表人)(提供以上三个网站四项内容查询结果截 图);
        6.本项目不接受被列入陕西延长石油(集团)有限责任公司任一失信交易商名单以及在陕西 延长石油(集团)有限责任公司招标中心(陕西德源招标有限责任公司))组织的招投标活动 中被评委会认定存在围串标情形且在限制期限内的供应商投标:
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年02月28日09时00分到2023年03月06日17时00分
        获取方式:凡有意参加投标者,请于2023年2月27日至2023年3月6日,每日上午 9时至12时,下午14时至17时(北京时间,节假日除外。下同)持以下资料购买招标文件介绍信、身份证复印件、开 票信息加盖公章同时采用电子邮件的方式进行招标文件购买,潜在投标人将企业介绍信及 委托代理人身份证复印件、购买文件开票信息加盖公章彩色扫描件发送至邮箱。信息审核后,招标文件将通过邮件形式发送至潜在投标人电子邮 箱。招标文件售价:500元/标段,售后不退。
        五、投标文件的递交
        递交截止时间:2023年03月21日09时30分
        递交方式:纸质文件递交

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/235.html b/news/235.html new file mode 100644 index 0000000..59bfeaa --- /dev/null +++ b/news/235.html @@ -0,0 +1,362 @@ + + + + +绵阳市公安局特巡警支队标识标牌宣传制作服务项目竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        绵阳市公安局特巡警支队标识标牌宣传制作服务项目竞争性磋商

        +
        +
        +
        +  2023-03-09 阅读:17 +
        +
        +

        标识标牌宣传制作服务项目 采购项目的潜在供应商应在四川聚丰达工程管理服务有限公司(绵阳市高新区石桥铺东路中国科技城跨境电子商务产业园6栋502室)获取采购文件,并于2023年03月17日 13点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:SCJFD(2023)007号

        项目名称:标识标牌宣传制作服务项目

        采购方式:竞争性磋商

        预算金额:28.0000000 万元(人民币)

        采购需求:

        详见磋商文件

        合同履行期限:三年,合同一年一签

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:(1)本项目不接受联合体磋商。(2)供应商及其现任法定代表人、主要负责人不得具有行贿犯罪记录。

        三、获取采购文件

        时间:2023年03月06日  至 2023年03月10日,每天上午9:00至12:00,下午13:30至16:30。(北京时间,法定节假日除外)

        地点:四川聚丰达工程管理服务有限公司(绵阳市高新区石桥铺东路中国科技城跨境电子商务产业园6栋502室)

        方式:现场获取(供应商购买磋商文件时应出示:1、报名人有效身份证原件及复印件;2、单位介绍信(介绍信上须注明项目名称、编号和被介绍人身份证信息、联系方式及邮箱)。(注:以上资料均须加盖报名单位鲜章)。供应商提供的资料须真实、完整、有效,未按要求提供资料的代理机构不予受理,提供资料中出现虚假、错误信息等所带来的后果由供应商自行承担)

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月17日 13点30分(北京时间)

        地点:四川聚丰达工程管理服务有限公司(绵阳市高新区石桥铺东路中国科技城跨境电子商务产业园6栋502室)

        五、开启

        时间:2023年03月17日 13点30分(北京时间)

        地点:四川聚丰达工程管理服务有限公司(绵阳市高新区石桥铺东路中国科技城跨境电子商务产业园6栋502室)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本项目预算金额为28万元/年。

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/236.html b/news/236.html new file mode 100644 index 0000000..cc12bef --- /dev/null +++ b/news/236.html @@ -0,0 +1,362 @@ + + + + +河南南阳市骨科医院中医文化标识标牌采购安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        河南南阳市骨科医院中医文化标识标牌采购安装项目招标公告

        +
        +
        +
        +  2023-03-14 阅读:31 +
        +
        +

        一、项目基本情况:
        1.项目编号:HN-2023-13
        2.项目名称:南阳市骨科医院中医文化标识标牌采购安装项目
        3.预算金额:860184.43元
        4.采购内容:南阳市骨科医院中医文化标识标牌采购安装项目(详见第五章采购内容)
        5.合同履行期限即供货期:签订合同后45日历天内供货、安装、调试完毕;
        6.质量要求:合格,满足采购人实际需求
        7.供货地点:采购人指定地点
        8.质保期:3年
        9.本项目不接受联合体。
        二、申请人的资格要求:
        1.满足《中国政府采购法》第二十二条规定;
        2.落实政府采购政策需满足的资格要求:节能产品、环境标志产品、促进中小微企业、监狱企业及残疾人福利性单位发展等政府采购政策。
        3.本项目的特定资格要求:
        3.1 (1)对列入失信被执行人、重大税收违法失信主体、政府采购严重违法失信行为记录名单及其他不符合《中国政府采购法》第二十二条规定条件的供应商,拒绝其参与本次政府采购活动。投标人需通过“信用中国”网站“列入失信被执行人、重大税收违法失信主体、政府采购严重违法失信行为记录名单”企业和法定代表人的查询,通过中国政府采购网对“政府采购严重违法失信行为信息记录”企业信用记录查询(投标文件中提供网站查询截屏,查询时间公告后有效)。
        (2)供应商在国境内注册的,具有有效的营业执照,具有独立承担民事责任的能力,有提供本次采购货物的能力。
        3.2本项目不接受联合体投标,不允许分包和转包。
        三、获取采购文件
        1、文件获取时间:凡有意参加投标者,请于2023年03月15日至2023年 03月21日(法定公休日、法定节假日除外),每日上午9:00至11:00,下午15:00至17:00(北京时间);领取招标文件,文件费:500元。
        2、方式:现场获取(原件备查,留加盖单位公章的复印件1套)
        3.获取招标文件时需提供申请人资格要求证明资料:

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/237.html b/news/237.html new file mode 100644 index 0000000..4245f31 --- /dev/null +++ b/news/237.html @@ -0,0 +1,362 @@ + + + + +2023年度众诚交通标识标牌采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023年度众诚交通标识标牌采购项目招标公告

        +
        +
        +
        +  2023-03-14 阅读:21 +
        +
        +

        一、 招标项目编号:ZXDL-2023-29
        二、 招标项目名称:2023年度众诚交通标识标牌采购项目
        三、 招标项目内容:本项目为杭州临安众诚交通设施有限公司2023年度标识标牌采购项目。具体详见采购文件第四章采购需求。
        四、 投标人资格
        1.符合《中华人民共和国政府采购法》第二十二条规定;
        2.未被“信用中国”(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)列入失信被执行人、重大税收违法案件当事人名单、严重违法失信行为记录名单;
        3.单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加同一合同项下的采购活动;为采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得再参加该采购项目的其他采购活动;
        4.特定资格要求:无。
        5.本项目不允许联合体投标。
        五、招标文件获取时间
        (一) 招标文件获取时间:2023年3月 14日至2023年3月20日,上午08:30-11:30,下午14:00-17:00。(双休及法定节假日除外)
        (二)招标文件获取方式及地址:
        1.获取方式:采购文件工本费300元/本,售后不退。
        2.获取招标文件时应提交:(1)法定代表人身份证明书或法定代表人授权委托书原件(附身份证复印件及原件);(2)营业执照副本复印件。注:以上材料均须加盖公章。
        六、 投标起止时间、地点及需提供材料等
        (一) 递交投标文件截止时间:2023年 4 月3日14时30分(北京时间)
        (二) 投标文件递交地点:杭州市
        (三) 开标时间及地点:
        1.开标时间:2023年 4 月3日14时30分(北京时间);
        (四)提供材料:详细见招标文件
        注:报名前联系代理人获取投标报名表

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/238.html b/news/238.html new file mode 100644 index 0000000..cc77358 --- /dev/null +++ b/news/238.html @@ -0,0 +1,362 @@ + + + + +温州液化天然气(LNG)项目现场标识标牌设计制作安装招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        温州液化天然气(LNG)项目现场标识标牌设计制作安装招标公告

        +
        +
        +
        +  2023-03-14 阅读:37 +
        +
        +

        一. 招标条件
        本招标项目温州液化天然气(LNG)项目现场标识标牌设计制作安装,招标人为浙江天虹物资贸易有限公司,招标项目资金已落实。该项目已具备招标条件,现对温州液化天然气(LNG)项目现场标识标牌设计制作安装采购进行公开招标。
        二. 项目概况与招标范围
        接收站工程和码头工程的现场标识标牌设计制作安装工作,具体内容包含:1) 厂区形象标识标牌;2) 生产现场管理标识标牌;3) 安全管理标识标牌;4)码头(港口)标识标牌,具体清单详见技术规范书。
        三. 投标人资格要求
        1.投标人是能够独立承担民事责任的法人或其他组织。
        2.投标人在浙江省能源集团有限公司及其下属公司存在“不良行为”,被列入浙能集团供应商“黑名单”或作“暂停使用”处置的,且该处置仍在有效期内,不得参与本标段投标。
        3.投标人须具有企业安全生产许可证。
        4.投标人须提供反光膜的品牌授权书。
        5.自2020年1月1日以来(以合同签订时间为准),投标人须在石油化工行业或电力行业具有100万及以上标识标牌项目的合同业绩(提供相应合同复印件,合同复印件至少需提供首页、签字盖章页以及体现合同供货范围内容的页面)。
        6.本次招标不接受代理商投标。
        本次招标是否接受联合体: 否
        四. 招标文件的获取
        1、招标文件出售时间:2023年03月09日 09时00分2023年03月16日 17时00分
        招标文件每套售价:200元,售后不退。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/239.html b/news/239.html new file mode 100644 index 0000000..6511101 --- /dev/null +++ b/news/239.html @@ -0,0 +1,362 @@ + + + + +中国石油集团测井有限公司新疆分公司2023年目视化标牌标识制作项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国石油集团测井有限公司新疆分公司2023年目视化标牌标识制作项目招标公告

        +
        +
        +
        +  2023-03-15 阅读:19 +
        +
        +

        一、招标条件

        本2023年目视化标牌标识制作项目(招标项目编号:TC2311017),已由项目审批/核准/备案机关批准,项目资金来源为国企自筹,招标人为中国石油集团测井有限公司新疆分公司。本项目已具备招标条件,现进行谈判采购。

        二、项目概况和招标范围

        项目规模:新疆分公司作业现场、固定场所需要定期更换目视化标牌、标识,以及日常安全宣传教育需要制作标识、标牌、视频等。

        招标内容与范围:本招标项目划分为标段1个标段,本次招标为其中的:

        001 第1包

        三、投标人资格要求

        001 第1包:

        供应商资格要求
        3.1 (1)在中华人民共和国境内注册的独立法人单位,营业执照处于有效期;
        (2)财务状况和市场行为良好;
        3.2 供应商不得存在下列情形之一:
        (1)处于被责令停产停业、暂扣或者吊销执照、暂扣或者吊销许可证、吊销资质
        证书状态;
        (2)进入清算程序,或被宣告破产,或其他丧失履约能力的情形;
        3.3本次采购不接受联合体。

        本项目不允许联合体投标。

        四、招标文件的获取

        获取时间:2023年03月15日16时00分00秒---2023年03月20日16时00分00秒

        获取方法:线上获取

        五、投标文件的递交

        递交截止时间:2023年03月24日10时30分00秒

        递交方法:线下递交纸质版

        六、开标时间及地点

        开标时间:2023年03月24日10时30分00秒

        4.2谈判文件每套售价300元。请有意参加谈判的潜在供应商确认自身资格条件是否满足要求,售后不退,应自负其责。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/24.html b/news/24.html new file mode 100644 index 0000000..f638039 --- /dev/null +++ b/news/24.html @@ -0,0 +1,362 @@ + + + + +数字标牌对智慧城市的贡献主要体现在哪些方面?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌对智慧城市的贡献主要体现在哪些方面?

        +
        +
        +
        +  2022-05-04 阅读:3 +
        +
        +

        数字标牌和智慧城市都是目前城市建设中比较超前的理念,在现实中也有不少的项目在摸索和尝试,智慧城市的范畴是比较广泛的,可以说是包罗万象,而数字标牌则是一个比较具体的产品,也可以说数字标牌率属于智慧城市建设中的一个很小的组成部分,下面我们就围绕着这两个关键词“数字标牌”和“智慧城市”进行展开分析,在创建智慧城市的过程中,一般情况下必然会或多或少的用到数字标牌产品,那么数字标牌产品对智慧城市建设的贡献主要体现在哪些方面呢,下面从3个方面来解答:

        1、城市形象升级,在基建的过程中,我们发现大多数更新换代的产品都会带来一波全方位的升级,无论是功能还是形象,都是脱胎换骨的,在数字标牌产品的发展过程中,虽然现阶段还没有大规模的参与到智慧城市建设中来,但是从已经尝鲜的项目中来看,对基础设施的形象提升作用是显而易见的,也是用户感知度比较深的一个落地产品。

        2、提升市民生活的便利性,如果说智慧城市需要重点从“智慧”层面来开展工作,那么这个智慧的体现方式就必须让用户切实感受到,并且从某种程度上降低用户的参与门槛和使用流程,数字标牌的出现刚好是这么样一个产品,比如一些商业领域公共场合的数字标牌,给用户带来的使用感受是非常直观的,点击某个商家的按钮,就可以得到相关的产品或者服务的基本介绍,同时也会给用户提供相关的导向和导视信息,这算是集合了广告和导向标识系统两种产品的特征,用户过去可能需要众多的传统标识牌才能实现的目的,通过数字标牌一个产品就解决了。其他的使用场景中,也有很多类似的功能便利性,特别是自助类型的,下面我们继续分解。

        3、增加用户参与度,给用户带来乐趣,接上上面提到的便利性,我们继续深入一个层级,到具体的参与环节,在这个环节中,如果用户被动接受信息的时候,通常是机械的接受信息,但是,如果用户可以参与到获取信息或者服务的过程中来,那么这种用户体验将是截然不同的,一些操控的过程不但可以让用户深度参与,在感官和视觉层面都会突破传统,更重要的是用户对自己获取的信息通常具备更强的认可度,在商业领域,这种认可度是价值转化的必要和前提条件,所以,数字标牌深度参与到智慧城市的建设也是符合商业利益的。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/240.html b/news/240.html new file mode 100644 index 0000000..3f1ae82 --- /dev/null +++ b/news/240.html @@ -0,0 +1,362 @@ + + + + +安溪县农业农村局山格淮山地标保护工程地理标志标牌制作安装项目询价邀请公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        安溪县农业农村局山格淮山地标保护工程地理标志标牌制作安装项目询价邀请公告

        +
        +
        +
        +  2023-03-15 阅读:20 +
        +
        +

        山格淮山地标保护工程地理标志标牌制作安装项目 采购项目的潜在供应商应在安溪县金融行政服务中心4B#603室获取采购文件,并于2023年03月21日 09点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:FJQH2023007

        项目名称:山格淮山地标保护工程地理标志标牌制作安装项目

        采购方式:询价

        预算金额:10.0000000 万元(人民币)

        最高限价(如有):10.0000000 万元(人民币)

        采购需求:

        合同履行期限:合同签订起15个工作日内根据采购单位指定的地点、安装完毕、交付使用

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        1)供应商有效的法人(负责人)营业执照副本复印件;

        2)供应商代表应执有法定代表人(负责人)的授权书原件[提供法定代表人(负责人)身份证复印件及供应商代表身份证复印件;若为法定代表人(负责人)直接参加报价可不需此件,但需提供法定代表人(负责人)身份证复印件]。

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2023年03月15日 至 2023年03月20日,每天上午8:00至12:00,下午14:30至17:30。(北京时间,法定节假日除外)

        地点:安溪县金融行政服务中心4B#603室

        方式:电话或现场报名

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年03月21日 09点30分(北京时间)

        地点:安溪县金融行政服务中心4B#603室开标室

        五、开启

        时间:2023年03月21日 09点30分(北京时间)

        地点:安溪县金融行政服务中心4B#603室开标室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本采购项目为询价邀请项目,欢迎受邀的供应商前来报名参与。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/241.html b/news/241.html new file mode 100644 index 0000000..3baceaa --- /dev/null +++ b/news/241.html @@ -0,0 +1,362 @@ + + + + +TCL电子:2022收入约625亿元,Mini LED智屏出货量增长26.8%_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        TCL电子:2022收入约625亿元,Mini LED智屏出货量增长26.8%

        +
        +
        +
        +  2023-03-15 阅读:49 +
        +
        +

        3月10日,TCL电子公布了2022年度业绩。2022年,TCL电子实现收入713.51亿港元(约合人民币625.05亿元),同比下跌4.7%;实现经调整归母净利润为7.04亿港元(约合人民币6.17亿港元),同比增长102.4%。

        资料显示,TCL电子主营业务包含显示、互联网、创新业务三大板块。2022年,TCL电子坚持发展策略,深化国际化经营,重点聚焦核心显示业务和互联网业务发展,同时积极探索新能源、新场景、新兴智能硬件等带来的新增长机会,加速创新业务的规模。

        尽管新冠疫情、地缘政治冲突等因素导致TCL电子营收下滑,但受益于公司大屏产品高端化、渠道结构优化和原材料成本下降,TCL电子的毛利同比增长4.6%。

        具体来看,在显示板块方面,TCL电子显示业务包含了大、中小尺寸显示产品以及智慧商显产品。2022年TCL电子的智屏产品结构持续升级,显示业务营收达579.07亿港元,毛利率升至18.2%。

        大尺寸显示产品上,TCL电子聚焦中高端产品、持续推进TCL+雷鸟的双品牌战略,TCL智屏全球出货量为2,378万台,同比上升0.8%,其中65英寸及以上的TCL智屏出货量同比大幅增长75.7%,带动大尺寸显示业务毛利率提升。

        同时,2022年TCL电子推出了多款Mini LED新品获得了市场认可,TCL Mini LED智屏全球出货量同比增长26.8%,在中国Mini LED TV市场上的占有率超过53%,产品高端化战略获得成效。

        另外,中小尺寸产品2022年实现营收118.02亿港元,北美地区收入同比增长20.2%;智慧商显业务规模则持续扩大,营收9.11亿港元,同比增幅达196.6%。

        而在创新业务板块方面,TCL电子实现营收达104.44亿港元,同比大幅增长22.2%。据悉,创新业务板块包括了光伏、智能家居及AR/VR等产品内容。

        其中,值得注意的是,在智能家居及AR/VR产品上,2022年,TCL电子陆续发售了消费级XR智能眼镜雷鸟Air,以及其升级版雷鸟Air 1S智能眼镜,产品基于Micro OLED+Birdbath显示方案打造,2022年TCL电子的AR眼镜产品销量位居国内线上市场前列。

        展望未来,TCL电子表示将巩固并强化供应链体系能力及市场渠道建设,提升集团在全球TV市场份额与品牌认知度,增强在全球市场的竞争力。公司将持续加大研发投入,开发行业领先的Mini LED、量子点、8K等高端显示技术,同时深化智能交互领域布局,发力AI、云服务、5G、智能制造等技术领域。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/242.html b/news/242.html new file mode 100644 index 0000000..8aa10df --- /dev/null +++ b/news/242.html @@ -0,0 +1,362 @@ + + + + +多地蓄势助推LED显示行业迈向价值链高端_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        多地蓄势助推LED显示行业迈向价值链高端

        +
        +
        +
        +  2023-03-15 阅读:12 +
        +
        +

        近日,全国“两会”隆重召开,各项政策信号集中释放,各行各业对政策走势的关注空前高涨。近年来LED显示行业发展势头强劲,与国家和地方的一系列政策支持密不可分。下面我们就来盘点一下近年来重要的行业政策,把握行业发展的未来动向。

          01

          国家层面政策规划

          2019年3月,工信部、国家广播电视总局、中央广播电视总台印发《超高清视频产业发展行动计划(2019-2022年)》,指出要按照“4K先行、兼顾8K”的总体技术路线,大力推进超高清视频产业发展和相关领域的应用。

        艾比森荣获8K超高清认证证书

          2021年3月,财政部、海关总署、税务总局发布《关于2021-2030年支持新型显示产业发展进口税收政策的通知》。《通知》指出:“自2021年1月1日至2030年12月31日,决定对新型显示产业(含Micro LED)的关键原材料、零配件生产企业进口国内不能生产或性能不能满足需求的自用生产性原材料、消耗品,免征进口关税”。在税收层面加大扶持力度,体现了国家对新型显示产业发展的重视与支持。

          2021年10月,工信部等六部门联合印发《关于开展“百城千屏”超高清视频落地推广活动的通知》,决定“支持有条件的城市设立超高清公共大屏,展播优质超高清4K/8K内容 ,提升超高清视频产业的渗透性,加速推动超高清视频在多领域的融合创新发展”,为户外超高清大屏的普及和推广注入了强劲动力。

        艾比森入选第一批“百城千屏”《国内8K LED显示屏制作商名录》

          02

          地方政府政策支持

          除了国家层面的政策引领,各省市地方政府也相继发布了一系列利好政策。据行业媒体统计,2021年以来,共有约20个省市出台了LED显示产业支持政策,内容重点主要集中在Mini/Micro LED等关键技术研发突破、超高清显示、“元宇宙” 等方面。

          “世界LED显示看中国,中国LED显示看深圳”,作为全球LED显示产业中心,深圳的政策环境对LED显示行业的影响不言而喻。2022年6月,深圳发改委等部门印发《深圳市培育发展超高清视频显示产业集群行动计划(2022-2025年)》,促进产业迈向价值链高端。

          重点内容包括:

         

          到2025年,超高清视频显示产业主营业务收入超过4500亿元,培育营收超百亿企业8家以上、营收超十亿企业20家以上 , 大尺寸面板和超高清视频显示终端的出货量和市占率全球领先 。

          支持开展Micro LED、Mini LED 等新一代显示技术和产品研发,针对亟待解决的共性问题,从材料、器件、设备、制造等方面进行联合攻关,推动新一代显示典型行业规模化应用 。支持内容制作企业开展超高清视听内容生产,丰富4K/8K、AR/VR、3D等内容供给。

          推动超高清视频显示在工业制造、医疗健康、智能交通、文教娱乐 等行业的产业化应用。

         

          2022年7月,上海市政府发布了《上海市培育“元宇宙”新赛道行动方案(2022-2025年)》,将“加快微型发光显示(Micro-LED)等新型显示技术研发应用” 、“支持裸眼3D等显示技术研发及产业化” 列为主要任务,着力强化新赛道布局。

          2022年10月,《武汉市促进新型显示产业创新发展实施方案(2022-2025年)》出台,提出“要突破8K超高清显示等关键技术 ”,“进军Mini LED、Micro LED等前瞻显示领域 ”。

        艾比森COB微间距显示应用案例-聊城茌平信发农业综合大厅

          2023年2月,成都市印发了《成都市关于进一步促进新型显示产业高质量发展的若干政策》,将“对围绕新型显示产业固定资产投入达到10亿元、50亿元、100亿元的企业,分别给予800万元、900万元、1000万元的奖励 ”,政策扶持力度空前。

          一系列利好政策的出台,为LED显示行业打开了广阔的发展空间。政策的引领,在给行业带来更多机遇的同时,也对发展划定了更明确的规范和准则。我们相信LED显示行业的市场环境必将越来越健康有序,期待与业界伙伴共建共享高质量发展新未来。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/243.html b/news/243.html new file mode 100644 index 0000000..5be330c --- /dev/null +++ b/news/243.html @@ -0,0 +1,362 @@ + + + + +比森×三菱:深化合作,共同开启数字化建设新篇章_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        比森×三菱:深化合作,共同开启数字化建设新篇章

        +
        +
        +
        +  2023-03-17 阅读:16 +
        +
        +

        3月16日,三菱电机自动化(中国)有限公司智能制造事业部总经理长谷宏明一行走进艾比森,艾比森总经理丁崇彬携公司管理团队热情接待。双方围绕数字艾比森建设成果与蓝图、智能制造战略规划等议题展开深入交流,共话未来合作方向。

        作为LED显示行业乃至国内企业中数字化转型的先行者,艾比森从2007年开始数字化布局,并率先完成数字化运营体系建设,成果显著,而这与三菱作为艾比森IT生态合作伙伴的支持密不可分。

         

        2018年,艾比森引进三菱公司的管理咨询和SCADA系统,同时与SAP、昊声等巨头合作,以MES智能制造系统作为连接底层生产设备和上层计划系统ERP之间的纽带,建设数字化、网络化、智能化工厂,全面布局中国制造2025。

        2018年,艾比森携手三菱等巨头启动MES项目

         

        2019年,MES系统项目正式落地,通过三菱 SCADA系统进行实时数据收集,实现生产透明化、可视化管理,满足客户全链条追溯,有效地增强了上下游的协同与整体决策能力,工厂管理效率大幅提升。

        长谷宏明一行参观艾比森惠州智能制造基地

        艾比森COB制造中心

         

        通过深入的座谈交流,长谷宏明总经理对数字艾比森的关键成果与核心价值给予了高度评价,并表达了对未来更深入合作的期待,希望依托三菱在智能制造领域的领先经验与丰富实践,为数字艾比森未来蓝图的实现提供切实可行的方案。

        艾比森总经理丁崇彬向来访嘉宾深入介绍数字艾比森成果

        此次交流进一步增进了艾比森与三菱的了解与互信,为双方下一步深化合作、共谋高质量发展奠定了坚实基础。作为合作伙伴,艾比森和三菱不仅是相互发展的见证者,也是彼此的支持者。面向未来,艾比森将继续与三菱携手同行,共同开启数字化建设新篇章。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/244.html b/news/244.html new file mode 100644 index 0000000..35d1f7e --- /dev/null +++ b/news/244.html @@ -0,0 +1,362 @@ + + + + +2022年全球及中国大陆激光投影市场总结与展望_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年全球及中国大陆激光投影市场总结与展望

        +
        +
        +
        +  2023-03-17 阅读:42 +
        +
        +

        根据洛图科技(RUNTO)最新发布的《全球及中国大陆激光投影市场分析季度报告(Global and China Laser Projector Market Analysis Quarterly Report)》,2022年,在持续欠佳的社会经济景气度之下,激光投影市场呈现了较强的发展韧性,全球激光投影(包括激光电视)市场出货量为145万台,同比增长24.4% 。

          2019-2022 年全球激光投影市场出货量变化

          数据来源:洛图科技(RUNTO), 单位:万台,%

          全球激光投影市场区域格局

          分区域看,2022年中国大陆激光投影(包括激光电视)市场出货量为67.9万台,同比增长12.6% 。中国大陆已是全球激光投影机最大的消费市场,市场份额达到47%。

          同期,北美市场份额增长至23%,保持全球第二大市场的地位;西欧地区在2022年度超过亚太地区,成为第三大市场,占比达到13%;中东非和拉美地区实现增长,均占据约2%的市场份额。

          2021-2022 年全球激光投影分区域出货量结构

          数据来源:洛图科技(RUNTO), 单位:%

          中国大陆市场:家用快速增长,工程商教下滑明显

          聚焦到中国大陆市场,2022年,家庭显示需求的大屏化和多场景化带动家用市场份额攀升至65%,增长8个百分点。市场详情可以参考早前发布的《年报 | 2022年中国大陆家用激光投影市场总结与展望》。

          工程市场受到疫情因素的压制,全年销售不理想,出货量份额下滑至17%。

          商教市场出货量同比下滑4.7%,份额下降至19%。但是,智能应用系统的搭载率不断提升,以及产品的轻量化和便携性拓宽了激光商务投影应用的宽度,商务投影出货量实现29%的增长。

          中国大陆激光投影市场应用场景出货量占比

          数据来源:洛图科技(RUNTO), 单位:%

          中国大陆工程市场:日系消退,国产品牌崛起

          2022年,中国大陆工程激光投影市场出货量完成11.3万台,同比下降10% ;市场CR8指数达到75.4%,较2021年进一步提升。市场格局进一步集中的同时,品牌仍在不断扩容:海信和长虹入局,厦门海同推出自有激光工程投影品牌—霍科思,神州数码推出自主品牌—神州云科,以及打印机厂商柯尼卡美能达。

          虽然日系品牌在行业地位逐步消退,但爱普生在工程市场以23%的市场份额保持了优势,位居第一。光峰、视美乐、索诺克等本土品牌加速产品布局和场景创新,在量和质两个维度上表现出强大竞争力,呈现不同程度的增长。

          在产品线布局上,外资品牌和本土品牌走向不同的方向:本土品牌继续向高端延伸,如光峰推出3款2万级流明的G系列高亮工程投影机;外资品牌则补齐入门级产品线,如巴可上市了6000/7000流明的IQ6系列固定镜头激光工程投影机。

          2022 年中国大陆工程激光投影市场品牌份额

          数据来源:洛图科技(RUNTO), 单位:%

          中国大陆商教市场:商务激光投影智能化

          2022年,中国大陆商教市场出货量为12.8万台,同比下降4.7% 。从品牌格局来看,光峰、索诺克两大品牌分别以24.5%和21.6%的份额位居前两名 ;NEC、视美乐通过增加多条产品线布局,份额均提升3个百分点,达到10%和5%。

          2022年以来,无论是国内光峰、宝视来、索诺克、华录,还是日系爱普生、理光、NEC等品牌,都针对性推出商务智能激光投影新品,瞄准企业会议互动、沉浸式办公体验、公共娱乐空间互动显示需求等场景。根据洛图科技(RUNTO)数据显示,2022年,中国大陆商用激光投影市场中智能产品的出货量占比已超过10%。

          2022 年中国大陆商教激光投影市场品牌份额

          数据来源:洛图科技(RUNTO), 单位:%

          整体来看,2022年低迷的环境并没有影响品牌在产品端的持续投入,国内市场仍处于激烈的竞争态势。传统外资巨头开展下沉市场的产品线布局和升级,本土商用激光投影品牌在产品上全面扩容。这也表现出企业对激光投影在娱乐大屏、亮化工程、智能化商务等领域的未来充满信心。

          在外部宏观环境并无恶化,内部环境企业积极布局的大前提下,洛图科技(RUNTO)预计,2023年,全球激光投影市场出货量将达167万台,同比近15%的增长;其中,中国大陆激光投影市场出货量将达85万台,同比增长25.7% 。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/245.html b/news/245.html new file mode 100644 index 0000000..bba7396 --- /dev/null +++ b/news/245.html @@ -0,0 +1,362 @@ + + + + +2023数字标牌行业分析及展望_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023数字标牌行业分析及展望

        +
        +
        +
        +  2023-03-22 阅读:204 +
        +
        +

        数字标牌作为数字化时代的一种重要营销手段,近年来在全球范围内得到了广泛的应用。据市场研究机构预测,未来几年数字标牌市场规模将以年均复合增长率6.1%的速度增长,预计到2026年将达到400亿美元以上。

        从销售量和企业数量增长的角度来看,数字标牌市场正处于快速增长的阶段。据统计,2019年数字标牌市场全球销售额达到了220亿美元,2020年增长了5%左右,其中亚太地区增长最快,达到了8.3%。随着数字化进程的加速,数字标牌行业未来的增长速度也将会进一步提升。

        从企业的营业状况分析来看,数字标牌行业的领先企业包括三星、LG、NEC、索尼等。这些企业在产品创新、技术研发、营销推广等方面具有明显优势,能够在激烈的市场竞争中占据一定的市场份额。同时,也有不少中小型数字标牌企业在市场上崭露头角,以更加专业化和差异化的服务满足客户需求。

        销售渠道的建全状态分析来看,数字标牌行业的销售渠道包括线上和线下两种方式。目前,线上销售渠道占据了数字标牌市场销售额的大部分。随着互联网和移动互联网的发展,数字标牌行业的线上销售渠道将会更加普及和成熟。数字标牌企业需要将线上和线下销售渠道有机结合,提高销售效率和用户体验。

        行业对数字标牌的需求分析来看,数字标牌应用领域不断扩大,尤其是在零售、医疗、金融、交通等行业。未来数字标牌在教育、娱乐、旅游等行业也将逐渐得到广泛应用,市场潜力将更加巨大。数字标牌的应用场景包括门店展示、交通导向、广告宣传、信息展示、数字菜单等,这些应用场景都需要数字标牌企业提供定制化和差异化的解决方案。

        未来,数字标牌行业的发展前景仍然广阔,数字标牌企业需要关注行业趋势和市场需求,注重注重产品创新和技术研发,提高产品性能和质量,不断满足用户需求。同时,数字标牌企业需要通过提高生产效率、优化管理流程等方式降低成本,提高市场竞争力。此外,数字标牌企业还需要关注环保和可持续发展等社会责任,将产品质量和环境保护有机结合,实现可持续发展。

        最后,数字标牌行业是一个充满活力和潜力的新兴行业,市场需求不断增长,未来发展前景广阔。数字标牌企业需要关注行业趋势和市场需求,注重产品创新和技术研发,提高产品质量和市场竞争力,实现可持续发展。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/246.html b/news/246.html new file mode 100644 index 0000000..c922da6 --- /dev/null +++ b/news/246.html @@ -0,0 +1,362 @@ + + + + +广州市公安局交警支队2023年内部宣传及窗口标识标牌采购项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        广州市公安局交警支队2023年内部宣传及窗口标识标牌采购项目招标公告

        +
        +
        +
        +  2023-03-24 阅读:12 +
        +
        +

        一、项目基本情况

        项目编号:CZ2022-8909

        项目名称:广州市公安局交警支队2023年内部宣传及窗口标识标牌采购项目

        采购方式:公开招标

        预算金额:2,390,000.00元

        采购需求:

        合同包1(广州市公安局交警支队2023年内部宣传及窗口标识标牌采购项目):

        合同包预算金额:2,390,000.00元

        本合同包不接受联合体投标

        合同履行期限:自合同签订之日起18个月,或项目合同累计支付费用达到合同总价2390000元时,该项目执行完毕,以先到为准。

        二、申请人的资格要求:





        1.投标供应商应具备《政府采购法》第二十二条规定的条件,提供下列材料:

        1)具有独立承担民事责任的能力:依据《投标函》及以下相关证照的扫描件之一:1.企业法人提供企业法人营业执照;2.事业法人提供事业法人登记证;3.其他组织提供其他组织的营业执照或执业许可证;4.自然人提供居民身份证等。分支机构投标的,还须提供分支机构的营业执照(执业许可证)扫描件及总公司(总所)出具给分支机构的授权书。

        2)有依法缴纳税收和社会保障资金的良好记录:依据《投标函》。

        3)具有良好的商业信誉和健全的财务会计制度:依据《投标函》。

        4)履行合同所必需的设备和专业技术能力:依据《投标函》。

        5)参加采购活动前3年内,在经营活动中没有重大违法记录:依据《投标函》。


        2.落实政府采购政策需满足的资格要求:

        合同包1(广州市公安局交警支队2023年内部宣传及窗口标识标牌采购项目)落实政府采购政策需满足的资格要求如下:

        本项目不属于专门面向中小微企业采购的项目。


        3.本项目的特定资格要求:

        合同包1(广州市公安局交警支队2023年内部宣传及窗口标识标牌采购项目)特定资格要求如下:

        (1)1.本项目不接受联合体投标。 2.投标人未被列入“信用中国”网站中“记录失信被执行人或重大税收违法案件当事人名单或政府采购严重违法失信行为”的记录名单;不处于“中国政府采购网”中“政府采购严重违法失信行为信息记录”的禁止参加政府采购活动期间(以采购代理机构或采购人于资格审查时在上述网站查询结果为准,如在上述网站查询结果均显示没有相关记录,视为没有上述不良信用记录。同时对信用信息查询记录和证据截图存档。如相关失信记录已失效,供应商须提供相关证明资料)。 3.投标人必须符合法律、行政法规规定的其他条件:依据《投标函》。

        三、获取招标文件

        时间: 2023年03月24日 至 2023年04月13日 ,每天上午 00:00:00 至 12:00:00 ,下午 12:00:00 至 23:59:59 (北京时间,法定节假日除外)

        地点:广东省政府采购网https://gdgpo.czt.gd.gov.cn/

        方式:在线获取

        售价: 免费获取

        四、提交投标文件截止时间、开标时间和地点

        2023年04月14日 08时45分00秒 (北京时间)

        递交文件地点:在线提交

        开标地点:在线开标

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        1.本项目采用电子系统进行招投标,请在投标前详细阅读供应商操作手册,手册获取网址:https://gdgpo.czt.gd.gov.cn/help/transaction/download.html。投标供应商在使用过程中遇到涉及系统使用的问题,可通过020-88696588 进行咨询或通过广东政府采购智慧云平台运维服务说明中提供的其他服务方式获取帮助。

        2.供应商参加本项目投标,需要提前办理CA和电子签章,办理方式和注意事项详见供应商操作手册与CA办理指南,指南获取地址:https://gdgpo.czt.gd.gov.cn/help/problem/。

        3.如需缴纳保证金,供应商可通过"广东政府采购智慧云平台金融服务中心"(http://gdgpo.czt.gd.gov.cn/zcdservice/zcd/guangdong/),申请办理投标(响应)担保函、保险(保证)保函。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/247.html b/news/247.html new file mode 100644 index 0000000..2e7defa --- /dev/null +++ b/news/247.html @@ -0,0 +1,362 @@ + + + + +西安市地铁1-6、14、16号线标识标牌设计、制作及安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        西安市地铁1-6、14、16号线标识标牌设计、制作及安装项目招标公告

        +
        +
        +
        +  2023-03-24 阅读:59 +
        +
        +

        招标编号:XG-2023-YY-005
        项目所在地区:陕西省
        一、招标条件
        本西安市地铁1-6、14、16号线标识标牌设计、制作及安装项目(2023-2025年度)已由项目审批/核准/备案机关批准,项目资金来源为其他资金已落实,招标人为西安市轨道交通集团有限公司。本项目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:本项目为西安市地铁1-6、14、16号线标识标牌设计、制作及安装项目(2023-2025年度),其中:1包:西安市地铁2023-2025年度1-6、14、16号线(含1号线三期、2号线二期)安全类标识设计、制作、配送、安装(含旧标识清撤)等全过程服务与售后服务。2包:西安市地铁2023-2025年度1-6、14、16号线(含1号线三期、2号线二期)服务类标识设计、制作、配送、安装(含旧标识清撤)等全过程服务与售后服务。详细内容及要求见《用户需求书》。
        范围:本招标项目划分为 2 个标段,本次招标为其中的:
        (001)第1包; (002)第2包;
        三、投标人资格要求
        (001 第 1 包)的投标人资格能力要求:
        1、投标人须为在中华人民共和国境内依法注册的独立法人;
        2、投标人自 2020 年 1 月 1 日(以合同签订时间为准) 以来, 至少签订过 1 份合同金额 不少于 150 万元的包含标识标牌类制作项目的业绩合同;
        3、本次招标不接受联合体投标;
        4、投标人未处于被取消或被暂停投标资格,未处于财产被托管、冻结或破产状态;
        5、与招标人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加投标。单位负责人为同一人或者存在控股、管理关系的不同单位, 不得参加同一标段投标或 者未划分标段的同一招标项目的投标。
        (002 第 2 包)的投标人资格能力要求:
        1、投标人须为在中华人民共和国境内依法注册的独立法人;
        2、投标人自 2020 年 1 月 1 日(以合同签订时间为准) 以来, 至少签订过 1 份合同金额不少于 200 万元的包含标识标牌类制作项目的业绩合同;
        3、本次招标不接受联合体投标;
        4、投标人未处于被取消或被暂停投标资格,未处于财产被托管、冻结或破产状态;
        5、与招标人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加投标。单位负责人为同一人或者存在控股、管理关系的不同单位, 不得参加同一标段投标或 者未划分标段的同一招标项目的投标。
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间: 从 2023 年 03 月 22 日 09 时 00 分到 2023 年 03 月 28 日 17 时 00 分
        获取方式:凡有意参加投标者,请于招标文件获取时间内将加盖公章的单位介绍信、法人授权委托书(附法定代表人和授权代理人身份证复印件)及投标人资格要求中第 1 条至第 2 条要求的资料扫描件。
        招标文件售价: 100 元/包,售后不退。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/248.html b/news/248.html new file mode 100644 index 0000000..18d7730 --- /dev/null +++ b/news/248.html @@ -0,0 +1,362 @@ + + + + +内蒙古呼伦贝尔山金矿业有限公司宣传标志牌采购项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        内蒙古呼伦贝尔山金矿业有限公司宣传标志牌采购项目

        +
        +
        +
        +  2023-03-24 阅读:10 +
        +
        +

        招标编号:QHZB-2023-005
        项目所在地区:内蒙古自治区,呼伦贝尔市
        一、招标条件
        本呼伦贝尔山金矿业有限公司宣传标志牌采购项目已由项目审批核准备案机关批准,项目资金来源为其他资金1861650元,招标人为呼伦贝尔山金矿业有限公司。本项目已具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:具体详见招标文件
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)呼伦贝尔山金矿业有限公司宣传标志牌采购项目;
        三、投标人资格要求
        (001呼伦贝尔山金矿业有限公司宣传标志牌采购项目)的投标人资格能力要求:具体详
        见招标文件;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年03月22日09时00分到2023年03月27日17时00分
        五、投标文件的递交
        递交截止时间:2023年04月11日14时30分
        六、开标时间
        开标时间:2023年04月11日14时30分
        七、其他
        呼伦贝尔山金矿业有限公司宣传标志牌采购项目招标公告
        招标编号:QHZB-2023-005
        本招标项目呼伦贝尔山金矿业有限公司宣传标志牌采购项目已由矿管集团批准建设,建设资 金来自自筹资金,招标人为呼伦贝尔山金矿业有限公司。项目已具备招标条件,现对该项目 进行公开招标。
        1.项目概况与招标范围:
        招标范围:呼伦贝尔山金矿业有限公司宣传标志牌等设计、制作及安装
        交货地点:呼伦贝尔山金矿业有限公司
        工期:240天
        2.投标人资格要求
        2.1合格的投标人需具备以下条件:
        (1)投标人必须为具备本项目履约能力的在中华人民共和国境内注册的独立的法人;
        (2)财务要求:近3年(2020年-2022年)财务经营状况良好(提供财务审计报告或财务报表);
        (3)信誉要求:没有处于被责令停业,投标资格被取消,财产被接管、冻结,破产状态; 投标人在国家信息中心主办“信用中国”网站查询是否有失信记 录,即截止报名及开标当日评审时未被记入失信名单;
        (4)业绩要求:近三年(2020年01月至今)具有类似项目业绩(以合同为准);
        (5)依法缴纳税收凭证:提供近半年2022年9月至2023年2月良好缴纳税收的相关凭据
        (以税务机关提供的纳税凭据或银行入账单为准)。注:其他组织和自然人也需要提供缴纳 税收的凭据金额缴纳社保的凭据。依法免税的企业,应提供响应文件证明其依法免税;
        2.2法定代表人为同一个人的两个及两个以上法人,母公司、全资子公司及其控股公司,以
        及其他形式有资产关联关系的投标人,都不得在本项目中同时投标。
        2.3本项目不接受联合体投标。
        以上所要求的条件必须同时满足,有意参加投标的投标人可就上述项目进行报名。
        3.招标文件的获取
        3.1符合供应商资格条件要求的供应商可在2023年03月22日至2023年03月27日,每日 上午9:00-12:00,下午14:00-17:00(北京时间)报名
        3.2报名时投标人需提供以下材料:
        1、报名人出示身份证原件,并提供加盖公章的身份证复印件;
        2、报名人出具经法定代表人签字、公司盖章的“授权委托书”;
        3、报名人出具报名期间在“信用中国”网站下载的信用报告;
        4、报名人须出具承诺书(格式自拟),保证其资料的真实性、有效性,一经发现有虚假资料, 招标人有权取消其投标资格。
        5、报名人提供本公告第二条款中全部资格要求的证明资料并加盖公章的彩色复印件1份且 装订成册。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/249.html b/news/249.html new file mode 100644 index 0000000..c6e91da --- /dev/null +++ b/news/249.html @@ -0,0 +1,362 @@ + + + + +西安市第一医院新院区标识标牌采购项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        西安市第一医院新院区标识标牌采购项目竞争性磋商公告

        +
        +
        +
        +  2023-03-24 阅读:17 +
        +
        +

        一、项目基本情况

        项目编号:HDFX-2023014

        项目名称:新院区标识标牌采购项目

        采购方式:竞争性磋商

        预算金额:1,500,000.00元

        采购需求:

        合同包1(西安市第一医院新院区标识标牌采购项目):

        合同包预算金额:1,500,000.00元

        合同包最高限价:1,500,000.00元

        本合同包不接受联合体投标

        合同履行期限:从成交通知书到达之日起20个日历天内

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求: 无。

        3.本项目的特定资格要求:

        合同包1(西安市第一医院新院区标识标牌采购项目)特定资格要求如下:

        (一)符合《中华人民共和国政府采购法》第二十二条资格条件:
        (1)具有独立承担民事责任能力的法人,其他组织或自然人,并出具合法有效的统一社会信用代码的营业执照或事业单位法人证书等国家规定的相关证明,自然人参与的提供其身份证明;
        (2)财务状况:提供2022年度的财务报告(至少包括资产负债表和利润表,成立时间至提交投标文件截止时间,不足一年的可提供成立后任意时段的资产负债表),或其基本存款账户开户银行出具的资信证明;
        (3)完税证明:提供2022年3月至今已缴纳的至少一个月的纳税证明或完税证明,依法免税的单位应提供相关证明材料;
        (4)社保缴纳情况:提供2022年3月至今已缴存的至少一个月的社会保障资金缴存单据或社保机构开具的社会保险参保缴费情况证明,依法不需要缴纳社会保障资金的单位应提供相关证明材料;
        (5)参加本次政府采购活动前三年内,在经营活动中没有重大违法记录声明;
        (6)履行合同所必需的产品和专业技术能力的书面声明。
        (二)参加本项目的特定资格条件:
        (1)供应商应授权合法的人员参加投标全过程,其中法定代表人直接参加投标的,须出具法定代表人身份证明及法人身份证原件及复印件,法定代表人授权代表参加投标的,须出具法定代表人授权书及授权代表身份证原件及复印件;
        (2)供应商不得为列入信用中国(www.creditchina.gov.cn)记录失信被执行人或重大税收违法案件当事人名单或中国政府采购网(www.ccgp.gov.cn)的政府采购严重违法失信行为记录名单(网站查询的截图,加盖供应商公章)
        (3)投标供应商营业执照需包含所投项目内容;
        (4)与采购人存在利害关系可能影响磋商公正性的单位,不得参加投标、单位负责人为同一人或存在控股、管理关系的不同单位,不得参加同一标段投标,否则,相关投标均无效;

        三、获取采购文件

        时间: 2023年03月24日 至 2023年03月30日 ,每天上午 09:00:00 至 12:00:00 ,下午 14:00:00 至 17:00:00 (北京时间)

        途径:陕西省西安市未央区朱宏路福清商会大厦9楼901室

        方式:现场获取

        售价: 0元

        四、响应文件提交

        截止时间: 2023年04月03日 09时00分00秒 (北京时间)

        地点:陕西省西安市未央区朱宏路福清商会大厦9楼901室

        五、开启

        时间: 2023年04月03日 09时00分00秒 (北京时间)

        地点:陕西省西安市未央区朱宏路福清商会大厦9楼901室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1、请供应商按照陕西省财政厅关于政府采购供应商注册登记有关事项的通知中的要求,通过陕西省政府采购网(http://www.ccgp-shaanxi.gov.cn/)注册登记加入陕西省政府采购供应商库。

        2、获取采购文件时请携带单位介绍信及身份证复印件。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/25.html b/news/25.html new file mode 100644 index 0000000..27f981d --- /dev/null +++ b/news/25.html @@ -0,0 +1,362 @@ + + + + +数字标牌于各行业下的实际应用_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌于各行业下的实际应用

        +
        +
        +
        +  2022-05-04 阅读:10 +
        +
        +

        当今时代下,数字标牌已逐渐取代传统的静态广告标牌并得到广泛应用,其凭借网络、多媒体技术的融合,正以媒体的方式发布处理信息,以动态图像、交互功能呈现更大的活力。解析新零售、医疗、交通、教育等场景下的深度应用。

        一、新零售场景应用

        动态化内容展示,聚焦消费者目光

        应用于新零售的餐饮行业,飞利浦数字标牌可搭建多联屏,一方面通过视频、滚播海报、动态模板等动态化内容展示、智能联屏/分屏展示,将店内的美食佳肴呈现得淋漓尽致,强化美食对消费者的视觉吸引力,全面提升消费者的购物体验;另一方面也能作为就餐叫号的显示屏,实时呈现排队叫号信息,提高餐饮行业效率。在确保门店促销及餐品等信息及时更新的同时,还能有效节省门店在人力物料方面的持续性投入成本。

        应用于鞋服专卖店、奢侈品专柜等门店场景下,通过嵌入式安装,则有助于门店打造智慧橱窗,既能带来更为震撼的视觉冲击感,又不占据门店更多空间布局,节省门店运营成本,并实现快速上新及展示信息的统一化管理。此外数字标牌+CMS信发系统软硬件一体化解决方案,还可应用于智能货柜中,实现批量智能货柜显示屏的统一调度及管理。

        针对酒店、会所前台等场景,飞利浦数字标牌一方面可通过精致沉稳大气的外观设计,打造高端酒店品牌形象,此外数字标牌也能精准展示酒店客房价目表、酒店促销活动、酒店实力与资质等内容,便于入住顾客建立清晰认知。

        二、医疗场景应用

        实时排队叫号,高效智能导诊

        应用于医疗场景下,飞利浦数字标牌主要有排队叫号信息显示、智能导诊以及医疗信息智慧展示三大作用。应用于医院各大门诊区域,数字标牌可以与医院系统相连,实时呈现排队叫号信息,让等候区就诊患者实时掌握排队情况,及时做好就诊准备;应用于导诊台,则能实时呈现导诊挂号、问诊注意事项、问诊流程等信息,便于加快问诊流程,缓解服务台医务人员工作压力,提高导诊效率。

        应用于护士工作站,则能实时显示当前楼层/科室病人出入院人数及床位等信息,便于护士人员提前进行协调与规划,同时更能清晰显示各病床患者的基础信息,便于交接班护士快速知晓各病人情况,进而提供更为契合的诊疗服务;应用于门诊大厅或各楼层走廊处,则支持患者等候列表与呼叫信息同屏切换及分屏显示,可同步呈现天气、时间等基础信息,以及养生保健、烟酒危害等生活科普类资讯、防疫抗疫注意事项等,具备极高的灵活性。

        三、交通场景应用

        航班信息引导,地铁站点动态显示

        应用于机场环境下,飞利浦数字标牌可以作为航显大屏来使用。其不仅可以实时呈现航班及登机口信息,实现航班信息引导,满足客流信息识别需要,同时还能及时跟进各班次值机情况,提升旅客的乘机体验。

        针对地铁场景,飞利浦数字标牌则能应用于地铁站台等候区,在与地铁PIS系统对接后,能提供全程站点、到站信息动态显示,实现精准站台播报,直观展示轨交线路走向及换乘信息,便于出行乘客及时掌握地铁站点信息。同时,疫情期间防控注意事项、政务动态、便民资讯以及商业广告等内容,均能轮播甚至分屏滚动呈现,通过综合信息展示,提供良好的便民出行服务。

        四、教育场景应用

        智慧公示,展现校园风采

        针对教育场景,飞利浦数字标牌则能应用于校园展厅或走廊等区域,进一步实现校园信息的智慧化展示。应用于走廊区域,可作为“智慧公示栏”,日常便于校方将政策公告、通知提醒、校园新闻、校方介绍等信息统一推送至数字标牌。同时学校一周安排、临时欢迎标语、校区活动等图文信息也能采用分屏/轮播等形式播放,营造浓郁的校园文化氛围。应用于展厅荣誉墙,则能够灵活展示校园建设成果、科学研究成果、校园特色、校内大事件、校园风采等信息,以智能化手段实时展现校园风采。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/250.html b/news/250.html new file mode 100644 index 0000000..4e98ffe --- /dev/null +++ b/news/250.html @@ -0,0 +1,362 @@ + + + + +数字标牌的激烈竞争下,印刷标牌市场景象如何?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌的激烈竞争下,印刷标牌市场景象如何?

        +
        +
        +
        +  2023-04-07 阅读:17 +
        +
        +

        在过去的五年中,印刷标牌在数字标牌的增长中面临着挑战,但印刷标牌仍然在主要选择的关键应用中存在机会。

        史密瑟斯(Smithers)的一份新报告《到2028年数字世界中印刷标牌的未来》显示,多年来,随着新的电子格式的引入,数字标牌的竞争一直在加剧,以扩大数字的潜力。由于市场竞争日益激烈,到2023年,全球印刷标牌市场的价值以2.2%的复合年增长率(2021年不变价格)下降至409亿美元,印刷面积的复合年增长率下降1.4%至100亿平方米。面对来自数字标牌的竞争,印刷标牌预计将呈现温和增长——到 2028 年,价值复合年增长率为 0.2%(2021 年不变价格)至 414 亿美元,印刷面积的复合年增长率为 0.7%,达到 104 亿平方米。

        重大事件对市场的影响

        在过去四年中,印刷标牌市场不得不应对对全球人口和经济产生重大影响的两大事件带来的挑战——Covid-19大流行和乌克兰战争。数字标牌的竞争挑战和这两起重大事件的全球经济影响相结合,从2018年到2023年,对印刷标牌的需求显着减少。

        2023 年,全球印刷标牌市场的价值比2019年大流行前的市场低9.8%,印刷面积下降6.7%。即使到2028年,预计市场仍将比2019年低8.8%,比印刷面积低3.5%。

        主要地区的印刷标牌

        到2023年,三个地理区域占全球价值的86%(2021 年不变价格):亚洲、北美和西欧。亚洲是2023年印刷标牌的最大区域市场,占全球价值的38.4%。北美是印刷标牌的第二大市场,份额为28.4%,西欧以19.2%的份额排名第三。

        在过去五年中,这三个地区的印刷标牌市场价值都有所下降;亚洲最低的复合年增长率不到1%,北美的复合年增长率略高于2%,而西欧的复合年增长率最快,接近4.5%。

        在这三个地区中,亚洲是唯一一个预计到2028年价值将以1.5%的复合年增长率增长的地区。在此期间,其他两个地区的价值将继续萎缩。

        室内和室外标牌

        室内标牌在印刷标牌需求中所占份额最大,按2021年不变价格计算,2023年的价值为249.3亿美元,面积为65.6亿平方米。2023年室内标牌在整个印刷标牌市场中的份额分别为价值的61%和印刷面积的65%,分别高于2018年的58.5%和63.5%。

        在定期封锁和餐馆、酒店和娱乐场所关闭之后,2020 年对户外标牌的需求下降速度比室内标牌快得多。按印刷面积划分的户外部分份额从2018年的36.5%下降到2020年的不到33.5%,随着限制的结束以及企业和场所的重新开放,2021 年和2022年逐渐增加到目前的水平。

        未来五年,全球室内标牌的需求预计将以0.9%的复合年增长率和0.2%的复合年增长率增长。对户外标牌的需求将以0.2%的复合年增长率和0.3%的复合年增长率增长。因此,到2028年,室内标牌的份额将略有增加,降至不到66%。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/251.html b/news/251.html new file mode 100644 index 0000000..52a3200 --- /dev/null +++ b/news/251.html @@ -0,0 +1,362 @@ + + + + +重庆医科大学附属第一医院,以数字标牌实现智慧叫号再升级_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        重庆医科大学附属第一医院,以数字标牌实现智慧叫号再升级

        +
        +
        +
        +  2023-04-07 阅读:14 +
        +
        +

        信息化技术在当今社会各行各业的作用日益增强,于医疗体系内,通过信息化建设来实现智慧叫号正是提高诊疗效率及医院形象的关键所在。为了保证患者能够及时掌握排队信息,大型综合性教学医院——重庆医科大学附属第一医院即采用AOC旗下翼彩系列32X8-V、55F1、65F1数字标牌,进一步实现全院智慧叫号问诊,确保有序排队,提高就诊秩序与效率。

        方案概述

        此次应用于重庆医科大学附属第一医院的AOC翼彩系列数字标牌共计236台,实现了医院门诊科室的全区域、全方位、全场景覆盖。依托数字标牌高清画质、广视角、优异系统拓展、智能终端控制等优势,搭载医院叫号系统打造智慧叫号一体化解决方案,为医院提供高效、便利、精准、安全的服务的同时,也助于减少患者等待时间,提高患者就诊体验。

        提高就诊效率·多终端统一调度

        实际应用于重庆医科大学附属第一医院时,AOC翼彩系列数字标牌可以与医院系统相连,实现智慧叫号问诊,实时显示挂号排队信息以及当天出诊的专家信息、诊室位置,从本质上改善传统排队管理所存在的一些混乱、无序的问题,实现候诊人群的提前排队等候,缓解患者就医等候焦虑,提高患者就诊效率、医护诊疗效率。

        翼彩系列数字标牌还搭载CMS信发系统,通过该系统不仅可以助医院快速制作展示内容,制订内容播放计划,随时传递到分布在医院任意地点的硬件终端,还可以随时控制医院百台标牌终端播放的内容和播放形式,使数字标牌得到统一调度与管控,充分实现全局控制一步到位。

        缓解工作负担·信息智慧展示

        日常工作中,分诊台护士常需要负责指导病人填写病历、接听电话、接待预约、回复患者疑虑、落实便民措施等工作,较为繁琐,工作压力较大。在采用数字标牌作为叫号屏的情况下,即能通过高清数字信号播出的叫号排队信息,减轻护士咨询业务的工作负担,为医务人员提供有力的工作支持。

        门诊压力较小时,则能实现门诊排队信息与养生保健、烟酒危害等生活科普类信息及医院品牌信息等内容的轮播展示。应用于人流量较大的医院公共区域,也不必担心会有人擅自操作屏幕导致显示异常,AOC数字标牌支持按键锁屏,支持本机按钮锁、遥控锁、信源按键锁等多种控制设置,防止在公共场所下有未授权人员擅自进行操作,造成不利影响。

        智慧叫号,赋能智慧医疗!作为全球知名显示设备提供商及品牌商,长久以来AOC始终专注于医疗行业应用,致力于提供专业化、整合化、一体化医疗场景解决方案,实现精准医疗,推进智能医疗建设发展!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/252.html b/news/252.html new file mode 100644 index 0000000..1fc129f --- /dev/null +++ b/news/252.html @@ -0,0 +1,362 @@ + + + + +2023年西安新城区道路停车标线标牌项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023年西安新城区道路停车标线标牌项目竞争性磋商公告

        +
        +
        +
        +  2023-04-07 阅读:49 +
        +
        +

        一、招标条件
        本2023年新城区道路停车标线标牌项目已由项目审批/核准/备案机关批准,项目资金 来源为其他资金/,招标人为西安新城智慧停车服务有限公司。本项目已具备招标条件,现 招标方式为其它方式。
        二、项目概况和招标范围
        规模:2023年新城区道路停车标线标牌项目,详见竞争性磋商文件
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)2023年新城区道路停车标线标牌项目;
        三、投标人资格要求
        (0012023年新城区道路停车标线标牌项目)的投标人资格能力要求:
        1、投标人须具备 独立法人资格及合法有效的营业执照
        2、法定代表人授权书及被授权人身份证(法定代表人 直接参加投标,须提交其身份证复印件及法定代表人身份证明);
        3、近年财务状况:提供近 三年(2020-2022)任意一年度完整的经会计师事务所或审计机构审计的财务报告(若公司成 立年限不足规定年份要求,仅提供公司成立后,有效年份的财务报告)或在开标日期前六个 月内其基本开户银行出具的资信证明,以上二种形式的证明资料提供任何一种即可;
        4、参 加招标活动前3年内在经营活动中没有重大违法记录的书面声明:
        5、投标人不得在“国家 企业信用信息公示系统”网站(http://www.gsxt.gov.cn/index.html)中列入严重违法失信 名单(黑名单)信息、投标人不得为“信用中国”网站(www.creditchina.gov.cn)中列入重大 税收违法失信主体、投标人不得为中国执行信息公开网
        (http://zxgk.court.gov.cn/shixin/)中列入失信被执行人名单;;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年04月07日09时00分到2023年04月13日17时00分
        文件售价:竞争性磋商文件每套500.00元。
        五、投标文件的递交
        递交截止时间:2023年04月19日14时00分

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/253.html b/news/253.html new file mode 100644 index 0000000..95522dc --- /dev/null +++ b/news/253.html @@ -0,0 +1,362 @@ + + + + +徐州市城市管理综合行政执法监督局道路停车标识标牌和标线施划工程项目竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        徐州市城市管理综合行政执法监督局道路停车标识标牌和标线施划工程项目竞争性谈判公告

        +
        +
        +
        +  2023-04-11 阅读:18 +
        +
        +

        项目概况

        道路停车标识标牌和标线施划工程项目 采购项目的潜在供应商应在徐州市云龙区万科尚都会商业综合楼5楼代理部获取采购文件,并于2023年04月23日 14点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:徐采谈(2023)JSRH006

        项目名称:道路停车标识标牌和标线施划工程项目

        采购方式:竞争性谈判

        预算金额:0.0000000 万元(人民币)

        采购需求:

        一、项目概况:

        1、项目名称:道路停车标识标牌和标线施划工程项目

        2、工    期: 1年

        3、承包方式:包工包料。

        4、质量要求:符合国家现行规范验收合格标准。

        二、采购预算  

        1、响应供应商根据项目清单及控制单价进行整体下浮率报价(最后报价),报价包括材料费、机械费、人工、安装费、税费、验收、检验检测费、保险、售后服务、质量保修、利润、代理服务费等全部费用。采购人不再支付报价以外的任何费用。

        2、供应商报价时应充分考虑所有可能影响到报价的因素,一旦谈判结束最终成交,如发生漏、缺、少项,都将被认为是成交人的报价让利行为,损失自负。

        3、项目清单及控制单价。

        序号

        采购项目

        单位

        控制价(元)

        1

        停车泊位指示牌(P牌)

        840

        2

        停车泊位指示牌(附标牌)

        65

        3

        停车泊位指示牌(起点牌)

        840

        4

        停车泊位指示牌(止点牌)

        840

        5

        停车泊位公示牌,文明公约牌(两牌一立柱)

        1650

        6

        常温道路标线漆泊位

        52

        7

        常温道路标线漆黄色禁停网状线

        60

        8

        热熔道路标线漆泊位

        92

        9

        撤除常温道路标线漆泊位

        20

        10

        泊位安全警示热熔标线(防开门杀)

        平方米

        41.09

        11

        泊位安全警示常温标线(防开门杀)

        平方米

        10.15

        12

        泊位残疾人停车标志

        23.2

        三、结算方式

        1、以实际完成合格的工程量进行结算,单价执行承包商自报的全费用单价。

        2、合同期内材料价格上涨综合单价不予调整。投标人报价时充分考虑此风险。

        四、道路停车标线划线技术规格及参数要求:

        序号

         

        项目名称

         

        项目内容、技术要求

        单位

        1

        施划常温道路标线漆泊位

        标线施划参照《道路交通标志和标线(GB-5768-2017)》有关标准并符合采购人提供的要求内容。1、泊位尺寸:每个泊位长5.5米,宽2.5米;泊位内施划车辆停放方向箭头及两位泊位编号。其中标线宽0.15米;方向箭头长0.6米;编号单个字体宽度0.20 米,具体施划尺寸、数量根据道路条件有一定变化。收费停车泊位用白色施划,免费停车泊位用蓝色施划,专属停车泊位用黄色施划(按2%比例施划残疾人专用停车位)。

        2

        撤除常温道路标线漆泊位

        用聚氨酯涂料覆盖原始泊位

        3

        施划热熔道路标线漆泊位

        标线施划参照《道路交通标志和标线(GB-5768-2017)有关标准并符合采购人提供的要求内容。1、泊位尺寸:每个泊位长5.5米,宽2.5米;泊位内施划车辆停放方向箭头及两位泊位编号。其中标线宽0.15米;方向箭头长0.6米;编号单个字体宽度0.20 米,具体施划尺寸、数量根据道路条件有一定变化。收费停车泊位用白色施划,免费停车泊位用蓝色施划,专属停车泊位用黄色施划(按2%比例施划残疾人专用停车位)。

        4

        施划常温道路标线漆黄色禁停网状线

        标线施划参照《道路交通标志和标线(GB-5768-2017)有关标准并符合采购人提供的要求内容。1、黄网尺寸:每个长3米,宽2.5米;内部交叉线2条, 其中标线宽0.15米;具体施划尺寸、数量根据道路条件有一定变化,禁停网状线用黄色施划。

        五、道路停车标识、标牌技术规格及参数要求:

        序号

         

        项目名称

         

        项目内容、技术要求

        单位

        1

        停车泊位指示牌 (P牌)

        1、牌面:1000×800×2mm,国产工程级反光膜;

        2、立柱:Φ89×2×4000热镀锌立杆,国产工程级反光膜,红白或蓝白相间600mm高。基础700x700x800,C25砼,地笼Φ20x600x4根(根据实际情况调整)。
        3、交通标志的颜色、形状、字符、图形、尺寸及构造、逆反射、制作等,必须按照《道路交通标志和标线》(GB5768-2017)的规定执行。

        2

        停车泊位指示牌(附标牌)

        1、牌面:300×800×2mm,国产工程级反光膜;内容:停车泊位除外。
        2、交通标志的颜色、形状、字符、图形、尺寸及构造、逆反射、制作等,必须按照《道路交通标志和标线》(GB5768-2017)的规定执行。

        3

        停车泊位指示牌(起点牌)

        1、牌面:1000×800×2mm,国产工程级反光膜;

        2、立柱:Φ89×2×4000热镀锌立杆,国产工程级反光膜,红白或蓝白相间600mm高。 基础700x700x800,C25砼,地笼Φ20x600x4根(根据实际情况调整)。
        3、交通标志的颜色、形状、字符、图形、尺寸及构造、逆反射、制作等,必须按照《道路交通标志和标线》(GB5768-2017)的规定执行。

        4

        停车泊位指示牌(止点牌)

        1、牌面:1000×800×2mm,国产工程级反光膜;

        2、立柱:Φ89×2×4000热镀锌立杆,国产工程级反光膜,红白或蓝白相间600mm高。 基础700x700x800,C25砼,地笼Φ20x600x4根(根据实际情况调整)。
        3、交通标志的颜色、形状、字符、图形、尺寸及构造、逆反射、制作等,必须按照《道路交通标志和标线》(GB5768-2017)的规定执行。

        5

        停车泊位公示牌,文明公约牌(两牌一立柱)

        1、牌面:1500×1000×2mm×2,国产工程级反光膜;

        2、立柱:Φ89×2×4000热镀锌立杆,国产工程级反光膜,红白或蓝白相间600mm高。基础700x700x800,C25砼,地笼Φ20x600x4根(根据实际情况调整)。
        3、交通标志的颜色、形状、字符、图形、尺寸及构造、逆反射、制作等,必须按照《道路交通标志和标线》(GB5768-2017)的规定执行。

        6

        泊位安全警示热熔标线(防开门杀)

        车位500mm外则增加平行与车位的热熔标线,此线与原车位中间间隔350mm,用4-5条斜45°热熔标线填充,线宽150mm。

        平方米

        7

        泊位安全警示常温标线(防开门杀)

        车位500mm外则增加平行与车位的常温标线,此线与原车位中间间隔350mm,用4-5条斜45°常温标线填充,线宽150mm。

        平方米

        8

        泊位残疾人停车标志

        标线施划参照《道路交通标志和标线(GB-5768-2017)》有关标准并符合采购人提供的要求内容。1、标志尺寸:长1米,宽1米;用白色常温道路标线漆施划

        六、项目实施要求

        1、交通标线的各种线条、箭头、文字及立面标记,必须按照《道路交通标志和标线》(GB5768-2017)的规定执行。

        2、满足国家标准GB/T16311-2009《道路交通标线质量规定和检测方法》及行业标准GA/T298-2001《道路标线涂料》、JT/T280-2004《路面标线涂料》的相关技术要求。

        3、热熔标线材料必须有检验报告,检查报告,批量生产许可证,复印件加公章。

        4、采购人会同专家、相关人员组织现场验收,供应商承担验收费用。

                5、因城市建设、创建活动、临时应急等原因,供应商须在接到采购人书面通知后,12小时之内响应采购需求,如无法满足,采购人有权要求其他供应商完成采购需求,所产生的费用由本项目供应商承担。


        合同履行期限:1年

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:


        3.本项目的特定资格要求:①合法有效的法人的营业执照复印件(加盖公章);②财务状况报告,至少提供:⑴供应商的提交首次响应文件时间前6个月内任何日期的资产负债表复印件1份;⑵供应商的提交首次响应文件时间前6个月内任何1月(不含本公告发布当月)利润表月报表复印件1份。③供应商的提交首次响应文件时间前6个月内任何1月的依法缴纳税收和社会保障资金的相关材料复印件;④具备履行合同所必需的设备和专业技术能力的证明材料复印件,即提供至少1名为本项目提供服务人员的学历或技能或职称证书或劳动合同(书)复印件;⑤投标人参加招标采购活动前3年内在经营活动中没有重大违法记录的书面声明。

        三、获取采购文件

        时间:2023年04月12日  至 2023年04月18日,每天上午9:00至12:00,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:徐州市云龙区万科尚都会商业综合楼5楼代理部

        方式:售价:人民币叁佰元整,售后不退。 时间:2023年4月12日9:00至2023年4月18日17:00(节假日休息) 地点:徐州市云龙区万科尚都会商业综合楼5楼代理部。 报名和购买文件时须提供: 1.营业执照复印件并加盖公章; 2.授权委托书(原件)。 (注明所报项目名称、项目编号、联系人、电话、有效邮箱。) 联系电话:0516-82500777

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年04月23日 14点30分(北京时间)

        地点:徐州市云龙区万科尚都会商业综合楼5楼开标室

        五、开启

        时间:2023年04月23日 14点30分(北京时间)

        地点:徐州市云龙区万科尚都会商业综合楼5楼开标室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/254.html b/news/254.html new file mode 100644 index 0000000..7489ceb --- /dev/null +++ b/news/254.html @@ -0,0 +1,362 @@ + + + + +淮安市中心血站党员活动室和走廊文化墙标牌设计和制作竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        淮安市中心血站党员活动室和走廊文化墙标牌设计和制作竞争性磋商

        +
        +
        +
        +  2023-04-11 阅读:23 +
        +
        +

        淮安市中心血站党员活动室和走廊文化墙标牌设计和制作 采购项目的潜在供应商应在淮安融创建设项目管理有限公司(淮安智慧谷B1号楼3楼)获取采购文件,并于2023年04月21日 14点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:HARC-磋商-20230403

        项目名称:淮安市中心血站党员活动室和走廊文化墙标牌设计和制作

        采购方式:竞争性磋商

        预算金额:10.0000000 万元(人民币)

        最高限价(如有):10.0000000 万元(人民币)

        采购需求:

        淮安市中心血站党员活动室和走廊文化墙标牌设计和制作,具体详见磋商文件第四章项目采购需求。

        合同履行期限:合同签订后20日内完成设计、制作、安装合格,交付使用。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        按照特定资格要求。

        3.本项目的特定资格要求:(一)满足《中华人民共和国政府采购法》第二十二条规定;并提供下列材料:1、法人或者其他组织的营业执照等证明文件;2、财务状况报告;3、依法缴纳税收和社会保障资金的相关材料;4、具备履行合同所必需的设备和专业技术能力的证明材料;5、参加政府采购活动前3年内在经营活动中没有重大违法记录的书面声明。(二)落实政府采购政策需满足的资格要求:本项目按照以下第 1 种方式落实政府采购促进中小企业发展的要求:1、本项目为专门面向中小企业采购的项目,供应商必须为中小微企业,不接受非中小型企业参与本项目投标。2、本项目通过以下第()种方式预留部分采购份额采购中小企业服务:(1)本项目要求供应商以联合体形式参加,中小企业合同金额应当达到的比例为 %,其中小微企业所占比例应为 %(两项比例均应符合《政府采购促进中小企业发展管理办法》第八条规定)。(2)本项目要求供应商进行合同分包,中小企业合同金额应当达到的比例为 %,其中小微企业所占比例应为 %(两项比例均应符合《政府采购促进中小企业发展管理办法》第八条规定)。3、本项目为非预留份额的采购项目,对小微企业报价给予扣除,用扣除后的价格参加评审,具体详见第二章“供应商须知”第32.1项。注:监狱企业、残疾人福利性单位视同小微企业。(三)本项目的特定资格要求:无。(四)拒绝下述条件的供应商参加本次采购活动:1、供应商单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一合同项下的政府采购活动。2、凡为采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得再参加本项目的采购活动;3、供应商被“信用中国”网站、“中国政府采购网”列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单。

        三、获取采购文件

        时间:2023年04月12日  至 2023年04月18日,每天上午8:30至11:30,下午14:00至17:30。(北京时间,法定节假日除外)

        地点:淮安融创建设项目管理有限公司(淮安智慧谷B1号楼3楼)

        方式:如果供应商确认参与本项目竞争性磋商,请携带供应商参与磋商确认函、单位营业执照、授权委托书及经办人身份证复印件加盖单位公章,到代理公司报名并获取磋商文件,文件材料费:人民币400元/份(售后不退),未缴纳文件材料费的供应商的响应文件将被拒绝。 报名时间:2023年4月12日至2023年4月18日上午8:30—11:30;下午2:00—5:30(周六、日和法定节假日除外)。 注:如果磋商供应商未填写供应商参与磋商确认函,在磋商文件发布期间如磋商文件有所更正或修改而代理公司因没有收到确认函或因所留联系方式有误而无法通知到磋商供应商的,其责任由磋商供应商自行承担。

        售价:¥400.0 元(人民币)

        四、响应文件提交

        截止时间:2023年04月21日 14点30分(北京时间)

        地点:淮安智慧谷B1号楼3楼310会议室

        五、开启

        时间:2023年04月21日 14点30分(北京时间)

        地点:淮安智慧谷B1号楼3楼310会议室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        详见磋商文件。

        八、凡对本次采购提出询问,请按以下方式联系。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/255.html b/news/255.html new file mode 100644 index 0000000..6441e77 --- /dev/null +++ b/news/255.html @@ -0,0 +1,362 @@ + + + + +中国银行营业网点营销辅助设施及标识标牌选型入围项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国银行营业网点营销辅助设施及标识标牌选型入围项目招标公告

        +
        +
        +
        +  2023-04-11 阅读:16 +
        +
        +
        1. 招标条件
          本招标项目已由中国银行股份有限公司青海省分行以青中银渠运签〔2023〕2号文批准建设,招标人为中国银行股份有限公司青海省分行,招标项目资金来自企业自筹资金。该项目已具备招标条件,现对该项目采购进行公开招标。
          2. 项目概况与招标范围
          2.1服务地点:招标人指定地点;
          2.2服务期:三年;
          2.3招标范围:本次招标项目内容为中国银行营业网点营销辅助设施及标识标牌选型入围项目 (入围单位不多于3家供应商),入围期限为3年;向全辖网点提供营业网点营销辅助设施及标识标牌采购;
          2.4招标编号:QHZC-HW-230401;
          2.5标段划分:一个标段。
          3. 投标人资格要求
          3.1 本次招标要求投标人在中华人民共和国境内注册,具备独立法人资格,具备独立承担民事责任的能力,且有能力提供招标文件要求的货物及服务的制造商或代理商【须提供营业执照副本复印件】;
          3.2若投标人为代理商,须提供制造商针对本项目的唯一授权函(说明:一个制造商仅能授权委托一个代理商参加投标,且制造商与代理商不能同时参加投标,否则其投标将被否决。)【须提供授权函】。
          3.3提供2021年度或2022年度财务审计报告,近三个月依法缴纳税收和社会保障资金的相关材料;
          3.4本次项目不接受联合体投标。
          4. 招标文件的获取
          4.1有意参加公开招标活动的单位,请于2023年04月12日至2023年04月16日,每日上午9 时至12时,下午14 时至17时(北京时间,下同),将单位介绍信或者法定代表人授权书及回执扫描后发送至招标代理机构电子邮箱在邮件中标明项目编号、项目名称、联系人、联系方式、邮箱等信息,并联系招标代理机构获取文件联系人进行确认;
          4.2采购文件每套售价500.00元,以转账方式交至招标代理机构,票据附言栏内须注明(简写)招标编号、标段名称及用途,招标文件售出后不退。
          备注:投标人应在规定的时间内到指定地点领取招标文件,须先进行供应商登记注册并办理备案,如在规定时间内未领取招标文件并登记备案的供应商均无资格参加该项目的投标。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/256.html b/news/256.html new file mode 100644 index 0000000..bb7b4f0 --- /dev/null +++ b/news/256.html @@ -0,0 +1,362 @@ + + + + +2023年标识标牌采购项目公开招标采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023年标识标牌采购项目公开招标采购公告

        +
        +
        +
        +  2023-04-18 阅读:22 +
        +
        +

        一、项目基本情况

        项目编号:N5101892023000068

        项目名称:2023年标识标牌采购项目

        采购方式:公开招标

        预算金额:1,500,000.00元

        采购需求:详见采购需求附件

        合同履行期限:

        采购包1:此为零星项目分批次制作,每批次货物中标人在接到采购人订单通知之日起 1 日内提供详细设计方案,设计方案通过采购人审批后,3日内完成制作及安装。若遇特殊情况不能按时交货的,中标人需经采购人同意后可延期交货。

        本项目是否接受联合体投标:

        采购包1:不接受联合体投标

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        采购包1:

        本项目属于专门面向中小企业采购的项目,货物制造商应为中小微企业或监狱企业或残疾人福利性单位。

        3.本项目的特定资格要求:

        采购包1:无

        三、获取招标文件

        时间:2023年04月18日至2023年04月23日,每天上午00:00:00至12:00:00,下午12:00:00至23:59:59(北京时间)

        途径:项目电子化交易系统-投标(响应)管理-未获取采购文件中选择本项目获取招标文件

        方式:在线获取

        售价:0元

        四、提交投标文件截止时间、开标时间和地点

        时间:2023年05月09日 11时00分00秒(北京时间)

        提交投标文件地点:成都市高新区吉泰五路88号(花样年香年广场)3栋7层开标厅

        开标地点:成都市高新区吉泰五路88号(花样年香年广场)3栋7层开标厅

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        本项目备案号:51018923210200004386[2023]00167,采购预算品目为A05040400文教用品,预算金额为人民币150万元。本项目最高限价为统一折扣率100%,投标人在报价时均应按统一折扣率进行报价。在实际结算时采购人将按中标人在投标时所报的统一折扣率进行结算,即:实际结算价格=基准单价×统一折扣率。(如:投标人在投标时的统一折扣率为80%,基准单价为100元,则实际结算价格为:100元×80%=80元。)如投标人的各项品种投标报价结算率为负数、有超过百分之百、各项品种有多个投标报价结算率的,其该投标文件均按无效投标文件处理。监督部门:成都高新区财政局,联系电话:028-82829642。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/257.html b/news/257.html new file mode 100644 index 0000000..bdefd41 --- /dev/null +++ b/news/257.html @@ -0,0 +1,362 @@ + + + + +第81届中国教育装备展开幕在即,海信智慧教育2023新品将现场发布_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        第81届中国教育装备展开幕在即,海信智慧教育2023新品将现场发布

        +
        +
        +
        +  2023-04-18 阅读:8 +
        +
        +

        4月21日至23日,第81届中国教育装备展示会将在江西省南昌市绿地国际博览中心拉开帷幕。海信商用显示作为参展企业之一,位于A4馆A4021号展位,届时将携海信智慧教育最新产品及解决方案登场,以强大产品矩阵展示海信智慧教育的最新成果与技术实力。

        作为国内规模最大、影响最广、专业性最强的教育装备行业盛会,中国教育装备展示会重在展示各类教育装备新技术、新产品,为推进中国教育事业的发展提供坚实后盾。展示会现场将集结中国最为优秀的教育装备企业,展示成果亦代表着中国教育装备行业的新高度。作为2023年开年以来最大的一场普教型展会,本届展示会将成为学校与企业之间对接的桥梁,为更多学校的智慧教育发展注入新活力。

        海信商用显示深耕智慧教育领域多年,伴随着国家对于教育信息化发展的重视,海信商用显示不断加大投入力度,以实际行动推进技术研发、产品创新。第81届中国教育装备展示会期间,海信商用显示将发布多款新品,为行业和客户呈现一场智慧教育的视觉盛宴。

        本届展会现场,海信教育将携2023年全阵容新品亮相,包括海信Vision Board电容智慧黑板、海信Vision Board红外一体机、海信Vision Board电容一体机“三联屏”和海信智慧讲台等。据了解,新品在舒适性、易用性、稳定性等方面做出了全面升级,更推出225英寸大尺寸电容一体机“三联屏”,深度赋能教育场景,描绘智慧教育蓝图。
        此外,海信商用显示还将在现场展出丰富多样的智慧教育解决方案,包括海信标准型智慧教室、海信研讨型智慧教室、海信合班型智慧教室、海信“三个课堂+”智慧教室等。依托最新的AI技术发展,海信打造的“元宇宙智慧空间”解决方案也将一齐亮相。届时,海信商用显示展位将设有体验区域,参展观众可沉浸式体验课堂板书书写、便捷教学工具、智慧课堂场景等,感受海信智慧教育打造的趣味交互体验,以及在健康护眼、简单易用、丰富工具、安全稳定等方面的优势,深入了解海信智慧教育产品及解决方案的独特之处。

        本届中国教育装备展示会上,海信商用显示还将在现场展出旗下三大产品板块的核心产品,包括智慧办公板块的海信Vision Hub智慧平板旗舰款U系列、专业款P系列和智享款S系列等;以及智能显示板块的海信Vision One|巨幕136英寸LED一体机、163英寸一体机等,现场展示校园视频会议、大小屏联动等丰富功能。

        4月21日至23日,第81届中国教育装备展示会将在江西省南昌市绿地国际博览中心开展。欢迎莅临A4馆A4021海信展位,体验海信智慧教育新品,感受高效课堂魅力。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/258.html b/news/258.html new file mode 100644 index 0000000..b244030 --- /dev/null +++ b/news/258.html @@ -0,0 +1,362 @@ + + + + +南京江北新区:精修行道树树冠,杜绝遮挡标牌信号灯现象_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        南京江北新区:精修行道树树冠,杜绝遮挡标牌信号灯现象

        +
        +
        +
        +  2023-04-19 阅读:16 +
        +
        +

        为保障城市道路安全出行,消除安全隐患,按照江北新区行政执法局安排部署,连日来,南京大厂园林绿化工程有限公司在江北新区分局交通警察支队的修剪要求下,对管养区域内遮挡信号灯、指示牌、路灯行道树进行修剪疏枝。

          在兼顾照明效果和绿化景观效果的同时,合理制定树木修剪计划,针对信号灯、指示牌、路灯下沿的树枝及其他徒长枝、病虫枝、干枯枝进行逐路逐段修剪,大厂园林对修剪工人进行了修剪作业安全培训,严格遵守绿化养护修剪规范,现场设反光锥进行安全提醒,做好安全防护和交通导流,随剪随清保证交通畅通。

          大厂园林对管养区域内需疏剪的行道树进行了仔细排查,并同时启动疏剪工作,今年以来已优先对遮挡信号灯和指示牌21株行道树修剪完毕,确保每条道路都达到“显”“透”“亮”的效果。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/259.html b/news/259.html new file mode 100644 index 0000000..b64aa3d --- /dev/null +++ b/news/259.html @@ -0,0 +1,362 @@ + + + + +标识标牌和发光广告字的制作加工流程详解_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        标识标牌和发光广告字的制作加工流程详解

        +
        +
        +
        +  2023-04-21 阅读:36 +
        +
        +

        在城市,标识标牌和发光广告字是广告行业中不可或缺的组成部分。如果你正在寻找关于它们制作加工流程的详细信息,那么本文将会是一个不错的起点。在这里,我们将会为你介绍标识标牌和发光广告字的制作加工流程步骤。

        一、材料准备

        制作标识标牌和发光广告字的第一步是准备所需材料。根据设计需求,通常需要选用透明亚克力板或者彩色亚克力板、闪光膜、LED灯管等材料。

        二、设计和制作图纸

        在进行标识标牌和发光广告字的制作前,需要进行设计和制作图纸。设计师需要使用专业的设计软件如AI、CDR等进行设计并制作图纸。确定完设计稿后,需要开启激光切割机对亚克力板进行切割。

        三、喷涂字体

        经过激光切割之后,需要对各个部分进行喷涂。如果产品需要进行表面喷涂字体,需要首先将喷涂区域进行打磨处理,然后进行底漆喷涂和面漆喷涂。

        四、安装灯管

        发光广告字在制作过程中需要安装LED灯管,一般是采用外挂式灯管来实现发光效果。需要先将LED灯管固定在亚克力板上,然后再安装到字体的内部结构中。

        五、安装电路和配线

        制作完成后,需要进行电路连线、电源供应等方面的工作。这个步骤需要专业的电气工程师进行操作。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/26.html b/news/26.html new file mode 100644 index 0000000..83a88d5 --- /dev/null +++ b/news/26.html @@ -0,0 +1,362 @@ + + + + +什么是多媒体数字标牌系统?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        什么是多媒体数字标牌系统?

        +
        +
        +
        +  2022-05-04 阅读:18 +
        +
        +

        我们都知道数字标牌是一种数字装置,显示视频或多媒体内容,用于信息或广告目的。我们到处都能看到。我们在汽车站看广告,在机场找到登机口信息,在快餐店订食物,买电影票,在博物馆拉起方向,所有这些都要感谢数字标牌。有无穷的用途支持各种业务和受众需求。

        在本文中,我们将探讨数字标牌的定义、使用范围和潜力。

        什么是数字标牌?

        让我们试着了解一下。维基百科写道,“数字标牌”是电子标牌的一个子类,而电子标牌又被定义为LCD、led、投影和电子纸等显示技术。那是毫无帮助的。标牌不仅仅是硬件。了解当今的数字标牌需要考虑其角色、功能和技术能力。

        我们可以说,数字标牌由三个关键组成部分组成:

        内容-一个目录的音频,视频,图像,图形,文本,等等,集合起来,告诉任何数量的独特的意图独特的故事。

        硬件–物理的、有形的组件,如屏幕、挂载、支付设备、打印机、照相机等。

        软件—支持创建、部署、管理和分析部署在硬件上的内容的数字基础架构。

        一、什么是数字标牌内容?

        内容的简单概念是屏幕上显示的任何内容,包括文本、图像、动画、视频和音频。然而,“内容”也可以是指各种媒体结合起来讲述一个故事的集体结果。这里讲的是传授给目标受众的整体体验。内容是吸引访客或路人停下脚步,通过互动捕捉他们的信息,并收集信息以获得商业洞察力的东西。这些内容甚至可以通过与后台系统的集成实时个性化。

        基于使用场景的最常见数字标牌示例:

        公共位置特定信息(新闻、天气、交通等)、地图、寻路

        公司-知识共享、会议室预订、会议协调、培训

        销售-产品/服务组合、白板、演示

        旅游-寻路,景点,城市信息

        零售-自助退房、无休止通道、产品展示、智能镜子

        餐厅-自助服务、数字菜单板、自助点菜亭

        营销-促销、氛围、游戏化

        博物馆-画廊、寻路、数字旅游

        教育-课堂教学、寻路、图书馆展览

        展览和贸易展-互动产品/服务目录、访客登记、网络

        二、什么是数字标牌硬件?

        数字标牌不再只是一个简单的屏幕,显示时间编排的内容。我们生活在这样一个时代:行业、创造者和服务提供商可以从各种硬件选项中随意选择,以实现他们的目标。一些领先的软件解决方案,如Intuiface,甚至可以使非技术团队以最少的努力和经验采用现代技术。

        1、多触摸屏

        多触摸屏(了解更多)允许一个或多个手指与屏幕上显示的内容进行交互。这些手指可能属于多个人,导致多个独立的交互并行发生。两种更流行的技术是:

        电容式触摸技术可以检测任何导电的东西。嵌入玻璃中的传感器检测电流的位置,然后将其记录为触摸事件。最流行的形式被称为投影电容,它可以发现在所有的手机和平板电脑。电容式显示器被认为是最精确的触摸技术,因此,如果目标环境不受天气影响,它就是金标准。

        红外技术在led/LCD屏幕的表面发射一个不可见的红外光网格。当物体与屏幕接触时,红外光会被打断,从而导致触摸位置的识别。与需要导电材料来指示触摸的投影电容显示器不同,红外显示器可以与任何材料配合使用。

        2、信标技术

        信标是一种低能设备,可以广播唯一的标识符或URL。通过为单个项目分配信标或发送信标通知,内容提供商可以在显示器和实际产品或移动设备之间创建上下文桥梁。示例用法包括近距离营销和自动导游。

        3、RFID、NFC等读卡器(如AR码、芯片、pin码等)

        所有这些设备都捕获可用于识别相关信息的唯一ID。例如,刷会员卡,您的会员信息就会显示在屏幕上。

        4、连接的对象

        连接对象是存在于Internet上的设备,可以通过某种API进行访问,这样就可以很容易地通过其他数字服务向它们提供信息。由此产生的物联网正变得越来越普及。(想想冰箱在你没奶的时候给你发短信。)这项技术可以将数字标牌解决方案连接到灯、相机、电视等。

        5、有形物体

        你把手指以外的东西放在屏幕上。屏幕可以唯一地识别对象是什么,并对其位置作出反应。

        三、什么是数字标牌软件?

        如果你曾经在google上搜索过“数字标牌软件”,并关注过那些不计其数的供应商提供的产品,你可能会觉得他们似乎都在谈论同一件事。要给出数字标牌软件的总体定义并不容易,因为许多软件选项提供不同程度的功能,因此适用于不同的用途。

        然而,我们可以通过描述一个理想的数字看板软件解决方案是什么样的来妥协。它应使其用户能够轻松创建数字标牌体验,并可选择整合互动性、硬件和第三方服务的集成以及用于分析的数据收集。它应该为多媒体格式的选择提供完全的自由,并允许任何设计、布局或情节提要。它应该促进协作和远程部署。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/260.html b/news/260.html new file mode 100644 index 0000000..4d5ac3d --- /dev/null +++ b/news/260.html @@ -0,0 +1,362 @@ + + + + +广发银行股份公司南京分行2023年营业网点标识标牌采购项目招标_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        广发银行股份公司南京分行2023年营业网点标识标牌采购项目招标

        +
        +
        +
        +  2023-04-21 阅读:14 +
        +
        +

        开标时间:2023-05-05
        一、项目名称:广发银行股份有限公司南京分行2023年营业网点标识标牌采购项目
        二、项目编号:
        三、采购内容:本项目拟通过公开招标选定1家中标人,由其向采购人提供2023年度营业网点标识标牌类产品。(详细要求及需求内容请参阅公开招标文件用户需求书)。
        四、投标人资格条件:
        1.中华人民共和国境内依法注册成立,具有独立承担民事责任的能力(分支机构参与本项目的采购需要取得总公司的授权)。
        2.遵守法律法规,具有良好的商业信誉和健全的财务会计制度,在参加本次采购活动前3年内不存在重大违法违规行为,未列入“信用中国”网站(www.creditchina.gov.cn)“记录失信被执行人”、“重大税收违法失信主体”及“政府采购严重违法失信行为”名单。
        3业绩要求:投标人自2020年1月1日至今承担过同类业绩案例,[须提供有效的中标通知书或合同关键页(必须涵括合同金额、合同签章页等)复印件。资料不全,评委无法确定业绩的不予认可。].
        4.不在采购人供应商禁入名单中。
        五、报名、招标文件领取
        (一)领取招标文件与报名时间为:自采购公告发布之时起至2023年4月26日,每日上午8:30时至12:00时,下午14:00时至17:30时(北京时间,法定节假日除外,下同)。
        (二)招标文件获取方式:
        1.请供应商严格按照本招标公告规定时间内,凡有意参加投标者,请于本项目采购公告发布之时至 2023年4月26日 17:30 (北京时间,下同)
        2.文件售价:招标文件每标段每套售价400元人民币,售后不退。
        审核时间:每日上午08时30分至11时30分,下午13时30分至17时30分
        六、参与投标的投标人都必须提交总额为人民币10000元的投标保证金。
        八、递交投标文件截止时间:2023年5月5日09时00分。
        九、收取投标文件时间及地点:
        1.投标文件收取时间:2023年5月5日08时30分至09时00分
        报名前发邮箱获取投标登记表。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/261.html b/news/261.html new file mode 100644 index 0000000..21d442b --- /dev/null +++ b/news/261.html @@ -0,0 +1,362 @@ + + + + +无棣县幸福河引调水工程(一期)标牌采购项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        无棣县幸福河引调水工程(一期)标牌采购项目竞争性磋商公告

        +
        +
        +
        +  2023-04-21 阅读:22 +
        +
        +

        采购期限 2023-05-04 15:00:00
        一、采购条件
        受无棣水总建设工程有限公司委托,就其无棣县幸福河引调水工程(一期)-标牌采购项目以竞争性磋商方式择优选择成交供应商,本次采购采用资格后审方式对供应商的资格进行审查。
        二、项目概况与招标范围
        1、项目编号:BZQCZB-2023-009
        2、项目名称:无棣县幸福河引调水工程(一期)-标牌采购项目
        3、实施地点:无棣县
        4、采购范围:采购标牌。
        5、预算金额:29.912626万元
        三、标段划分情况:本项目为一个标段。
        详细项目说明及要求见磋商文件。
        四、供应商资格要求
        1、依法在国内工商登记注册,具有相应的生产或经营范围,且有能力完成本项目的全部要求;
        2、本项目采用资格后审;
        3、本项目不接受联合体报价。
        报名时各单位应保证所提供资料的真实性,如发现有虚假、隐瞒情况者,采购人将拒绝其报名。
        六、获取磋商文件时间、地点及售价:
        1、凡有意参加投标者,请于本公告发布之日至2023年04月27日(具体时间8:30-12:00至14:00-17:00,法定公休日、节假日除外),携带以下证件,原件经审验后即退还,复印件一套采用A4纸按序统一装订并加盖公章:
        营业执照原件、组织机构代码证原件、税务登记证原件(三证合一的仅需提供营业执照原件)、法定代表人身份证明文件及法人身份证或法定代表人授权委托书原件、委托代理人身份证原件,以上资料需携带原件及加盖公章的复印件一套
        2、无论出于何种原因,采购代理机构可在采购活动开始前对磋商文件进行修改、补充及变更,其内容作为磋商文件的重要组成部分,将以公告形式在该公告发布媒体发布,请各潜在供应商自行关注上述网站,采购人与采购代理机构均不承担由此引起的一切后果。
        3、磋商文件售价:300元/份。现金支付,售后不退。
        七、开标时间、地点:
        1、开标时间(投标截止时间):2023年05月04日;
        2、投标文件递交的时间:2023年05月04日14:30-15:00;
        3、逾期送达的或者未送达指定地点或者未按要求密封的投标文件,采购人不予受理报名前发邮箱获取投标登记表。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/262.html b/news/262.html new file mode 100644 index 0000000..a81f34c --- /dev/null +++ b/news/262.html @@ -0,0 +1,362 @@ + + + + +济南市人民医院济南市人民医院标识标牌宣传材料采购项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        济南市人民医院济南市人民医院标识标牌宣传材料采购项目公开招标公告

        +
        +
        +
        +  2023-04-25 阅读:12 +
        +
        +

        济南市人民医院标识标牌宣传材料采购项目招标项目的潜在投标人应在相应公告界面获取招标文件,并于2023-05-16 10:30 (北京时间)前递交投标文件。

        一、采购项目基本情况:

        采购项目编号(建议书编号):SDGP370100000202302000090

        采购项目名称:济南市人民医院标识标牌宣传材料采购项目

        采购需求:医院标识标牌宣传材料1项

        预算金额:本项目预算金额为 600000.00 元,其中:无分包 标识标牌 600000.00 元。

        合同履行期限:招标人发出供货通知后7日历天内供货并安装调试完成。

        本项目(是/否)接受联合体投标:否

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;
        2.落实政府采购政策需满足的资格要求:本项目专门面向中小企业采购,具体内容详见招标文件;
        3.本项目的特定资格要求:
        在“信用中国”、中国政府采购网、“信用山东”等网站中被列入失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单的投标人,不得参加本次政府采购活动;
        4.投标人参加政府采购活动前3年内在经营活动中没有重大违法记录;
        5.本项目资格后审、不接受联合体投标。

        三、获取招标文件:

        时间2023-04-26 08:00至2023-05-05 17:00

        地点:山东省政府采购信息公开平台及济南公共资源交易中心免费下载

        方式:网站“招标公告”栏目中,在对应招标公告中下载

        售价:0元

        四、投标截止时间、开标时间及地点:

        投标截止时间、开标时间:2023-05-16 10:30

        开标地点:济南市历城区经十路1277号(经十路与凤鸣路交叉口东北角)

        五、公告期限:

        招标公告发出之日起5个工作日。

        六、其他补充事宜:

        采购项目需要落实的政府采购政策:节能环保、小微型企业扶持、监狱企业扶持、残疾人福利性单位扶持等相关政府采购政策。

        七、对本次招标提出询问,请按以下方式联系。

         1.采购人信息

        联系人(采购人):济南市人民医院

        地址:济南市莱芜区长勺北路雪湖大街1号

        联系方式:17563422013

         2.采购代理机构信息

        联系人(代理机构):山东公平工程咨询有限责任公司

        地址:济南市莱芜区文化北路18号

        联系方式:0531-76210369

        3.项目联系方式

        项目联系人(代理机构):陈彩云

        联系方式:0531-76210369

        附件

        PDF版招标文件(标识标牌)

        请登录“济南公共资源交易中心”个人空间,通过“政府采购入口”进行招标文件下载。链接地址:http://jnggzy.jinan.gov.cn/jnggzyztb/new_flogin/login.do

        发 布 人:山东公平工程咨询有限责任公司

        发布时间:2023-04-25 20:09

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/263.html b/news/263.html new file mode 100644 index 0000000..8dfe4de --- /dev/null +++ b/news/263.html @@ -0,0 +1,362 @@ + + + + +聊城市中医医院标识标牌制作及安装工程项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        聊城市中医医院标识标牌制作及安装工程项目

        +
        +
        +
        +  2023-04-25 阅读:55 +
        +
        +

        一、项目基本情况

        项目编号:SDGP371500000202302000167

        聊城市公共资源交易中心系统内编号 :LCZFCG-2023-226

        项目名称:聊城市中医医院标识标牌制作及安装工程项目

        采购方式:竞争性磋商

        预算金额:86.3837万元

        最高限价:86.3837万元

        采购需求:

        本项目监督单位:聊城市财政局

        二、申请人的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:本项目为政府采购项目,专门面向小微企业采购。

        3.本项目的特定资格要求:本项目不接受联合体投标。

        三、获取招标文件

        1.时间:2023年04月25日9:00至2023年05月04日17:00(北京时间)

        2.地点:通过聊城市公共资源交易中心电子系统(http://ggzyjy.liaocheng.gov.cn)、中国山东政府采购网(招标文件链接供于查看)获取招标文件。

        3.方式:各供应商在规定时间内登录中国山东政府采购网(招标文件链接供于查看)、聊城公共资源招投标会员网上交易系统(http://ggzyjy.liaocheng.gov.cn:8001/lchy)免费下载招标文件(文件格式为.lczf),逾期未下载招标文件视为放弃投标。

        注:(1)根据山东省政府采购有关规定,各拟参与本项目供应商在交易中心系统获取采购文件后,务必于响应文件提交截止时间前在“中国山东政府采购网(http://www.ccgp-shandong.gov.cn)”完成注册(已注册的无需重复注册),由于供应商原因造成其在响应文件提交截止时间前未完成注册的后果自负。

        (2)供应商在聊城公共资源招投标会员网上交易系统诚信入库类型:施工企业。

        4.售价:0元

        四、响应文件提交

        1.截止时间:2023年05月11日09点00分(北京时间)

        2.地点:供应商在响应文件提交截止时间前将电子响应文件上传到聊城公共资源招投标会员网上交易系统(http://ggzyjy.liaocheng.gov.cn:8001/lchy)

        五、开启(竞争性磋商方式必须填写)

        1.时间:2023年05月11日09点00分(北京时间)

        2.地点:本项目采取不见面方式开标,开标当日供应商不必抵达现场,仅需登录聊城市公共资源交易中心不见面开标大厅参与会议。各供应商应严格按照采购文件的具体要求在开标前登录网上不见面开标大厅完成相应工作,并安排专人实时在线处理答疑、澄清、报价等事宜。具体详见《聊城不见面开标大厅--操作手册(投标人)》。

        3、不见面开标大厅登录途径

        (1)聊城市公共资源交易中心不见面开标大厅(聊城市公共资源交易中心网-平台入口-不见面开标大厅登录入口);

        (2)不见面开标大厅网址:

        http://ggzyjy.liaocheng.gov.cn:8093/BidOpening/bidopeninghallaction/hall/login

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1.发布公告的媒介:中国山东政府采购网、聊城市公共资源交易中心网

        2.电子交易系统特别注意事项

        (1)供应商首次在聊城市公共资源交易平台参与项目的,获取采购文件前须办理企业诚信入库,详见聊城市公共资源交易中心网(http://ggzyjy.liaocheng.gov.cn)―采购投标指南―采购类业务诚信入库及常见问题解答。因未及时办理入库导致无法获取文件的,后果自负。另各供应商务必安排好专人对诚信库信息进行更新、维护,并对因诚信库不合法、不真实、不清晰、不完整、无效、错误或编辑待验证状态等造成的一切后果负责。电子标书的制作,企业从其诚信库内获取的所有扫描件均为原件扫描件,否则不予认可。文件制作过程中,若供应商对电子投标(响应)文件关联(链接)的诚信库内的信息进行更新或修改的,应在相应信息更新或修改后,再次打开电子投标(响应)文件,重新关联(链接)诚信库内更新或修改后的相应信息,重新生成投标(响应)文件。

        (2)本项目实行电子评标,供应商需办理CA证书,办理要求详见聊城市公共资源交易中心网右侧快捷入口“CA办理”。因未及时办理CA证书而导致无法提交投标(响应)文件的,责任自负。CA办理咨询电话:0635-8902280 ;移动CA锁(标证通)办理咨询电话:400-823-8788。

        (3)各供应商应随时关注项目信息并及时登录聊城市公共资源交易平台系统下载采购文件和各类答疑澄清,否则所造成的一切后果由供应商承担,最终文件以答疑澄清后的为准。电子评标的,制作投标(响应)文件需将答疑澄清文件导入投标(响应)文件制作工具。

        (4)电子投标(响应)文件制作工具请到聊城市公共资源交易中心网“下载中心-政府采购-政府采购电子标投标文件制作软件以及视频教程”下载。

        (5)供应商如遇交易系统软件操作技术问题,请咨询国泰新点软件股份有限公司或聊城市公共资源交易中心交易平台维护室。国泰新点软件股份有限公司:400-998-0000;聊城市公共资源交易中心交易平台维护室:0635-8902702,联系人:黄工、张工。

        (6)采购过程中如遇到网络故障、服务器受损、系统服务异常或停电事故等突发情况,导致项目无法正常进行时,按照中心开评标应急预案处理,详见①聊城市公共资源交易中心采购类项目开评标应急预案(暂行)(聊城市公共资源交易中心网(http://ggzyjy.liaocheng.gov.cn)―办事指南―政府采购);②信息技术科公共资源电子交易系统开评标应急预案(聊城市公共资源交易中心网(http://ggzyjy.liaocheng.gov.cn)―办事指南―信息技术科)。

        3.重要说明

        (1)公告附件链接的采购文件仅供获取前查看,供应商必须登录聊城公共资源招投标会员网上交易系统获取并下载正式的采购文件。网上获取文件的成功不代表资格审查的最终通过或合格,供应商最终资格的确认以评审委员会组织的审核结果为准。

        (2)本项目采用电子标评审,其中技术标采用明标评审。

        4、政府采购合同融资

        中标人可按相关规定申请政府采购合同融资,具体规定、操作流程详见山东省政府采购合同融资与履约保函服务平台。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/264.html b/news/264.html new file mode 100644 index 0000000..3e5831d --- /dev/null +++ b/news/264.html @@ -0,0 +1,362 @@ + + + + +复旦大学附属中山医院厦门医院广告标识标牌年度采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        复旦大学附属中山医院厦门医院广告标识标牌年度采购公告

        +
        +
        +
        +  2023-04-26 阅读:52 +
        +
        +

        厦门市公物采购招投标有限公司受复旦大学附属中山医院厦门医院 委托,根据《中华人民共和国政府采购法》等有关规定,现对广告标识标牌年度采购进行其他招标,欢迎合格的供应商前来投标。

        项目名称:广告标识标牌年度采购

        项目编号:GW2023-SH219

        项目联系方式:

        项目联系人:唐嘉豪、黄丽萍

        项目联系电话:0592-2225870、2233021

        采购单位联系方式:

        采购单位:复旦大学附属中山医院厦门医院

        采购单位地址:厦门市湖里区金湖路668号

        采购单位联系方式:江老师,0592-3569762

        代理机构联系方式:

        代理机构:厦门市公物采购招投标有限公司

        代理机构联系人:唐嘉豪、黄丽萍,0592-2225870、2233021

        代理机构地址: 厦门市湖滨南路81号光大银行大厦21楼

        一、采购项目内容

        一、项目基本情况

        项目编号:GW2023-SH219

        项目名称:广告标识标牌年度采购

        采购方式:竞争性磋商

        预算金额:65万元

        采购需求:广告标识标牌年度采购,1项。具体内容详见磋商文件。

        合同履行期限:服务期限:1年(1年后若采购人和成交供应商无异议可自行续签,总服务期限不得超过三年)。

        二、供应商的资格要求

        包1:

        一、营业执照等证明文件:供应商应具有独立承担民事责任的能力,并提供营业执照等证明文件的复印件。

        二、单位负责人证明或授权书:(1)若供应商代表为单位负责人,无需提供授权书,但应提供单位负责人身份证复印件。

        (2)若供应商代表为单位负责人授权的委托代理人,应提供授权书及供应商代表身份证复印件。

        三、财务状况报告:供应商应提供上一年度(响应文件提交截止时间为1-6月的也可提供上上年度)的财务报告复印件或银行资信证明复印件或磋商担保函复印件。

        四、依法缴纳税收证明材料:供应商应提供响应文件递交截止时间前六个月(不含递交截止时间的当月)中任一月份依法缴纳税收的证明复印件,享受税收减免政策或因疫情影响享受缓缴或免缴税款的企业,提供依法缴纳税收承诺书原件(格式自拟)。

        五、依法缴纳社会保障资金证明材料:供应商应提供响应文件递交截止时间前六个月(不含递交截止时间的当月)中任一月份依法缴纳社会保障资金的证明复印件,享受社保减免政策或因疫情影响享受缓缴或免缴社保的企业,提供依法缴纳社会保障资金承诺书原件(格式自拟)。

        六、信用承诺制要求:本项目允许采用“信用承诺制”,即供应商提供资格承诺函即可参加采购活动,在响应文件中无需再提供财务状况报告、依法缴纳税收和社会保障资金的相关证明材料。

        七、具备履行合同所必需设备和专业技术能力的声明函:供应商应提供具备履行合同所必需设备和专业技术能力的声明函。

        八、信用记录要求:1、信用信息查询渠道:通过“信用中国”网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)、“信用厦门”网站(credit.xm.gov.cn)、国家企业信用信息公示系统(www.gsxt.gov.cn)查询供应商的信用信息。

        2、截止时点:查询供应商截止提交响应文件当天前三年内的信用信息。

        3、查询记录和证据留存方式:将查询结果打印后随项目档案一并存档。

        4、信用信息的使用规则:

        (1)查询结果显示供应商存在以下情形之一的,其资格审查不合格:

        ①被“中国政府采购网”列入“政府采购严重违法失信行为信用记录”名单的;

        ②被“信用中国”网站列入“失信被执行人”名单、“税收违法黑名单”的;

        ③被“信用厦门”网站列入“失信被执行人”名单、“地方性黑名单”的;

        ④被“国家企业信用信息公示系统” 列入“严重违法失信企业名单(黑名单)”的。

        (2)信用信息查询仅以资格审查时通过本条款规定网站的查询结果为准,除以上规定外,其他时间或其他网站的查询信息均不作为审查的依据。

        (3)联合体成员存在以上情形的,联合体资格审查不合格。

        5、供应商无需提供信用信息查询结果。若供应商自行提供查询结果的,仍以评审当天查询结果为准。

        九、联合体要求:本项目不接受联合体响应。

        十、廉洁要求:供应商需按照磋商文件第五章格式提供廉洁告知书。

        三、获取采购文件

        获取采购文件时间:即日起至2023年5月6日下午17:30时止。

        获取方式:线上获取。欲参与本项目的供应商,须先通过公e采电子招标采购服务平台(www.xmzfcg.com)进行相关信息登记、在线支付文件费用,否则其投标(响应)将被拒绝。采购文件以加盖代理机构公章的文件为准。供应商如未在平台注册,请先按平台要求进行注册,注册免费,注册后可免费在线预览招标(采购)文件的主要内容,对平台操作有疑问的,请联系平台客服电话:400-805-9899。

        售价:包1:人民币100元。

        四、响应文件提交

        截止时间:2023年5月8日16:00

        提交地点:厦门市湖滨南路81号光大银行大厦18楼开标厅3

        提交方式:提交纸质响应文件。

        五、响应文件开启

        开启时间:磋商小组全部签到完成后

        开启地点:厦门市湖滨南路81号光大银行大厦18楼评标室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本项目不属于政府采购项目,本公告第一段修改为“厦门市公物采购招投标有限公司受采购单位委托,现对本项目进行竞争性磋商采购,欢迎合格的供应商前来提交响应文件。”

        八、对本次采购提出询问的联系方式

        1.采购人信息

        名称:复旦大学附属中山医院厦门医院

        地址:厦门市湖里区金湖路668号

        联系方式:江老师,0592-3569762

        2.采购代理机构信息

        名称:厦门市公物采购招投标有限公司

        地址:厦门市湖滨南路81号光大银行大厦21楼

        联系方式:0592-2230888

        3.项目联系方式

        项目联系人:唐嘉豪、黄丽萍

        电话:0592-2225870、2233021

        咨询时间:法定工作日,上午8:00-12:00、下午14:30-17:30。

        二、开标时间:2023年05月08日 16:00

        三、其它补充事宜

        四、预算金额:

        预算金额:65.0000000 万元(人民币)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/265.html b/news/265.html new file mode 100644 index 0000000..288aaf8 --- /dev/null +++ b/news/265.html @@ -0,0 +1,362 @@ + + + + +横山水库警示标语、标牌出新、更换工程施工招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        横山水库警示标语、标牌出新、更换工程施工招标公告

        +
        +
        +
        +  2023-04-26 阅读:22 +
        +
        +

        1.招标条件
        本招标项目横山水库警示标语、标牌出新、更换工程已由相关部门批准建设,项目业主为宜兴市横山水库管理所,招标人为宜兴市横山水库管理所,建设资金来自市财政统筹安排,项目出资比例为国有资金:100.00%,私有资金:0.00%,外国政府及组织投资:0.00%,境外私人投资:0.00%。项目已具备招标条件,现对该项目的施工进行公开招标。
        2.项目概况与招标范围
        2.1建设地点:宜兴市西渚镇
        2.2工程规模 /
        2.3结构类型: /
        2.4合同估算价:约15.6万元
        2.5计划工期:2023年 5月10日至 2023年6月18日,共计40天
        2.6招标范围:清单范围内的警示标语、标牌出新、更换工程
        2.7标段划分:一个标段
        2.8 质量要求:合格
        3.投标人资格要求
        3.1本次招标要求投标人须具备营业执照经营范围中含有“广告(或路牌)设计和制作的相关内容,并在人员、设备、资金等方面具有相应的施工能力,其中,投标人拟派项目经理须为本单位专职人员。
        3.2本次招标 不接受 联合体投标。
        3.3各投标人均可就本招标项目上述标段中的 1 个标段投标。
        3.4资格审查条件:
        3.4.1有独立订立合同的能力;
        3.4.2企业的资质类别、等级符合本公告要求;
        3.4.3符合法律、法规规定的其他条件
        3.5投标人不得存在下列情形之一:
        3.5.1.为招标人不具有独立法人资格的附属机构(单位);
        3.5.2.为本招标项目的监理人、代建人、项目管理人,以及为本招标项目提供招标代理、设计服务的;
        3.5.3.与本招标项目的监理人、代建人、招标代理机构同为一个法定代表人的,或者相互控股、参股的;
        3.5.4.与招标人存在利害关系可能影响招标公正性的;
        3.5.5.单位负责人为同一人或者存在控股、管理关系的不同单位;
        3.5.6.处于被责令停业、财产被接管、冻结和破产状态,以及投标资格被取消或者被暂停且在暂停期内;
        3.5.7.因拖欠工人工资或者因发生质量安全事故被有关部门限制在招标项目所在地承接工程的;
        3.5.8.投标人近3年内有行贿犯罪行为且被记录,或者法定代表人有行贿犯罪记录且自记录之日起未超过5 年的。
        4.招标文件的获取
        招标文件的获取时间:2023年4月23日~ 2023年 4 月 27 日,上午9时00分~下午4时00分。招标文件售价人民币300元,售后不退,同时提交5000元投标保证金。
        5.投标文件的递交
        5.1投标文件递交的截止时间(投标截止时间,下同)为2023年5月6日9时00分。
        5.2逾期送达的或者未送达指定地点的投标文件,招标人不予受理。
        备注:投标人将公司名称联系方式及参与项目名称发邮件获取投标登记表。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/266.html b/news/266.html new file mode 100644 index 0000000..63abc04 --- /dev/null +++ b/news/266.html @@ -0,0 +1,362 @@ + + + + +杭州全市首条 机场高速公路完成标识标牌更新_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        杭州全市首条 机场高速公路完成标识标牌更新

        +
        +
        +
        +  2023-05-04 阅读:23 +
        +
        +

        亚运会临近,我区开展迎亚运城市道路国际化标识提升行动。

        日前,记者从萧山交投集团获悉,杭州萧山国际机场高速公路在仅仅一周时间内顺利完成迎亚运城市道路国际化标识提升工作,该条道路也成为全市首条完成高速标识标牌更新的高速公路。

        如今,行驶在机场高速上,可以看见每块标识标牌下面都附有英文标识。

        “为确保不影响道路通行,我们在最短时间内对范围内的指路牌、分道牌、路名牌等逐路段、逐点位、逐块牌子进行深入摸底,确定施工图纸,全力保障施工安全。同时,制定详细的交通疏导方案,最大限度降低交通影响,共计更换136块标识标牌。”萧山交投集团相关负责人说。

        为进一步提升窗口服务水平,用最美姿态迎接亚运会的到来,机场高速公司组织开展“窗口服务提升”系列活动,以精准站位打造服务先锋队,从情绪管理、英语对话、礼仪形态、职业化妆等课程入手,结合工作场景对服务对象提高交流沟通的方式进行全方位培训,以核心标杆引领带动收费窗口人员素质的迭代升级,积极融入高质量城市环境品质提升建设。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/267.html b/news/267.html new file mode 100644 index 0000000..47c9cfe --- /dev/null +++ b/news/267.html @@ -0,0 +1,362 @@ + + + + +如何正确设置施工标识标牌提高工地安全性?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        如何正确设置施工标识标牌提高工地安全性?

        +
        +
        +
        +  2023-05-04 阅读:79 +
        +
        +

        在建筑施工现场,正确设置标识标牌是非常重要的事情,这能够有效地保护工人及周围公众的安全。具体而言,在隧道、桥梁和路基工程中,因为施工场地通常在大型交通干线上,所以更应该注意标识标牌的设置。

        施工区域

        在工程施工过程中,最好将有关施工、危险等内容的标识标牌以明显的方式展示在施工区域内,以便人们在进入施工区域前能够看到并了解相关信息,从而减少交通事故的发生。对于那些不熟悉施工行业的人,这不仅可以告诉他们在哪里施工,还应该包括足够的详细信息,例如:“危险施工区域,禁止通行”,“请减速慢行”,“请勿靠近”等。

        工作人员

        除了标识施工区域外,还应该注意在工作岗位上设置标识标牌,以便工人能够快速找到自己的位置和任务,并避免其他工作岗位的混淆。例如,“吊装点”,“钢筋加固点”,“浇筑口”等。

        基础设施

        在一些比较大型的工程中,标牌不仅应该展示施工区域和工作人员,还应该涵盖相关的基础设施。例如,“暂时供水点”,“临时电源”,“危险品存放区域”,“紧急医疗服务区域”等。

        安全警告

        在施工现场唯一的目的就是确保工人和公众的安全。对于可能引起伤害或威胁安全的区域,必须设置标识标牌以提醒人们注意安全。例如,“高空坠落危险”,“临边作业注意安全”,“远离施工区域”等等。

        其他因素

        在施工现场,任何事情都可能发生,所以我们需要设置一些额外的标识标牌来提醒工人和公众注意防范风险。例如,“远离开车道”,“头戴安全帽”,“使用手套”等等。

        总结

        正确设置标识标牌在施工现场中是至关重要的。这不仅可以有效地减少交通事故的发生,还可以提醒工人和公众注意安全。建议在施工现场期间密切关注这些标识标牌,并坚持遵守标记所提供的指示。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/268.html b/news/268.html new file mode 100644 index 0000000..b20c161 --- /dev/null +++ b/news/268.html @@ -0,0 +1,362 @@ + + + + +交通银行湖北省分行网点标识标牌改造项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        交通银行湖北省分行网点标识标牌改造项目招标公告

        +
        +
        +
        +  2023-05-04 阅读:25 +
        +
        +

        项目所在地区:湖北省
        一、招标条件
        本交通银行湖北省分行网点标识标牌改造项目已由项目审批/核准/备案机关批准,项目 资金来源为自筹资金144.16万元,招标人为交通银行股份有限公司湖北省分行。本项目已
        具备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        1、招标编号:HBCZ-20120759-230598
        采购编号:CGXM42199923030014
        2、项目名称:交通银行湖北省分行网点标识标牌改造项目
        3、招标内容:为提升交通银行营业网点整体的对外服务形象,本项目拟对武汉市本部48家 营业网点的内外标识标牌进行样式统一及位置固定,拟通过公开招标方式确认一家供应商完 成本项目。
        4、采购最高限价:含税价为144.16万元
        5、合同期限和合同续签安排:本合同为一次性合同,期限为一年。
        三、投标人资格要求
        (001交通银行湖北省分行网点标识标牌改造项目)的投标人资格能力要求:投标资格要 求为本次项目投标人应具备的基本条件,参加投标的投标人必须满足投标资格要求中的所有 条款,并按照招标文件的规定提交资格证明文件,未按要求递交的投标人,其投标为无效投 标。
        1、投标人须为在中华人民共和国境内注册的独立法人,注册地不在项目所在地的,须在项 目所在地设有固定的办事处或分支机构,能提供稳定、可靠、完善的本地化服务(提供营业 执照复印件);
        2、投标人须有近三年(2020年05月至投标截止时间)具有金融业与本项目类似的采购案
        例:
        3、投标人须具有稳定的经营场所和正式员工(提供企业劳动合同及2022年10月份以来任
        意连续三个月社保缴纳证明):
        4、投标人参加本次投标活动前三年内(2020年05月至公告发布之日)在“信用中国”网 站未被列入失信被执行人及失信惩戒对象名单在“中国政府采购网”网站未被列入严重违
        法失信行为记录名单:(提供上述查询结果截图并加盖公司公章):
        5、投标人近三年内,财务审计报告经营情况良好(提供2019、2020、2021年会计师事务所
        出具企业财务报告):
        6、投标人在各类项目合作过程中,没有合同违约、泄露商业秘密或技术秘密等非公开信息
        等事件:
        7、本项目不接受投标人以联合体形式参与投标;
        8、投标人应在投标截止时间5个工作日前,在交通银行智采平台供应商门户网站
        (https://bocom-gys.bankconm.com)完成注册,详情请登录门户网站查阅《供应商门户操 作手册》,完成注册后,及时向招标代理机构反馈注册结果(智采平台网站中通过注册审批 的截图)。;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年05月05日08时30分到2023年05月10日16时30分
        售价:人民币500元,售后不退。
        五、投标文件的递交
        递交截止时间:2023年05月26日09时30分
        六、开标时间:2023年05月26日09时30分

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/269.html b/news/269.html new file mode 100644 index 0000000..f5353c1 --- /dev/null +++ b/news/269.html @@ -0,0 +1,362 @@ + + + + +锦州市妇婴医院标牌、宣传板制作等采购项目采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        锦州市妇婴医院标牌、宣传板制作等采购项目采购公告

        +
        +
        +
        +  2023-05-08 阅读:30 +
        +
        +

        锦州市妇婴医院标牌、宣传板制作等采购项目的潜在供应商应在辽宁星辰项目管理有限公司获取采购文件,并于2023年5月12日10点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:LNXC-2023021

        项目名称:锦州市妇婴医院标牌、宣传板制作等采购项目

        采购方式:询价

        预算金额:200,000.00元

        最高单价限价:22,000.00元

        采购需求:详见第三章采购需求

        合同履行期限:1年

        需落实的政府采购政策内容:中小微企业(含监狱企业)、促进残疾人就业等

        本项目不接受联合体。

        二、供应商的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:根据财政部工业和信息化部关于印发《政府采购促进中小企业发展管理办法》的通知财库〔2020〕46号文件,本项目专门面向中小企业采购。

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2023年5月9日至2023年5月11日,每天上午08:00至11:30,下午13:00至17:00(北京时间,法定节假日除外 )

        地点:辽宁星辰项目管理有限公司 (锦州市太和区锦娘路国际汽配城3-10-15)

        方式:现场领取

        售价:人民币500元/本,售后不退。

        领取文件须携带:1、营业执照副本;2.法定代表人身份证明书;3.法定代表人授权委托书及被授权人身份证(如无授权人可不提供);以上复印件各一份,复印件需加盖单位公章(盖有电子印章的无效)。详细填写领取表后,辽宁星辰项目管理有限公司发放电子版询价采购文件。(对于不能提供、拒绝提供或提供不清楚或不完整的,拒绝受理)。

        四、响应文件提交

        截止时间:2023年5月12日10点00分(北京时间)

        地点:辽宁星辰项目管理有限公司 (辽宁星辰项目管理有限公司会议室)

        五、开启

        时间:2023年5月12日10点00分(北京时间)

        地点:辽宁星辰项目管理有限公司 (辽宁星辰项目管理有限公司会议室)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、质疑与投诉

        供应商认为自己的权益受到损害的,可以在知道或者应知其权益受到损害之日起七个工作日内,向采购代理机构或采购人提出质疑。

        1、接收质疑函方式:书面纸质质疑函

        2、质疑函内容、格式:应符合《政府采购质疑和投诉办法》相关规定和财政部制定的《政府采购质疑函范本》格式,详见辽宁政府采购网。

        质疑供应商对采购人、采购代理机构的答复不满意,或者采购人、采购代理机构未在规定时间内作出答复的,可以在答复期满后15个工作日内向本级财政部门提起投诉。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名称:锦州市妇婴医院

        地址:锦州市古塔区解放路三段2号

        联系人:韩先生

        联系方式:0416-3885577

        2.采购代理机构信息

        名称:辽宁星辰项目管理有限公司

        地址:锦州市太和区锦娘路国际汽配城3-10-15

        联系方式:0416-3219317

        邮箱地址:LNXC8888@163.com

        开户行:锦州银行股份有限公司市府路科技支行

        账户名称:辽宁星辰项目管理有限公司

        账号:410100689469744

        3.项目联系方式

        项目联系人:曾女士

        电 话:0416-3219317

        辽宁星辰项目管理有限公司

        2023年5月8日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/27.html b/news/27.html new file mode 100644 index 0000000..58b80e0 --- /dev/null +++ b/news/27.html @@ -0,0 +1,362 @@ + + + + +商场中使用数字标牌都有哪些好处_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        商场中使用数字标牌都有哪些好处

        +
        +
        +
        +  2022-05-08 阅读:39 +
        +
        +

        对于以前的标识标牌大多数人的印象就是以图片和文字结合的展现形式进行展示,但是传统的这种形式所展示的效果会给人们带来一种视觉上的疲惫,也没有达到很好的效果,随着科学技术的不断发展,现在市场中有一种数字标牌产品,可能是因为是新技术的原因,人们对数字标牌的认同度还不是很高,有些客户对新技术有一种怀疑的态度,但是随着信息时代的到来,任何一个新型的技术都会得到快速地发展,下面就为大家介绍一下商场中是使用数字标牌都有哪些好处。

        一、增强商场的外在形象

        数字标牌是现在市场上比较主流的标识标牌产品,他的作用出来可以为商场带来不一样的外观的同时,还能让消费者与数字标牌进行互动,增加用户体验,满足年轻人的娱乐需求。

        二、减少投入成本

        数字标牌与传统的标识标牌相对比,数字标牌的优势就是显而易见了;随着社会的不断快速发展,人们都有了保护环境的思想意识,现在可利用的资源越来越少,导致纸质的宣传海报愈加的昂贵,选择数字标牌就可以一步到位,不需要后期再支付其他的费用,从此就可以看出数字标牌可以为商家节约制作标识标牌的成本。

        三、增加商场收入

        数字标牌可以为商家带来更多的广告收入,不管是什么类型的公司,数字标牌都是一块有价值的不动资产,数字标牌不仅不占用大量的空间,还可以进行租赁。

        四、有利于商场品牌塑造

        商场通过设置数字标牌系统可以很好的对商场进行宣传,还可以向人们传达各种所需要的信息,商场数字标牌不管在系统稳定性上还是在安全性和操作性上来说都高于其他类型的标识产品,所以数字标牌可以很好的为商场进行品牌塑造。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/270.html b/news/270.html new file mode 100644 index 0000000..17230f7 --- /dev/null +++ b/news/270.html @@ -0,0 +1,362 @@ + + + + +康定市麦崩乡人民政府康定市麦崩乡乡村振兴特色标识标牌采购项目竞争性磋商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        康定市麦崩乡人民政府康定市麦崩乡乡村振兴特色标识标牌采购项目竞争性磋商

        +
        +
        +
        +  2023-05-08 阅读:28 +
        +
        +

        康定市麦崩乡乡村振兴特色标识标牌采购项目 采购项目的潜在供应商应在网上获取获取采购文件,并于2023年05月19日 14点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:scsz-2023-0508

        项目名称:康定市麦崩乡乡村振兴特色标识标牌采购项目

        采购方式:竞争性磋商

        预算金额:29.0000000 万元(人民币)

        最高限价(如有):29.0000000 万元(人民币)

        采购需求:

        采购项目技术、服务及其他商务要求

        一、项目概述

        本项目采购内容为康定市麦崩乡乡村振兴特色标识标牌采购项目,本项目一个包。项目业主为康定市麦崩乡人民政府

        二、采购内容及要求

        序号

        名称

        材质要求及描述以下均为环保材料

        单位

        数量

        1

        为舍村,敏迁村,日央村,下火地村,含泥村,瓜达村,昌昌村,厂马村等8个村道旗

        主体8*8矩管,画面上下支撑,5*5矩管造型、3*3矩管,画面材质为:10mm聚氯乙烯 UV喷印

        130

        2

        通乡路道旗

        3*3矩管焊接烤漆抱箍焊接螺丝固定,画面材质为:10mm聚氯乙烯 UV喷印

        16

        3

        磨子沟村道旗

        3*3矩管焊接烤漆抱箍焊接螺丝固定,画面材质为:10mm聚氯乙烯 UV喷印

        12

        4

        李子玻璃钢雕塑

        1、李子(高度1.4米左右玻璃钢雕塑);2、花(直径0.60米左右玻璃钢雕塑);3、叶子和枝干(玻璃钢雕塑);4、盘子(直径2.7米左右镀锌板烤漆图案彩绘);5、底座(4*2.5*1.5米镀锌板烤漆内容丝印)

        1

        5

        永久性横幅

        15m*1.2m户外高清喷绘布+钢管焊接

        1

        6

        通乡路隧道标语

        60㎡户外高清喷绘布+钢管焊接

        1

         

        三、商务要求:

        1、报价要求:此项目报价应是最终用户验收合格后的总价,包括产品、运输及保险、安装调试、售后服务费、税费和采购文件规定以外的其它未涉及费用。采购人不再另行支付其他一切费用。

        2、完成期限:政府采购合同签订生效后15日内,完成供货、安装、调试及验收。

        3、实施地点:采购人指定地点。

        4、售后要求:供应商承诺提供24小时热线服务,出现故障30分钟内由技术支持人员电话处理,电话不能解决的,专业工作人员6小时内到达现场解决。(自然灾害等不可抗因素除外)

        5、质保期:1年(质保期为验收合格之日起开始计算)。

        6、付款方式:合同签订后3个工作日内支付合同金额的50%作为预付款,项目交货完毕经验收合格后7个工作日内支付合同金额的48%;质保期满后付合同金额2%。

        7、 验收方法和标准:中标供应商与采购人应严格按照《财库【2016】205 号》《财政部关于进一步加强政府采购需求和履约验收管理的指导意见》([2016]205 号) 的要求、采购文件规定的要求和响应文件及合同承诺的内容进行验收。

        8、其他要求:双方在服务合同中约定。

        合同履行期限:合同签订后 15 天

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        本项目专门面向中小微企业采购

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2023年05月09日  至 2023年05月15日,每天上午9:00至12:00,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:网上获取

        方式:网络邮件获取,获取磋商文件时,供应商需提供以下资料: (1)供应商网上办理购买采购文件时,请先自行下载公告附件中的《报名登记表(格式)》,并按相关要求填写信息(单位名称、经办人姓名、经办人手机号、单位座机及电子邮箱等)。 (2)将已填写好的《报名登记表》(附经办人身份证复印件)加盖供应商单位公章后扫描成图片连同报名费用支付凭证截图发至730401752@QQ.com(支付时备注公司简称)

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2023年05月19日 14点30分(北京时间)

        地点:成都市金牛区蜀西路52号中国西部黄金珠宝中心4栋9楼904A

        五、开启

        时间:2023年05月19日 14点30分(北京时间)

        地点:成都市金牛区蜀西路52号中国西部黄金珠宝中心4栋9楼904A

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:康定市麦崩乡人民政府     

        地址:康定市麦崩乡人民政府        

        联系方式:呷先生15351493332      

        2.采购代理机构信息

        名 称:四川蜀众招标代理有限公司            

        地 址:成都市金牛区蜀西路52号中国西部黄金珠宝中心4栋9楼904A            

        联系方式:于先生028-64646486            

        3.项目联系方式

        项目联系人:于先生

        电 话:  028-64646486

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/271.html b/news/271.html new file mode 100644 index 0000000..fb24d55 --- /dev/null +++ b/news/271.html @@ -0,0 +1,362 @@ + + + + +黑龙江楼体亮化大字及公益宣传板标牌等服务(第3次)采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        黑龙江楼体亮化大字及公益宣传板标牌等服务(第3次)采购公告

        +
        +
        +
        +  2023-05-08 阅读:30 +
        +
        +

        1、内科楼综合服务台、护士站、护士导诊底围、医护人员简介铝塑板+精工字烤漆围边+PVC字托,镀镜板烤漆电脑静电喷涂折盒+丝网印+透明亚克力相片槽+背架支撑。2、外科楼一站式服务台、超声登记、综合分诊台、医保窗口、导诊台、医护人员简介铝塑板+精工字烤漆围边+PVC字托、镀镜板烤漆电脑静电喷涂折盒+丝网印+透明亚克力相片槽+背架支撑、雪弗板UV异形雕刻。3、放射楼体检科门上牌、分诊台、卡布灯箱、医护人员简介镀锌板烤漆芬兰绿电脑静电喷涂折盒+丝网印、铝塑板+精工字烤漆围边+PVC字托、卡布灯箱。
        项目名称:楼体亮化大字及公益宣传板标牌等服务(第3次)
        服务周期:3天
        报价方式:价格
        评选方式:价格最低
        最低价相同评审办法:
        按照采购人政府采购内控制度规定的程序确定并列明具体评审办法,具体内容如下
        最低价相同的情况,根据附表2规定的评分标准进行打分,并按得分由高到低顺序推荐中标候选人,综合评分相等时,以项目服务方案得分高的优先;如果项目服务方案得分也相等,由询价小组根据企业综合实力、技术方案、售后等因素确定中标人。
        竞采最低限制:¥308800
        服务地址:黑龙江省牡丹江市爱民区康佳街333号
        报名开始时间:2023-05-08 14:11:01
        报名结束时间:2023-05-11 00:00:00
        发布时间:2023-05-08 11:11:01
        采购编号:HLJGCYC23150100Z20231282434
        采购单位:牡丹江市肿瘤医院
        供应商数量: 报名供应商不足3家。
        允许1家中选
        是否需要上传响应文件:是
        供应商资格:一、符合《中华人民共和国政府采购法》第二十二条规定,且已在本系统注册的供应商。
        二、落实政府采购政策满足的需求:本项目整体专门面向中小企业。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/272.html b/news/272.html new file mode 100644 index 0000000..cd839e2 --- /dev/null +++ b/news/272.html @@ -0,0 +1,362 @@ + + + + +神农架国际慢城会议度假酒店标识标牌采购安装公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        神农架国际慢城会议度假酒店标识标牌采购安装公告

        +
        +
        +
        +  2023-05-08 阅读:45 +
        +
        +

        招标编号:ZXH-SNJ-2023018
        项目所在地区:湖北省,省直辖县级行政区划,神农架林区
        一、招标条件
        本神农架国际慢城会议度假酒店标识标牌采购安装项目已由项目审批/核准/备案机关批准,项目资金来源为自筹资金100万元,招标人为神农架武山矿业有限责任公司。本项目已具备招标条件,现招标方式为其它方式。
        二、项目概况和招标范围
        规模 本项目为酒店标识标牌的采购及安装,并按采购人要求进行安装调试及售后维保等。
        范围:本招标项目划分为1个标段,本次招标为其中的:(001)神农架国际慢城会议度假酒店标识标牌采购安装项目;
        三、投标人资格要求
        (001神农架国际慢城会议度假酒店标识标牌采购安装项目)的投标人资格能力要求:本工程对投标人的资格审查采用资格后审方式,主要资格审查标准如下(详细内容和要求见招标文件):
        3.1投标人须具有有效法人营业执照且不得以分公司名义进行投标,投标文件的单位盖章必须使用其法人公章,分公司盖章无效。(提供营业执照原件扫描件)
        3.2投标人近3年(投标截止时间往前推算)独立完成过类似酒店标识标牌采购安装工程业绩。(提供合同原件扫描件,业绩开始时间以合同签订时间为准)
        3.2在“信用中国”网站,未被列入失信被执行人;在“国家企业信用信息公示系统”未被列入严重违法失信企业名单(开标结束后由招标人或其委托的招标代理机构按照招标文件要求对所有投标人的信用信息进行查询,做好记录,由评标委员会按招标文件的规定进行评审。)
        3.3单位负责人为同一人或者存在控股、管理关系的不同单位,不得同时参加同一标段投标或者未划分标段的同一招标项目投标;
        3.4与招标人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加投标:
        3.5本项目不接受联合体投标,投标人须以独立投标人身份参与投标。
        3.6信誉要求:1.须提供“无行贿犯罪记录声明”作为投标人及其法定代表人没有行贿犯罪记录的信誉证明材料和声明,格式自拟:
        投标人在制作投标文件时,应对照上述资格审查条件提供证明材料的原件扫描件(需清晰可见),否则评委与招标人将不予采信。(提供虚假资料的,将取消该投标人的中标资格,并报请行业主管部门作列入黑名单处理):
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2023年05月04日17时00分到2023年05月10日17时00分
        获取方式:请将以下材料发送至联系人邮箱,邮件主题必须注明所投标项目名称及投标人公司名称 ①针对本次投标的法人授权委托书,该授权书必须为法人签字并盖章生效后的扫描件,企业法人参与投标的请提交企业法人资格证明书(法人资格证明和授权委托书必须是针对本项目名称)②最新的企业营业执照③投标单位的联系人姓名、电话、电子邮箱地址。招标文件500元/份,售后不退。
        五、投标文件的递交
        递交截止时间:2023年05月19日10时30分
        六、开标时间及地点
        开标时间:2023年05月19日10时30分
        七、其他
        1、招标条件
        2、项目概况与招标范围
        2.1项目名称:神农架国际慢城会议度假酒店标识标牌采购安装项目
        2.2项目编号:ZXH-SNJ-2023018
        2.3本招标项目建设地点:神农架林区松柏镇。
        2.4本招标项目的项目概况:本项目为酒店标识标牌的采购及安装,并按采购人要求进行安 装调试及售后维保等。
        2.5招标控制价:1000000.00元。
        2.6本招标项目的招标范围:采购清单范围内的采购、安装、调试及售后等服务。(详见采购需求清单及技术参数要求)
        2.7工期控制目标:30日历天。
        2.8质量控制目标:必须是符合采购人规定的技术参数要求的全新正品
        3、供应商资格要求
        本工程对投标人的资格审查采用资格后审方式,主要资格审查标准如下(详细内容和要求见招标文件):
        3.1投标人须具有有效法人营业执照且不得以分公司名义进行投标,投标文件的单位盖章必须使用其法人公章,分公司盖章无效。(提供营业执照原件扫描件)
        3.2投标人近3年(投标截止时间往前推算)独立完成过类似酒店标识标牌采购安装工程业绩。(提供合同原件扫描件,业绩开始时间以合同签订时间为准)
        3.2在“信用中国”网站,未被列入失信被执行人;在“国家企业信用信息公示系统”未被列入严重违法失信企业名单(开标结束后由招标人或其委托的招标代理机构按照招标文件要求对所有投标人的信用信息进行查询,做好记录,由评标委员会按招标文件的规定进行评审。)
        3.3单位负责人为同一人或者存在控股、管理关系的不同单位,不得同时参加同一标段投标或者未划分标段的同一招标项目投标:
        3.4与招标人存在利害关系可能影响招标公正性的法人、其他组织或者个人,不得参加投标:
        3.5本项目不接受联合体投标,投标人须以独立投标人身份参与投标。
        3.6信誉要求:1.须提供“无行贿犯罪记录声明”作为投标人及其法定代表人没有行贿犯罪记录的信誉证明材料和声明,格式自拟:
        投标人在制作投标文件时,应对照上述资格审查条件提供证明材料的原件扫描件(需清晰可见),否则评委与招标人将不予采信。(提供虚假资料的,将取消该投标人的中标资格,并报请行业主管部门作列入黑名单处理)
        4、招标文件的获取
        请将以下材料发送至联系人邮箱,邮件主题必须注明所投标项目名称及投标人公司名称①针对本次投标的法人授权委托书,该授权书必须为法人签字并盖章生效后的扫描件,企业法人参与投标的请提交企业法人资格证明书(法人资格证明和授权委托书必须是针对本项目名称):②最新的企业营业执照:③投标单位的联系人姓名、电话、电子邮箱地址。招标文件500元/份,售后不退。
        5、报名截止时间
        报名截止时间:2023年05月10日下午17:00时。
        6、投标文件的递交
        投标文件递交截止时间:2023年05月19日上午10时30分。
        7、开标
        开标时间:2023年05月19日上午10时30分。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/273.html b/news/273.html new file mode 100644 index 0000000..54a3cdf --- /dev/null +++ b/news/273.html @@ -0,0 +1,362 @@ + + + + +德州市德达壹号院项目标识标牌采购及安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        德州市德达壹号院项目标识标牌采购及安装项目招标公告

        +
        +
        +
        +  2023-05-08 阅读:205 +
        +
        +

        一、项目概况
        1、项目编号:SD-2023140
        2、项目名称:德达壹号院项目标识标牌采购及安装项目
        3、项目地点:本项目位于德州市夏津县城区,银山路以东,砚池街以南。
        4、招标范围及规模:德达壹号院项目标识标牌采购及安装,具体详见图纸及采购清单。
        5、工期:30日历天,具体以建设单位进度要求为准。
        6、资金来源:自筹资金
        7、标段划分:本项目分为一个标段。
        8、招标方式:竞争性磋商。
        二、供应商资格要求:
        标段:一
        项目名称:德达壹号院项目标识标牌采购及安装项目
        控制价:676667.65元(含暂列金62000元)
        供应商资格要求:
        1.供应商须在中国境内合法注册,具备独立法人资格,营业执照包含相关营业范围,具有相应技术实力和管理能力,并在人员、设备、资金等方面具有履行合同的能力;
        2、企业信誉良好,且未被列入“信用中国”网站或中国政府采购网等渠道信用记录失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单;
        3、单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得参加同一项目的招标活动;
        4、本项目不接受联合体投标;
        5、符合法律、法规的其他规定。
        三、竞争性磋商文件获取:
        1、获取时间:2023年5月5日至2023年5月10日(上午08:30-12:00,下午14:00-17:30,北京时间,节假日除外)。
        2、获取方式:现场获取。供应商报名时需提供以下资料的原件及加盖单位公章的证件扫描件。竞争性磋商文件售价300元/套,售后不退。
        具体资料包括:营业执照、法人授权委托书及法人身份证复印件、授权代理人身份证(法人直接购买的可不提供授权委托书,仅需提供法人身份证)。
        四、递交响应文件截止时间:2023年5月15日10:00分(北京时间,超时不收)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/274.html b/news/274.html new file mode 100644 index 0000000..f19b198 --- /dev/null +++ b/news/274.html @@ -0,0 +1,362 @@ + + + + +飞利浦数字标牌,增添城市光彩,解锁智慧城市新可能_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        飞利浦数字标牌,增添城市光彩,解锁智慧城市新可能

        +
        +
        +
        +  2023-10-10 阅读:20 +
        +
        +

        随着现代科技不断发展,数字标牌在零售、交通、政企、教育、医疗等行业的应用愈发广泛。飞利浦数字标牌凭借数字化、智能化、互动反馈于一体的技术优势,成功打造了诸如以色列特拉维夫红线轨道项目、杨国福麻辣烫、深圳大学丽湖校区、深圳某国企、郑州市第三人民医院等众多应用案例,促进城市智能互联建设,打造智慧城市品牌。


        加速出行进度
        让交通更显便捷

         

        应用案例:以色列特拉维夫红线轨道
        使用场景:地铁出行信息显示


         

        在“一带一路”倡议框架下,一大批以中国标准建设的基础设施项目在海外加速落地,成为高质量共建“一带一路”的标志性工程。以色列特拉维夫红线轻轨项目就是其中之一,它是以色列建国以来最大的政府特许基础设施建设项目,代表着中企在发达国家高端市场轨道交通建设方面迈向新高度。在此项目中,飞利浦商显中国区为其提供地铁屏显方案,助力中以基建合作。

        飞利浦商显解决方案能够高清呈现每座城市风貌,向世界展示亮眼的以色列风采。除此之外,数字标牌能够为出行乘客提供轨道线路状态及换乘信息,方便出行乘客及时了解地铁客运信息,为智慧城市未来模样绘制美好蓝图。

         

        焕新品牌形象
        让零售更显出彩

         

        应用案例:杨国福麻辣烫

        使用场景:门店叫号显示

         

         

        始创于2003年的杨国福麻辣烫,拥有560多家门店,为国内快餐品牌之最。为满足日益增长的门店客流,杨国福麻辣烫选用飞利浦数字标牌,搭建信息展示系统,焕新品牌形象。
        飞利浦数字标牌及信息显示系统,能精准显示美食视频、滚动海报等信息,强化视觉吸引力;能实现叫号取餐、菜单展示等智能、多元、便捷的信息展示,提升消费者到店体验,促进餐饮品牌宣传,延伸品牌内容输出,为门店创造更多价值。


        强化企业形象
        让政企更显专业

         

        应用案例:深圳某国企

        使用场景:电梯间

         

         

        随着数字化时代到来,国家正积极倡导企业进行数字化转型,以适应新的经济形势。在此背景下,深圳某国企顺应时代潮流,积极参与数字化转型浪潮。飞利浦商显为其打造应用解决方案,助力该企业焕新升级。

        飞利浦数字标牌能够以视频、音频、图片和滚动字幕的形式实时呈现企业动态,提高公司内部组织间的凝聚力和协作能力,全面彰显公司品牌形象和品牌内涵。飞利浦商显打造以高科技、人性化的数字标牌系统,将企业文化进行有机渗透,构筑企业办公环境数字美学。


        搭建智慧高校
        让教育更显智能

         

        应用案例:深圳大学丽湖校区

        使用场景:综合服务大厅

         

         

        飞利浦商显携手深圳大学丽湖校区打造便捷、规范、高效、精进的综合服务大厅,推动智慧显示技术与校园基础建设深度融合,赋能智慧高校建设。
        飞利浦商显数字标牌可作为数字化“信息发布栏”,通过搭载功能强大的CMS信息发布系统,将日常校务信息以视频、音频、图片和滚动字幕的形式,传递到服务大厅的数字显示终端,为广大师生筑造起一座数字化“沟通桥梁”,全面提升丽湖校区形象面貌,切实提高综合服务大厅的管理服务水平。

         

        提升就医体验
        让医疗更显温度

         

        应用案例:郑州市第三人民医院

        使用场景:候诊室

         

         

        近些年,在信息化进程的迅猛发展下,越来越多的医院开始加速医疗信息化平台建设,以便提升其整体的医疗服务水平及核心竞争力。

        飞利浦商显为郑州市第三人民医院设计候诊解决方案,通过飞利浦数字标牌,可实时发布挂号信息、就诊情况、患者等候情况,有效缓解患者的就医体验,确保就医流程的有序性,实现医院信息管理统一、透明化,提升医疗就诊效率,带来和谐信任的医患关系,让医疗行业更显温度。
        快速迭代的数字技术与城市治理融合创新,不断拓展形成智慧、宜居的现代城市新图景。飞利浦商显通过科技之力,将数字化理念、数字化思维融入各行各业,覆盖新零售、交通、教育、政企、医疗五大行业,打造数字惠民的应用解决方案,提升城市大脑一体化和智慧化水平,让智慧生活触手可及。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/275.html b/news/275.html new file mode 100644 index 0000000..66ec2b4 --- /dev/null +++ b/news/275.html @@ -0,0 +1,362 @@ + + + + +某单位医院标识标牌采购项目采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        某单位医院标识标牌采购项目采购公告

        +
        +
        +
        +  2023-12-15 阅读:16 +
        +
        +

        一、项目名称:医院标识标牌采购项目

        二、项目编号:2023-JQXWGX-W9038

        三、项目内容

        序号

        物资名称

        物资要求

        计量单位

        预估数量

        预算

        (万元)

        交货时间

        交货地点

        1

        医院标识标牌采购项目

        1.医技楼门诊标志标牌(门诊)、2.急诊楼标志标牌(急救中心+红十字)、3.门诊由此进入标牌(门诊由此进入)、4.发热门诊灯箱。效果图见附近1,详情见后附件1效果图.doc

        1

        6

        比价结束当日完成沟通,3日内完成设计打样,一周内完成安装

        甘肃兰州

        1.报价供应商须对所投所有产品和数量进行唯一报价,否则视为无效投标。
        2.报价应包括所有货物供应、运输、安装调试、技术培训、售后服务、备品备件和伴随服务等价格。
        3.报价供应商必须保证所投产品为全新、未使用过的产品。











        四、项目要求

        (一)交货时间、地点

        1.交货时间:比价结束当日完成沟通,3日内完成设计打样,并在指定的时间和地点进行供货,一周内完成安装。

        2.交货地点:甘肃兰州。

        (二)物资具体要求

        (1)医技楼门诊标识标牌:

        1.字样:门诊

        2.材质:穿孔字,孔距2.5cm

        3.大小:约为3.5米大字(最终尺寸以实际测量为准,可适当增大)

        4.颜色:红色

        5.亮度:安装灯珠,定时夜间长亮

        6.支架:根据标牌尺寸安装支架,支架至少为1.5mm厚铝板,保证安全

        7.质保年限:5年,5年内免费更换,终身免费维修

        (2)急诊楼标识标牌:

        1.字样:急救中心+红十字

        2.材质:穿孔字,孔距2.5cm,背1.5mm厚铝板

        3.大小:5米大字(最终尺寸以实际测量为准,可适当增大)

        4.颜色:红色

        5.亮度:安装灯珠,定时夜间长亮

        6.支架:根据标牌尺寸安装支架,支架至少为1.5mm厚铝板,保证安全

        7.质保年限:5年,5年内免费更换,终身免费维修

        (3)门诊由此进入标牌

        1.字样:门诊由此进入

        2.材质:亚克力板,防止刮花(厚度至少为1cm,可根据实际情况进行调整)

        3.大小:2m×1m(最终尺寸以实际测量为准,可适当调整)

        4.质保年限:5年,5年内免费更换,终身免费维修

        (4)发热门诊灯箱

        1.字样:发热门诊

        2.吸塑灯箱,拆除原有灯箱,重新制作安装

        3.大小:80cm×1.2m(最终尺寸以实际测量为准,可适当调整,与原有灯箱大小持平)

        4.亮度:定时夜间长亮

        5.质保年限:5年,5年内免费更换,终身免费维修

        (5)临时突发的其他项目:由中标方承担

        (三)付款方式

        成交方成交价即为合同价,合同价包含货款、利润、税金、装卸载费、运杂费、安装费、人员培训费、售后服务费及相应的不可预测风险等一切费用。本项目不预付货款,待项目结束后,按照成交金额结算费用,留5%质保金,质保5年,5年后退还。

        五、供应商遴选方式

        该项目采用直接面向市场比价方式组织,请有意愿参与的供应商填写附件2附件2.docx,按采购公告中明确的时间、地点提交资料,比价小组审查资格性要求(详见资格性审查要求),审查合格的供应商,按照同质低价原则确定成交结果并现场告知报价供应商。

        六、提交资料时间及地点

        (一)提交资料时间及地点:

        1.时间:10月24日15时(北京时间);

        2.地点:甘肃省兰州市七里河区南滨河中路333号科技办公楼7楼会议室。

        (二)需提供以下资料:(模板见附件,资格性文件与报价文件单独装订)

        资格性审查资料:

        1.报名登记表;

        2.营业执照或事业单位法人证书 (提供加盖企业鲜章的影印件);

        3.报价截止时间,供应商成立时间不少于3年;

        4.法定代表人资格证明书;

        5.法定代表人授权书(除法定代表人参加之外,须提供法定代表人和被授权人身份证复印件);

        6.非外资企业或外资控股企业的书面声明(企业提供,事业单位、军队单位不需要提供);

        7.投标供应商主要股东或出资人信息;

        8.未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重失信行为记录名单,未被列入军队供应商暂停名单,未在军队采购供应商失信名单禁入处罚期内的承诺书;

        9.售后服务承诺书

        报价资料:

        报价单(单独装订)。

        (三)  审核方式及地点

        1.审核方式:供应商现场递交装订的资料,我方统一审核,按照报价最低原则确定中标供应商。

        2.地点:甘肃省兰州市七里河区南滨河中路333号科技办公楼7楼会议室。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/276.html b/news/276.html new file mode 100644 index 0000000..d4e8f30 --- /dev/null +++ b/news/276.html @@ -0,0 +1,362 @@ + + + + +数字标牌亮彩新视界,揭秘它的十大应用优势!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌亮彩新视界,揭秘它的十大应用优势!

        +
        +
        +
        +  2023-11-06 阅读:93 +
        +
        +

        科技如同一把钥匙,打开人类进步的大门。如今科技的飞速发展,商显市场产品呈现多样化发展趋势,产品的更新迭代日新月异。最常见的传统电视标识被数字标牌所取代,其利用专业显示、多媒体内容制作、内容管理技术等优势,综合发展起来的多媒体发布系统。

         

        根据奥维云最新发布的《中国大陆液晶数字标牌市场分析季度报告》,2023年上半年,中国大陆液晶数字标牌市场出货量为33.1万台,同比2022年增长27.7%。相比于商用显示市场的其它品类,数字标牌的表现堪称优秀。目前,数字标牌凭借自身优势广泛应用主要集中于零售、医疗、金融、交通等行业,并发挥着重要作用。

         

        传统电视标识弊端

        强光反光看不清;

        信息实时更新管理难;

        无法长时间稳定工作;

        无法满足多元化安装需求;

        显示效果无法满足达到专业的显示效果;

        常附带开机广告。

        数字标牌实际应用优势

         

        1高清晰:吸睛亮眼

        商用数字标牌178°广视角炫彩显示屏、 4K高清分辨率、500nits-700nits屏幕亮度,即便是应用于商场、机场、快餐店等高亮的场景下,依旧可以清晰显示相关信息,满足店铺展示、公共显示等严苛应用场景的需求。

        2强交互:增用户粘性

        作为显示屏,数字标牌可根据需要选择性搭载触控技术,以供用户进行信息查询、导览等,以交互手段增强用户体验。同时还可从显示云端手机触控数据,为用户提供更为精准的个性化、特色化服务及推广,提高用户与场景间的粘性。

        3易管理:高时效实时更新

        数字标牌搭载CMS信发系统,可实现对多终端设备发布信息的统一调度与管控,实时更新信息,满足商家运营宣传、用户即时掌握有关信息的需要。

        4低成本:寿命长免维护

        数字标牌支持7×24小时连续开机及远程休眠与唤醒,使用寿命达50000小时,再加上防灼烧功能,可以有效防止因长时间开机使得液晶屏灼烧损坏,使用寿命长。相较于传统印刷物料,无需人员定期维护与更换,一定程度还降低了人工与宣传物料的成本。

        5个性化:外观播放自定义

        从外观看,数字标牌支持异形设计,任由客户选择,实际应用时也能实现横竖灵活安装,满足更多应用场景需求。从信息发布看,相比传统电视标牌固定的开机广告,中银数字标牌则可以自定义开机广告内容,信息展示灵活便捷。

        6多样化:尺寸设计多样化

        数字标牌作为时兴的智能显示终端,为满足各行各业及特色形象打造的需求,其产品矩阵尺寸丰富,外观设计也从简单四边形向圆形、三角等多样化形状发展。多屏间还可实现多屏联动,提升画面现实质感。

        根据不同场景,不同空间大小选择不同尺寸的数字标牌,可以更好地与场景相契合,带来更直观的展示作用。

         

        屏连万物下,数字显示无处不在,数字标牌必将向着更个性化、智能化的方向发展。各大智慧商显厂商将以前瞻性的战略布局,深入应用场景,创新完善数字标牌产品矩阵,为现代社会的信息宣传与生活带来更多的便利。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/277.html b/news/277.html new file mode 100644 index 0000000..b6f1c89 --- /dev/null +++ b/news/277.html @@ -0,0 +1,362 @@ + + + + +中国邮政以中银智能广告机提升运营、服务新高度_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国邮政以中银智能广告机提升运营、服务新高度

        +
        +
        +
        +  2023-11-06 阅读:18 +
        +
        +

        物理营业网点曾是银行最主要的营销获客场所,但随着移动互联网的发展与应用,线下物理网点的客流量、交易量正逐步缩减,直营获客模式的投资回报率越来越低,银行逐步开始推进网点的减能增效、智能化转型,充分借力数字化来创新服务,提供并满足客户多样化的需求。

        ╱ 中国邮政 ╱

          传统金融机构要在数字化浪潮中立足,必须要运用数字化创新来拓宽获客渠道、重构业务流程,增强自身营运水平。广东云浮市云城区高峰邮政支局隶属于中国邮政,作为我国老牌的龙头物流企业,在数字化浪潮中配置安装中银立式广告机,以打造契合市场的数字化金融服务生态环境,提升客户需求响应力。

        实际应用优势

          ·信息展示便捷灵活

          立式广告机可以通过预先录制和编辑好的宣传信息,远程控制实现信息的实时更新和调整,无需人工更换海报,更加灵活便利,满足客户不断变化的需求。还可根据客户的喜好和需求进行定制交互,实现个性化的模块设计与展示,智能分屏呈现服务和产品信息,显你所想。

          ·提升服务质量

          邮政银行可以利用立式广告机可以播放图文、音视频、动画等,介绍最新的产品信息、服务指南、贷款须知、金融产品和银行政策等,吸引更多的客户前来咨询和办理业务,帮助客户更方便地了解邮政服务,提升服务质量。加之触控技术,客户可自行点击感兴趣的内容,进一步节省了工作人员的重复解释和演示时间,提高服务效率。

          ·提高品牌形象

          立式广告机采用高清晰度显示屏幕,可以展示高分辨率的图片和视频,以及更丰富的色彩,从而在视觉上给客户带来强烈的冲击力。通过在营业厅内展示邮政银行的业务、服务以及政策宣传等信息,立式广告机可以帮助提高顾客对邮政政策的了解渠道,增强品牌形象。

          在智慧网点的搭建过程中,除最热的中银立式广告机,自助查询机、排队机、壁挂广告机、双面吊挂广告机、会议平板等中银系列智慧终端纷纷走进各大银行,成为了智慧网点搭建利器,为中国银行、中国农业银行、广发银行、中国建设银行、中国工商银行等各大银行提供了助力。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/278.html b/news/278.html new file mode 100644 index 0000000..9697246 --- /dev/null +++ b/news/278.html @@ -0,0 +1,362 @@ + + + + +中国邮政银行+中银立式广告机屡次携手,共谋金融服务创新发展_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中国邮政银行+中银立式广告机屡次携手,共谋金融服务创新发展

        +
        +
        +
        +  2023-12-13 阅读:4 +
        +
        +

        在数字化转型的趋势下,对于客户来说,选择银行已经不再只是看中其资金实力和信誉,而是更加注重其服务质量和创新能力。因此,银行需要更加注重客户需求和市场变化,积极推进数字化转型和创新发展,以提高其市场竞争力。

        ╱ 中国邮政储蓄银行╱

        中国邮政银行是中国银行业中规模较大、网点覆盖面较广、服务客户数量较多的金融机构之一。随着金融市场的不断变化和数字化转型的推进,云浮市云安区前锋镇街邮政银行配置安装中银55寸立式广告机,继续加强创新和转型发展,提升服务质量和效率,以适应市场的变化和客户的需求。

        细分场景灵活应用

         

        银行大厅:立式广告机可以放置在银行大厅中,作为进入银行的第一道风景线。

        服务台:在服务台旁,立式广告机可以提供交互式查询服务,了解业务办理流程。

        休息区:在休息区,立式广告机可以播放轻松愉快的视频,提供娱乐和放松的功能。

        实际应用优势

        多样化展示提升服务质量

        立式广告机搭载多媒体信发系统,可以展示各种多媒体内容,包括音视频、图片和文字。使得它能够灵活地展示邮政银行的品牌形象、金融产品和服务,还可以作为银行介绍、业务指南和金融服务展示的平台,提升邮政银行的服务质量,增强客户对邮政银行的信任度。


        ·触控管理优化业务流程

        作为当下智慧智能显示终端的大热“新星”,立式广告机支持触控操作,银行客户可以通过互动查询业务、了解金融产品等,无需排队等待人工问询,降低银行的人力成本,不仅增强了客户的参与感,还可以减少客户等待时间,提高服务效率。同时,它还支持远程管理,银行可以通过网络对其进行远程监控和管理,方便快捷。

        亮丽风景线吸引客户

        在银行中立式广告机具有广泛的应用场景和多样化的功能,一举成为银行中不可或缺的一部分。加之其现代化外观的设计使得它成为银行中一道亮丽的风景线,机身采用一体化超薄设计,选用高清高亮显示屏,使其更好地适应数字化时代的发展要求,增强银行的竞争力。同时,提高银行的品牌形象和市场声誉,吸引更多的客户和业务合作伙伴。

        时至今日,中银立式广告机已成为中国邮政银行的老朋友,与多地分行达成合作。此外立式广告机还走进了中国建设银行、中国银行、广东华兴银行、中国农业银行、中国交通银行等等多家头部金融机构,成为其数字化转型的利器。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/279.html b/news/279.html new file mode 100644 index 0000000..244f99c --- /dev/null +++ b/news/279.html @@ -0,0 +1,362 @@ + + + + +Mini LED TV同比增长近50%_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        Mini LED TV同比增长近50%

        +
        +
        +
        +  2023-12-13 阅读:3 +
        +
        +

        2023年,TV市场依旧是Mini LED背光的增长主力。

          据《2023 Mini LED背光调研白皮书》 数据显示:2023 年,Mini LED 背光产品整体出货量约为 1259 万台 ,Mini LED 背光 TV 板块同比增长近50%  ,iPad 和笔记本电脑市场收缩。

         来源《2023 Mini LED背光调研白皮书》,欢迎订阅

          而TV市场和车载市场是今年最受关注的市场,在TV市场之中Mini LED 背光分区数的变化将呈先降后升的 U 型曲线;车载市场之中,目前Mini LED 背光的主要车型价格集中在 30~50 万之间。

          那么,2023年都上新了哪些Mini LED背光新品呢?

         

          今年上新28款Mini LED电视

          据不完全统计,截止12月中旬,近30款 Mini LED电视推出市场。

          汇总已经发布的Mini LED背光电视可见,在TV领域,拉动Mini LED背光增长的主要品牌终端为三星、TCL、海信、小米、康佳、创维 等企业,除了三星为韩企企业,青睐MiniLED背光技术 的多为国产品牌。

          另外,从价格、分区变化、供应链等方向来看,Mini LED背光电视逐渐呈现了新的趋势。

         

          变化一:Mini LED TV越来越亲民

          首先是在价格方面,从上表可看出,百级分区价格持续优化,更加亲民 ;而部分千级分区的Mini LED背光电视价格已开始低于万元,部分已接近5000元。

          如TCL带来Q10G的升级迭代款——Q10G Pro ,实现质价比升级。不仅通过全新一代Mini LED背光技术,TCL Q10G Pro实现分区数量成倍提升,完成画质升级;另从其发布会所公布的价格来看,该产品五款尺寸与去年Q10G的首发价相比不仅没有上涨,甚至85吋的还降低了2000元。

          再者是价格屠夫 小米,其今年推出的S Pro 不仅保证了千级分区(1440分区)、大尺寸(85英寸),同样在价格上也达成了万元以下。对比小米在4月份发布的小米电视大师,S Pro的三个尺寸都可以说是在高端化的同时,打出了性价比。

         

          变化二:高分区产品已从2000+进入了20000+

          其次是产品布局上,高端产品分区也在逐步增长。

          如3月份,TCL发布X11G,该产品5184分区,背光模组由瑞丰光电提供 。据悉,瑞丰光电Mini LED背光技术助力 TCL 实现了全新技术路线的创新与融合,在提升优异画质体验的同时,令Mini LED在商用领域更具性价比。

          此后在8月份,TCL发布Max款,分区达到20000+。在此之后,长虹同样发布20000+分区的电视。至9月,海信推出了40000+分区的电视。

        来源《2023 Mini LED背光调研白皮书》

          可见,在近两年的发展下,高分区产品已从2000+进入了20000+ ,并且在Mini LED技术中,高分区依然是体现画质的重要参数,在高端产品方面,万级分区能体现Mini LED的画质优势。

         

          变化三:降本增效成为供应链共识

          如前文所述,万元以下的高性价比+高画质,反映的不仅仅是小米对成本的把控,同样也体现了今年供应链降本增效方案的变化 。

          从供应链端来看,核心方案主要在芯片、PCB板、Lens 等环节展开。

          如Mini LED芯片降本增效思路朝着几个方面聚焦:减少Mini LED使用颗数、往高压芯片发展、免锡膏Mini LED芯片方案、提升Mini芯片工艺水平等;

          因为背板在成本上仍占据较高比例,因此多家企业通过PCB板形状的创新来优化成本,主要采用的异性板有鱼骨差齿状、灯条状等形式;

          OD与Pitch的比值也相比2022年有所变小,从方案上降低Mini LED模组 的成本;

          可见,Mini LED背光产品分区数呈下降趋势,成本往更为贴近消费者可接受的价格靠拢。拉长时间看,Mini LED背光分区数的变化将呈先降后升的U型曲线。更多Mini LED TV市场分析及供应链信息可订阅《2023 Mini LED背光调研白皮书》。

          《2023 Mini LED背光调研白皮书》由行家说携手京东方晶芯科技、京东方华灿光电、兆驰半导体、兆驰光元、瑞丰光电、东山精密、国星光电、华引芯、天电光电、集创北方、新益昌、GKG凯格精机、南极光、盟拓智能科技、EPS伊帕思、华正新材、瑞投安信、北方华创、惠合显示、纳泽光电、威钛科技等21家产业各环节领军企业共同编写。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/28.html b/news/28.html new file mode 100644 index 0000000..90b4310 --- /dev/null +++ b/news/28.html @@ -0,0 +1,362 @@ + + + + +数字标牌十大品牌详细介绍_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌十大品牌详细介绍

        +
        +
        +
        +  2022-05-08 阅读:53 +
        +
        +

        在城市的很多大型商场、 酒店等很多地方常常都会有很多显示屏,我们可以看到很多的广告宣传等各种视频,那其实就是数字标牌。数字标牌是一种新型的媒体设备,它可以通过大屏幕向大家展示一些广告、音乐、电影等很多东西,应用范围也很广泛。所以现在很多的发达的城市街头都会安装很多大大小小的数字标牌,那么数字标牌的十大品牌有哪些?一起来了解一下吧。

        1、十大品牌之一三星

        2013年,全球显示领域的领军品牌三星电子在核心技术上再次突破,推出创新的三星智能数字标牌解决方案,可以有效满足不同类型饮吧、店面对数字标牌产品的信息沟通、广告宣传、形象提升等需求。

        2、十大品牌之一鑫视海

        鑫海视作为国内领先的数字标牌生产商,专业液晶广告机、触摸一体机、液晶监视器、液晶拼接墙和高清播放盒等产品的研发、生产和销售。产品尺寸覆盖10.4-84寸,满足客户全方位、多元化的需求。

        3、十大品牌之一星火

        北京信成星火科技有限公司,是北京地区一家以商用显示解决方案、展览展示设备为主营的科技型公司。主要产品:触控一体机、自助终端查询机、楼宇广告机、教学白板、多媒体互动、多媒体信息发布系统。

        4、十大品牌之一美视窗

        北京美视窗科技有限公司是从事数字标牌的专业厂家。集设计、加工、安装、销售、维修一条龙服务。公司所需加工厂实力雄厚、设备精良,等全套加工设备。

        5、十大品牌之一德丽珑

        得丽珑数字标牌主要应用于商业楼宇、学校、 医院 、公共交通等行业。因此,液晶广告机还具有针对性强、到达率高、强制性观看、城市覆盖率高、低碳环保等优点。

        6、十大品牌之一鑫思宇

        昆明鑫思宇科技有限公司是一家专业从事液晶系列产品开发、设计、生产、销售和工程于一体的实力公司。主营产品包括液晶数字标牌、网络广告机、移动电视一体机、车载宽电压液晶广告机、工控、等LCD产品。

        7、十大品牌之一NEC

        日本电气股份有限公司简称日本电气或日电或NEC,是一家跨国信息技术公司,总部位于日本东京港区。NEC为商业企业、通信服务以及政府提供信息技术和网络产品。

        8、十大品牌之一UNCCR

        深圳中创联合科技发展有限公司是一家集研发、生产、销售的高科技产品公司,公司凭借强大的研发能力、严谨专业的生产管理经验以及“质量第一、信誉第一”的经营理念,成功地开发出一系列拥有自主知识产权的高品质、高价值、高品位,多层次的一系列创新型高科技产品。

        9、十大品牌之一星辰

        星辰心科技是一家专业生产广告机的科技公司,地址位于深圳市龙华新区,星辰心科技的主要产品有广告机、电视电脑一体机、数字标牌、楼宇广告机、户外广告机、触摸一体机、安卓广告机,以及数码相框等。

        10、十大品牌之一传美

        深圳传美是一家集研发、生产、销售与服务于一体的“商业视频”领域专业化公司,是车载影视系统、楼宇视频广告领域的行业龙头企业。

        以上即是关于数字标牌的十大知名品牌简介,相信会对大家有所帮助。数字标牌的生产厂家还有很多,它们也都各有自己优秀的地方,那么大家在选购的时候也要进行筛选,选出最适合的最好的,因为数字标牌是面向很多观众的一个设施,它的美观以及各个方面会直接影响到它的宣传效果,就拿它的画质清晰方面来说,如果画面模糊的话,会影响消费者对产品的认识等等各种因素。所以一定要慎重选择。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/280.html b/news/280.html new file mode 100644 index 0000000..c3a8361 --- /dev/null +++ b/news/280.html @@ -0,0 +1,362 @@ + + + + +深圳市爱鑫微电子有限公司荣获高工创新产品奖_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        深圳市爱鑫微电子有限公司荣获高工创新产品奖

        +
        +
        +
        +  2023-12-13 阅读:27 +
        +
        +

        高工LED十五周年年会庆典已经圆满落幕,12月7号-8号,深圳市爱鑫微电子有限公司受邀出席在深圳举行的高工LED年会,斩获2023创新产品奖。

         

        在此,我们深深感谢高工LED十五周年年会庆典这个活动,让大家,让世界,见证到了LED是如何一步一步艰辛的走到遍布全球的过程,LED行业历经百年的发展,已经在全球各地广泛应用。

         

        8号晚,在高工LED十五周年庆典暨金球奖颁奖典礼上,爱鑫微斩获创新产品奖,这既是媒体朋友爱鑫微的认可,也是对爱鑫微坚持创新的肯定。

        随着时代与科技的不断进步,则产品也要随着而不断升级不断研发,LED显示屏可以用于很多方面,但是也会需要用到电脑以及系统,系统方案的不同,从而带给大家的感觉和效果也不同。在系统方面这一块想必大家也都略知一二,一个就是很普遍的Windows系统和Android安卓系统了,则另一个就是IOS系统,电脑的不同取决于它的系统方案,大家都知道一台电脑一个系统,可若要是一台电脑可以操纵两个系统呢?那岂不是两全其美,是的,爱鑫微最新推出的双系统方案就可以做到一台电脑上两个系统来回切换,就是将两台不同系统的电脑连接到需要的显示屏上,也就是二合一。

         

        既便捷且低功耗还功能性强,高主频,多核心。并且有不少的展商被爱鑫微研发的双系统方案所吸引。安卓方案可运用到教学会议上面,安卓选用RK3399/RK3588/311D2 等系列CPU,可支持红外触摸与遥控

         

        可智能化切换至Windows系统可当电脑使用,用于室内办公等等;则Windows OPS电脑可支持6-14代CPU,显卡可选GTX1050TI/1650 4G/RTX3060 12G/ 3080/16G显卡。

         

        未来,爱鑫微将继续开发OPS电脑以及解决方案的创新,担任起引领者的企业责任和担当,推动LED一体机产业稳步向前发展,以优质的产品服务客户,将更加精彩的解决方案带给广大消费者。

        爱鑫微电子作为国内OPS电脑产品线最全的研发、生产、销售为一体的厂家,同时提供OEM/ODM定制服务,目前主产品线为:

        OPS电脑:Baytrail-J1800/J1900/Baytrail-CR Z8350/GeminiLake-N4000/N4100/J4105/J4005 CPU/HM76+2-3 代CPU/HM86+4代CPU/Skylake-u+6-7 代CPU/Whiskeylake-u+8-10代CPU/tigerlake-u+11代CPU(最新支持5K显示或者8K分辨率显示OPS电脑方案)。

        OPS-C电脑:HM76+2-3代CPU/HM86+4代CPU/H77+2-3代CPU/H81+4代CPU/H110+6-7代CPU/ H310+8-9代CPU/H510+10-11代CPU。

        独显OPS电脑:H81+4代CPU+独显GT730/960/1030/1050/1050TI/1650 2-4GB/ H110++6-7代CPU+独显GT730/960/1030/1050/1050TI/1650 2-4GB/ H310、H510+8-9-10-11代CPU +独显

        GT730/960/1030/1050/1050TI/1650、1060/1070 2-4-6GB显卡。

        国产化OPS电脑:国产CPU飞腾FT-2000/4 /兆芯KX-6000系列CPU+国产操作系统(UOS/Deepin/Kylin)系列OPS-C电脑

        定制型OPS-C电脑:带DVD光驱系列OPS-C电脑/超薄27MM系列OPS-C电脑/带无线路由器系列OPS-C电脑/带采集卡系列OPS-C电脑/带双网口三网 口/光端机OPS模块/SDI OPS模块/光纤SFP OPS电脑模块/双HDMI系列OPS电脑。

        安卓OPS电脑:RK3328 安卓OPS电脑/RK3288 安卓OPS电脑/RK3399 安卓OPS电脑/RK3399PRO 安卓OPS电脑/RK3588 安卓OPS电脑系列/4K 30HZ/4K 60HZ/ 8K显示OPS电脑。

        SDM卡模块:SDM-L:Skylake-u/H310系列/SDI系列

        MINIPC/工控机:Geminilake/ Skylake-u/Cometlake-u系列

        4U工控机/服务器:H110/H510-12盘位/24盘位

        定制:LED会议一体机行业专用插拔式OPS电脑(超窄、超薄、超高性能)

        OPS转接小板:支持3USB+HDMI/支持6USB+HDMI/支持5USB+HDMI+RJ 45网口/支持支持5USB+HDMI+VGA+RJ45网口/支持LVDS点屏/支持Vbyone 点屏。

         

        深圳市爱鑫微电子有限公司(以下简称“AIOSTAR”)是一家集研发、生产和销售于一体的高新技术企业,同时是Intel、AMD、NVIDIA等芯片厂 商紧密的合作伙伴。公司主营工业主板(ITX/3.5寸/NANO等)、播放终端、MINI PC、工控机、工业计算机、商用主机、独显OPS电脑、OPS可插拔式电脑模块、OPS主板、BOX-PC、网络安全硬 件平台、服务器、工业平板电脑、一体化工作站等产品。目前,产品已广 泛应用于DS、MIDS、IWB、POS、自助查询、零售金融、工业自动化,智能 交通,网络信息安全,通讯、智能安防,云计算、石油石化、医疗、军事 装备等多个领域。公司高度重视客户的需求和满意度,针对不同的客户需 求,能够快速做出积极的响应,为其进行量身设计并提供个性化的OEM/OD M服务。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/281.html b/news/281.html new file mode 100644 index 0000000..533f56a --- /dev/null +++ b/news/281.html @@ -0,0 +1,362 @@ + + + + +杭州大关街道及时修复标志牌 消除隐患保安全_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        杭州大关街道及时修复标志牌 消除隐患保安全

        +
        +
        +
        +  2023-12-13 阅读:21 +
        +
        +

         近日,大关街道南苑社区工作人员接到居民反映,小区门口道路交通引导牌一侧脱落,柱体上还留有胶水痕迹,摇摇欲坠的状态不仅对小区环境美观造成影响,也对过往居民和车辆造成一定的安全隐患。

          社区工作人员第一时间赶往现场,查看情况后,联系相关单位对该处引导牌进行固定修复。为防止此类事件再次发生,确保辖区路段各类标志、标牌安装牢固、清晰醒目、规范合理、起到良好的引导和警示效果,南苑社区工作人员开展道路指示牌安全隐患集中排查整治行动。

          行动中,为扎实做好整治工作,工作人员分组对辖区主次道路的指示牌情况进行排查摸底,通过徒步巡查,现场拍照记录问题点位,并结合实际情况采取具体行动。对指示牌歪斜,及时联系物业进行扶正加固;对指示牌整体掉落、牌面脱落以及破损的,及时予以更换、固定,工作人员主动跟进监督,确保整改到位。

          通过排查整治,辖区内的交通指示牌及安全设施台账得到了进一步完善。同时,社区利用日常网格巡查,对各类要素情况做到心中有数,及时发现不足、及时恢复完善,确保道路标志、标牌等管护到位,切实履行好保障辖区内道路安全畅通的职责。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/282.html b/news/282.html new file mode 100644 index 0000000..56f55f2 --- /dev/null +++ b/news/282.html @@ -0,0 +1,362 @@ + + + + +安徽省标识行业质量检查制度_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        安徽省标识行业质量检查制度

        +
        +
        +
        +  2023-12-13 阅读:9 +
        +
        +

        一、适应于标识行业内从事管理、生产、施工的所有人员。

          二、为了更好的维护行业相关的生产和工作秩序,提高工作效率,强化团体纪律,促使行业工作畅通,特制定本制度。

          三、严格按有关规范.标准和施工图纸要求进行工程质量监督.检验和评定工作。

          四、每个标识行业企业在工程开工前,由项目技术负责人向施工负责人和班组进行书面技术交底,并签证。

          五、检查施工人员按设计图纸.施工验收规范.操作规程和施工技术组织措施(施工技术组织措施中必须有确保工程质量的技术措施内容)及其它施工技术文件进行正确施工。

          六、对施工中的重要部位和资料进行监督检查。施工中的主要部位、大型标识标牌、上下道工序衔接的重要部位等:由项目技术负责人会同现场质检员自检合格后,由技术人员填写标识工程检查证,并备齐有关资料,于施工前通知建设单位监察工程师.施工监理,确认合格并签证后,方可进行施工安装。

          七、采取专业检查和群众检查相结合的方法,协助项目搞好三检(自检.互检.交接检),加强对施工过程的检查,把质量问题消灭在施工过程中。‘三检制’要贯彻到整个施工过程中,要充分发挥班组质量员的作用,把施工现场质量管理工作的重点从‘事后把关’转移到‘事前控制’,做到防检结合,实行对工序严格把关。

          八、督促检查检验标识相关单位工程的质量检验评定工作。未经检验或已经检验评为不合格的,严禁转入下道工序。

          九、组织质量大检查,针对施工中的薄弱环节和质量通病,制定切实可行的消除措施计划。根据施工任务的特点,可分别按月.旬组织质量大检查,有针对性地检查工程质量中存在的典型问题,质量通病是影响工程质量的重要因素,各现场应根据自己的实际,定期分析工程质量动态,预见隐患或不正常因素,通过数据分析,找出影响工程质量的主要因素,采取有力措施,组织攻关逐项消除,从而不断提高工程质量水平。

          十、对完成施工的标识标牌需不定期的检查维护,确保产品本身无问题前提下,不影响标识周围安全及环境。

          十一、对质量事故或较大的质量隐患的处理要严肃,召开分析现场会,总结经验训,并给予教育和必要的处罚。

          安徽省标识行业协会

          2023年12月12日


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/283.html b/news/283.html new file mode 100644 index 0000000..1708f44 --- /dev/null +++ b/news/283.html @@ -0,0 +1,362 @@ + + + + +标识系统和导视系统有什么区别_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        标识系统和导视系统有什么区别

        +
        +
        +
        +  2023-12-13 阅读:73 +
        +
        +

        标识系统和导视系统在功能、形式和应用上存在明显的区别。


        从功能上看,标识系统主要承担着信息传达和品牌宣传的作用,它通过图形、文字等元素,向人们传递关于品牌、产品或服务的信息。而导视系统则更注重于引导和指示,它通过箭头、标识牌等元素,为人们提供关于方向、位置和距离的指引。

        从形式上看,标识系统通常以静态的形式存在,它以固定的位置和尺寸出现在产品、包装或宣传物料上,以文字和图形的形式呈现。而导视系统则更加灵活,它可以以动态的形式存在,比如电子显示屏、语音导览等,也可以以静态的形式存在,比如指示牌、地图等。


        从应用上看,标识系统广泛应用于各种领域,包括商业、教育、文化、医疗等,它能够满足不同领域的信息传达需求。而导视系统则更加注重于空间和环境的指示,它通常应用于公共场所、旅游景点、商业中心等地方,为人们提供关于场所的导览和指示。


        标识系统和导视系统在功能、形式和应用上存在明显的区别。标识系统主要承担着信息传达和品牌宣传的作用,以静态的形式存在并广泛应用于各个领域;而导视系统则更注重于引导和指示,以动态和静态的形式存在并广泛应用于公共场所和旅游景点等地方。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/284.html b/news/284.html new file mode 100644 index 0000000..404db0b --- /dev/null +++ b/news/284.html @@ -0,0 +1,362 @@ + + + + +昆明市呈贡区农村信用合作联社零星宣传、网点标识标牌采购供应商_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        昆明市呈贡区农村信用合作联社零星宣传、网点标识标牌采购供应商

        +
        +
        +
        +  2023-12-13 阅读:16 +
        +
        +

        1、竞争性磋商条件

        受昆明市呈贡区农村信用合作联社委托,对“昆明市呈贡区农村信用合作联社2024年-2025年零星宣传、网点标识标牌采购供应商入围项目”采用竞争性磋商方式采购。本项目已具备采购条件,现对该项目进行公开竞争性磋商。

        2、项目概况与采购范围

        2.1 项目名称:昆明市呈贡区农村信用合作联社2024年-2025年零星宣传、网点标识标牌采购供应商入围项目;

        2.2 项目编号:HCZB01202312026;

        2.3 采购预算(含税):70万元;

        2.4 资金来源:自筹资金;

        2.5 采购范围:拟选取2家供应商开展昆明市呈贡区农村信用合作联社2024年至2025年零星广告、网点标识标牌、宣传素材设计等工作;具体内容详见第五章《项目需求》;

        2.6 服务地点:采购人指定地点;

        2.7 制作及安装期限:5日历天/每个网点,以每次接到甲方通知后开始计算;

        2.8 供货服务周期:自合同签订生效之日起两年(具体时间以实际签订合同为准);

        2.9 质量要求:符合现行国家及行业相关标准,满足采购人的使用要求及采购文件中的项目需求。

        2.10入围数量:本项目共入围2家供应商。

        2.11标段划分:本项目共划分为1个标段;

        2.12本次采购将采用资格后审的方式;

        3、供应商资格要求

        3.1磋商申请人须为具备经国家工商行政管理部门登记注册的企业(事业)法人或其他组织,具备有效的营业执照(或市场监管部门或其他行政机关颁发的可以合法开展业务的执照或证书)。

        3.2信誉要求:

        (1)供应商未被列入中国执行信息公开网(http://zxgk.court.gov.cn/)的失信被执行人名单(由采购人或采购代理机构在响应文件递交截止时间前查询并将查询结果提交评审委员会审查)。

        (2)供应商未被列入“信用中国(www.creditchina.gov.cn)”的严重失信主体名单、重大税收违法失信主体、政府采购严重违法失信行为记录名单(由采购人或采购代理机构在响应文件递交截止时间前查询并将查询结果提交评审委员会审查)。

        3.3其他要求:与采购人存在利害关系可能影响采购公正性的法人、其他组织或者个人,不得参加磋商;单位负责人为同一人或者存在控股、管理关系的不同单位,不得参加同一标段磋商或者未划分标段的同一采购项目磋商。

        3.4本项目不接受联合体。

        4、竞争性磋商文件的获取时间:2023年12月12日至2023年12月18日,每天上午9:00至12:00;下午14:00至17:00。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/285.html b/news/285.html new file mode 100644 index 0000000..49ff0d3 --- /dev/null +++ b/news/285.html @@ -0,0 +1,362 @@ + + + + +智能数字标牌系统设计制作有哪些应用场景?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        智能数字标牌系统设计制作有哪些应用场景?

        +
        +
        +
        +  2023-12-13 阅读:18 +
        +
        +

        商业数字标牌智能广告机以数字化的展示内容,给大家提供发挥创造性的空间,让用户即时了解商品详情并提供针对性服务,借以智能数字标牌的互动性将产品完美呈现给用户,设置趣味互动环节来加深用户对商业品牌的印象,让其沉浸式体验促使消费,同时营造愉快时尚及信息化的购物氛围:


        1,高端酒店和餐饮导视系统,应用数字标牌智能广告体机全面传送多种服务,实现连锁餐饮公开价格和订购的多媒体广告,满足用户需求的知情权和企业广告宣传效果。

        2,智慧商场和智慧门店智能导视标识,数字标牌实时发布商业购物中心购物指南,助力提升商场购物新体验。

        3,展厅场馆和政府机构智能导视设计,智能数字标牌系统设计制作实现统一操控与信息发布,全面提升信息交流效率,智能数字标牌系统的布署有利于日常的业务处理指南。

        4,金融机构数字标牌系统,数字标牌具备简约时尚的外观,例如银行数字标识牌系统集成线上排队取号与智能导视终端,实现远程操作管理。

        5,智慧交通标识导视系统,通过智慧公交电子站牌,大家及时获取最新时刻表的交通信息与轮播生活资讯,为焦灼等待的人们提供放松消遣时间,基于车站机场人群流量大的特征,建议可播放多种广告类型,为商家增加经济效益。

        6,医院智慧标识系统解决方案,医院数字标牌主要用途在于宣传医院科室,临床经验以及就诊指南,供给人们智能导视导览服务以达简化就医流程的目的,有助于减轻患者的看诊焦虑感。


        智能数字标牌系统设计制作以人性化和内容丰富化为核心,其关注重心在于互动营销,以数字标牌为代表的智能导视系统深受商业场所的追捧,凭借抵达率高,针对性强,城市覆盖率高与绿色环保优势迅速成为广告标识智慧化的主要渠道。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/286.html b/news/286.html new file mode 100644 index 0000000..e551da0 --- /dev/null +++ b/news/286.html @@ -0,0 +1,362 @@ + + + + +视美泰发布国产化开源鸿蒙系统数字标牌解决方案!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        视美泰发布国产化开源鸿蒙系统数字标牌解决方案!

        +
        +
        +
        +  2023-12-13 阅读:54 +
        +
        +

        视美泰发布国产化开源鸿蒙系统数字标牌解决方案?相信不少人是有疑问的,今天深圳市视美泰技术股份有限公司就跟大家解答一下!

        一、方案概述

        视美泰推出基于国产化开源鸿蒙(OpenHarmony)数字标牌方案,旨在解决目前市场上数字标牌系统存在的信息安全性不高、维护成本高等问题。

        二、方案优势

        该方案涵盖了核心主板AIoT-3568A、 Shimeta 数字标牌信息系统,具备以下方案优势:

        1、国产化配置:采用国产化芯片、操作系统及软件,确保信息安全和系统稳定性;

        2、分布式架构:基于OpenHarmony的分布式架构,可以实现多台数字标牌之间的协同工作,提高整体展示效果;

        3、集成能力:与现有信息发布系统无缝对接,支持各种数据源的集成;

        4、可视化编辑:节目采用可视化编辑模式,所见即所得,可轻松自定义界面,实现多种元素的灵活组合与排版,满足多样化的信息发布需求;

        5、节目发布:支持节目灵活发布,可进行轮播或分屏播放,也可分栏目、版块进行互动查询;

        6、多端管控:支持通过PC/移动端实现海量设备统一管理,方便管理员实时监控系统运行状态、发布内容等操作;

        7、多级权限:支持用户自由分配各子账号的管控权限,满足复杂运营管理的需求;

        8、高效节能:采用低功耗设计,可以有效降低能源消耗,符合绿色环保的理念。

        三、方案应用

        主要面向政府机构、银行、医院、园区、校园、商超等多种场景的信息发布需求。

        1、硬件平台AIoT-3568A

        主板配置:

        ①RK3568四核处理器,主频最高2.0GHz,1TOPS算力,搭载OpenHarmony操作系统;

        ②支持HDMI/LVDS/eDP输出,LVDS屏最大支持1920*1200分辨率,EDP屏最大支持2560*1600分辨率,HDMI屏最大支持4Kx2K@60HZ分辨率。支持1路MIPI Camera;

        ③支持1路USB 3.0,5路USB HOST;

        ④支持5路串口(2路TTL、2路RS232、1路RS485),GPIO/CAN/ADC等接口;

        ⑤支持千兆以太网/WiFi/BT/4G/5G(可选)。

        2、Shimeta数字标牌信息系统

        Shimeta 数字标牌信息系统是提供一套通用的媒体信息发布管理平台和终端软件,利用显示屏将企业宣传、产品展示、实时通知等信息全方位展现出来的一种高清多媒体显示技术。

        系统将音视频、电视画面、图片、动画、文本、文档、网页、资讯数据等组合成一段精彩的节目,并通过网络将制作好的节目实时的推送到分布在各地的媒体显示终端,从而将精彩的画面、实时的信息资讯在各种指定场所全方位的完美展现在所需的群众眼前。实现对节目内容的统一制作、发布、审核、终端管理。

        以上就是深圳市视美泰技术股份有限公司小编给您们介绍的视美泰发布国产化开源鸿蒙系统数字标牌解决方案的内容,希望大家看后有所帮助!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/287.html b/news/287.html new file mode 100644 index 0000000..3628fed --- /dev/null +++ b/news/287.html @@ -0,0 +1,362 @@ + + + + +泰安市中心医院党建宣传标牌项目竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        泰安市中心医院党建宣传标牌项目竞争性磋商公告

        +
        +
        +
        +  2023-12-15 阅读:13 +
        +
        +

        一、项目基本情况

        项目编号:2023-DZ-28

        项目名称:泰安市中心医院(青岛大学附属泰安市中心医院、泰山医养中心)党建宣传标牌项目

        采购方式:竞争性磋商

        合同履行期限:详见磋商文件。

        本项目不接受联合体报价。

        二、申请人的资格要求:

        1、满足《中华人民共和国政府采购法》第二十二条规定

        2、供应商应具有有效的营业执照,并在人员、设备、资金等方面具有相应的供货及安装能力;

        3、在“信用中国”(www.creditchina.gov.cn) 及“中国政府采购网”(www.ccgp.gov.cn)网站中被列入失信被执行人、税收违法黑名单、政府采购严重违法失信行为记录名单的供应商,不得参加本项目报价;

        4、本项目不接受联合体报价。

        三、磋商文件发售的时间

        1.时间:2023年12月15日起至2023年12月21日08:30至17:00(节假日除外)。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/288.html b/news/288.html new file mode 100644 index 0000000..0276278 --- /dev/null +++ b/news/288.html @@ -0,0 +1,362 @@ + + + + +农业农村部办公厅关于加强畜禽标识管理工作的通知_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        农业农村部办公厅关于加强畜禽标识管理工作的通知

        +
        +
        +
        +  2023-12-15 阅读:3 +
        +
        +

        各省、自治区、直辖市农业农村(农牧)、畜牧兽医厅(局、委),新疆生产建设兵团农业农村局:

        为深入贯彻落实《中华人民共和国畜牧法》、《中华人民共和国动物防疫法》,加强畜禽标识管理,确保追溯体系有效运行,提升动物疫病防控能力,现就有关工作通知如下。

        一、进一步明确职责强化管理

        地方各级农业农村部门要明确承担畜禽标识管理工作的机构和职责任务,配备相应人员,建立健全登记管理、按需领取、逐级发放、及时注销、定期销毁等工作流程,确保相关岗位职责清晰、责任到人。要规范县级申请、市级审核、省级审批、企业生产、县级签收等环节的管理,及时掌握畜禽标识生产、签收、发放、使用等情况,做到有效供应、有据可查。要加强畜禽标识库存管理,县乡两级库存超过上一年度本区域畜禽出栏量的,本年度不得申请畜禽标识。

        二、推动落实主体责任

        地方各级农业农村部门要大力宣传有关规定要求,进一步明确养殖者申领和加施畜禽标识的主体责任,做到按需申领、按规定加施畜禽标识,妥善保管、不得转让畜禽标识,不使用伪造、变造的畜禽标识。对经补检合格的畜禽,补检地农业农村部门应当及时发放并监督货主加施畜禽标识。

        三、提升信息化管理水平

        各省级农业农村部门要结合畜牧兽医生产经营主体统一赋码及基础信息采集工作,尽快建立省级畜禽标识数据库,开展省部畜禽标识信息共享;要在2024年12月底前将畜禽标识编码信息与动物检疫出证系统中养殖场户基础信息关联,尽快实现养殖场户网上申领标识、免疫档案自动关联标识编码、检疫申报时下拉菜单方式选择标识编码等功能。县级农业农村部门要通过农业农村部相关畜禽标识信息追溯系统(以下简称“追溯系统”)或者APP签收畜禽标识,并逐级发放到乡镇级工作机构和养殖场户,实现签收、发放、加施、使用、注销等信息闭环管理。可使用农业农村部相关畜禽标识APP扫码,或者使用中国兽医网综合查询栏的“畜禽标识查询”功能查验畜禽标识真伪。

        四、加强监督执法

        地方各级农业农村部门要强化产地检疫、指定通道、屠宰入场等环节的畜禽标识真实性查验,对发现的异常情况要及时调查处理;在产地检疫工作中,发现牲畜佩戴的畜禽标识与发放到养殖场户的标识编码信息不符的,不得出具检疫证明;要加大监督执法力度,依法严肃查处转让、伪造、变造畜禽标识,以及运输、销售、屠宰不佩戴畜禽标识的牲畜等行为。各省级农业农村部门要依据《牲畜耳标技术规范(修订稿)》、《家畜用耳标及固定器》(NY 534—2002)规定的检验项目和判定标准,做好畜禽标识质量检查。

        五、强化工作落实

        各省级农业农村部门要在2024年3月底前,集中梳理2021—2023年本地区畜禽标识的申请数量是否与动物免疫、产地检疫、标识库存等情况相符;是否通过追溯系统发放,登记是否完整,乡镇发放记录、养殖场使用记录是否做到账物一致。农业农村部将适时调度情况,及时通报工作进展和存在问题,指导各地落实落细有关要求。

        农业农村部办公厅

        2023年12月12日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/289.html b/news/289.html new file mode 100644 index 0000000..653f3b5 --- /dev/null +++ b/news/289.html @@ -0,0 +1,362 @@ + + + + +首届工业互联网标识应用创新大赛在渝“结硕果”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        首届工业互联网标识应用创新大赛在渝“结硕果”

        +
        +
        +
        +  2023-12-15 阅读:25 +
        +
        +

        12月14日,工业互联网标识贯通创新发展大会暨首届工业互联网标识应用创新大赛总决赛颁奖典礼在渝举行。

        本届大赛由中国信息通信研究院、工业互联网产业联盟主办,是我国首个以“工业互联网标识”为主题、以“创新应用”为主体的大赛,围绕主动标识载体、标识+X、标识全连接工厂三大赛题,挖掘优秀应用。

        大会现场。华龙网记者 梁浩楠 摄


        全国16强在渝决赛

        挖掘优秀标识创新应用


        工业互联网是新型工业化的重要基础设施,工业互联网标识解析体系建设则是我国工业互联网发展战略的重要任务之一,目前正向千行百业赋能。

        本次大赛共向全国征集到292份参赛作品。经过初赛、区域赛、半决赛、总决赛层层角逐,江苏中天互联科技有限公司的《基于标识解析的企业节点集成创新应用》脱颖而出,获得一等奖。

        “在标识应用推广过程中,企业普遍存在上下游产品互相看不懂、众多物料缺少统一编码、企业间无法动态查询、数据无法动态交互等痛点。中天互联探索出企业标识解析节点一体机创新方案,解决了企业在标识应用中的技术、资金等问题,助力企业升级。”中天互联总经理时宗胜介绍。

        此外,大赛还评出二等奖2名,三等奖3名,优胜奖10名,以及最具技术创新奖、最具商业价值奖、最受大众欢迎奖各2名。

        主办方表示,本次大赛总决赛落地重庆,希望汇聚全国工业互联网发展智慧,策源创新思想,立足工业互联网标识国家顶级节点(重庆)、“星火·链网”超级节点(重庆)、F根镜像节点三大基础设施,为数字重庆建设建言献策,同时将重庆工业互联网发展优秀经验案例共享到全国。

        重庆制造业发展门类齐全、底蕴深厚,为工业互联网发展提供广阔空间和丰富的场景。近年来,重庆已形成以国家顶级节点重庆运营中心为原点,多企业百花齐放的企业生态。


        标识应用向全行业贯通

        助力产业链供应链融通化发展


        当前,我国已全面建成工业互联网标识解析体系,从“基础设施建设”发展到“应用规模发展”。在重点领域、行业,随着标识生态的开放度和内部合作紧密度提升,标识生态体系化建设需求呼之欲出。

        在共话标识贯通环节,来自科研院所代表、二级节点企业代表、标识服务商代表、行业协会及联盟的嘉宾围绕这一话题展开探讨。

        “工业互联网已全面融入工业企业仓储、物流、销售等环节,在企业内外部产生了巨大的价值。”中国信息通信研究院总工程师敖立表示,接下来,要推动标识向生产制造、绿色低碳、安全生产等领域应用,打造全国标识标杆应用案例,形成可复制、可推广的商业模式、实施路径,更好地赋能产业数字化。

        在标识推广应用过程中,中国信通院高级专家常如平建议,根据标识的“四性”——身份唯一性、标准性、可信性、可控性,让企业之间、行业之间实现标识统一,让万物有统一的数字身份。“比如,打通各个企业之间的数据,让企业之间的数据流动起来,开发新的商业模式。”

        重庆将如何推动工业互联网标识贯通?中国信息通信研究院工业互联网与物联网研究所所长金键建议,重庆作为国家级顶级节点之一,在基础设施建设方面要继续保持领先的优势。同时,重庆拥有汽车、电子等优势产业集群,可依托产业集群建立工业互联网生态。

        “好的工业互联网生态对整个工业互联网发展非常关键。我们可以基于基础设施优势,面向全球吸引大型企业,以及产业链供应链上的企业来渝。”金键说,重庆可以根据自身实际情况,出台更有针对性、更灵活的政策,让优势产业集群形成更完备的供应链、产业链、价值链。

        金键还建议,要开展更多的产教融合,尤其是对专业性、技能性人才的培养,非常关键。

        值得注意的是,本届大赛正式启动“行百城 赋千园 育万人”中国信通院智能+学院工业互联网标识人才培养计划,将培养更多的专业人才和技术骨干,为我国工业互联网的长足发展筑牢坚实的人才基石。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/29.html b/news/29.html new file mode 100644 index 0000000..cd338b0 --- /dev/null +++ b/news/29.html @@ -0,0 +1,362 @@ + + + + +昆明五华区疾控中心写真、标识牌等非纸质类印刷采购竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        昆明五华区疾控中心写真、标识牌等非纸质类印刷采购竞争性磋商公告

        +
        +
        +
        +  2022-05-10 阅读:2 +
        +
        +

        招标编号:KCGC-2022-05375招标人:昆明市五华区疾病预防控制中心
        资金来源: 国内政府资金

        1.竞争性磋商条件

        本项目五华区疾病预防控制中心写真、标识牌等非纸质类印刷采购,项目资金已落实,采购人为昆明市五华区疾病预防控制中心,本项目为《云南省政府集中采购目录及标准(2021版)》规定的集中采购机构采购项目和部门集中采购项目之外,且单项或批量金额在60万元及以下的项目。现由采购人按照内控、财务制度执行,以竞争性磋商的方式选择本项目的实施单位。

        2.项目概况与磋商范围

        2.1项目名称:五华区疾病预防控制中心写真、标识牌等非纸质类印刷采购;

        2.2供货地址:具体以采购人指定地点为准;

        2.3磋商规模:不超过60万元/年,按实际发生结算;

        2.4磋商范围:选取1家单位负责五华区疾病预防控制中心写真、标识牌等非纸质类印刷,具体要求详见竞争性磋商文件“第五章 采购清单及技术参数要求”。

        2.5服务周期:两年,合同一年一签(具体起止时间以合同签订为准);

        2.6质量标准:符合国家、行业现行的相关法律、法规、规范及标准要求。

        2.7标段划分:本项目只设一个标段。

        3.磋商申请人资格要求

        3.1磋商申请人须具备经国家工商行政管理部门登记注册的独立企业(事业)法人或其他组织,具备有效的营业执照(或事业单位法人证书或其他类似的法定证明文件);

        3.2财务要求:磋商申请人财务状况良好,提供2021年的财务报表(注:新成立的企业按成立后的年份提供);

        3.3具有履行合同所必需的人员和专业技术能力;

        3.4有依法缴纳税收和社会保障资金的良好记录,提供2021年度任意三个月的完税证明及社会保险缴纳证明(新成立的公司按实际成立时间提供);

        3.5磋商申请人及单位法人未被列入“信用中国”网站(www.creditchina.gov.cn)失信被执行人名单、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单及中国政府采购网(www.ccgp.gov.cn)“政府采购严重违法失信行为信息记录名单内。

        3.6本项目不接受联合体。

        4. 竞争性磋商文件的获取

        4.1凡有意参加磋商者,请于2022年5月10日至2022年5月16日(法定公休日,法定节假日除外),每日上午09时00分至11时30分,13时30分至17时00分(北京时间),由单位在册人员持介绍信原件、身份证原件获取竞争性磋商文件。

        4.2竞争性磋商文件每套售价300.00元,售后不退。

        5.竞争性磋商响应文件的递交

        5.1递交竞争性磋商响应文件截止时间(竞争性磋商截止时间,下同)为2022年5月23日14时00分(北京时间)

        5.2本项目的开标将于上述竞争性磋商截止的同一时间同一地点公开进行,磋商申请人的法定代表人或其授权的委托代理人应在竞争性磋商截止时间前递交响应文件,并准时参加开标会。

        5.3未按照竞争性磋商文件规定逾期送达或者未送达指定地点的响应文件,采购人不予受理。
        报名前请发邮件获取报名表
        联系人:徐先生
        手 机:15611300638
        邮 箱:zhaobiaobu66@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/290.html b/news/290.html new file mode 100644 index 0000000..dd0ff9e --- /dev/null +++ b/news/290.html @@ -0,0 +1,362 @@ + + + + +确保降雪期间户外广告牌匾设施安全,北京整改6处隐患_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        确保降雪期间户外广告牌匾设施安全,北京整改6处隐患

        +
        +
        +
        +  2023-12-15 阅读:4 +
        +
        +

        为确保降雪期间户外广告牌匾设施安全,截至目前,全市已巡查广告牌匾2.72万余处,清除户外广告牌匾设施积雪63处,整改安全隐患6处。

        针对本轮降雪天气,为保障市民出行安全,市城市管理委要求各区、各单位加强户外广告设施、牌匾标识和标语宣传品安全维护和应急处置,及时清除户外广告牌匾设施积雪,防止因积雪造成结构变形,导致坠落、倒塌等事故。

        各区组织不间断巡查检查,指导设施设置单位开展自查。记者从市城市管理委了解到,截至目前,全市共出动112个专业队伍、3574人,巡查车辆463台,巡查广告牌匾2.72万余处,清除户外广告牌匾设施积雪63处,整改安全隐患6处。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/291.html b/news/291.html new file mode 100644 index 0000000..8cea43a --- /dev/null +++ b/news/291.html @@ -0,0 +1,362 @@ + + + + +潍坊市城管执法支队组织户外广告牌、LED显示屏安全工作检查_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        潍坊市城管执法支队组织户外广告牌、LED显示屏安全工作检查

        +
        +
        +
        +  2023-12-15 阅读:11 +
        +
        +

        根据山东省气象局12月13日11时天气预报:13日下午到15日,山东省将出现大范围雨雪天气,同时发出大风暴雪和道路结冰橙色预警。为做好大风暴雪极端天气应对与防范,潍坊市城管执法支队提前部署,快速行动,开展对市管户外广告牌、LED显示屏安全工作检查。

        这次安全工作检查采取巡查排查与重点抽查相结合的方法,一是第一时间落实专人通过广告业主群、执法进行时等微信工作群下发通知,发布预警信息和安全排查检查工作要求,强调各区落实安全监管属地责任和广告业户安全运行主体责任。二是检查中特别对直管的16块大型户外广告电子屏,要求落实第三方安全检测制度,并到支队备案。三是定期或不定期组织开展对各广告公司及产权责任单位所属户外广告牌、LED显示屏安全运行工作的抽查,主要是检查各责任单位的工作台账、安全检查记录、隐患排查整改记录以及责任人落实情况等。通过检查抽查不断压实责任,全力确保行业安全运行,杜绝高空坠物等安全事故发生,用心用力守护人民“头顶上”的安全。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/292.html b/news/292.html new file mode 100644 index 0000000..0c3d384 --- /dev/null +++ b/news/292.html @@ -0,0 +1,362 @@ + + + + +民法君“典”案例:安装广告牌时被电击,责任谁来担?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        民法君“典”案例:安装广告牌时被电击,责任谁来担?

        +
        +
        +
        +  2023-12-18 阅读:29 +
        +
        +

        《民法君“典”案例》第一百四十一集聚焦湖南省汨罗市人民法院审理的一起工人安装广告牌时被电伤,诉请广告店和吊车司机赔偿66万余元的民事案件。

        法院经审理认为,一被告广告店作为承接安装广告牌和接受劳务的一方,没有事先作断电处理及配备防护工具,未尽到安全保障义务,应承担50%的责任。二被告吊车司机直接操作车吊臂穿越高压线,未尽到安全谨慎注意义务,应承担35%的责任。原告未佩戴任何防护工具,其自身也存在一定的过错。

        最终,根据民法典第一千一百九十二条规定,法院判决一被告赔偿228763.99元,二被告赔偿160134.79元。二审法院维持原判。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/293.html b/news/293.html new file mode 100644 index 0000000..724b5aa --- /dev/null +++ b/news/293.html @@ -0,0 +1,362 @@ + + + + +珠海街道:细治理严执法,规范户外广告牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        珠海街道:细治理严执法,规范户外广告牌

        +
        +
        +
        +  2023-12-18 阅读:12 +
        +
        +

        为净化市容环境,规范户外广告牌匾秩序,提升城市形象,近日,珠海街道聚焦城市管理重点、难点问题,开展户外广告规范整治行动,持续提升辖区城市品质和群众满意度,进一步提升城市精细化管理水平。

        整治前,珠海街道召开工作部署会议,要求加强重点问题、重点区域巡查,严格按照“先教育、再处罚”“先主要区域、再全面覆盖”的工作思路,对跨门经营、占道经营、乱摆乱放以及违规设置广告牌匾、乱贴乱画等重点问题进行整治。同时,珠海执法中队利用“公众开放日”活动平台,积极宣传相关法律法规,充分调动广大居民维护市容秩序的主动性,提高居民自觉维护市容秩序的参与度。

        在整治过程中,工作人员坚持宣传教育和规范整治同步,按照一街一景的设置规范要求,对违规设置户外广告的商户及时进行教育整改。对于大型户外广告、屋顶广告、违规设置的门头牌匾等加强日常巡查整治,并将日常管理责任精细到每一个责任区、每一条道路、每一块广告牌,真正做到排查有速度、措施有力度、整改有深度,从根源上减少违规设置广告、占路立牌广告等问题的出现。

        下一步,珠海街道将持续抓实抓好细节问题,从普法宣传、日常巡查等各个环节入手,进一步强化市容秩序管理,规范户外广告设置,确保市容市貌整洁有序,为广大居民提供安全、宜居的生活环境。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/294.html b/news/294.html new file mode 100644 index 0000000..3b86c37 --- /dev/null +++ b/news/294.html @@ -0,0 +1,362 @@ + + + + +大连:小小标识牌成乡村振兴“新名片”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        大连:小小标识牌成乡村振兴“新名片”

        +
        +
        +
        +  2023-12-18 阅读:8 +
        +
        +

        近日,大连市普兰店区皮口街道17个村(社区)的村庄标识牌全部建成。一个个标识牌外形和谐美观,位于进村入屯的显著位置,“党建引领乡村振兴”主题明晰,形成了进入乡村的第一道靓丽风景线。

        打开趣头条,查看更多精彩图片 >

        平岛社区标识牌(央广网记者 于芳菲 摄)

        “以往皮口街道各村社区的村口没有特别的标识,寻路时常是外乡人的一件难事,让往来旅客摸不着头脑,也不利于当地经济文化的发展,现在好了,哪个村在哪里,发展什么经济都一目了然。”大岭社区的董克仁书记看着新建成的大岭社区标识牌,笑容满面地对记者说。

        近年来,皮口街道大力推进人居环境整治,乡村面貌焕然一新,村庄标识牌作为乡土文化的重要组成部分,影响着外来人对村庄的第一印象。17个村(社区)的标识牌不仅在设计上与当地环境景色相互映衬,且结合了当地突出的特色文化产业元素,既对来往路人起到了指示作用,又展现了乡村特色产业的缩影,成为了村庄的“新名片”。

        今年,皮口街道以党建为引领组建了五个产业联合党委,培育村级集体经济增长点。五个产业联合党委的中心村标识牌设计中,都巧妙融合了产业联合党委的特色产业元素,其中大岭社区作为农机产业联合党委的中心社区,标识牌上策划了车轮、收割机和谷物的元素,展示出当地在农业作业方面的集体化、规模化、现代化。

        大岭社区标识牌(央广网记者 于芳菲 摄)

        皮口街道相关负责人表示,美丽乡村标识牌是乡村振兴文化宣传的精神堡垒,也是伫立在村口凝望后续经济发展的引路人。接下来,皮口街道将继续以党建为引领,拓宽村集体经济发展渠道,为乡村振兴注入新动能,致力于打造产业兴旺、生态宜居、乡风文明、治理有效、生活富裕的美丽乡村。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/295.html b/news/295.html new file mode 100644 index 0000000..875b233 --- /dev/null +++ b/news/295.html @@ -0,0 +1,362 @@ + + + + +山重建机有限公司挖掘机标牌及图形标志张贴外包项目更正公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        山重建机有限公司挖掘机标牌及图形标志张贴外包项目更正公告

        +
        +
        +
        +  2023-12-19 阅读:10 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:SZXMZB090-2023

        原公告的采购项目名称:山重建机有限公司挖掘机标牌及图形标志张贴外包项目

        首次公告日期:2023年12月04日 

        二、更正信息

        更正事项:采购公告

        更正内容:

        本项目的报名时间、获取招标文件时间和开标时间调整。具体更正内容如下:

        1.报名时间:2023年12月18日17:00前,更正为:2023年12月27日17:00前。

        2.获取招标文件时间:2023年12月4日-2023年12月18日(每天上午8:30-11:30;下午14:00-17:00,北京时间,法定节假日除外。),更正为:2023年12月4日-2023年12月27日(每天上午8:30-11:30;下午14:00-17:00,北京时间,法定节假日除外。)

        3. 开标时间:2023年12月19日9:00,更正为:2023年12月28日9:00。

        更正日期:2023年12月18日。 

        三、其他补充事宜 

        1. 本次更正公告在阳光采购服务平台(http://www.ygcgfw.com)、山重建机有限公司官方网站(https://www.strongest.cn)、“山重建机”微信公众号上发布。

        2. 本更正公告作为招标文件的组成部分,与原招标公告、招标文件具有同等法律效力,原招标公告、招标文件其他内容不变。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/296.html b/news/296.html new file mode 100644 index 0000000..ad82984 --- /dev/null +++ b/news/296.html @@ -0,0 +1,362 @@ + + + + +2023年中国大陆数字标牌市场将达65.2万台,增长29.6%;2024年预测再涨10%_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023年中国大陆数字标牌市场将达65.2万台,增长29.6%;2024年预测再涨10%

        +
        +
        +
        +  2023-12-20 阅读:128 +
        +
        +

        2023年正在进入收官阶段,在过去的近一年里,中国中央和各地政府积极推动一系列促消费政策落地,促进家居、汽车、电子、餐饮等重点领域消费提升,消费的恢复带动了广告投放的需求。2023年前三季度,中国大陆广告市场同比增长了5.5%。而广告,则是数字标牌产业的核心动力。

        广义的数字标牌市场方案相当多样化,范围涉及宽泛,详见文末。本文中的数字标牌为狭义范围,根据场景分为户内和户外液晶数字标牌。户内液晶数字标牌包括梯媒和非梯媒产品,非梯媒产品包括立式、壁挂式、卧式数字标牌、电子餐牌、电子水牌、海报机等。户外液晶数字标牌产品仅统计户外液晶数字标牌一体机产品,不包含LED屏,液晶拼接墙等大型显示产品。

        根据洛图科技(RUNTO)数据显示,2023年全年,中国大陆数字标牌的出货量将达到65.2万台,同比增长29.6%

        从使用场景来看,户内仍是主流,全年的出货占比将超过97%。

        户内数字标牌以梯媒和非梯媒分开来看,非梯媒的占比超过65%。从产品尺寸来看,20-29寸、40-49寸为主流尺寸,合计出货量占到户内市场的53%。

        户外数字标牌方面,随着国家大力发展智慧社区、智慧校园和数字文化产业,产品已经大量应用在信息传递、动态展览、广告投放和文化传播等方面。2023年,社区、传媒、旅游及展馆应用领域的出货量将占中国大陆户外数字标牌整体市场的67%左右。

        2024年的中国市场将继续保持增长态势。洛图科技(RUNTO)预测全年出货量将达到71.6万台,同比增长9.8%。

        2021-2024 中国大陆液晶数字标牌市场出货量

        据来源:洛图科技(RUNTO),单位:千台,%

        数字标牌的节能趋势

        数字标牌产品在全球商业垂直领域的应用不断增加,发达国家的快速数字化对市场增长的推动力不可忽视。然而,这些国家对于产品的能源消耗要求也比较苛刻,由此,节能型数字标牌产品逐渐成为市场的发展趋势之一。

        随着电子纸的彩色化和大型化,数字标牌产品越来越多地开始采用电子纸显示屏幕。根据洛图科技(RUNTO)数据显示,2023年,全球电子纸数字标牌的出货量将达到12.7万台,而到2027年有望达到30.4万台,复合增长率为19.1%

        2022-2027 全球电子纸数字标牌市场出货量

        数据来源:洛图科技(RUNTO),单位:千台

        在中国市场,城市的数字化升级和节能改造对各个品牌商及其数字标牌产品来说,既是机遇,也有要求。头部品牌如康佳、TCL等正在把可持续发展的理念融入企业生产、经营的各个环节,在打造绿色产品、新能源、新技术等方面上发力。

        未来的市场发展中,新型的节能数字标牌产品有望在“双碳”大势下脱颖而出,确立其市场的领导地位。

        产品图谱

        数字标牌市场分为户外和户内产品。

        户外产品包括户外墙/大屏(如LED屏、投影墙、拼接墙等设备)、户外显示中小屏(如落地产品、电子站牌、阅报栏等产品),以及功能性自助设备(如智能充电桩、快递柜、智慧垃圾桶等)。

        户内产品多指梯媒显示、非梯媒的壁挂式、立式、卧式等显示产品、以及功能性自助设备(如缴费机、互动营销桌、导览查询等自助设备)。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/297.html b/news/297.html new file mode 100644 index 0000000..e4d6426 --- /dev/null +++ b/news/297.html @@ -0,0 +1,362 @@ + + + + +《2023激光显示产业高质量发展白皮书》正式公开发布_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        《2023激光显示产业高质量发展白皮书》正式公开发布

        +
        +
        +
        +  2023-12-20 阅读:111 +
        +
        +

        今年9月19日,2023全球激光显示技术与产业发展大会在青岛举行,大会由山东省工业和信息化厅、青岛市人民政府主办,中国电子视像行业协会、青岛市工业和信息化局承办。

          大会之上,中国电子视像行业协会执行会长郝亚斌和激光显示产业分会会长、海信激光显示股份有限公司董事长高玉岭共同发布了《2023激光显示产业高质量发展白皮书》。这是中国电子视像行业协会激光显示产业分会继《2021激光显示产业发展及用户体验运营白皮书》、《2022全球激光显示产业链发展及国家区域竞争力白皮书》之后又一年度的重磅研究。

          随后,中国电子视像行业协会副秘书长董敏做了现场解读,白皮书从市场、供应链、知识产权、用户认知、多元化触点等六个方面,全面展示了全球激光显示产业高质量发展风貌。

          激光显示产业高质量发展的时代意义

          显示无处不在的时代已经来临。以激光显示为代表的新型显示产业作为国民经济与社会发展的战略性、基础性和先导性产业,是决战未来、关系全局、影响深远、战略必争的高技术领域,其高质量发展对促进我国产业结构调整、实施创新驱动发展战略、推动经济发展提质增效具有重要意义。

          激光显示产业表现出高质量发展的新特色和新格局,在核心器件、显示技术、整机制造、产品生态等方面逐步实现了突破 。核心器件方面,目前LCOS芯片、光学膜片、超短焦镜头等基本实现了本土化;显示技术方面,光源设计、光机模组、整机设计等关键环节技术领先;专利方面,中国申请和授权的激光显示专利数量全球领先;标准化方面,我国制定了激光显示国际标准和多项激光电视行业标准;产业生态方面,一大批上下游产业链企业涌现。在产业链上下游的共同努力下,我国激光显示产品日益丰富,产业链供应链韧性和安全水平稳步提高,国内品牌激光电视在全球市场表现优秀,彰显了我国激光显示产业强大的创新能力。

          中国激光显示产业高质量发展的水平体现

          中国正走在全球激光显示产业发展的前沿 。根据洛图科技(RUNTO)数据显示,2023年,全球激光显示市场规模有望达到184万台;中国已是全球最大的市场,出货量占比达到49%。

        2023-2027年 全球及中国激光投影市场出货规模

          数据来源:洛图科技(RUNTO),单位:万台

          激光显示成为中国高端制造的出海名片 。2020到2022年,海外市场激光显示产品出货量的复合增长率高达37.4%;2023年上半年,激光电视产品在一带一路沿线的主要销售区域,如新加坡、印度尼西亚、俄罗斯、马来西亚、沙特阿拉伯、阿联酋等地方,实现了数倍的规模增长。

          中国品牌实现在高端大屏领域的“弯道超车” 。2023年上半年,以海信、长虹、峰米、坚果等为代表的大陆品牌在全球激光投影市场的份额达到45.8%;全球激光电视市场TOP3品牌均为中国企业,合计份额为67.7%。

          中国激光显示原创技术专利申请量居全球第一 。截至2023年8月31日,中国激光投影显示专利数量超2万件,全球排名第一;中国三色激光光源技术专利,全球遥遥领先;中国屏幕专利数量,筑起明显优势。

          中国激光显示场景化全域崛起 。主流应用场景家用、工程、商务、教育在2023年上半年继续高歌猛进,分别收获20%-40%的同比增长;未来,激光显示还将在医疗、虚拟显示、航空、车载等等领域以崭新的形态发挥更大的潜力。

          消费者对激光显示产品的认知度不断提升 。中国用户购买激光电视时,首先考虑大屏护眼。激光显示已经成为了用户获得高端视觉体验、提升生活品质的最佳解决方案之一。

          全产业链重点企业共同编撰

          一年一度的《白皮书》希望使之成为激光显示产业供应侧和需求端定之有则、行之有效的依据文件,得到了全产业链重点企业的共同参与。

          《2023激光显示产业高质量发展白皮书》参编单位包括中国电子视像行业协会激光显示产业分会、青岛海信激光显示股份有限公司、深圳光峰科技股份有限公司、四川长虹激光显示科技公司、中国华录集团 有限公司、中光学集团股份有限公司、成都菲斯特科技有限公司、杭州中科极光科技有限公司、杭州科汀光学技术有限公司、宁波激智科技股份有限公司、成都极米科技股份有限公司、扬州吉新光电有限公司、深圳市火乐科技发展有限公司、中山联合光电科技股份有限公司、上海唯视锐光电技术有限公司、艾弗堤西科技(深圳)有限公司、江苏舜合物联网科技有限公司、上海凝汐智能科技发展有限公司、青岛海尔多媒体有限公司、芯鼎微(中山)光电半导体有限公司,以及科技产业调查机构洛图科技(RUNTO)等。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/298.html b/news/298.html new file mode 100644 index 0000000..d573046 --- /dev/null +++ b/news/298.html @@ -0,0 +1,362 @@ + + + + +联想针对数字标牌等设备,推出 Chromebox Micro 迷你主机_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        联想针对数字标牌等设备,推出 Chromebox Micro 迷你主机

        +
        +
        +
        +  2023-12-20 阅读:19 +
        +
        +

        IT之家 12 月 5 日消息,联想公司今天针对地铁、商场等高人流量场景下,24/7 全天候数字标牌等设备,推出 Chromebox Micro 迷你主机。

         

        Chromebox Micro 迷你主机采用无风扇设计,可以外接两台 4K 分辨率显示器,可紧贴安置在狭小空间内。

        Chromebox Micro 迷你主机配备了丰富的连接接口,包括 USB-C、USB-A 和 HDMI 端口,以及用于简单安装的螺丝孔。

        联想还和 Instorescreen 合作,专门为 Chromebox Micro 打造了 15.6 英寸和 21.5 英寸尺寸的 inFLEX 显示器。

        这些显示器背面配有专用的凹槽,恰好可以容纳 Chromebox Micro 迷你主机,并能高效收纳各种连接线缆。

         

        联想 Chromebox Micro 专为大规模部署而打造,提供简单的远程管理。它与 ChromeOS 自助服务终端和数字标牌升级集成,可以轻松设置和控制多个自助服务终端单元。

        此外,ChromeOS 零接触注册功能简化了预配置设备的部署,从而增强了部署过程。该设备紧凑而坚固的构造,结合 ChromeOS 的用户友好和安全平台,可显著降低联想 Chromebox Micro 的总拥有成本。

         

        联想计划 2024 年第 1 季度在部分市场推出 Chromebox Micro,起售价为 219 美元


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/299.html b/news/299.html new file mode 100644 index 0000000..82bafc5 --- /dev/null +++ b/news/299.html @@ -0,0 +1,362 @@ + + + + +合川区人民医院2024-2025年零星标识标牌设计制作安装维护服务供应商招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        合川区人民医院2024-2025年零星标识标牌设计制作安装维护服务供应商招标公告

        +
        +
        +
        +  2023-12-21 阅读:68 +
        +
        +

        一、采购方式:竞争性比选 采购执行编号:2023087

        二、项目详情概况

        项目描述详情及简要技术要求见附件

        三、供应商资格要求

        参与采购活动的供应商需满足以下条件

        (一)基本资格条件

        1、具有独立承担民事责任的能力;

        2、具有良好的商业信誉和健全的财务会计制度;

        3、具有履行合同所必需的设备和专业技术能力;

        4、有依法缴纳税收和社会保障资金的良好记录;

        5、三年内在经营活动中无重大违纪记录;

        6、法律、行政法规规定的其他条件。

        四、获取采购文件的地点、方式、期限及售价

        获取文件期限:2023年12月19日 至 2023年12月27日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/3.html b/news/3.html new file mode 100644 index 0000000..30ff712 --- /dev/null +++ b/news/3.html @@ -0,0 +1,362 @@ + + + + +户外广告会成为手机品牌的倾心之选吗?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        户外广告会成为手机品牌的倾心之选吗?

        +
        +
        +
        +  2022-04-29 阅读:15 +
        +
        +

        自智能手机时代开启,户外就成为了手机品牌的传播阵地,随后国产智能手机华为、小米、VIVO和OPPO等品牌逐渐成为市场消费和传播的焦点,智能手机市场也随之白热化。

        不久前,苹果手机退出俄罗斯市场的消息发出,曾引发了热议。据俄国相关媒体报道,华为、荣耀、中兴、OPPO和VIVO等中国智能手机在俄罗斯市场销售额上涨,Realme手机也增长了80%,这预示着中国智能手机将会迎来新的发展契机。从品牌营销的侧面看来,这种智能手机市场波动,也正在影响着品牌广告的营销预算与媒介布局。

        国产手机品牌竞争激烈

        不久前,《2022年中国内地市场高端手机消费者调研报告》数据显示,近一年苹果手机用户有22.0%来自小米,35.6%用户来自华为。不过,有27.5%的用户表示购买iphone是出于猎奇尝鲜,42.4%的苹果新用户认为购买苹果的原因是其流畅性更好。可见,智能手机市场激烈,国产手机品牌的市场竞争力还需要进一步提升。

        特别是品牌高端化印象中,国产品牌的高端化印象较低,“国产品牌高端手机有23%的苹果新用户表示下一部手机会选择华为,有65.7%的用户会选择继续购买苹果,下一部手机选择苹果的用户中包含了71.1%的原华为用户”。以上数据是智能手机品牌市场快速竞争迭代角逐的体现,未来国产手机也会不断持续升级,不断创造更多新增长点。特别在消费者持续升级的时代,手机品牌需要不断挖掘消费痛点,迭代产品,同时通过广告进行品牌曝光,挖掘新的生存空间。

        手机新品发布吸睛利器

        乐于尝新、追求新鲜挑战、寻求发展是当今的典型消费需求,而手机品牌持续推陈出新,密集发布新品进行角逐,是在通过告知品牌持续追求自主创新发展理念,满足受众对手机外观、性能、系统、拍照等功能更新换代的硬需求,同时也是占领市场份额的集中表现。

        除了通过创新发展的方式传播产品魅力之外,投放户外广告做曝光宣传也成为手机新品发布的主要阵地。今年年初,搭载全新一代处理器的荣耀手机,在产品发布前强势布局线上预热,同时亮灯城市地标户外LED大屏进行传播,广泛的线下人群曝光,引发线上二次讨论,使产品充满期待。另外本次荣耀手机的卖点是在“低光条件下出色的拍照效果”,与LED大屏高清出色的显示效果十分契合。

        户外媒体尤其是核心商圈LED广告,其地理位置不可替代性,能快速广泛覆盖人群,扩大品牌声量,也成为了品牌快速抢占市场的关键。华为P50 Pro新机发布,同样借力地标户外媒体进行曝光,强大的视觉冲击力和造势能力,诠释了华为新折叠机型、新色上市的阵势,拉近与城市受众的距离。同样,回顾其他国产智能手机品牌如小米、VIVO等,户外媒体也成为了新机发布和俘获受众关注不可或缺的阵地。

        为手机品牌重塑沟通场景

        对手机品牌来说,投放户外广告的主要原因是借助大屏的传播力量引爆圈层,打造宣传和抢占心智的目的。而随着消费主流人群的年轻化、信息传播同质化,追求酷炫视觉效果、互动效果的户外广告更能引发消费者沟通,实现破圈传播。

        技术创新使得户外媒体实现从小屏到大屏的升级,巨大的视觉画面,让手机广告融入世界场景,广告创意灵活,让广告产生沉浸式冲击效果。如苹果、华为、小米等手机品牌多年来在海内外布局的大屏广告,无疑以超大的画面,冲击着每一位受众,产生过目不忘的效果。

        社交、互动需求也是人类的天性,巨型静态户外广告冲击着每一位受众眼球,而互动户外广告同样赋予了广告亲切的沟通场景,打破冰冷的手机印象,升温品牌情感价值。如华为手机为传播智慧屏幕的产品特点,将智慧屏幕搬到户外公交站台前,等车的受众点击屏幕即可随机“拨通”大屏另外一端同样按下“接通按钮”的陌生人,并通过互相赞美对方的形式参与活动。可见广告能够在受众深度互动中完成智慧屏幕的传播,加深产品的情感连接,实现破圈。

        户外广告不是只有冰冷的屏幕,它还有更多链接用户的科技化、智能化技术,打破人与人、人与品牌距离的智慧之处,未来的户外广告也将会持续爆发出未曾想象的潜力,助力品牌释放价值。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/30.html b/news/30.html new file mode 100644 index 0000000..64fa1c0 --- /dev/null +++ b/news/30.html @@ -0,0 +1,362 @@ + + + + +全球首款裸眼悬浮3D广告机落户高铁西安北站_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        全球首款裸眼悬浮3D广告机落户高铁西安北站

        +
        +
        +
        +  2022-05-12 阅读:34 +
        +
        +

        西安北站作为亚洲第一高铁站,已成为城市交通的核心和人流转换的中心,以西安北站为原点的高铁越开越多,每天至少有20万人次穿梭于此,每秒钟就有2位乘客坐高铁到达或离开,年旅客流量高达1亿人次。作为西北地区最重要的铁路客运枢纽,西安北站也与华北、华中、华东、华南、西南等地区紧密联系在一起,并与北上广深等中心城市构筑起“一日交通圈”。西安作为中国铁路枢纽的地位也愈发凸显,更为城市发展带来巨大的机遇。

          陕西皓伦文化传媒是以“元宇宙”广告产品为中心,选择全球人流量最大的交通枢纽,投资经营管理的“独角兽”传媒企业。公司计划在全国200多个高铁站全面铺设,每个高铁站投放50台左右,全国预计投放近万台裸眼悬浮3D广告屏。全部落成后,皓伦文化传媒无疑将成为全国最大的“悬浮3D高铁广告商”。

          为实现西安北站必经通道裸眼悬浮3D广告全覆盖,陕西皓伦文化传媒计划投放50块不同尺寸的裸眼悬浮3D广告屏(含液晶面板及led面板),共分两期投资完成,现已完成12台86寸液晶裸眼悬浮3D广告屏,分布在所有进出口及贵宾通道;其余设备将在两月内安装完成。待全部落成后,西安北站将成为首个元宇宙级悬浮3D广告的展示中心,真正实现悬浮3D广告的无缝衔接,其元宇宙广告理念所产生的视觉冲击力,颠覆了传统广告屏的显示形态,不仅成为高铁站新亮点,通过科技与艺术感的显示效果更有助于广告传播。

          裸眼悬浮广告屏是天马辉裸眼悬浮3D“10+2”产业之一,主要由裸眼虚拟3D及裸眼悬浮3D两大类组成,可应用于户外及户内,100寸以下釆用液晶面板,100寸以上(最大尺寸不限)为LED显示面板。西安北站裸眼悬浮3D的落成,为天马辉悬浮3D在数字展板及广告行业的发展奠定了坚实的基础,也为裸眼悬浮3D在其他行业的应用起到了很好的宣传作用。天马辉裸眼悬浮3D“10+2”的产业落地正在按计划推进,欢迎更多的“裸眼悬浮3D”爱好者加盟天马辉,携手聚势共赢,天马辉因您而辉煌。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/300.html b/news/300.html new file mode 100644 index 0000000..e43194c --- /dev/null +++ b/news/300.html @@ -0,0 +1,362 @@ + + + + +飞利浦二合一电子墨水显示器荣膺电子纸创新应用“首创奖”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        飞利浦二合一电子墨水显示器荣膺电子纸创新应用“首创奖”

        +
        +
        +
        +  2023-12-22 阅读:25 +
        +
        +

        “2023「新视界·无纸境」第一届电子纸产业创新应用论坛”于深圳国际会展中心圆满落幕。本次论坛活动在电子纸产业联盟的引领指导下,由CINNO·ePaper Insight与IOTE物联网展携手合作主办,众多电子纸产业链上下游企业受邀与会。

        其间,对于电子纸产业内过去20年间的创新应用,论坛也首次举办了电子纸创新应用“首创”颁奖典礼,并为其颁发了“首创奖”。经过层层评选,飞利浦推出的革命性创新产品——行业内首款二合一电子墨水显示器24B1D5600一举斩获电子纸创新应用“首创奖”!

        CINNO·ePaper nsight为CINNO Group 旗下专注电子纸产业链观案的子品牌,专注于电子纸产业深度观察,2017年开始调研并流理电子纸产业发展相关的多维度数据,2023年负责主笔并汇编了首部电子纸产业“百科全书”——《电子纸产业蓝皮书》,一路见证了电子纸产品的起源与发展。

        本次论坛聚焦于电子纸产业生态链中的全新技术、创新应用和未来发展方向,并就其技术、产业应用和市场商业模式等领域,进行了相关专题演讲,进一步向大家展现了电子纸产业在绿色、低碳、可循环的数字化时代的重要性和广阔的应用前景。

        近20年来,全球电子纸生态持续不断迭代,推动着新材料、新视野、新技术的应用边界;20年后,这次产业界的“首创“颁奖典礼更成为了一次产业聚会和历史盘点,旨在回顾和发布过往全球范围内电子纸创新应用领域的每一个“第一”,并为电子纸行业培育长期、稳健、可持续的创新文化。

        在众多优秀科技产品中,飞利浦24B1D5600能够成功脱颖而出,广获大众认可并喜提“首创奖”,这正是对该产品实力的认可。值得一提的是,此次颁发的荣誉证书则由一块动态的彩色电子纸屏幕展现,不仅突显了科技与创新的结合,更是彰显了对电子纸技术的前瞻应用。

        接下来,就让我们一起了解下24B1D5600都有哪些优势吧~

        创新亮点:

        24B1D5600极富创新性地将23.8英寸的2K液晶屏和13.3英寸的电子墨水屏进行组合,通过双屏互补的方式,满足了用户多场景的需求,兼顾了彩色与护眼,丰富了电子纸在显示器领域的应用品类。

        24B1D5600双屏的设计让用户可以在使用时根据不同内容调整显示窗口,以获得最合适的使用体验:图片、视频等内容可以在液晶屏上进行观看,文字量大的内容可以通过辅助电子墨水屏来阅读。双屏转换,双效合一。既能满足用户对于彩色观感的需求,同时也能满足护眼的要求,更是有效解决了液晶屏不够护眼、单一墨水屏刷新率低、单色等痛点,带来多线程任务的便捷处理方案。

        无论是编辑等需要处理大量文字的用户,还是IT从业者、剪辑师等追求高效办公的用户,这款显示器都能带来令人满意的使用体验。

        此次,飞利浦24B1D5600喜获大奖,不但是一份荣耀,更是一种鞭策。未来,飞利浦将加大在商用显示器领域的持续投入,不忘初心,坚持“创新为你”,通过更智能、更丰富、更卓越的商用产品,为行业用户带来更优质的体验!


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/301.html b/news/301.html new file mode 100644 index 0000000..c36aa86 --- /dev/null +++ b/news/301.html @@ -0,0 +1,362 @@ + + + + +中银立式广告机数智助力陕西交通控股集团打造品牌形象_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中银立式广告机数智助力陕西交通控股集团打造品牌形象

        +
        +
        +
        +  2023-12-22 阅读:43 +
        +
        +

        在当今数字化、信息化的时代,广告形式的多样性以及高效的传播方式成为了商业运营的重要一环。立式广告机作为一种集视频、音频、图片、文字等多元素于一体的多媒体展示设备,已经在众多领域中得到了广泛的应用。

        陕西交通控股集团有限公司是陕西省政府出资设立的大型国有独资企业,其咸铜分公司近日也配置安装中银55寸立式广告机,旨在通过创新和综合开发,提升该集团运营领域的竞争力,打造品牌形象。


        实际应用优势

        ·智能交互提升品牌形象

        立式广告机作为对内向外的信息展示平台,能够以高清、高质的视频和图片展示陕西交通控股集团企业形象、产品特色和服务优势,提升品牌知名度和美誉度。此外,通过触控互动技术实现与访客的互动,让访客能够更加深入地了解企业的相关信息,从而提高访客的满意度和体验感,提升企业在来访客户和公众心目中的品牌形象。

        ·远程管理提高工作效率

        搭载多媒体信发系统,陕西交通控股集团管理员可以通过远程管理功能,进行统一管理和调度,实现统一的内容更新、播放计划等,实时更新展示最新动态、政策公告、项目进展等信息,使来访客户和公众能够及时获取最新的信息,提高了管理效率。同时,实现广告机的自动控制和智能化管理,及时发现问题并进行处理,确保广告机的正常运行。

        ·多场景应用灵活便捷

        一体化设计+可选择移动支架+轻便的设计,使得立式广告机具有可移动属性,可以随时调整位置,使得大厅空间利用更加合理、高效。并灵活移动到不同的场所,企业可以根据需要,将广告机移动到会议室、展厅、前台等不同场景。

        并通过内容定制化,根据不同的场景和需求,展示不同的信息。例如,在大厅可以展示企业最新信息、在节假日展示假日短片、在前台可以展示外来访客欢迎海报等内容。

        当前,中银立式广告机已然成为的重要信息展示工具,广泛的应用在商业中心、机场、火车站、地铁站等公共场所,以及企业展厅、会议室等领域。随着数字化和智能化的不断推进,数字显示终端立式广告机将会与人工智能、大数据等先进技术相结合,不断升级助力信息展示和品牌推广。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/302.html b/news/302.html new file mode 100644 index 0000000..21b0967 --- /dev/null +++ b/news/302.html @@ -0,0 +1,362 @@ + + + + +2024广州光影显示展启动发布会圆满举行_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2024广州光影显示展启动发布会圆满举行

        +
        +
        +
        +  2023-12-22 阅读:56 +
        +
        +

        由上海市多媒体行业协会、法兰克福展览与广东科展国际展览有限公司联合主办的2024广州国际数字光影及智能显示应用展览会(以下简称“2024广州光影显示展”)将于2024年5月23-26日在中国进出口商品交易会展馆B区12.2号馆隆重举办。

        12月21日,2024广州光影显示展启动发布会在上海WWAC奇观艺术中心圆满举行。会上,主办单位重磅官宣了展会的亮点、最新规划与筹备情况,在访谈环节中,多位业界领军者结合企业实际案例,与大家一同畅谈数字光影及智能显示应用的市场发展前景。

        展会

        多方赋能 展会亮点纷呈

        近年来,数字文旅、沉浸式光影、多媒体互动、智能显示等前沿技术与应用方案日益成为数字浪潮中的新蓝海。12月15日,国家七部门联合发文《关于加快推进视听电子产业高质量发展的指导意见》,支持城市更新中打造沉浸式项目和空间,支持博物馆、乐园、体育馆试点沉浸式光影导览。

        在当前的发展机遇下,数字光影显示行业亟需一个集商贸对接、品牌推广、技术交流、创意展示、资源信息共享等多功能于一体的优质平台,助力业界实现新技术创新、新产品培育和新业态发展,这正是广州光影显示展举办的初衷。


        上海市多媒体行业协会秘书长明豪侠先生致辞

        发布会上,上海市多媒体行业协会秘书长明豪侠先生指出:协会希望通过举办2024广州光影显示展,为会员提供更好的服务和支持,让他们有机会与行业买家进行深入互动,探讨合作机会,促进业务发展与产业转型。


        法兰克福展览(香港)有限公司副总经理张菁女士致辞

        作为广州光影显示展的联合主办单位,法兰克福展览和广东科展国际展览有限公司深耕娱乐音视频行业21年,在全球商贸网络、政府科技资源以及展会运营经验等方面具有深厚积累。法兰克福展览(香港)有限公司副总经理张菁女士表示:数字光影和智能显示技术在多个应用领域不断推出创新的产品和服务,主办单位希望广大参展企业和观众能够在2024广州光影显示展上共同探讨行业发展趋势,分享最新的技术和解决方案,推动行业向前发展。


        广东科展国际展览有限公司总经理马静女士致辞

        广东科展国际展览有限公司总经理马静女士认为,展会成功举办的三要素是:天时、地利、人和。广州光影显示展如今已完全具备这三要素——国家政策上的多重利好,叠加三方主办单位的雄厚实力与各自优势,2024广州光影显示展可谓集行业、专业、国际、政府、地区优势于一身。

        发布会上,法兰克福展览(上海)有限公司展会经理柯迪先生向大家介绍了2024广州光影显示展的全新亮点与规划:本届展会将坚持以需求为导向,连接顶尖行业软硬件解决方案供应商与数字内容创作者,深度聚焦数字光影及智能显示在文化、旅游、教育、视觉艺术、影视、零售和电子商务、汽车、医疗、娱乐、新媒体等各个领域的应用。

         

        法兰克福展览(上海)有限公司展会经理柯迪先生介绍展会情况

        柯迪先生更为大家介绍:展会将与深耕娱乐演艺音视频行业21载、全球同类展会中规模最大的第22届广州国际专业灯光、音响展览会同期举办。选择一个展会最重要的考虑因素之一是观众资源,就这一方面来说,广州光影显示展可谓是站在巨人的肩膀上。在灯光音响展的加持下,2024广州光影显示展将得以承接超过10万名来自娱乐演艺、商用安装、文旅、教育、政企及民用6大板块的专业买家群体,并触及遍布全球约180个国家及地区的国际销售网络和50多家专业媒体资源。加之第20届广州国际乐器展览会也将在同期拉开帷幕,三大展会强强联袂,共设26大主题展厅,展览总面积达25万平方米,共享超过15万名相关行业专家与买家资源。

        共议行业变化 抢占数字光影浪潮先机

        随着全球数字化转型的加速,数字光影及智能显示应用的市场发展有着怎样的潜力?对此,在发布会现场,上海市多媒体行业协会秘书长明豪侠先生与上海幻维数码总经理唐昊先生、上海维迈股份董事长陈章勤先生、上海晶创清图总经理丁英女士、上海显仕光影总经理朱雪松先生、上海迪恒股份市场总监陈卓先生一同进行了深入探讨。


        如今,北京、上海、广州等国际大都市都将光影节全力打造为城市文旅商贸新品牌,各城市致力于将显示技术和数字制作运用于城市更新成果展示、文化空间沉浸式体验等新场景,数字光影和智能显示市场大有可为。上海幻维数码总经理唐昊先生从亲自设计的各大光影秀中发现,光影秀中的技术建设和文化叙事一直在突飞猛进,优秀、创新成果众多,海内外相关团队、专家、艺术家等对行业有很多建设性的想法,“那么,我们现在就亟需一个平台,将所有行业建设成果加以展示,获取更多海内外新鲜智慧,才能做出更有趣的光影显示作品。”

        上海显仕光影总经理朱雪松先生认为,多媒体行业自上海世博会后,一直处于欣欣向荣的状态,发展至今,应用市场更加广阔:各类型的艺术空间、娱乐游戏、教育培训,甚至是室内外体育活动等等。他也希望,上海市多媒体行业协会的伙伴们可以走出上海,到广州光影显示展进行产品输出,共同开拓市场。

        近几年,民族品牌的光影设备正在市场上快速崛起。在迪恒技术股份有限公司市场总监陈卓先生看来,无论是在产品端、还是在技术端,优秀的国产品牌已经快速突破并提升,甚至部分优秀国产品牌的部分机型在市场上的竞争力已经远超老牌的进口机型。而光影市场要实现更大突破,需在应用端持续突破天花板,不断探索行业外延。这既是对合作伙伴与客户赋能,也是对行业负责。

        各个领航企业代表的案例梳理和行业观察让在场嘉宾看到了一个正焕发着勃勃生机的数字光影及智能显示应用市场,嘉宾们对于展会推广的形式,也一致充满期待。

        2024光影显示展将致力为广大业界同仁搭建起交流、合作、共赢的优质平台,与大家一起抢占数字光影浪潮先机!2024年5月23-26日,我们相约广州中国进出口商品交易会展馆B区12.2号馆,不见不散!


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/303.html b/news/303.html new file mode 100644 index 0000000..7a821c7 --- /dev/null +++ b/news/303.html @@ -0,0 +1,362 @@ + + + + +数字标牌对用户的吸引力明显高于传统标牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌对用户的吸引力明显高于传统标牌

        +
        +
        +
        +  2023-12-26 阅读:38 +
        +
        +

        数字标牌与传统标牌相比,具有显著的优势,能够更好地吸引用户的注意力。传统标牌通常只能提供静态的、固定的信息,而数字标牌则可以通过动态的、交互式的方式展示信息,更加生动、形象。

        数字标牌的优势在于其灵活性和可定制性。数字标牌可以展示多种媒体内容,如文字、图像、视频和音频等,提供更加丰富的信息。此外,数字标牌还可以根据不同的场景和需求进行定制,例如在商场中展示促销信息、在博物馆中展示展品介绍等。

        数字标牌还具有交互性和互动性,能够与用户进行互动,提高用户的参与度和体验感。例如,数字标牌可以通过触摸屏、手势识别等技术实现互动,让用户更加深入地参与到信息传递中。

        数字标牌还具有智能化的特点,可以通过数据分析等技术,对用户的行为和喜好进行分析,从而更好地为用户提供定制化的服务和信息。例如,数字标牌可以根据用户的喜好和行为,推送相应的广告和促销信息,提高转化率。

        因此,数字标牌相对于传统标牌具有更加明显的优势,能够更好地吸引用户的注意力,提供更加丰富、生动、智能的信息和服务。在未来,随着技术的不断发展和普及,数字标牌的应用范围将会越来越广泛,成为展示信息的重要手段之一。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/304.html b/news/304.html new file mode 100644 index 0000000..44ea361 --- /dev/null +++ b/news/304.html @@ -0,0 +1,362 @@ + + + + +熵基科技向阳:数字标牌运营在零售行业的发展趋势及未来展望_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        熵基科技向阳:数字标牌运营在零售行业的发展趋势及未来展望

        +
        +
        +
        +  2023-12-27 阅读:82 +
        +
        +

        12月7-8日,由慧聪物联网、慧聪安防网、慧聪电子网主办,以“智变重构,创引未来”为主题的2023(第20届)中国物联网产业大会暨品牌盛会(简称:慧聪物联网品牌盛会)盛大召开。大会汇聚行业精英、权威专家、地方协会等产业中坚力量,集众智、聚群力,开新局、谋新篇,共同探寻智能物联发展变革的新范式。

        本届盛会遴选行业优秀的实力企业,进行颁奖公布,主要围绕“AI大模型、AloT、智慧办公、智能家居、机器视觉”等热点话题开展主题演讲及圆桌论坛,齐聚行业巨匠论商机,以前沿科技话远景,共谋产业发展新高地。

        在现场,厦门熵基科技有限公司总经理向阳发表了《数字标牌运营在零售行业的发展趋势及未来展望》的主题演讲,结合数字标牌运营在零售行业的商业价值和发展趋势,深入浅出生动阐述了熵基科技在智慧零售、数字标牌应用场景的探索成果,以及熵基云联的数字标牌运营解决方案的创新价值。

        随着行业数字化转型进入深水区,云计算、人工智能等技术突破带来更多新的机遇,智慧生活也逐步从构想迈向现实。譬如,便利店、零售店等常见的生活场景也开始“科技感”十足,数字标牌、电子价签、AI摄像机、智能货柜等智能硬件在城市中身影频现。

        近几年,由于国内更加关注线上运营以及线上体验,导致国内忽略了国外零售行业的变化,国内的零售行业亟待变革。值得注意的是,国外零售市场的变化在于:高效融合了线上线下场景体验,并且更加以“人”为本,更加注重消费者的线下交互体验。

        对于新零售产业的变化趋势,向阳认为:“服务,终究需要回归线下”。以数智化技术赋能线上线下购物的深度融合,聚焦“人”的线下消费体验,也将是未来国内发展的一个重要方向。

        据悉,面对新零售浪潮,熵基科技基于云计算、AI等技术的沉淀,围绕智慧零售AI+数字标牌应用场景,携手合作伙伴,创新开拓数字标牌运营业务线,以“熵基云联”作为熵基科技智慧零售全新商业品牌,持续助力连锁便利店形象升级、经营提效、业绩增长。

        向阳提到,熵基云联是一家聚焦智慧零售,基于云计算、AI等技术的商业云平台服务提供商,可为商业活动、内容管理和广告提供端到端解决方案和服务,帮助零售商和企业实现其增长潜力。

        相关数据显示,从2021年起,除了非常成熟的美国、日本市场,其他各国的便利店行业销售额与门店数均有不同程度的增长。这意味着在社区时代,便利店在家庭存放物品的前置仓场景中扮演着越来越重要的作用。

        对于全球便利店行业的增加趋势,向阳强调,在零售店场景中最稀缺的是“内容营销”。其中。“数字标牌运营”这类全要素广告推广能够唤起共情,相比静态的内容营销,其更能够以“流动的数据”唤醒消费意识,进一步刺激零售门店的业绩增长。

        据悉,在便利店行业的实际运用,熵基云联AI数字标牌能够帮助零售商解决更多难点、痛点:数字化广告覆盖范围广,人群定位更加清晰,甚至能线下线上联动营销,潜移默化地占领消费者心智,触发隐形消费行为。

        向阳表示,消费者对便利店电子标牌的需求主要体现在信息获取、购物体验和品牌形象等方面。熵基云联数字标牌可以帮助提升便利店的形象和购物体验,通过移动应用打破物理空间的限制,让消费者在不同的场景下享受线上线下深度融合的消费体验,让商品价格不再是顾客的顾虑点。

        对数字标牌传递出的情感共鸣信号,向阳表示十分认可:“数字标牌通过简单的流动信息触达,能够帮助零售店在每天的早中晚‘更懂消费者的选择’,充分发挥社区生活中的人文关怀,让用户感受到‘我们门店更懂你’的情感互动。”

        谈完数字标牌运营在零售行业的价值,向阳紧接着阐述了数字标牌运营的发展趋势分析:

        以往,国内大部分企业更加注重线上电商平台的布局,侧重于渠道和流量,导致线下门店市场逐渐萧条。疫情开放后,消费者回归⻔店服务和购物体验,大部分零售门店为了应对线上业务的冲击和竞争,亟需数字化、智能化转型。

        但众所周知,随着大数据、云计算等技术的快速发展,线上电商平台在“用户购物过程全过程追踪、精准广告投放、线上导购”等营销方式中极具优势,强力冲击着线下业务。线下业务虽然具有便利性和购物体验的优势,却也缺乏收集客户数据的手段,面临着诸如缺乏精准的广告投放工具、缺乏商品的数字化追踪手段、缺乏便利的线上实时互动、零售门店的运营成本逐年增高等困境,难以形成增长飞轮。

        脱离这些困境,离不开对消费者购物体验的关注,离不开“以人为本”的经营理念。向阳认为,如今“社区属性”在便利店的经营中愈发重要。未来,如何打造数字底座来覆盖门店橱窗、收银台、电子价签等全场景,帮助线下门店更了解社区居民的购买习惯,将会是非常重要的课题。

        “当所有的线上数据来势汹汹的时候,零售行业的需求重点需要聚焦在以数字化、智能化的技术加持用户服务,将线上营销的优势转化至线下消费场景。熵基云联的数字标牌运营解决方案可赋能零售店数字化运营数据,实现追踪客户购买习惯,精准投放广告,以可视化能力联动线上线下的消费情景,唤醒二次销售,激发巨大的市场。”向阳一再表示。

        据悉,熵基云联的数字标牌运营解决方案在品牌方、便利店、消费者三大层面,均发挥着巨大的商业价值。在品牌方层面,数字标牌可以通过反复地展示流动的信息数据,提升推新、营销活动的效率和效果,促进品牌销售,培养消费者购买习惯,进一步提升品牌竞争力。在便利店层面,数字标牌运营简约大气,有利于升级门店形象、升级内容载体,以极具创意的营销活动提升销售,吸引更多消费者,实现降本增效。在消费者层面,数字标牌运营联动了线上线下的品牌促销活动,不仅可以享受多重优惠,还优化了消费者的购物环境,提升了购物体验。

        此外,熵基云联数字标牌运营解决方案基于“熵基云联Level 3数字零售平台”的货架陈列监测、客流分析等数字营销能力,推出了针对便利店“门店橱窗、收银台、货架区域、冷饮区、电子价签”5大应用场景的产品策略组合,以全场景数字化营销,提升品牌曝光度,助力零售企业构建以客户为中心的服务战略,全面提升企业智能化水平,完成智慧零售转型。

        最后,向阳总结表示,目前国内线下业务承接不住线上的数字化能力,我们要怎么接住,怎么唤醒,怎么提醒,怎么成交,这是我们永远探寻和追求的目标。未来,熵基云联将持续以AI、数字标牌、大数据等数字技术深化零售门店场景,并深研心智营销推广,为消费者提供“千人千面”的个性化营销与服务,助力零售业实现智能化。

        零售高端化,扩大品牌影响力已成为线下零售店提升购物体验的软要求,更是释放零售市场购买力的主流趋势。熵基云联数字标牌运营解决方案在备受高端零售行业青睐的同时,也在创造着零售行业的全新体验、价值。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/305.html b/news/305.html new file mode 100644 index 0000000..354ee0b --- /dev/null +++ b/news/305.html @@ -0,0 +1,362 @@ + + + + +数字标牌显示屏助学校打造信息化校园!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌显示屏助学校打造信息化校园!

        +
        +
        +
        +  2023-12-28 阅读:27 +
        +
        +

        学校中的数字标牌显示屏具备多功能,为学校管理人员和教师提供了可满足独特需求的灵活性。数字标牌显示屏的内容可通过各种解决方案进行定制,使其更易于管理。在当今时代,学校数字标牌显示屏被视为不可或缺的工具,为学校提供了多方面的好处,包括向学生通报天气、课程信息、紧急情况、家长教师会议以及其他活动。

        数字标牌显示屏的应用范围

        数字标牌显示屏是一种电子标牌,能够帮助传达信息。它们的应用范围广泛,不仅出现在商店、银行、健身房、教堂等场所,更在学校和政府大楼中发挥作用。通过LCD、LED屏幕,数字标牌显示屏以多媒体形式展示信息,旨在提供便捷的信息传递渠道。

        学校数字标牌显示屏的特色

        一个出色的数字标牌显示屏应当具备以下特色,以满足学校的需求。

        01可再生性: 数字标牌显示屏的关键之一是易于更新。大多数数字标牌显示屏系统支持用户通过远程控制或软件进行信息更新。管理员应能够通过软件界面轻松修改显示的详细信息。

        02新闻报道:针对大型或多校区的学校,数字标牌显示屏系统应能够同时向大量学生传达信息,确保信息的广泛传播。

        03辅助功能: 优秀的数字标牌显示屏系统不仅应该为管理员提供方便,还应为学生和工作人员提供使用。系统应支持传达各类信息,并确保学生和员工能够轻松访问所需的信息。

        数字标牌显示屏在教育中的价值

        数字标牌显示屏不仅仅是信息传递的工具,更是教育领域的一项重要资源。通过提供实时、动态的信息,数字标牌显示屏为学生和教职员工创造了更加互动和信息丰富的学习环境。教育机构应善加利用数字标牌显示屏的便利,以提升校园信息传达的效率,促进学校管理的现代化。

        在数字时代,学校数字标牌显示屏不仅是信息传递的工具,更是推动学校教育改革的引领者,助力培养具备现代素养的学生。通过不断优化和适应新技术,学校数字标牌显示屏将继续在教育领域发挥着越来越重要的作用。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/306.html b/news/306.html new file mode 100644 index 0000000..d0ee17a --- /dev/null +++ b/news/306.html @@ -0,0 +1,362 @@ + + + + +中银智能广告机赋能四川省中国邮政金融服务_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中银智能广告机赋能四川省中国邮政金融服务

        +
        +
        +
        +  2023-12-28 阅读:22 +
        +
        +

        数字经济已经成为我国高质量发展的新引擎,中央金融工作会议提出“做好科技金融、绿色金融、普惠金融、养老金融、数字金融五篇大文章”,为推进金融高质量发展指明了方向。要做好数字金融这篇大文章,将数字金融提升到战略部署的新高度,银行业也迎来了数字化加速发展的新阶段。

        ╱ 中国邮政╱

        立式广告机作为数字时代下,助力企业数字化发展必备的的智能显示终端。近日,四川省达州市邮政公司顺应时代呼唤,也加速进入数字化发展新阶段,配置安装中银49寸立式广告机,助力金融服务数字化、普惠金融服务,同时提升品牌形象。

        实际应用优势

        ·金融信息的动态展示

        在银行大厅,立式广告机可以作为利率、汇率等金融信息的动态展示平台。客户可以通过触摸屏或语音交互方式查询实时利率、汇率等信息,方便快捷。同时,立式广告机的高清晰度显示技术使得金融信息更加清晰明了,提高客户体验。

        ·企业宣传视频播放

        立式广告机可以播放银行的宣传视频,让客户更直观地了解银行的产品和服务。通过生动形象的宣传视频,银行可以吸引更多潜在客户,提高品牌知名度。同时,立式广告机还可以根据不同业务需求远程实时更新管理,实现信息的统一调度。

        ·便捷的触控查询服务

        通过立式广告机的触摸屏功能,客户可以轻松查询业务详情、业务办理流程等,提高了查询效率,满足不同客户的需求,减少了客户等待时间。同时,在银行大厅或会议室等公共区域,立式广告机还可以播放安全教育视频,提醒客户注意防范金融风险,提高客户的安全意识。

        近日,中银立式广告机与中国邮政的合作密切,除此外,与中国建设银行、中国工商银行、中国银行等各大头部金融机构有达成多次合作。立式广告机系列产品更是从华南走到华中、华北、华西全国各地,从市级到县级都有中银的身影,成为金融行业的首选数字伙伴。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/307.html b/news/307.html new file mode 100644 index 0000000..85fefbe --- /dev/null +++ b/news/307.html @@ -0,0 +1,362 @@ + + + + +2023 LCD拼接招投标市场盘点:旺季不旺,监控场景属性突出_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023 LCD拼接招投标市场盘点:旺季不旺,监控场景属性突出

        +
        +
        +
        +  2023-12-28 阅读:106 +
        +
        +

        目前LCD拼接产品仍有近50%应用于大政府行业(含教育),大政府行业多通过招投标形式采购,根据DISCIEN大数据挖掘LCD拼接产品每个月在大政府招投标市场中活跃度表现看,近两年LCD拼接在大政府市场活跃度持续放缓,从2023年全年产品活跃度表现看,1-8月优于去年同期,9-12月不及去年同期水平(常规三、四季度为政府采购旺季),出现疫情后首次旺季不旺情况,强拉动型政策不明显,项目逾期取消较多。

          202201-202312F月中国LCD拼接在大政府(公开招投标市场)活跃度表现

        Data source: DISCIEN大数据

          根据迪显咨询(DISCIEN)《中国大陆LCD拼接月度中标项目数据库》统计,2023年1-12月LCD拼接公开中标项目数量约10716个,同比去年同期增长11.5%,项目数量略有增长;分月份来看,1-7月项目数量逐月走高,其中7月份达到高峰,中标项目近1300个,同比增长近55%,但自8月开始,项目数量开始呈现不同幅度的下滑,预计12月份项目数量下滑近30%,可以看出当前LCD拼接市场需求持续收缩,落地项目减少。

          2023年中国LCD拼接中标项目数量挖掘统计-分月份(个)

        Data source: DISCIEN大数据

          应用场景:从中标项目的应用分布来看,LCD拼接主流仍以监控为主,场景属性突出,合计份额超五成且占比保持增长; 指挥调度应用受到竞品LED小间距的替代趋势较为明显,占比已低于10%;会议应用占比略有下降,该应用下用户预算差距较大。

          2023年中国LCD拼接中标项目数量挖掘统计-分应用

        Data source: DISCIEN大数据

          参与品牌:从梳理的中标品牌看,2023年合计参与品牌数量高达487个,参与品牌众多,其中海康、大华、宇视、创维、BOE中标项目数量较多,预计全年超7000个,头部品牌集中度持续提升; 当前头部品牌均已导入一体机高性价比产品,others品牌份额持续受到挤压,同时随着各品牌在经销渠道的布局,未来竞争依然会持续加剧。

          2023年中国LCD拼接中标项目数量挖掘统计-分品牌

        Data source: DISCIEN大数据

          TOP10省份:按项目个数统计主要中标省份看,1-11月新疆、四川、广东位居TOP3,合计占比24.7%, 其中新疆、四川、黑龙江、山东、江苏等省份项目个数同比表现成长,广东、湖南、山西、浙江、湖北等省份中标项目个数下降明显。

          2023年中国LCD拼接中标项目数量挖掘统计-分省份

        Data source: DISCIEN大数据

          应用细分行业: 按项目个数统计主要细分行业看,政府部门采购数量占比仍位居TOP1,但政府部门下涵盖的政府机构较多,细分化明显,其中教育/体育局、行政审批/政务服务、国土/自然资源/林业、水利水务、农牧渔类政府部门应用增长明显,企业可重点关注; 教育行业的项目基本都需要公示,项目数量占比较高且同比表现成长(主要为职教以及高教拉动),份额达22.7%;公检法司下仍以公安采购为主,项目个数占公检法司内部超七成,此外检察院下的项目数量同比增长明显,主要以监控需求增长为主。

        2023年中国LCD拼接中标项目数量挖掘统计-分行业

        Data source: DISCIEN大数据

          综合来看,LCD拼接作为后成熟期产品,当前价格已进入普及化阶段,未来渠道线占比将呈增长之势,政府端项目持续受到竞品LED小间距替代,预计明年大政府市场或将呈负增长趋势,活跃度下降;从应用来看,LCD拼接在监控场景仍占据一席之地,监控场景属性标签明显;未来DISCIEN也将持续跟进LCD拼接标案市场,同时捕捉产品在细分行业的需求变化,预判未来市场发展。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/308.html b/news/308.html new file mode 100644 index 0000000..8965bf5 --- /dev/null +++ b/news/308.html @@ -0,0 +1,362 @@ + + + + +液晶拼接屏在数字广告牌中的实际应用案例有哪些?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        液晶拼接屏在数字广告牌中的实际应用案例有哪些?

        +
        +
        +
        +  2024-01-02 阅读:47 +
        +
        +

        液晶拼接屏在数字广告牌中有广泛的实际应用案例,这些案例展示了拼接屏在不同场景和行业中的多样化应用。以下是一些代表性的液晶拼接屏数字广告牌应用案例:

        零售商店: 在零售环境中,液晶拼接屏广泛应用于商店入口、特价商品区域等位置,用于展示产品促销、广告宣传以及品牌信息。拼接屏能够提供高清晰度和大尺寸的显示,吸引顾客的注意力。

        购物中心: 数字广告牌在购物中心内的应用非常常见,液晶拼接屏可用于创建大型视频墙,展示商店促销、品牌活动、导航信息等,提升购物体验。

        交通枢纽: 在机场、火车站、地铁站等交通枢纽,液晶拼接屏被广泛用于显示航班信息、列车时刻表、广告宣传等,为旅客提供实时信息。

        酒店大堂: 酒店大堂通常使用液晶拼接屏来展示酒店服务、活动信息、当地旅游信息以及合作伙伴的广告内容,提升酒店形象和服务体验。

        展览会和会议中心: 在大型展览会和会议中心,液晶拼接屏通常被用于创建大型数字展台,展示参展商的产品、公司信息,以及活动日程等内容。

        银行和金融机构: 银行和金融机构使用液晶拼接屏来展示金融产品、服务信息,提供汇率信息、股市行情等实时数据,同时也用于宣传金融机构的形象广告。

        户外广告牌: 某些户外数字广告牌采用液晶拼接屏技术,以提供高亮度、高对比度的显示效果,适应不同天气和光照条件。

        体育场馆: 在体育赛事场馆内,液晶拼接屏被用于显示实时比分、广告赞助商信息,以及观众互动内容,提升现场体育观赏体验。

        这些应用案例展示了液晶拼接屏在数字广告牌领域的多样性和灵活性,适用于各种不同的场景和行业,为广告和信息传播提供了强大的工具。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/309.html b/news/309.html new file mode 100644 index 0000000..4a63974 --- /dev/null +++ b/news/309.html @@ -0,0 +1,362 @@ + + + + +平潭职业中专学校雕塑标识标牌设施采购项目成交公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        平潭职业中专学校雕塑标识标牌设施采购项目成交公告

        +
        +
        +
        +  2024-01-02 阅读:36 +
        +
        +

        一、项目编号:FZZH-2023190(招标文件编号:FZZH-2023190 )

        二、项目名称:雕塑标识标牌设施采购项目

        三、中标(成交)信息

        供应商名称:福州佐乾文化传媒有限公司

        供应商地址:福建省福州市晋安区连江北路与化工路交叉处东二环泰禾城市广场4期2号楼7层07单元

        中标(成交)金额:37.2800000(万元)

        五、评审专家(单一来源采购人员)名单:

        孙海榕、叶建良、翁义明

        六、代理服务收费标准及金额:

        本项目代理费收费标准:(1)成交金额*1.5%成交金额*1.5%(2)服务费支付至以下账户: 开户名称:福州正宏工程咨询有限公司,开户银行:中信银行股份有限公司福州王庄支行,账 号:7341110182600109137。

        本项目代理费总金额:0.559200 万元(人民币)

        七、公告期限

        自本公告发布之日起1个工作日。

        八、其它补充事宜

        1、本项目所有递交响应文件的供应商资格性和符合性审查均通过。

         九、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名 称:平潭职业中专学校     

        地址:平潭县潭城镇万宝庄30号         

        联系方式:翁义明 、059124390628      

        2.采购代理机构信息

        名 称:福州正宏工程咨询有限公司            

        地 址:福建省福州市晋安区长乐北路261号名城广场17层            

        联系方式:刘敏、付玉、王展、郑平平、0591-83308660            

        3.项目联系方式

        项目联系人:刘敏、付玉、王展、郑平平

        电 话:  0591-83308660

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/31.html b/news/31.html new file mode 100644 index 0000000..22cb1b0 --- /dev/null +++ b/news/31.html @@ -0,0 +1,362 @@ + + + + +数字标牌加速城市智能化发展,透明OLED成为催化剂_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌加速城市智能化发展,透明OLED成为催化剂

        +
        +
        +
        +来源:中国政府采购报  作者:广文  2022-05-13 阅读:35 +
        +
        +

        当前,全球新一轮科技革命和产业变革正在孕育兴起,数字化转型已成为推动社会发展、培育产业新动能的重要战略,数字技术正在从经济领域向政务管理、社会民生等领域深入。“十四五”规划和2035远景目标指出:要加快数字社会建设步伐、提供智慧便捷的公共服务、建设智慧城市和数字乡村,构筑美好数字生活新图景。政企采购更愿意加大在智能领域的投资力度,智能设备渗透率不断提升。

        智慧城市、数字乡村建设红火,数字标牌呈爆发之势

        2022年全国两会期间,数字经济、智慧城市再一次成为各界关注的焦点。建设数字信息基础设施,推进5G规模化应用,促进产业数字化转型,发展智慧城市、数字乡村等写入顶层设计。

        过去两年,智慧城市行业涌现了不少亿元以上的项目。中央和及各省市区公共采购数据显示,2021年智慧城市各类中标信息近4300条,总中标金额约1085亿元。其中,数字标牌在智慧城市建设中的使用,呈现出爆发趋势。

        然而一直以来消费者都更乐于互动,传统的单向传递信息的广告机数字标牌并不能识别用户的行为方式或者指令。虽然市场出现了取号机和自助点餐的智慧服务自助终端,但明显消费者在与数字标牌交互的过程十分机械,功能的单一也使得趣味性没有得到体现。因此,透明显示屏的数字标牌情结由来已久。

        交互式数字标牌可以促进市民参与度,并通过自定义创建内容,吸引市民更多关注。尤其是随着透明OLED显示屏这一创新品类的推出,能够承载互动触摸、裸眼3D、4K、云计算等一系列创新技术,成为提升消费体验、提高办公效率的新窗口。而且,在商业领域,通过引入透明OLED显示屏显示标牌,奢侈品、贵金属得到了良好的展示效果。

        透明OLED显示屏还在博物馆得到应用,借助清晰鲜艳的色彩呈现,展品好像“活”起来,跨越虚拟与现实的界限。博物馆玩出新花样,让用户逛博物馆像欣赏一部电影大片。在各大展会上,透明屏幕的相关产品也被大量应用,带来独具视觉冲击力的观感。


        政务办公数字化转型,推动公共设施向智能化跃迁

        新冠肺炎疫情的爆发改变了人们工作和生活的方式,也为完善政务治理带来了新的机遇。《2020联合国电子政务调查报告》显示,全球范围内的政务数字化转型的步伐正在加快。而这将快速实现智能设备的普及化,释放数字红利。

        在该趋势的推动下,透明OLED显示屏或将被大量应用于图书馆、体育馆、医院、学校等建筑中。应用透明屏可以提供宽阔的空间开放感,当召开政务工作会议时,不再会因为屏幕的存在而阻隔了与会者的视线。且发言人无需再准备纸质发言稿,直接看着透明显示屏读出即可,也避免了时常低头看稿的尴尬。

        此外轻薄的透明OLED显示屏,近乎于不存在一般,让空间的使用更加灵活而高效,为政务数字化转型提供新的发展方向。

        在打造智能办公室方面,透明OLED也有着自身的优势。该产品通过在外部窗户上搭载透明OLED显示屏,达到展示开阔的全景,节约电视、显示器等占据空间的效果,让整个会议室气氛更活跃。并且该产品适用于视频会议、展示、娱乐等多类场景。


        差异化价值掘金千亿级商显赛道,未来独占一席之地

        可以说,透明OLED显示屏的“酷”,是它令人向往的主要原因。尤其是当你伸手触及屏幕,看到自己的掌心与虚拟的内容相交汇,感觉确实非常奇妙。目前,越来越多透明显示产品被应用于商用场景,商场、酒店等场所追求空间感和美观感,而透明OLED凭借其崭新的透视式设计即可与四周的环境自然无缝地融合,形成开阔的视野与开放的空间,无疑可提供差异化价值。

        全球咨询公司Prescient & Stratsgic Intelligence的数据显示,透明显示器市场预计将以平均每年46%的速度增长,到2024年规模将达到49.3亿美元。在未来,透明OLED显示屏的使用场景将会更加广泛。

        随着OLED透明显示技术的愈发成熟,或许我们很快就能在很多高端零售店,以及公共基础设施中看到这些透明显示屏的存在了,就像地铁中的列车玻璃窗那样。尤其在后疫情时代,在“无接触、零感染”的疫情管控下产生了新的经济模式,以透明OLED显示屏为代表的交互式显示类产品在未来的“商显”领域中将独占一席之地。

        随着“新基建”逐步落地实施,未来在5G、AI等科技的加持下,透明OLED显示屏将不断被用于智慧城市、智慧交通等建设,创建新的应用场景,为智能化生活赋能。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/310.html b/news/310.html new file mode 100644 index 0000000..9d1f009 --- /dev/null +++ b/news/310.html @@ -0,0 +1,362 @@ + + + + +2024年数字标牌蓄势待发,凭硬实力再迎新增长期_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2024年数字标牌蓄势待发,凭硬实力再迎新增长期

        +
        +
        +
        +  2024-01-09 阅读:213 +
        +
        +

        2023年正在进入收官阶段,在过去的近一年里,国内市场复苏势头强劲,从五一、端午到中秋、国庆小长假下来,消费恢复超出预期。加之中国中央和各地政府积极推动一系列促消费政策落地,促进家居、汽车、电子、餐饮等重点领域消费提升,消费的恢复带动了广告投放的需求。

         

        广告,则是数字标牌产业的核心动力。据洛图科技(RUNTO)数据显示,2023年前三季度,中国大陆广告市场同比增长了5.5%。2023年全年,中国大陆数字标牌的出货量将达到65.2万台,同比增长29.6%。而数字标牌产品的优势正式是推动其市场需求增长的关键因素。

        数字标牌无限应用于公共空间、交通系统、博物馆、体育场、零售店、酒店、餐厅和企业大楼等场所,提供寻路、展览、营销和户外广告,因而又被分为户内与户外数字标牌。从户外LED、广告机,到室内电梯广告机、立式广告机、卧式查询机、电子水牌、自助服务终端等等。

        数字标牌产品优势

        互动性:触摸屏界面可以让观众获取更多信息或进行操作,提供出色的互动体验,允许观众参与并与内容进行交互,提高了用户的参与度和体验感。

        信息展示的灵活性:多媒体播放系统使得数字标牌可以展示动态和静态的内容,甚至可以播放视频和动画。这种灵活性使得它可以根据需要展示各种格式的信息,满足不同场景和目标受众的需求。

         

        智能分屏播放:多种媒体格式如文本、图像、音频和视频,通过智能分屏,为观众提供丰富的视听体验。

        实时更新:数字标牌可以远程实时更新信息,确保观众看到的是最新、最相关的内容。无论是在新闻发布、产品推广还是活动宣传方面,均可实现信息的统一调度与管理。

         

        节能环保:相比传统的纸质或霓虹灯标牌,其具有低耗能特点,可实现长时间的稳定运行,同时减少了废弃物的产生,符合绿色环保的理念。

        易于远程管理:通过系统后台,可以远程监控运行状态和维护设备,大大提高了运营效率。

         

        适应性强:数字标牌可以在各种环境和条件下工作,可采用防水、耐高温、抗高压设计,无论是室内还是室外,都能保持稳定的运行状态。

        个性化定制:数字标牌系列产品形态多样,界面同样支持定制设计,以适应不同的品牌风格、设计空间和目标受众选择合适产品,进行战略布局,帮助企业建立独特的品牌形象。

        据全球科技产业市场调研机构洛图科技判断,2023年之后,中国数字标牌市场将开启恢复和再成长之发展阶段。未来,中银将持续以创新为驱动力,以丰富场景应用为抓手,进一步完善系列产品,深入各行各业场景应用痛点,助力数字标牌市场迎来下一轮增长期。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/311.html b/news/311.html new file mode 100644 index 0000000..c3bf86d --- /dev/null +++ b/news/311.html @@ -0,0 +1,362 @@ + + + + +通过数字标牌增强便利店的客户体验_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        通过数字标牌增强便利店的客户体验

        +
        +
        +
        +  2024-01-09 阅读:45 +
        +
        +

        领先的便利店正在使用数字解决方案为购物者提供更便捷的履行服务,包括得来速、送货、路边和移动订单取货,从而提高客户满意度和保留率,并扩大购物篮规模。忠诚度计划和应用程序提供高级订购选项、个性化和完全非接触式的客户体验。

        这些新服务和技术使便利店顾客能够按照他们想要的方式购物。这是关键,因为服务速度和等待时间仍然是消费者的首要任务。Bluedot 的 2022 年假日购物习惯报告发现,十分之六的购物者更喜欢自助服务而不是员工协助,这主要是由于速度。这使得自助服务亭(如三星 Windows 一体机信息亭)在便利店和快餐店特别有用,因为它允许客户在自己的时间浏览、选择和购买商品,而无需销售助理。

        数字标牌在促进更快的客户体验方面发挥着关键作用,无论是单独悬挂还是集成到自助服务终端中。例如,在加油站的加油站和帐篷中,户外直视 LED 屏幕(如三星 XPR 系列)可以欢迎司机进入前院,然后通过充满活力的图像和信息将他们引导到车内或得来速。以下是数字标牌增强客户旅程的其他方式。

        使用数字标牌引导客户旅程
        说到得来速服务,速度是游戏的名称。在Bluedot调查的顾客中,85%的人表示,如果得来速线路太长,他们会离开商店。但多长时间才算太长?根据消费者的说法,在得来速的可接受等待时间为 6 分钟或更短。Bluedot还发现,任何更长的时间都可能驱使他们去其他企业,如果快餐店排长队,十分之六的人会考虑在咖啡连锁店购买食物。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/312.html b/news/312.html new file mode 100644 index 0000000..467f857 --- /dev/null +++ b/news/312.html @@ -0,0 +1,362 @@ + + + + +LED一体机在中国市场的应用场景分析_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        LED一体机在中国市场的应用场景分析

        +
        +
        +
        +  2024-01-09 阅读:42 +
        +
        +

        LED一体机作为LED显示行业近年来兴起的一个新品类,目前在会议、教育、展览展示、控制室等场景均有应用。根据洛图科技(RUNTO)发布的《中国大陆小间距LED市场分析报告》显示,2023年,中国大陆LED一体机市场的出货规模超过了5千台 。

          从应用领域看,政企应用比重最大,占比64%;商务应用接近26%,用于会议会展、酒店宴会、数字展陈等方面;教育应用已达7%;其它则为医疗培训、远端调控等应用,占比3%。

          2023年 中国大陆LED一体机产品应用结构

          数据来源:洛图科技(RUNTO),单位:%

          政企和商务:会议和展陈应用为主,尤其是后装和移动场景

          LED一体机在政企和商务领域的应用有相似点,以会议场景为主,用在报告厅、多功能厅、酒店宴会厅、媒体演播厅等场所 。其次,在政务、企业、会议会展方面等用于展陈功能。

          事实上,在政企与商务行业中,用于会议和展陈方面可选的解决方案比较多,如LED一体机、LED拼接、LCD拼接、超大液晶显示屏、投影仪等等。

          政企和商务市场显示解决方案产品对比

          数据来源:洛图科技(RUNTO)整理

          在以上显示技术的比较之下,LED显示产品存在一定优势:一、LCD拼接屏的物理拼缝相对较大,影响观感,其和LED显示竞争的主要场景在监控领域。二、超大尺寸液晶显示屏在尺寸方面受限,目前最大尺寸不超120寸,而LED显示屏可根据需求尺寸进行拼接。两者目前在会议场景的应用竞争不明显,LED显示屏主要用于超大型及大型会议室;而超大尺寸液晶显示屏主要用于中小型会议室。三、投影仪设备尺寸虽然也可根据需求融合拼接,但寿命较短,而LED显示屏的寿命可达10万小时;相对来说,投影仪和LED显示在会议场景的竞争较为直接和充分。

          政企和商务市场在选择产品方案时,更看重的因素是产品功能是否满足需求。LED一体机产品的应用与小间距LED拼接显示屏(固装)的应用领域相似,因适用后装、移动便捷、安装维护方便 等因素,政企和商务市场在会议与展陈场景开始有越来越多的用户选择LED一体机产品。

          LED一体机当前的劣势是在价格方面。尽管P1.56的135寸LED一体机产品的价格已在10万元之内,但相较于其它技术,仍有不小的成本差距。因此,LED一体机的突围路径在于实现更高的“质价比”平衡 。

          教育:教学和报告场景为主,宽屏产品应景而生

          LED一体机在教育市场的普及范围正在扩大,主要应用在高校和培训机构的报告厅、阶梯教室、培训室等教学和报告场景。

          企业争相布局教育领域主要源于两方面的因素:一是政策引导,二是寻求新增量市场。政策层面,教育市场显示产品的大尺寸化趋势明朗,教育部发布的《交互式电子白板 》标准中明确规定,大于70㎡(50人以上)的教室,需搭配至少显示尺寸为100寸以上的显示设备。其次,教育市场中,小间距LED显示屏 和LED一体机的产品特点一致,间距段分布结构相近,采购模式与政企相仿,因此成为企业寻求新增量的重要方向之一。

          2023年 中国大陆LED一体机与高校小间距LED显示屏间距对比

          数据来源:洛图科技(RUNTO),单位:%

          从LED企业在一体机的布局看,尺寸范围涵盖了从108到220寸。131-140寸占到了最大的出货量份额,高达47%;141-170寸和100-130寸分别占到了28%和20%。

          2023年 中国大陆LED一体机产品尺寸段结构

          数据来源:洛图科技(RUNTO),单位:%

          其中,108/110寸、135/136/138寸、165寸是主要的着力点 ,也是教育市场中较有优势的应用尺寸。为满足教室的教学环境,企业也陆续推出了32:9和21:9的宽屏产品。

          整体来看,LED一体机产品在市场发展已有5年时间。洛图科技(RUNTO)认为,2024年,LED一体机在技术、成本、品牌阵容、市场认知和影响力上,都将进入到一个新节点,预计未来3-5年内LED一体机将成为百亿级市场。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/313.html b/news/313.html new file mode 100644 index 0000000..b4e9003 --- /dev/null +++ b/news/313.html @@ -0,0 +1,362 @@ + + + + +中银立式广告机加速景德镇陶瓷大学数字校园建设_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        中银立式广告机加速景德镇陶瓷大学数字校园建设

        +
        +
        +
        +  2024-01-09 阅读:40 +
        +
        +

        随着5G、大数据、物联网、人工智能等技术的发展,教育环境正在经历从网络化、数字化向智能化的跃迁。这不仅模糊了正式教育与非正式教育的界限,还引领学习体验从“静态视觉”转向“动态视听”和“智能交互”,使得人人皆学、处处能学、时时可学成为现实。

         

        ╱ 江西景德镇陶瓷大学 ╱

         

        立式广告机这一数字化信息传播工具在校园内逐渐发挥其独特优势。江西景德镇陶瓷大学作为国内知名的陶瓷艺术学府,拥有着深厚的历史底蕴与技术积淀,积极引进和应用先进的技术,安装中银65寸立式广告机,推动数字化校园的建设,为师生提供更好的教学、科研和管理服务。

        实际应用优势

        信息的高效传播与调度

        具有高清特性的立式广告机与传统海报或宣传栏相比,立式广告机具有更强的便利性和实时性。学校可以随时更新内容,为学校的管理和服务提供了便捷、高效的方式,确保信息的及时性和准确性,以更加规范、科学地进行管理,如学校的最新公告、学术活动通知、临时变更等,使学生和教职工能够第一时间获取。

        多场景应用营造文化氛围

        除了公告和通知,立式广告机也可灵活部署于教学楼大厅、图书馆、博物馆、校园广场、食堂、行政大楼等场景,展示优秀学生作品、课程安排、管理通知、节日庆典等。或作为不同学科间交流的平台,展示各种陶瓷制作过程或艺术家的创作视频,增强校园的文化氛围和凝聚力。

        高度定制化提升学校形象

        一个设计精美、内容丰富的立式广告机,能够很好地展示学校的现代化形象。中银立式广告机可根据景德镇陶瓷大学的特色和需求,进行高度定制化,以突出学校的特色和优势。例如,展示学校的陶瓷工艺、历史和优秀作品等。无论是外部来访者还是内部学生,都能感受到学校与时俱进的精神。

        当前,数字化技术已经成为推动教育创新和改革的重要力量。它不仅改变了教与学的方式,还影响了教育资源的配置、教育评价和教育治理等方面的改革。在未来的发展中,中银科技将继续以数字化技术发挥其优势,为教育的持续发展和创新提供有力支持。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/314.html b/news/314.html new file mode 100644 index 0000000..ef1bef4 --- /dev/null +++ b/news/314.html @@ -0,0 +1,362 @@ + + + + +星巴克美国引入数字菜单屏,营业额提高30%_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        星巴克美国引入数字菜单屏,营业额提高30%

        +
        +
        +
        +  2024-01-15 阅读:113 +
        +
        +

        数字时代

        餐饮业如何紧跟潮流?

        餐饮行业作为一个竞争激烈、发展迅速的领域,必须紧跟潮流,不断引入新科技以提升顾客满意度和用餐体验,方能在激烈的市场竞争中取得更远的发展。

        数字菜单屏,就是吸引顾客的典型代表

        相比传统纸质印刷菜单板,数字菜单屏通过滚动屏幕实时向顾客展示餐饮店当前的所有菜品,以及及时更新菜品信息,向顾客推荐符合个人口味的菜品,从而省去了顾客翻阅纸质菜单的烦恼。这一创新设计为提升顾客体验和简化点餐流程注入了活力。

        「数字菜单对餐饮业有什么好处‍」

        1. 数字菜单及时更新售空菜品,避免顾客失望。

        我们都经历过进店点餐却被告知所选菜品已售罄的情况,令人沮丧。通过数字菜单,可以在后台及时删除售空菜品,以新的菜品替代,减少了顾客的不便,提高了客户满意度,同时激发购买欲望,促进销售。

        2. 数字菜单显示食品、饮品组合建议,帮助顾客选择。

        相较于传统纸质菜单,数字菜单将信息直观地展示在大屏幕上,为顾客提供食品和饮品的组合建议、分量,以及全部优惠食品种类。这不仅简化了顾客的选择过程,也减轻了餐饮店铺的运营负担。

        3. 数字菜单可根据天气变化调整推荐,贴合顾客需求。

        例如,麦当劳的数字菜单屏根据不同天气动态调整主打推荐菜品。消费者的点餐偏好通常受天气影响,数字菜单屏通过灵活的调整使得菜品更符合顾客口味。美国星巴克同样运用数字菜单屏,根据天气推出适应当天气象的美食,并在主打位置推出三明治配汤的简餐,而不是咖啡,成功提高了下午闲时时段的客流量。据数据显示,这一举措将美国星巴克下午时段营业额提高了30%。

        「数字菜单屏还有另类的作用」

        1遇到紧急状况时,作为公告通知牌,给顾客提供紧急指引。

        2餐饮店利用数字菜单板能添加一些促销活动、美味菜品等,能吸引顾客购买以及二次到访。

        3数字菜单还有别样的用法,在非用餐时间还可以用于内部员工培训,提升员工的专业能力,可谓是物尽其用。

        4数字菜单还带有娱乐功能。在重大节日或体育赛事日,可以为顾客在就餐时提供有节日视频、或体育赛事节目,提升餐厅氛围感,增强顾客用餐体验。‍‍

        事实上,数字菜单屏的用途远不止此,限制你对数字菜单屏的使用途径是你的想象力。未来它将蔓延到市场上的各个领域,被广泛应用。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/315.html b/news/315.html new file mode 100644 index 0000000..4ef82b0 --- /dev/null +++ b/news/315.html @@ -0,0 +1,362 @@ + + + + +CVIA《2023年中国电子视像行业发展报告》:C0B技术优势更加凸显_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        CVIA《2023年中国电子视像行业发展报告》:C0B技术优势更加凸显

        +
        +
        +
        +  2024-01-28 阅读:98 +
        +
        +

          中国电子视像行业协会发布(CVIA)《2023年中国电子视像行业发展报告》,认为“LED显示屏:增长动能在于微间距深化和封装技术演变”“预计2023年,小间距LED显示屏 P<1.0占比13%;在微间距产品中COB的占比已超三成”,报告指出:“在间距P1.0以内的产品范围内,C0B技术优势更加凸显,叠加良率提升带来成本优化,因此其市场份额快速提升”。

          2023年威创 小间距LED销售规模增长20%。威创自2015年起成功将COB 显示技术产品化、市场化、规模化,至2023年COB小间距显示市场规模已达20亿,成为LED小间距显示产业的主流发展趋势。据业内统计,威创在P1.5以下间距的COB显示产品品牌累计销量和项目数国内排名第一。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/316.html b/news/316.html new file mode 100644 index 0000000..69d3bef --- /dev/null +++ b/news/316.html @@ -0,0 +1,362 @@ + + + + +春节将至,如何用智能广告机打造营销盛宴_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        春节将至,如何用智能广告机打造营销盛宴

        +
        +
        +
        +  2024-01-28 阅读:102 +
        +
        +

        春节将至,又一批务工人员返乡,这不仅是游子归家与家人团圆的温情时刻,更是各大品牌的一次营销内卷。如何让品牌信息脱颖而出,成为了各大商家的重要任务。在这个数字化时代,智能广告机作为一种创新的营销工具,借其专业性、互动性和动态展示能力,正逐渐成为企业抢占市场商机的利器。


        智能广告机:引领数字化营销潮流

        智能广告机是一种集高清显示、多媒体播放、互动体验于一体的数字化广告终端。

        智能广告机的产品特性

        高清显示:智能广告机采用高分辨率显示屏,画面清晰、色彩鲜艳,为观众带来极致的视觉体验。

        多媒体播放:支持视频、图片、文字等多种媒体格式播放,满足企业多样化的广告宣传需求。

        触控互动:智能广告机内置触摸屏、摄像头等互动设备,可实现观众与广告内容的实时互动,提升品牌形象。

        远程管理:通过智能广告机管理系统,企业可实现远程操控、内容更新等功能,提高管理效率。

        低耗环保:立式广告机采用低能耗设计,可实现长时间的持续续航。

        如何用智能广告机打造春节营销盛宴


        创意设计是关键

        智能广告机的高清显示和多媒体播放功能为创意设计提供了无限可能。企业可以根据品牌特点和目标受众需求,设计出富有创意的广告内容和形式。通过有趣的视频、动感的图片和引人入胜的故事情节,吸引消费者的注意力,提高品牌知名度和记忆度。

         

        双向互动提高品牌知名度

        通过智能广告机内置的触摸屏和摄像头,可以设计各种互动游戏,如抽奖游戏、答题游戏等。这些游戏可以吸引消费者的注意力,增加他们与广告内容的互动,提高参与度。同时,通过游戏奖励和分享功能,可以鼓励消费者将互动体验分享到社交媒体上,进一步扩大品牌曝光度。

        精准投放是重要手段

        通过智能广告机管理系统,企业可以根据不同地区、时间段和受众群体的特点,制定个性化的广告策略。例如,根据商圈的人流情况和消费习惯,调整不同地点的广告播放时间和频率;根据受众群体的年龄、性别和兴趣爱好等因素,制定差异化的广告内容和形式。

        线上线下联动是有效方式

        智能广告机可以作为线上线下的连接桥梁,将线上线下的营销活动相结合。例如,在智能广告机上发布优惠券、折扣信息等,引导消费者到附近的门店或线上商城进行消费;同时,将智能广告机的互动体验与线上活动相结合,为消费者提供更加丰富多样的参与方式,提高品牌知名度和销售额。

        持续更新与维护是必要措施

        企业需定期对设备进行更新和维护,包括软硬件升级、内容更新等环节。同时对于出现的问题和故障应及时进行修复和处理确保智能广告机的稳定运行和持续宣传效果。通过定期更新智能广告机的内容和功能保持其新鲜感和吸引力,定期维护和保养智能广告机,确保其稳定性和可靠性。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/317.html b/news/317.html new file mode 100644 index 0000000..4a45b55 --- /dev/null +++ b/news/317.html @@ -0,0 +1,362 @@ + + + + +视颐荣获2023年度“数字标牌 十大卓越品牌”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        视颐荣获2023年度“数字标牌 十大卓越品牌”

        +
        +
        +
        +  2024-01-28 阅读:115 +
        +
        +

        近日,由中国数字视听网、数字视听行业十大评选机构承办的2023年度中国数字视听行业年度品牌评选活动落下帷幕,视颐凭借其在数字标牌领域的卓越表现,荣获2023年度“数字标牌 十大卓越品牌”的殊荣。

        2023年是视颐科技三年计划的收官之年,在国内经济环境十分不利的情况下,视颐人发扬了敢打敢干的优良作风,提前准备,早做预防,突破重重困难,最终完美收官:研发不断创新前进,产品线再拓展丰富,新业务开拓顺利,销售目标顺利达成,人才规划有条不紊,品质显著提升,这些成绩来之不易。此次获奖,是对视颐在数字标牌领域持续创新和卓越表现的肯定。


        视颐自成立以来,一直致力于大屏显示技术的研发和应用,为全球用户提供高效、便捷、优质的解决方案,主营业务为液晶和LED显示类、互动、大数据产品场景定制服务及相关产品制造,产品包括液晶广告机、拼接屏、LED小间距、电子餐牌、智能自助终端等。视颐数字标牌产品广泛应用于文图、零售、政务、人工智能、传媒等领域,帮助企业实现数字化转型,提升品牌形象和市场竞争力。

        此次获奖,不仅是对视颐过去一年努力的肯定,更是对未来发展的鞭策:2024年是视颐科技实施第二个“三年计划”的开局之年,视颐将继续秉承“共创、共担、共享”的企业发展理念,全体员工不忘初心和使命,众志成城、勇往直前,为“创造商显新视界 助力社会信息化”的宏伟目标而不懈努力奋斗!


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/318.html b/news/318.html new file mode 100644 index 0000000..5aa7a7a --- /dev/null +++ b/news/318.html @@ -0,0 +1,362 @@ + + + + +安徽建工建设投资集团有限公司2024年标识标牌集中采购_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        安徽建工建设投资集团有限公司2024年标识标牌集中采购

        +
        +
        +
        +  2024-01-28 阅读:104 +
        +
        +

        项目名称:安徽建工建设投资集团有限公司2024年标识标牌集中采购

        招标人:安徽建工建设投资集团有限公司

        项目概况:安徽建工建设投资集团有限公司2024年度标识标牌集中采购,具体施工内容详见招标文件、招标清单。

        标段划分:本次招标项目分为 1 个标段,拟选择 4 个中标人。

        本项目是否接受联合体投标:不接受

        本项目投标保证金人民币 拾 万元(¥: 100000.00 )。招标项目为多标段,投标人同时投标两个及以上标段时,投标保证金不需重复缴纳。

        标段1预估金额: 914.71 万元(含税),具体以控制价为准。

        标段2预估金额: 914.71 万元(含税),具体以控制价为准。

        标段3预估金额: 914.71 万元(含税),具体以控制价为准。

        标段4预估金额: 914.71 万元(含税),具体以控制价为准。

        合计:3658.84 万元(含税)

        这么看来平分了四个标段,兼投不兼中!

        借此项目我们也探讨一下工程项目集采的利弊:

        工程项目甲方供材料是指甲方(建设单位)提供或指定购买的主要建筑材料、建筑构配件和设备。这种方式有以下几个优点:

        1、可以更好地控制材料的质量、品牌和规格,保证工程质量和安全。

        2、可以节约材料采购成本,利用甲方的集中采购优势,避免施工单位在材料采购过程中挣取差价。

        3、可以控制工程进度,减少材料供应的延误和争议。

        4、可以降低甲方的税收负担,利用营改增政策,抵扣甲方的增值税。

        当然,甲方供材料也有一些缺点和风险,比如:

        1、增加了甲方的前期资金投入和库存管理成本。

        2、增加了甲方的材料供应责任和风险,如果材料出现质量问题或供货不足,甲方可能要承担索赔或解除合同的后果。

        3、增加了甲方和施工单位之间的协调和沟通成本,需要明确材料的交货方式、地点、数量、质量、验收等细节。

        4、增加了甲方的监督和审计难度,需要防止施工单位偷卖或浪费材料。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/319.html b/news/319.html new file mode 100644 index 0000000..a777d66 --- /dev/null +++ b/news/319.html @@ -0,0 +1,362 @@ + + + + +三星连续 14 年引领数字标牌市场_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        三星连续 14 年引领数字标牌市场

        +
        +
        +
        +  2024-02-04 阅读:100 +
        +
        +

        三星电子是数字标牌技术的先驱,庆祝其作为市场领导者的第 14 个年头,保持其在创新前沿的地位,并彻底改变了数字标牌在各个领域的作用。根据 Fortune Business Insight 的数据,到 2026 年,数字标牌市场预计将超过 350 亿美元,三星一直在扩大这个充满活力的行业的边界。

        在过去的十年中,数字标牌已经从单纯的广告展示发展成为一个强大的个性化信息、教育、体育、艺术等平台。三星的智能标牌在这一转型中发挥了关键作用,提供了超越白板和投影仪等传统技术的灵活性和多功能性。

        2023 年,三星继续在各个领域推进沉浸感,为采用其技术的组织创造了全面的体验。从梵蒂冈城的圣彼得广场等历史古迹到迪拜的亚特兰蒂斯皇家酒店等超豪华度假村,三星的高精度 LED 显示屏和音频解决方案增强了活动效果,并创造了令人惊叹的环境。

        一个值得注意的例子是与威尔士大学圣大卫三一分校的合作,三星的沉浸式房间配备了 18 米的 LED 屏幕,重新定义了学习体验。该大学的沉浸式空间被公认为 2023 年 AV 奖的“年度教育项目”决赛入围者,展示了三星致力于通过数字标牌突破教育界限的承诺。

        三星对教育的影响还延伸到德克萨斯州达拉斯的 Hogg 新技术中心,那里的 Flip Pro 交互式显示器促进了交互式学习和协作,在 2023 年 EdTech 突破奖中,三星被公认为教育市场最佳整体 IT 解决方案提供商。

        The Wall for Virtual Production 是三星产品阵容的新成员,展示了该公司对支持电视、电影和创意产业创造力的承诺。它允许创意人员使用超大的LED墙,通过实时视觉效果技术创建虚拟内容,从而减少制作时间和成本。

        三星作为数字艺术平台的角色体现在它与已故朴瑞博和荷兰裔美国视听艺术家 0010×0010 等当代艺术家的合作中。在纽约洛克菲勒中心和泰国曼谷等地举办的展览展示了三星的技术如何将艺术带入生活,重新定义现代艺术的边界,并探索数字世界和物理世界的融合。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/32.html b/news/32.html new file mode 100644 index 0000000..2afe54d --- /dev/null +++ b/news/32.html @@ -0,0 +1,362 @@ + + + + +小标牌撬动大产业,标识标牌成为城市生活和城市软实力的重要组成部分_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        小标牌撬动大产业,标识标牌成为城市生活和城市软实力的重要组成部分

        +
        +
        +
        +  2022-05-13 阅读:4 +
        +
        +

        走在湖南省怀化市大街小巷、商场楼宇、公园景区,具有鲜明地域特色和文化内涵的路标、店面招牌、灯箱等鳞次栉比。这些材质不同、形状各异、大小不一的标识标牌,成为城市生活和城市软实力的重要组成部分,其中,有相当一部分系“本土造”。

          连日来,在怀化经开区产业园内,湖南国艺标识股份有限公司生产车间里机器轰鸣、作业繁忙。一条湖南最大的广告标识静电喷涂流水线在此落成,直接把喷涂工艺和时间从原来的3天压缩至现在的2小时,生产效能翻了好几番。全面复工复产后,企业按下“加速键”,优质产能得到充分释放,订单排到6月份以后。公司一季度实现销售收入超过130万元,全年预计完成销售收入1000万元。

          公司在完成孵化前,是一家传统喷漆小型企业,采取典型的“作坊式”生产模式。2021年12月,在怀化市市场监管局的引导下,怀化意象形广告传媒、湖南耐得丽科文建设有限公司、怀化腾美标识工程有限公司共同组建注册了湖南国艺标识股份有限公司。

          “新的公司成立后,引进最新的喷涂流水线设备,在提质、提效、提速、降本等方面制定了行之有效的解决方案,并成功研发仿木纹和热转印工艺。”湖南国艺标识股份有限公司总经理蒋平安介绍说。喷涂流水线相比传统的喷漆工艺,生产效率提高20多倍,通过组合后,公司在产值效能方面至少提高2/3。

          蒋平安满怀信心地表示,公司打算用5到7年时间,投资1500万元,安置社会劳力200余人,把国艺标识打造成武陵山片区标识标牌的生产基地。

          两公里外的中方县湘商产业园内,湖南澳辉标识有限公司同样开足马力,工人们正在为贵州、重庆等地客户赶制一批标识标牌……该公司由4家小型企业组合而成。在市场监管部门的指导下完成资源整合后,公司设施设备不断优化,产能产值迅速提升。近期,公司为重庆酉阳打造的352块林长制标识牌深受业界好评。

          湖南澳辉标识有限公司总经理胡健华介绍说,公司当前已完成300余万元的订单生产,正在积极拓展五省周边客户资源,争取实现年销售收入1500万元。

          “我们以企业发展和质量需求为导向,施行‘一需一策’‘一企一案’滴灌式服务,帮助企业抓品牌促发展。”怀化市市场监管局党组成员、副局长刘春华说。该局联系广告行业相关企业,与市标识行业协会面对面交流,引导标识行业规范化发展,树立标杆企业。国艺、澳辉等一批优质企业脱颖而出,带动全市广告标识产业复工复产和高质量发展。

          近年来,该局不断创新监管方式,探索出一条加强监管与支持发展并重的新路子,指导成立行业协会怀化搭建交流平台,与贵州、重庆等周边省市开展交流合作,提升广告标识行业形象和业务资源。截至2021年,怀化市标识行业协会解决就业3000余人,间接为社会创下100多亿元的经济价值。同时,市场监管部门加大行业资源整合和技术创新力度,加强质量管理,不断提升企业创新力,助力全市广告企业高质量发展。截至目前,怀化市标识行业协会会员已发展到78个,营业额突破5.3亿元,实现小标牌撬动大产业。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/320.html b/news/320.html new file mode 100644 index 0000000..8c0e4d1 --- /dev/null +++ b/news/320.html @@ -0,0 +1,362 @@ + + + + +希沃携信阳市第一实验小学打造数字化校园新标杆_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        希沃携信阳市第一实验小学打造数字化校园新标杆

        +
        +
        +
        +  2024-02-04 阅读:166 +
        +
        +

        为推进学校教育信息化应用能力,促进校园数字化转型建设,1月30日,信阳市第一实验小学与希沃正式签署合作协议并进行“希沃智慧教育应用示范校”授牌仪式。双方将在教育数字化领域开展深度合作。

        希沃

        签约仪式由信阳市第一实验小学副校长杜娟主持,信阳市第一实验小学党总支书记、校长高琼、教导处主任王西梅、教科室主任张景琼、总务主任潘山、教导处副主任叶豪、大队部副主任刘文丽、信息技术专干戚莹莹,以及郑州视睿(希沃)副总经理赵一直、信阳区域经理黄少凯、培训顾问马亚亚等双方代表出席了此次活动。


        活动伊始,郑州视睿(希沃)副总经理赵一直致辞道,希沃始终以用户为核心,围绕教师、教室、教学,提供数字化环境硬件、常态化教学应用,致力于让教学卓有成效。同时,对于本次校企双方的合作,他表示“信阳市第一实验小学作为本地院校队伍中的佼佼者,一直致力于探索教育创新之路,注重教育教学的数字化改革。而希沃作为拥有先进教育技术和丰富教育资源的教育科技企业,此次合作,双方将充分发挥各自优势,探讨教育数字化转型阶段的智慧教学教研新模式。”


        希沃培训顾问马亚亚汇报运维方案

        信阳市第一实验小学党总支书记、校长高琼对本次合作抱以高度的认可和期待,她表示“把专业的事情交给专业的人做,希沃就是我们认可的在教育领域的专业团队。本着提升学校发展质量,提升教师队伍水平的初心,促成了我们双方的本次合作,携手认真做教育,将我们畅想的未来式教育理念逐步贯彻实践。”


        随后,在所有来宾的共同见证下,高琼书记与郑州视睿(希沃)副总经理赵一直上台签署了示范校合作协议并进行“希沃智慧教育应用示范校”授牌仪式。

        签约仪式结束后,希沃一行人在高琼书记和杜娟校长的带领下参观了校史馆,一同回顾信阳市第一实验小学悠久的办学历史和丰富的文化底蕴,同时也进一步了解到学校办学理念的前瞻性和教育数字化转型浪潮下的发展信心。


        此外,希沃培训顾问马亚亚面向学校新进教师群体,就希沃白板、希沃信鸽、希沃魔方·数字校园基座等平台和应用进行了分享,通过案例、实操进行教学数字化的赋能培训,进一步巩固老师们的信息化素养。

        此次示范校的签约授牌,不仅是信阳市第一实验小学与希沃合作的起点,更是双方共同探索智慧教育新模式、在智慧课堂建设、教育资源共享、师资培训等方面展开深度合作的开始。相信在双方的共同努力下,将加快推进学校教学教研方式的变革与创新,加快学校数字化建设,推动教育信息化进一步发展。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/321.html b/news/321.html new file mode 100644 index 0000000..dc855be --- /dev/null +++ b/news/321.html @@ -0,0 +1,362 @@ + + + + +2023年全球交互平板市场衰退10.4%;需求、预算、软件化、竞品是四大下滑因素_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2023年全球交互平板市场衰退10.4%;需求、预算、软件化、竞品是四大下滑因素

        +
        +
        +
        +  2024-03-11 阅读:100 +
        +
        +

        根据洛图科技(RUNTO)最新发布的《全球交互平板市场分析季度报告(Global Interactive Board Market Analysis Quarterly Report)》,2023年,全球大尺寸交互平板(Interactive Board)的出货总量为280万台,同比下降10.4% 。

          其中,中国市场出货量占到全球的44.5%,为124.5万台,同比下降13.5%。

          四大因素:需求、预算、软件化、竞品

          分析来看,交互平板市场下滑的原因可以总结为四个方面的因素,这些因素在2023年的影响表现尤为突出。

          一、作为交互平板赛道的主力应用场景,教育市场的需求连年下滑 ,直接影响了整体市场的表现,也降低了自身的内部市占。2022年全球教育和商用的比例接近3.1:1,到2023年已降至2.5:1。

          二、全球性经济下滑影响的深度和广度均远超预期,大量中小企业控制成本、减少非生产性支出、大幅收缩办公设备采购预算 ,取而代之的是采购线上会议系统以及企业数字化管理系统,来实现人效提升和组织协同。

          三、交互平板在产品开发早期所设计的主要功能正在被软件和系统方案替代 ,包括投屏、多人协同会议、音视频采集等功能,通过软件就可以轻松实现。

          四、受传统商教投影机和会议电视、家用电视等竞品挤压 。替代品在价格、渠道、产品认识度等方面都要明显好于交互平板产品,而宣传的侧重点方面,除了交互平板所特有的人机交互功能,其它功能均类同。

          全球市场:教育应用仍占主导,品牌集中度大幅提升,亚太份额最高

          应用方面 ,在2023年以前,海外市场的商用场景中,应用多以投影产品为主。单纯以商用会议作为目标市场的交互平板品牌较少,大部分厂商和产品以开拓各个地区和国家的教育市场为主。2022年,海外市场的教育和商用比例约为3.7:1,2023年该比例降至2.5:1。

          中国市场则不同,2023年在教育领域的应用比例呈现了一定提升,由2022年的2.3:1提升至2023年的2.6:1。

          竞争格局方面 ,全球市场(含中国区)在教育应用方面的品牌集中度较高。2023年,全球前四品牌的合计份额(CR4)达到了50.2%,较2022年提升了19.3个百分点,其中中国品牌Seewo(希沃)的全球市占率为24.6%,位居全球交互平板教育应用行业第一。

          在会议等其它商用场景应用方面,集中度虽然未达到教育场景的水平,但亦实现了快速提升,2023年CR4占据了市场34.9%的市场份额,较2022年提升了14.6个百分点,其中中国品牌MAXHUB在全球范围内的市占率为12.8%,位居全球交互平板会议及其它商用的整体市场行业第一。

          综合全球交互平板市场来看,海外品牌和中国品牌势均力敌,海外品牌中不乏Cisco、Microsoft、Samsung、Google这类巨头企业,也有深耕交互平板领域的ViewSonic、newline、Clevertouch等品牌,同时也有深耕投影领域的品牌,如NEC、Sharp、中国台湾的BenQ等。整体来说,交互平板仍是受到全球制造商重点关注的产品,在跨越经济动荡的周期之后,仍然期待获得发展。

          区域方面 ,从交互平板在全球主要地区的表现来看,亚太地区的出货量占全球整体的54.0%,市占率较2022年降低了1个百分点。与亚太市场的占有率下降相比,其它各地区市场均出现不同程度的上涨。其中,北美市场出货量占比为21.7%,较2022年提升了0.7个百分点;欧洲市场出货量占比为17.2%,较2022年提升了0.2个百分点;其它地区出货量占比为13.1%,较2022年提升了0.1个百分点。从交互平板区域分布微小的变化可以窥见,2023年年初企业重视布局海外市场的策略开始收效。

          中国市场:教育市场近饱和,竞争格局较稳定,华东华西有增长

          应用方面 ,中国交互平板市场整体仍然以教育应用为主,2023年中国教育交互平板(E-IB,Educational Interactive Board)在整体市场的占比约为72%,较2022年提升3个百分点。虽然教育应用居多,但其市场已经接近饱和,换机潮尚未看到大规模爆发的信号,加之地方财政预算紧缺造成的利润和回款风险,未来3-5年内,交互平板市场的参与者仍然会以开发会议及其它商用场景为主要策略。

          从2017年至今,在中国区域,会议及其它商用场景的市场开发始终未出现高增长的态势,洛图科技(RUNTO)谨慎认为,6年过去,商用平板或是会议平板的品类认知仍旧未能有效建立起来,近两年又遭遇了经济下行、企业消费采购降级,在“会议电视”呼之欲来的当前,商用平板可能已经错过了最好的发展时间窗口。

          向后看,教育市场呈现饱和;会议市场的创新进步将以软件应用为主,硬件交互终端产品的设计和迭代需要紧密结合“智慧办公、智慧政务”等用户的需求变化而更新换代。

          竞争格局方面 ,中国市场在教育应用场景的品牌集中度较高,竞争格局也较为稳定。2023年,Seewo、鸿合、海信、安道等前四名品牌的集中度(CR4)已经占据了市场约80%的市场份额,较2022年提升了4个百分点。中国教育市场接近饱和,市场较为成熟,因此行业出现了高集中、高寡占、低利润、低增长的局面。

          在会议及其它商用场景应用方面,集中度正在逐年提升,2023年,包括MAXHUB、皓丽、海康威视、华为、海信、newline六大品牌的CR6占据了市场70%的市场份额,较2022年提升了9个百分点。

          区域方面 ,2023年,中国交互平板市场的出货量整体在向内陆有一定延伸。其中,华东区域市场占有率最高,出货量的占比达到27.4%,较2022年提升10.5个百分点;其次是华西地区,市场占有率为26.8%,较2022年提升5.1个百分点;华南、华北、东北地区的市场占有率则有不同程度的下降。

          值得关注的是,华西市场受益于川渝经济带的快速发展。近几年,川渝地区成为年轻人就业的优选地区,新兴企业不断涌现,作为科技产品接纳度最高的区域之一,为交互平板的快速布设提供了优质的市场环境。

          市场展望:2024年全球出货量将达296万台,上涨5.7%

          从全球各销售地区来看,中国、北美和欧洲的教育和商用产品仍然是出货量最高的三个地区,但教育的主要群体还是K12,随着世界人口结构的变化,主要发达国家和地区的人口减少,未来3年教育市场将保持需求稳定,或呈现出稳中缓增的态势,大概率不会出现较为激进的表现。

          交互平板的市场机会将更集中在以会议为主要应用的商用领域,北美和欧洲的商业比较发达,注重效率和体验,必然会是中国交互平板企业出海的主要落脚区。

          洛图科技(RUNTO)预计,2024年,全球交互平板市场的出货量将达296万台,同比涨5.7% ,其中教育占比继续降低至65%,商用占比将达到35%。在2027年前后,教育将恢复增长,会议等商用领域进入稳定期。到2028年,整体市场出货量将接近366万台。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/33.html b/news/33.html new file mode 100644 index 0000000..9c9ca1a --- /dev/null +++ b/news/33.html @@ -0,0 +1,362 @@ + + + + +金沙滩旅游休闲区旅游标识牌建设项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        金沙滩旅游休闲区旅游标识牌建设项目招标公告

        +
        +
        +
        +  2022-05-13 阅读:6 +
        +
        +

        一、项目基本情况

        项目编号:2022-HZZB-141

        项目名称:金沙滩旅游休闲区旅游标识牌建设项目

        采购方式:公开招标

        预算金额:720,000.00元

        采购需求:

        合同包1(金沙滩旅游休闲区旅游标识牌建设项目):

        合同包预算金额:720,000.00元








        品目号品目名称采购标的数量(单位)技术规格、参数及要求品目预算(元)最高限价(元)
        1-1活动辅助设备

        二里镇金沙滩休闲旅游区乡村旅游导视标注牌制作安装,包含导览图、综合指示牌、停车场指示牌、卫生间指示牌、景点综合介绍牌、产业示范园标牌、温馨提示牌、警示牌等

        1(批)详见采购文件720,000.00


        本合同包不接受联合体投标

        合同履行期限:20天

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        合同包1(金沙滩旅游休闲区旅游标识牌建设项目)落实政府采购政策需满足的资格要求如下:

        (1)《政府采购促进中小企业发展管理办法》的通知--财库〔2020〕46号
        (2)财政部司法部关于政府采购支持监狱企业发展有关问题的通知--财库[2014]68号?
        (3)《财政部?发展改革委?生态环境部?市场监管总局关于调整优化节能产品?环境标志产品政府采购执行机制的通知》(财库〔2019〕9号)
        (4)《节能产品政府采购实施意见》--(财库[2004]185号)?
        (5)《环境标志产品政府采购实施的意见》--财库[2006]90号
        (6)《关于促进残疾人就业政府采购政策的通知》(财库[2017]141号)
        (7)《陕西省财政厅关于加快推进我省中小企业政府采购信用融资工作的通知》(陕财办采〔2020〕15?号)
        (8)《陕西省中小企业政府采购信用融资办法》陕财办采〔2018〕23号
        (9)《关于运用政府采购政策支持乡村产业振兴的通知》(财库〔2021〕19?号)


        3.本项目的特定资格要求:

        合同包1(金沙滩旅游休闲区旅游标识牌建设项目)特定资格要求如下:

        (1)供应商必须是具有独立承担民事责任能力的法人、其他组织或自然人,并出具合法有效的营业执照或事业单位法人证书等国家规定的相关证明,自然人参与的提供其身份证明;?
        (2)具有良好的商业信誉和健全的财务会计制度(提供2021年度财务审计报告或银行出具的资信证明);?
        (3)税收缴纳证明:提供2021年度以来已缴纳的任意一个月的纳税证明或完税证明,依法免税的单位应提供相关证明材料;
        (4)社会保障资金缴纳证明:提供2021年度以来已缴存的任意一个月的社会保障资金缴存单据或社保机构开具的社会保险参保缴费情况证明,依法不需要缴纳社会保障资金的单位应提供相关证明材料;
        (5)供应商提供具有履行本合同所必需的设备和专业技术能力的书面声明;?
        (6)提供投标人参加采购活动近三年内经营活动中没有重大违法记录声明;
        (7)供应商不得为“信用中国”网站(www.creditchina.gov.cn)中列入失信被执行人和重大税收违法案件当事人名单的供应商,不得为中国政府采购网(www.ccgp.gov.cn)政府采购严重违法失信行为记录名单中被财政部门禁止参加政府采购活动的供应商;?
        (8)法定代表人/负责人授权书(附法定代表人/负责人、被授权人身份证)及被授权人身份证(法定代表人/负责人直接参加投标的,须提供法定代表人/负责人身份证明及身份证);
        (9)本项目不接受联合体投标。


        三、获取招标文件

        时间: 2022年05月13日 至 2022年05月19日 ,每天上午 08:00:00 至 12:00:00 ,下午 12:00:00 至 18:00:00 (北京时间,法定节假日除外)

        地点:衡正国际工程咨询有限公司会议室(汉中市汉台区南关社区汉上第一街12号楼23层)

        方式:现场获取

        售价: 500元

        四、提交投标文件截止时间、开标时间和地点

        2022年06月02日 14时30分00秒 (北京时间)

        地点:衡正国际工程咨询有限公司会议室(汉中市汉台区南关社区汉上第一街12号楼23层)

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        本项目开标地点:衡正国际工程咨询有限公司会议室(汉中市汉台区南关社区汉上第一街12号楼23层)

        注:获取采购文件请携带单位介绍信原件、经办人身份证原件及加盖供应商公章的复印件。

        七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名称:城固县二里镇人民政府

        地址:城固县二里镇二里街

        联系方式:19829166689

        2.采购代理机构信息

        名称:衡正国际工程咨询有限公司

        地址:汉中市汉台区南关社区汉上第一街12号楼23层04-05室

        联系方式:0916-8886036

        3.项目联系方式

        项目联系人:陈先生

        电话:0916-8886036

        衡正国际工程咨询有限公司

        2022年05月12日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/34.html b/news/34.html new file mode 100644 index 0000000..6e07528 --- /dev/null +++ b/news/34.html @@ -0,0 +1,362 @@ + + + + +强力巨彩亚户外单红P10新品正式上市_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        强力巨彩亚户外单红P10新品正式上市

        +
        +
        +
        +  2022-05-18 阅读:4 +
        +
        +

        为了帮助客户进一步拓展市场,满足客户对于高性价比产品的需求,强力巨彩特推出亚户外P10单红新品。该亚户外表贴P10单红产品采用正面喷胶和背面喷漆防护工艺,无惧雨天潮湿的亚户外环境,真正满足客户打造门头屏或亚户外公告屏的需求。

          亚户外表贴P10单红正视图

          亚户外表贴P10单红背视图

          真正的亚户外单红P10

          品质足够硬,才敢再定义

          优势1:超高能防护,防潮散热都在行

          相比于市面普通亚户外单红P10产品,强力巨彩本款产品真正做到了防潮,无惧潮湿的亚户外环境,使用寿命更长。

          优势2:显示够清晰,画面效果更出众

          采用高品质、高亮度灯管,画面一致性好,走字流畅,观看舒适。

          优势3:低温可运行,恒流输出性能好

          恒流输出,工作电流小,有效控制灯管温度,光衰小,性能稳定。

          优势4:安全系数高,客户使用更安心

          采用V-0级阻燃PCB材质,使用更加安全,让客户更加放心。

          优势5:安装更方便,简单快捷更高效

          产品安装时,直接插、拔即可完成线材的连接与拆卸,安装简单方便快捷。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/35.html b/news/35.html new file mode 100644 index 0000000..9819742 --- /dev/null +++ b/news/35.html @@ -0,0 +1,362 @@ + + + + +福建省图书馆标识标牌导视系统采购项目结果公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        福建省图书馆标识标牌导视系统采购项目结果公告

        +
        +
        +
        +  2022-05-18 阅读:3 +
        +
        +

        一、项目编号:[3500]FJXH[GK]2022001
        二、项目名称:福建省图书馆标识标牌导视系统采购项目
        三、采购结果
          [3500]FJXH[GK]2022001-1 包1


        四、主要标的信息
          合同包[3500]FJXH[GK]2022001-1 包1

        福建云景标识工程有限公司:
        服务类

        六、代理服务收费标准及金额:
        代理服务费收费标准: 

        招标代理服务费按照中标金额,以差额定率累进法计算,中标金额在100万元以下的按1.5%的标准计费收取。中标人应在领取中标通知书的同时按规定的标准一次性向采购代理机构缴清招标代理服务费。招标代理服务费以银行转账、电汇或现金等付款方式。服务费账号:开户名称:福州信豪工程造价咨询有限公司 账 号:35001870007052514362 开户银行:中国建设银行福州广达支行

        代理服务费收费金额:
        合同包[3500]FJXH[GK]2022001-1 包1 :11906.04元
        收取对象: 中标人
        七、公告期限
          自本公告发布之日起1个工作日
        八、其他补充事宜
          /
        九、凡对本次公告内容提出询问,按以下方式联系。
            1.采购人信息
            名  称:福建省图书馆
            地  址:福州市湖东路227号
            联系方式:13600858878
            2.采购代理机构信息(如有):
            名  称:福州信豪工程造价咨询有限公司
            地  址:福州市鼓楼区福州市鼓楼区华大街道华林路268号侨益大厦14楼1405
            联系方式:0591-83725589
            3.项目联系人
            项目联系人:蒋锦彬
            电  话:0591-83725589

        福州信豪工程造价咨询有限公司


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/36.html b/news/36.html new file mode 100644 index 0000000..5fe2122 --- /dev/null +++ b/news/36.html @@ -0,0 +1,362 @@ + + + + +2022年安徽防洪所标识标牌采购及维修保养服务竞争性磋商公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年安徽防洪所标识标牌采购及维修保养服务竞争性磋商公告

        +
        +
        +
        +  2022-05-18 阅读:9 +
        +
        +

        项目概况

        2022年防洪所标识标牌采购及维修保养服务采购项目的潜在供应商应在安徽公共资源交易集团电子交易系统或安徽合肥·公共资源交易电子服务系统获取采购文件,并于2022年05月27日10点00分前提交(上传)响应文件。

        一、项目基本情况

        项目编号:2022BFFHN00981

        项目名称:2022年防洪所标识标牌采购及维修保养服务

        采购方式:竞争性磋商

        预算金额:35万元

        最高限价:35万元

        采购需求:2022年防洪所标识标牌采购及维修保养等,详见磋商文件

        合同履行期限:合同签订后1年

        本项目是否接受联合体:否

        二、申请人的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定;
            2.落实政府采购政策需满足的资格要求:供应商所提供的货物为中小微企业、监狱企业或残疾人福利性单位制造;
            3.本项目的特定资格要求:无。

        三、获取采购文件

        1.时间:2022年05月17日09:00至2022年05月27日10:00

        2.地点:安徽公共资源交易集团电子交易系统或安徽合肥·公共资源交易电子服务系统

        3.方式:(1)供应商须登录安徽公共资源交易集团电子交易系统或安徽合肥·公共资源交易电子服务系统(电子服务系统)查阅采购文件。首次登录须持有电子服务系统兼容的数字证书,详情参见电子服务系统办事指南。
            (2)采购文件获取过程中有任何疑问,请在工作时间(9:00-17:30,节假日休息)拨打技术支持热线(非项目咨询):4009980000。项目咨询请拨打电话:0551-66223645。

        4.售价:免费

        四、响应文件提交

        1.提交(上传)响应文件截止时间(开标时间):2022年05月27日10点00分

        2.提交(上传)响应文件地点(开标地点):合肥市滨湖新区南京路2588号要素交易市场A区(徽州大道与南京路交口)4楼

        五、开启

        时间:2022年05月27日10点00分

        地点:合肥市滨湖新区南京路2588号要素交易市场A区(徽州大道与南京路交口)4楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        1.本项目落实节能环保、中小微型企业扶持等相关政府采购政策。
            2.本次公告同时在安徽省政府采购网、全国公共资源交易平台(安徽省·合肥市)、全国公共资源交易平台(安徽省)上发布。
            3.供应商应合理安排采购文件获取时间,特别是网络速度慢的地区防止在系统关闭前网络拥堵无法操作。如果因计算机及网络故障造成无法完成采购文件获取,责任自负。
            4.为全力做好新型冠状病毒感染肺炎疫情防控工作,本项目实施全流程电子化交易,响应文件实施网上远程解密,供应商无需前往磋商现场。
            5.疫情期间,各市场主体均应当按照《安徽合肥公共资源交易中心疫情防控期间交易服务指南》开展公共资源交易活动,谢谢理解、支持。

        八、凡对本次采购提出询问,请按以下方式联系

        1.采购人信息

        名称:合肥市排水管理办公室

        地址:合肥市阜阳路39号

        联系方式:0551-62897603

        2.采购代理机构信息

        名称:安徽公共资源交易集团项目管理有限公司

        地址:合肥市滨湖新区南京路2588号(徽州大道与南京路交口)六楼

        联系方式:0551-66223645

        3.项目联系方式

        项目联系人:李工

        电话:0551-66223646

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/37.html b/news/37.html new file mode 100644 index 0000000..9fa8797 --- /dev/null +++ b/news/37.html @@ -0,0 +1,362 @@ + + + + +深圳排查整治全市道路英文标识_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        深圳排查整治全市道路英文标识

        +
        +
        +
        +  2022-05-18 阅读:7 +
        +
        +

        建设国际化大都市,城市文化软实力建设是重要环节。近日,深圳市交通运输局启动对全市道路英文标识排查整治,以进一步完善深圳市的国际标识系统,建设良好的国际语言环境。

        道路路牌作为国际语言环境重要的承载体,是各国友人来深认路识路的重要导向标识。近年来,在外事部门的指导下,市交通运输局对道路英文标识进行了排查整治,发现不少问题,如道路路牌公示语英文单词拼写错误、以汉语拼音代替英文单词等。

        深圳市交通运输局于本月起组织开展道路交通标识英文译写排查整治工作,对全市快速路、主干道和重点区域(包括交通枢纽、国际化街区、行政事业机构、旅游景点等)周边路段进行全面系统排查。

        据了解,对于排查出来的问题,市交通运输局将分类推进整治工作。一是建立档案,到5月底前建立道路交通标识公示语英文译写排查整治档案,为后续强化巡查管养提供依据;二是完成整治,对于存在英文拼写错误、汉语拼音代替英文单词的道路交通标识,立即组织整改;对于公示语英文缺失、译写不统一等需重新设置英文的道路交通标识,将根据《汉英深圳公示语辞典》《深圳市公示语英文译写和使用管理办法》有关原则补充英文译写,预计在7月完成所有道路交通标识英文译写问题整治工作。(记者 戴晓蓉)

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/38.html b/news/38.html new file mode 100644 index 0000000..4418f8e --- /dev/null +++ b/news/38.html @@ -0,0 +1,362 @@ + + + + +六安市第二人民医院综合大楼标识标牌设计、制作及安装采购项目采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        六安市第二人民医院综合大楼标识标牌设计、制作及安装采购项目采购公告

        +
        +
        +
        +  2022-05-18 阅读:5 +
        +
        +

        六安市第二人民医院门诊、内科病房及老年养护院综合大楼标识标牌设计、制作及安装采购项目(二次)竞争性磋商采购公告

        项目概况:六安市第二人民医院门诊、内科病房及老年养护院综合大楼标识标牌设计、制作及安装采购项目(二次)(22AT49046903507)的潜在供应商应在六安市公共资源交易电子服务系统(http://ggzy.luan.gov.cn)获取采购文件,并于2022年 5 月 30 日09点 00 分(北京时间)前提交响应文件。

        一、项目基本情况

        1、项目编号:22AT49046903507

        2、项目名称:六安市第二人民医院门诊、内科病房及老年养护院综合大楼标识标牌设计、制作及安装采购项目(二次)

        3、项目类型:服务类

        4、采购方式:竞争性磋商

        5、预算金额:167万元

        6、最高限价:167万元

        7、资金来源:财政资金

        8、标段(包别)划分:本项目不分包。

        9、采购需求:皖西卫生职业学院附属医院拟就六安市第二人民医院门诊、内科病房及老年养护院综合大楼标识标牌设计、制作及安装采购项目(二次)进行竞争性磋商采购,具体内容见公告附件:项目采购需求。

        10、合同履行期限:合同签订后90日内完成设计、制作及安装。

        11、是否接受联合体:本项目不接受联合体投标。

        二、申请人的资格要求

        1、满足《中华人民共和国政府采购法》第二十二条规定;

          2、落实政府采购政策需满足的资格要求:无

        3、本项目的特定资格要求:无

        4、供应商存在以下不良信用记录情形之一的,不得推荐为成交候选供应商,不得确定为成交供应商:

        (1)供应商被人民法院列入失信被执行人的;

        (2)供应商被市场监督管理部门列入企业经营异常名录的;

        (3)供应商被税务部门列入重大税收违法案件当事人名单的;

        (4)供应商被政府采购监管部门列入政府采购严重违法失信行为记录名单的。

        三、获取采购文件

        1、时间:自公告发布之日起至响应文件提交截止时间止

        2、地点:六安市公共资源交易电子服务系统(http://ggzy.luan.gov.cn)

        3、获取方式:①本项目采购文件(答疑澄清等相关文件资料)从六安市公共资源交易电子服务系统下载;②供应商注册、办理CA联系电话400-998-0000、400-880-4959;③供应商在下载响应文件(答疑澄清等相关文件资料)过程中若遇到问题,电话:400-998-0000。

        4、售价:零元

        四、响应文件提交

        1、截止时间:2022年 5月 30 日 09 点 00 分(北京时间)

        2、提交方式:电子响应文件应在提交截止时间前通过六安公共资源交易中心电子交易系统上传,不再接收纸质标书。

        3、供应商应按本项目采购公告、采购文件的要求,在响应截止时间前将评审要求提交的资质资格及社保缴费证明、奖项、业绩、荣誉等相关资料原件的扫描件录入市场主体信息库中。供应商在制作响应文件时,须将采购文件要求的资质资格、社保缴费证明、奖项、业绩、荣誉等相关资料原件扫描件编入响应文件中,磋商小组在评审时以响应文件编入的信息原件扫描件为评审依据。供应商须确保响应文件编入的前述资料的原件扫描件与用于市场主体库录入的原件扫描件的真实性完全一致。完税证明、银行授信文件、预授信文件(意向函或授信承诺函)等涉及企业秘密的资料,由供应商将其原件的扫描件直接编入响应文件。也可将其原件的扫描件在录入市场主体库“其他信息”(该栏目属于不对外开放查询子目)栏目后再编入响应文件,若供应商将完税证明、银行授信文件、预授信文件(意向函或授信承诺函)等涉及企业秘密的资料录入市场主体库中的对外开放查询栏目导致其他竞争主体知悉造成的后果由供应商自行负责。编入响应文件的各种证书、证照、证明、文件、业绩、奖项、荣誉以及完税证明、银行授信文件等涉及企业秘密的资料的扫描件的原件,其真实性、准确性、完整性均由供应商负责。

        本项目只接受安徽省公共资源交易市场主体库中已入库企业参与磋商,未入库的供应商请及时办理入库手续(供应商在办理企业入库手续时,六安市公共资源交易中心不收取任何费用)。

        安徽省公共资源交易市场主体库注册联系电话:010-86483801转5-2;

        六安市公共资源交易平台电子交易系统联系电话:400-998-0000;

        六安市公共资源交易平台电子交易系统CA证书办理机构:安徽CA(安徽省电子认证管理中心有限责任公司)联系电话:400-880-4959;CFCA(江苏翔晟信息技术股份有限公司)联系电话:025-66085508,因未及时办理入库手续导致无法参与谈判的,责任自负,程序请参见中心网站“操作手册下载”。

        五、响应文件开启

        1、时间:2022年 05 月 30 日 09 点 00 分(北京时间)

        2、地点:六安市梅山南路农科大厦三楼开标二室(不见面开标大厅)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他事宜

        (一)本项目采用不见面开标(远程解密)方式,开标时供应商无需至开标现场进行解密,开标采取远程解密方式解密响应文件,供应商远程解密可选择以下两种方式:

        ①方式一:供应商在开标时间前使用CA数字证书登录六安市“不见面开标系统”,网址为:http:183.162.78.64:9016/BidOpening,等待开标并按系统提示进行相应的供应商解密等事项,无需到开标现场。采用本方式可以观看开标现场音视频直播并进行互动交流。具体操作方法见六安市公共资源交易中心网站“服务指引—交易微课堂”栏目中“六安市公共资源交易不见面开标系统操作手册(投标人)”;

        ②方式二:可继续在电子交易系统>开标签到解密>远程解密中进行解密操作,采用此方式仅能实现解密功能,无法观看音视频直播并进行互动交流。

        两种方式的解密时间要求为:解密程序开始后每个供应商均应在解密指令发出后30分钟内完成解密,否则响应文件将被拒绝。

        (二)参加本项目的供应商应提前准备好电脑、耳麦等相关设备,确保开标顺利进行,如因设备造成的问题由供应商自行负责,供应商应在开标前半小时登录六安市公共资源交易不见面开标系统完成签到,否则将无法完成后续开标流程,并视为放弃投标。具体操作流程及相关规定以《六安市公共资源交易不见面开标操作规定(试行)》和“六安市公共资源交易中心不见面开标系统-操作手册(投标人)”为准。

        (三)严禁恶意低价或恶意高价竞标,对恶意低价或恶意高价竞标的,采购人有权围绕是否为“陪标”拉价格(商务)分值进行调查处理,经查证属实的,其投标无效,同时给予限制投标资格等处理。

        八、凡对本次采购提出询问,请按以下方式联系。

        1、采购人信息

        名 称:皖西卫生职业学院附属医院(六安市第二人民医院)

        地址:六安市磨子潭南路73号

        联系方式:0564-3300160

        2、采购代理机构信息

        名 称:安徽安天利信工程管理股份有限公司

        地 址:安徽省合肥市祁门路1779号国贸大厦

        联系方式:18656633662

        3、项目联系方式

        项目联系人:杨工

        电    话:18656633662

        皖西卫生职业学院附属医院(六安市第二人民医院)

        安徽安天利信工程管理股份有限公司

        2022年05月17日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/39.html b/news/39.html new file mode 100644 index 0000000..b06f22e --- /dev/null +++ b/news/39.html @@ -0,0 +1,362 @@ + + + + +安徽省开展户外广告和招牌设施安全隐患排查整治_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        安徽省开展户外广告和招牌设施安全隐患排查整治

        +
        +
        +
        +  2022-05-18 阅读:5 +
        +
        +

        为了防范化解城市户外广告和招牌设施重大安全风险,确保市民们“头顶上的安全”,近日我省决定在全省范围内立即开展户外广告和招牌设施安全隐患排查整治。

        根据部署,自即日起至2022年6月底前,全省范围将全面完成户外广告和招牌设施安全隐患排查工作,摸清底数,逐一建档造册,实行台账管理。2022年12月底前,完成整改工作,消除安全隐患。

        重点排查设置在建(构)筑物、公共设施上的户外广告设施,独立式户外广告设施(包括立杆式户外广告设施、底座式户外广告设施、大型落地户外广告设施、大型高立柱户外广告设施及实物造型户外广告设施),以及户外招牌设施等的规划、设计、施工、验收、运行管理全过程全周期的安全隐患,不留盲区,不留死角。

        按照计划,各地要坚持边查边改,严格按照规范要求,对排查发现存在安全隐患的户外广告和招牌设施,采取切实有效的安全防范措施,督促整改到位,及时消除安全隐患。对排查中发现的违法违规行为,坚决依法依规进行处理。

        全省将压实属地主管部门、所有权人、使用人等的相应责任,组织专家排查,制定整改方案,跟踪整改落实,实行动态销号,强化闭环监管,确保户外广告和招牌设施运行安全可靠。

        今后,各地还要加快制定城市户外广告设置规划和安全要求,规范户外广告科学设置、合理布局。另外,探索建设户外广告设施智慧管理系统,创新管理手段,实行全天候安全管理。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/4.html b/news/4.html new file mode 100644 index 0000000..752accd --- /dev/null +++ b/news/4.html @@ -0,0 +1,362 @@ + + + + +广告标牌如何美化城市环境、提升城市竞争力?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        广告标牌如何美化城市环境、提升城市竞争力?

        +
        +
        +
        +  2022-04-29 阅读:10 +
        +
        +

        随着社会的不断发展,标识标牌得到广泛应用,如小区楼宇、商超连锁、轨道交通等,广告标牌作为城市家具之一,随着新基建+中国城市化进程加速,标识标牌需求数量大幅度提升。

        城市的发展,标识标牌承担着十分重要的作用,它不只是城市功能的重要载体,同时也影响着我们城市的各个方面的发展,下面大家聊聊,标识标牌对城市发展有哪些影响。

        广告标牌

        一、信息传递

        日常生活中常见的标识标牌,为我们的生活提供了便利,快速了解自己所需信息,方便我们的出行。如小区标识标牌、宣传栏、医院导视标牌、公交站标牌、地铁站标牌等等。

        标识标牌的设计融入设计者的智慧和心血,通过图形、文字、符号、线条等元素,构成视觉图像系统,构成城市环境整体的重要部分,融环境功能和形象工程为一体。呈现给我们,很好的视觉效果,也是信息传递的有效途径。

        二、交通秩序

        近年来,汽车的数量急剧增加,交通堵塞严重,在各个重要关卡处设置完善交通标识标牌,引导交通秩序,可以很好地缓解交通压力,方面出行。

        三、美化环境

        随着社会发展,现代标识标牌具有的信息传达功能,还有良好的视觉效果,符合现代人们的审美。技术的革新,标识标牌的造型多样化,标识标牌不仅仅是一种基础设施,还做对城市环境起到美化的作用,让城市增添一道风景线。

        如我们身边的公交候车厅标牌、门店广告招牌、橱窗广告、电子显示屏等,以各种形式展现,覆盖在公交、地铁、商城、停车场、街道、楼宇、社区等建筑物上,大街小巷随处可见广告标牌的身影。

        城市环境在标识标牌的导入,有助于指导城市建设科学、有序、快速地进行。标识标牌与城市环境相互影响,在未来,标识标牌为城市文化、城市形象、城市特色等方面发挥着重要作用,成为打造城市的一张名片。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/40.html b/news/40.html new file mode 100644 index 0000000..a0ccdc2 --- /dev/null +++ b/news/40.html @@ -0,0 +1,362 @@ + + + + +新疆医科大学第六附属医院室内、外标识标牌宣传品设计制作安装项目变更公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        新疆医科大学第六附属医院室内、外标识标牌宣传品设计制作安装项目变更公告

        +
        +
        +
        +  2022-05-19 阅读:36 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:0634-224XZ1QF0102      

        原公告的采购项目名称:新疆医科大学第六附属医院室内、外标识标牌宣传品设计制作安装项目竞争性磋商      

        首次公告日期:2022年05月07日      


        二、更正信息

        更正事项:采购公告

        更正内容:

        原定开标地点:乌鲁木齐市友好南路179号自治区工信厅13楼评标一室

        现变更开标地点:乌鲁木齐扬子江路188号兵房大厦三楼会议室

        更正日期:2022年05月19日 


        三、其他补充事宜

        其他内容不变


        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名 称:新疆医科大学第六附属医院     

        地址:乌鲁木齐市天山区五星南路39号        

        联系方式:/      

        2.采购代理机构信息

        名 称:新疆招标有限公司            

        地 址:新疆乌鲁木齐市友好南路179号招标1部            

        联系方式:王浩羽 18160659265            

        3.项目联系方式

        项目联系人:王浩羽

        电 话:  18160659265

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/41.html b/news/41.html new file mode 100644 index 0000000..0bf9297 --- /dev/null +++ b/news/41.html @@ -0,0 +1,362 @@ + + + + +确保公路安全畅通 湘乡市开展非法广告牌拆除行动_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        确保公路安全畅通 湘乡市开展非法广告牌拆除行动

        +
        +
        +
        +  2022-05-19 阅读:2 +
        +
        +

        5月16日,湘乡市交通运输综合行政执法大队开展非公路标志标牌专项整治行动,对湘乡市境内国省干线公路和主要公路两侧非公路标志标牌进行依法拆除。

        在白田镇G234线公路用地范围内,五块未经许可设置的非公路标志标牌树立在道路两侧。执法人员根据广告牌上的电话号码与广告牌设置当事人取得联系,对其进行批评教育,并将广告牌进行拆除。

        今年5月是第八个全国“路政宣传月”。下一步,湘乡将以“守护公路安全、争当服务先锋”为主题,结合公路路域环境集中整治行动,加大公路巡查力度,对涉及的非法广告牌,严格依法及时进行处置,同时将加强公路法律法规宣传,积极引导群众提升对非公路标志牌等设施影响公路通行安全的认识度,为全市公路安全通行保驾护航。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/42.html b/news/42.html new file mode 100644 index 0000000..2bfc782 --- /dev/null +++ b/news/42.html @@ -0,0 +1,362 @@ + + + + +2022年Q1数字标牌销量仅为15万台,同比下降48.0%_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年Q1数字标牌销量仅为15万台,同比下降48.0%

        +
        +
        +
        +  2022-05-22 阅读:33 +
        +
        +

        2022年国内多地疫情反扑,国内经济复苏中断,零售业和广告业对数字标牌需求高速下滑,据《AVC Revo-2022年Q1中国大陆数字标牌市场研究报告》数据显示,2022年Q1数字标牌销量仅为15万台,同比下降48.0%,销额为6.0亿元,同比下降47.8%,其中广告机销量为12万台,为数字标牌最大的出货产品。

        2022年Q1数字标牌销量及销额

        数据来源:奥维睿沃  单位:千台,亿元,%

        梯媒广告为广告机最大的出货市场

        2022年Q1在广告机市场中,梯媒需求占比最大,为47.3%。梯媒作为广告投放的场景之一,每年梯媒LCD广告花费均高于其他广告形态,梯媒广告备受广告主欢迎,其市场需求有望进一步扩大。

        数据来源:奥维睿沃  单位:%

        梯媒市场需求带动小尺寸广告机占据市场主力

        梯媒市场应用最为广泛的为19”、21.5”、25”,据奥维睿沃(AVC Revo)数据显示:2022年Q1广告机市场19”、21.5”、25”产品出货占比分别为12%、18%和6.9%,其中30”以下小屏产品出货总计占比为41%,小尺寸产品在广告机市场中占有较大的比重。

        2022年Q1广告机尺寸销量份额

        数据来源:奥维睿沃  单位:%

        “十四五”期间老旧小区电梯改造预计新增350万台广告机

        2020年7月在国务院办公厅发布《关于全面推进城镇老旧小区改造工作的指导意见》,我国计划到“十四五”期末,力争基本完成2000年底前建成的老旧小区改造任务,即21.9万个城镇老旧小区。随着国内物联网不断推进,老旧小区改造主要向智慧化方向发展,而梯媒广告机在电梯管理中发挥不可替代的作用,如降低人工巡检次数、提升乘梯体验、拓展增值业务。奥维睿沃(AVC Revo)推算2021-2025年改造旧电梯数为105万部,加装电梯数为245万部,预计梯媒广告机需求量总计为350万台。

        2022年虽然零售市场萎靡,但梯媒市场仍有一线曙光。分众传媒计划楼宇媒体自营设备数增至267.3万台,且点位扩充以智能屏为主。传媒企业的点位扩张将为广告机市场带来新的发展机会,奥维睿沃(AVC Revo)预测2022年广告机销量将同比下降9.9%,销额同比下降10.2%。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/43.html b/news/43.html new file mode 100644 index 0000000..ef042e8 --- /dev/null +++ b/news/43.html @@ -0,0 +1,362 @@ + + + + +海信商用显示未来三年持续落地“大显示”战略_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        海信商用显示未来三年持续落地“大显示”战略

        +
        +
        +
        +  2022-05-23 阅读:3 +
        +
        +

        5月20日下午,海信商用显示2022年新品发布会如期举办,整场发布会可谓全程高能,海信商用显示公司发布全新Vision系列产品战略,将办公、教育、智能显示等产品明确定位,最新款Vision Hub海信会议平板、Vision One巨幕与Vision X视界LED两大系列新品惊艳亮相。此次新品发布会以“大视界 大智慧”为主题,与之契合的海信“大显示”战略引起广泛关注。那么海信商用显示是如何推动海信“大显示”战略持续落地,又将在哪些方向上“大有可为”?海信商用显示公司总经理刘雪莉在发布会上给出了明确答案。

        深耕显示,应对商显市场推动战略

        信息爆炸的当今社会,显示作为信息的可视化载体,正以不可或缺的重要性占据着市场。据奥维睿沃数据显示,2021年中国商显市场的销售额达到了803.1亿元,这是一个十分可观的数字,并且从全球范围来看,这一数据在未来3年仍将保持近10%的年复合增长率。由此可见,商显市场未来的发展趋势是极为蓬勃向上的。而对于由显示产业起家的海信来说,良好的形势是东风,亦是考验。“大显示”战略正是对市场形势的有力应答。

        深耕显示行业的50余年来,海信在显示画质、芯片、触控交互专利上的积累达数千项之多。2021年,海信发布了“显示无处不在 服务无处不在”的大显示战略,通过提高AI、5G、芯片、OS等基础产业链能力,带动显示技术创新、应用场景拓展、云服务升级等全方位迈进,“大显示”应用模式初具规模。而此次发布会的新品,则是“大显示”战略持续落地的一场深入探索。

        赋能客户,着眼人群痛点精研技术

        随着网络技术的成熟、大数据的应用以及LED显示屏的天然优势日益凸显,诸多企业纷纷投身其中,庞大的市场规模加快了新产品、新技术地推广应用。与此同时,LED显示技术趋于成熟,市场进入存量阶段,由此产生的行业格局变化使得各家商显品牌都不敢轻易停下脚步。

        当然,无论市场如何瞬息万变,客户的需求始终是产品技术研发的指引。作为商用显示领域的实力代表,海信商用显示依托母公司海信集团的深厚底蕴与技术支持,继承“显示”的基因,着眼于不同领域的需求重点发力,打造出差异化产品线阵容,此次全新升级的两大LED产品矩阵更是打造出独属于海信商用显示的显著竞争力。

        海信商用显示始终以“显示”作为着力点,赋能客户,针对人群痛点去精研技术,正因如此,其每次新品面世都既有可预见的革新方向,又有未知的惊喜突破。

        广泛布局,海信商显是出海战略重要一环

        作为承接“大显示”战略的重要支撑,海信商用显示近年来在智慧办公、智慧教育、智能显示产品和解决方案上进行了广泛的布局,其应用已渗透到各行各业中:智慧办公产品入驻包含中国人寿、中铁、电网等500强大型企业;智慧教育产品“普教智慧教室”在全国135个地级以上城市部署;海信智能显示产品和解决方案成功应用于长沙公安局和交警、山东高速等指挥中心,青岛胶东国际机场,北京、南京、贵阳和青岛等地铁系统。

        据海信官方发布的数据来看,海信商用显示自2019年进入海外市场,近两年规模实现了突破式增长,两年复合增长率达到了256.5%。2021年,海信营收1755亿元,同比增长24%。其中海外收入725亿元,同比增长32%。2022年, B2B产业出海是海信重要的战略发展方向,作为海信布局海外的核心力量,海信商用显示公司依托海信多年积累的研发实力,针对海外市场推出多产品及解决方案,在海外市场大放异彩。此前,巴黎圣日耳曼足球俱乐部的主场巴黎王子公园球场LED屏幕带和计分大屏幕,位于香榭丽舍大街的球迷商店,英国的BP石油连锁加油站,波兰的KFC连锁餐厅,挪威的国家冰球场和奥斯陆艺术中心,都有海信商用显示屏的身影。

        明确目标,锁定行业TOP3领先优势 扩大海外版图

        “大显示”战略持续落地的背后,必然少不了技术力量的支持。海信商用显示产品已经在智慧协同、隐私保护、噪音过滤、广色域和用户体验等方面实现突破,形成新产品的独特优势。海信商用显示在各领域的雄心壮志是显而易见的,海信全场景会议平板系列为行业带来了太多惊喜,而智慧教育领域的产品也频频获奖。如海信商用显示总经理刘雪莉女士所说:“我们在智慧教育行业要稳进TOP3;智慧办公行业力争进入TOP3;此外,要建立LED大屏画质的领先优势,打造有竞争力的LED产品线阵容,实现业务规模翻番。在海外业务上,我们会继续扩大业务布局,全面覆盖欧洲、亚太、中东非、南非、美洲五大区域市场,同时扩充与完善各区域当地团队建设。海信商显将搭建专业化B2B海外产品及研发团队,提升产品全球竞争力,建立健全海外B2B产品应用生态,打造‘出海’业务的新标杆。”

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/44.html b/news/44.html new file mode 100644 index 0000000..8b78dc4 --- /dev/null +++ b/news/44.html @@ -0,0 +1,362 @@ + + + + +标牌制作要规范,武昌南湖拆除违规广告牌_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        标牌制作要规范,武昌南湖拆除违规广告牌

        +
        +
        +
        +  2022-05-23 阅读:6 +
        +
        +

        “这个广告牌拆除得非常好,每次从这里路过,我都担心它掉下来砸到人,这下不仅消除了安全隐患,看起来也更干净了。”市民徐先生说道。

        今年来,武昌区南湖街道积极净化城市公共空间,致力增添城市“气质”。组织综合执法中心队伍对辖区内违规广告进行集中清理整治。被拆除的违规广告牌涉及招牌超高超大、招牌上多加字、私设多个招牌、招牌破损年久失修等问题。据统计,此次累计拆除、更换违规广告招牌21处,为进一步优化城市营商环境提速增质。

        南湖街道沿街部分商铺设置招牌为求醒目,长期将招牌“整体”裸露在户外,用于支撑的钢结构经过日晒雨淋,极易锈蚀老化,遇到梅雨季节或大风暴雨天气,老旧广告招牌存在坠落的风险,易造成安全事故。

        拆违前期,执法人员对南湖街沿街商铺的广告牌进行了摸排、取证、登记,多次登门入户宣传,向商户讲解相关政策规定;作为广告牌等设施的所有人、管理人,督促自查自改,要第一时间排除有关设施的安全隐患,对老旧广告招牌及时进行加固或更换,确保门店营商安全。执法人员强调,对于自行施工整改存在困难的商户,可以向执法中心申请协助拆除。

        整个拆除过程为确保安全高效,启用吊车、拖车等重型机械到现场开展拆除工作,并在现场设置警戒线,增派专人负责道路交通、维持秩序。

        经过对门店招牌的集中整改,武昌区南湖街道部分重点路段门店招牌设置有所改善,此项措施既维护了广大商户正规经营的权益,又排除了安全隐患,城市外立面也得到一定程度的美化。

        商家李先生说:“我们要积极响应南湖街的文明城市创建工作,配合拆违清乱,让南湖的城市面貌和营商环境变得更好,那样我们的生意才会越做越好”。同时李先生也表达了对城管执法人员工作的理解与感谢。

        据执法人员介绍,后续南湖街综合执法中心将继续加大巡查监管力度,强化户外广告招牌设置管理,对拆除后的户外广告进行“回头看”,杜绝“回潮”;对违规户外广告招牌发现一处、拆除一处、规范一处。同时呼吁临街商户要从我做起,自行杜绝违规广告招牌的设置,树立起正确的营商理念,共同营造一个良好的市容环境,为创建全国文明典范城市助力。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/45.html b/news/45.html new file mode 100644 index 0000000..f1505fa --- /dev/null +++ b/news/45.html @@ -0,0 +1,362 @@ + + + + +户外数字标牌如何进行营销宣传_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        户外数字标牌如何进行营销宣传

        +
        +
        +
        +  2022-05-23 阅读:2 +
        +
        +

        随着户外数字标牌的不断升温,市场营销人员亟需对该媒体有一个全面的认知,以便从中发现机遇并更好地获得投资回报。

        为了事半功倍及优化投资,这里有以下几点建议:

        1.充分理解并精确定位。

        为满足战略及竞争需要,户外数字标牌可涉及各种可能的领域,但这并不是强调 其应用的广泛性,而是基于不同客户群和环境,市场营销者可有针对性地投放所 需广告。

        户外数字标牌网络的网点设置有其特定的分布依据,比如要考虑到某地的人 口总数、邻近关系、客户数量及富裕程度,当然还包括准备售出的产品。而品牌 经销商大可利用其精确的定位能力及强大的宣传力度来运作某项计划,以医疗环 境为例,有意识地针对某地及人群特点来设定播出内容,便可使该地受众更易于 接受相关信息。 

        2.从购买角度看数字标牌活动

        如今,有超过 70%的消费者是于店内才下定决心购物的。从沙发到商店的购 物模式早已不复存在,而与之相对的则是顾客们在购物时所接收到的产品信息。 事实上,在一些极端的例子下,有品牌商实现过产品销售额的三位数增长——当 然这是基于播放产品信息的显示屏安装在了正确位置进而使其带有独特创意的 产品讯息发挥了作用。

        因此,引导及点对点销售的喜人成绩都得归功于户外数字标牌的支持。同时, 在户外数字标牌的作用下,一些顶尖品牌的知名度不仅有了 49%的增长率,其产 品的销售额也有了 40%的提升。而这场数字标牌运动的结果表明,在当今市场上, 任何新生产品的投放都离不开户外数字标牌的帮助。 

        3.抓住机会,拉近契合度

        户外数字标牌无疑是一种新兴且与众不同的媒体,自有其独一无二的需求和 机遇。它的数字化及户外数字标牌网络的各种功用,都为完美定位其所需环境和 受众做出了极大贡献。这同时也意味着,植入其中的程序及市场讯息都必须考虑到消费者的消费习惯、消费心理和消费环境。当然,要使顾客需求和产品功用完 全契合也是不可能的,因此,在最大程度上拉近两者间的契合度,令顾客欢欢喜 喜地把产品“带回家”才是最佳选择。 

        4.与其他媒体合作的综合战略

        户外数字标牌与消费者的日常生活息息相关,引申开来就是——它为消费者提供一个由多种平台综合而成的市场解决方案。由于它们的可定址性和智能性, 户外数字标牌、手机及各类线上媒体间存在着千丝万缕的内在联系及协同关系。 一切在户外数字标牌网络上发起的运动皆可在显示屏上实现,而这就促使智能手 机的用户参与其中,共同使用或下载一些更具体的资讯。事实上,正是户外数字 标牌的可行性和实效性使其在我们的生活中扮演越来越重要的角色。

        5.设定策略目标并全面预测结果

        并不是所有户外数字标牌活动在发起之初就设定好相同的营销策略或是竞 争目标。一个零售商,众所周知,只有营业额的提升才能使其欢欣鼓舞。然而除 此之外,还有许多别的因素参杂其中:比如广告及品牌回想度、购买意向、停留时间和市场与市场间的比较等。

        它的数字化及户外数字标牌网络的各种功用,都为完美定位其所需环境和受众做出了极大贡献。这同时也意味着,植入其中的程序及市场讯息都必须考虑到 消费者的消费习惯、消费心理和消费环境。

        这是个成熟的媒体,适当的指标和问责对公信及认可度的形成非常重要。研 究不仅会建立及验证体系中真正有实效的,还能去除那些不可行的方法、策略、 目标、环境和创意。而该媒体最强大的一面是——它极快的运作、回应及随着反 馈而及时调整的能力。

        然而,目标一旦确定,目标市场及所选地点也就有了针对性,由此便可进行 深入研究,从而更全面的分析既定项目。而像这样的经济增长区块,是以范围、 时间、技术及预算等各方面为依据,因此想要踏实地完成任务,详尽的分析必不 可少。

        6.让数字标牌变得创意十足

        户外数字标牌自成一派。户外数字标牌(DigitalOut-Of-Home)是非家用电 视的显示终端,它看起来像电视,但真正播放起来则需要广告学的支持,而这就 让它成了独一无二的媒介。任何正在打户外数字标牌主意的人都别指望把它当作 是广播并起到广而告知的作用。

        换句话说,新颖的专属创意才是数字标牌的最佳选择,而在许多数字标牌活动中就包含了各种多媒体技术,可以在不加大开销的情况下,使消费者对产品的 认可度达到最高并使销售机会最优化。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/46.html b/news/46.html new file mode 100644 index 0000000..59fcfc9 --- /dev/null +++ b/news/46.html @@ -0,0 +1,362 @@ + + + + +海信Micro LED一体机正式发布:国内首款可量产Micro LED芯片_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        海信Micro LED一体机正式发布:国内首款可量产Micro LED芯片

        +
        +
        +
        +  2022-05-24 阅读:7 +
        +
        +

        5月20日,主题为“大视界 大智慧”的海信商用显示2022新品发布会举行,通过线上直播,面向全球发布海信旗舰款Micro LED一体机、专业款2K一体机和星图系列COB小间距模组三个新品。50多年来,海信一直贯彻“技术立企”的战略理念,始终以显示和图像处理技术为核心,在显示产业生态链纵深布局,积极拥抱信息化和智能化的浪潮,打通了从底层技术、终端设备、场景应用、云端支撑到内容服务的全产业链条。

        国内首款可量产且采用真正Micro LED芯片

        众所周知,Micro LED是最近几年LED行业新的增长动力,是目前最大的风口。行业公认的Micro LED是LCD液晶、OLED之后的主流显示技术,根据第三方的预测,未来 Micro LED 全球市场将快速增长,2027年将超过105亿美元,年复合增长率达126%,市场前景广阔。而随着5G+8K超高清推广和普及,小间距之后,微间距时代必然到来,未来成长非常可观。

        海信Micro LED一体机具有“沉浸式的深黑显示”优势,采用了比头发丝还精细的小于75μm Micro LED发光芯片,芯片周边全部采用精密喷涂的深黑密封技术,高达98%的黑色表面占比,可呈现沉浸式的纯黑显示效果,实现高达百万比一的对比度。即使是熄屏状态下,也是一面墨玉般深邃大气的装饰品。同时,它采用行业独有的双重混Bin技术,在LED封装和固晶前后两个环节进行两次不同的LED混Bin,确保不同灯板之间LED的颜色一致;加持海信独有的广播级色彩还原技术,以及逐台的图像校正,能为用户呈现出色彩更加纯净自然的真实视界。

        在打造旗舰画质的同时,海信的Micro LED一体机具有“节能冷屏”的优势。整体系统功耗较同类产品降低超过30%。如果以一天工作12h算,一年可节省超过4000度电,符合当下碳中和的国家战略。同时长时间工作屏体表面温升小于15℃,在屏前面几乎不会感受到热辐射,真正的舒适冷屏体验,解决了室内普通大屏对周围环境热辐射过高的尴尬。

        行业首创SOC+ASIC系统方案——星图COB产品

        海信的全新SOC+ASIC系统方案,跟传统的FPGA系统方案相比,取消了接收卡和发送卡,对于一个4K模块来说,只需要一根HDMI线即可,给客户节省了大量空间。信号链路简单,可靠性更高。更重要的是,从传统的网线带宽20M,升级到ELVDS传输高达350M的带宽,让海信的产品具备了智能化的可能。

        类似monitor显示器、新能源汽车等行业,LED屏的未来,也必须向智能化发展,具备智能化才有更广阔的市场前景,这是存量市场竞争的必然选择。可是传统的FPGA系统方案开发周期长、灵活度低、集成度差、成本高,很难实现智能化。依赖网线传输,只有20M的带宽,就像一个单向一车道的马路,传输图像数据就已经把马路挤满了。所以传统的方式就很难实现智能化。而海信的SOC+ASIC方案,开发出了ELVDS高速链路,带宽高达350M,就是双向八车道的马路,具备了前后端数据交互、AI深度学习的基础。

        基于这套平台,海信的COB小间距具备了如下四大优势:更清晰、更可靠、更节能和更智能。

        VISION ONE专业款P 系列LED一体机

        新一代海信小间距LED一体机在出色的显示效果、高效的协同办公及共阴节能设计的基础上,紧扣客户需求,对产品形态进行了音质、系统、外观三项全面升级。

        海信小间距LED一体机首先从音质上进行创新,搭载Dolby&DTS音效双解码,给您身临其境的立体环绕音效,再加上60W大功率音响的加持,使得低音更震撼,高音更明亮,全方位打造影院级的震撼音效。在系统方面,新一代产品搭载海信自主研发全场景会议解决方案,操作便捷,快速上手。外观上,28mm超薄机身,搭配简洁稳重的金属前饰和星云框架,视觉感受更震撼。

        面向指挥中心、安防监控、会议室、展览展示、广电演播室等应用场景,海信已经拥有了完整的LED产品线,旗下产品包括Micro LED一体机、小间距LED一体机、COB小间距、LED模组等。海信凭借出色的显示、优异的图像处理技术和稳定可靠的产品赢得了客户的认可,目前已在青岛司法局、长沙公安局、重庆南岸公安局、菏泽学院、崂山二中、齐鲁医院、德州欢乐谷、上海虹桥高铁站等场所打造了多个成功案例。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/47.html b/news/47.html new file mode 100644 index 0000000..bf9b142 --- /dev/null +++ b/news/47.html @@ -0,0 +1,362 @@ + + + + +宁波象山:数字赋能全域标牌管理 促进城乡空间整洁有序_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        宁波象山:数字赋能全域标牌管理 促进城乡空间整洁有序

        +
        +
        +
        +  2022-05-24 阅读:9 +
        +
        +

        为化解城乡公共空间设置的各类标牌因管理缺失而产生的无序设置、牌体倾斜、版面破损、信息失效等问题,宁波市象山县抢抓亚运契机,结合城乡风貌整治提升工作,于2022年2月正式开展迎亚运城乡公共空间标牌专项整治行动,对全县范围设置的各类标识标牌进行“清除、归并、更新”。

          “清除”即拆除城乡公共空间设置的所有旧标牌;“归并”即对各类标牌设置点位进行重新规划布点,减少点位数量;“更新”即根据新的布点规划安装各类新标牌。通过精简数量、规整样式,实现标牌设置“减少”“减色”。为巩固行动成果,形成长效机制,象山县结合数字化改革,找准“小切口”发力,打造“全域标牌数字化管理系统”,努力实现全县城乡公共空间标牌设置规范有序、整洁美观。

          全域标牌数字化管理系统以“一张图”“一件事”为总体框架进行构建。“一张图”即绘制“全域标牌信息一张图”。结合整治行动,详细记录标牌类型、安装点位、使用单位、现场照片等全县新装标牌基础信息,从治理端实现全县标牌分布及信息一图总览,并为主管部门提供临近标牌点位归并建议和其他数据分析;开展对标牌设置时效、点位数量、设置密度等方面的研判预警。“一件事”即打造“标牌管理申请一件事”。围绕全域标牌的全流程管理,具体分为新增标牌申请、标牌安装、标牌更换、标牌拆除等四个模块,从服务端为标牌使用(申请)单位提供申请入口、规范样式信息、采购渠道、管理办法查询等功能,帮助标牌使用(申请)单位及时了解标牌管理的相关规定。

          打造全域标牌数字化管理系统,一方面抓住痛点,建立业务流程。原先标牌设置无主管部门、无管理规定、无规范样式,随意立牌导致乱象发生;系统投入运行后,标牌的新增、安装、更换、拆除等管理活动均需明确主体、提交申请并由主管部门进行审批,切实扭转标牌设置“有人立、无人管”的局面。另一方面聚焦智能,推动精准管理。基于全县标牌分布点位数量、分布状况、设置密度、设置年代、设置时效等数据,通过运算提供标牌点位过密、标牌版面老化、临时标牌超期设置三色预警,做到以算力代替脑力,为主管部门决策提供依据。象山县全域原设有标牌7367件(不含道路交通标志牌),通过开展标牌专项整治行动,标牌设置数量将减少至4172件,所有新设标牌都将纳入全域标牌数字化管理系统进行全流程管理,城乡公共空间标牌设置“多、杂、乱、旧”的情况得到显著改观。

          以数字赋能城市管理,象山县全域标牌数字化管理系统将持续记录好全县各类标牌信息并处理好各类工单,下步将结合运行情况对系统进行迭代升级。将原先失管的标志标牌“管起来”,让无序设牌的城乡空间“美起来”,进一步打造高品质城市形象,迎接第19届亚运会的隆重举办。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/48.html b/news/48.html new file mode 100644 index 0000000..581ab85 --- /dev/null +++ b/news/48.html @@ -0,0 +1,362 @@ + + + + +山东省临沂市平邑县某部图板标牌采购项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        山东省临沂市平邑县某部图板标牌采购项目公开招标公告

        +
        +
        +
        +  2022-05-24 阅读:8 +
        +
        +

        项目概况

        某部图板标牌采购项目 招标项目的潜在投标人应在青岛市市北区徐州路160号(利群·宇恒大厦)19楼A获取招标文件,并于2022年06月16日 13点30分(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:2022-JQSCPY-W1001

        项目名称:某部图板标牌采购项目

        预算金额:0.0000000 万元(人民币)

        最高限价(如有):0.0000000 万元(人民币)

        采购需求:

        我部就以下项目进行国内公开招标,采购资金已全部落实,欢迎符合条件的供应商参加投标。

        项目名称:某部图板标牌采购项目

        项目编号:2022-JQSCPY-W1001

        项目概况:本项目为某部图板标牌采购,项目地点为山东省临沂市平邑县,共分为三个标包,采用兼投不兼中。

        第一包:宣传类展板采购

        本包采用投标报价下浮率的方式。

        结算方式为:图板面积*采购方提供的基准价*(1-中标方报价下浮率)=结算价

        1.投标方报价前提前考虑含税费、运费、安装调试费、售后服务费等成本在内,采购方不再支付实际报价之外的任何费用;

        2.产品费用结算以成品材料面积及数量进行;报价方应提前考虑因图板制作过程中产生的材料损耗,采购方不额外担负此损耗费用;

        3. 投标方同时考虑对所供产品提供的技术咨询服务费用(含图板、标牌类设计排版等工作)。

        交货服务期:自签订合同之日起至2022年12月31日止。

        第二包:业务图板采购

        采用综合单价报价(清单报价)方式,招标控制价为25.0万元。

        投标方总报价应包括但不限于完成该项目的人工费、材料费、机械使用费、措施费、管理费、利润、规费、税金、技术措施费、保险费、材料试验费、材料检测费、代理服务、咨询服务费等费用及后续合同包含的所有风险、责任等各项应有费用。

        交货服务期:合同签订后30个日历天向采购人交付全部采购物资,并安装调试验收完毕。

        第三包:综合楼会议室电子屏幕采购

        采用综合单价报价(清单报价)方式,招标控制价为19.0万元。

        投标方总报价应包括但不限于完成该项目的人工费、材料费、机械使用费、措施费、管理费、利润、规费、税金、技术措施费、保险费、材料试验费、材料检测费、代理服务、咨询服务费等费用及后续合同包含的所有风险、责任等各项应有费用。

        交货服务期:合同签订后30个日历天向采购人交付全部采购物资,并安装调试验收完毕。

        注:投标人可参与多个标包投标,但只能中其中一个标包(项目按标包顺序进行评审,若第1标包排第一名的,将不再参与剩余标包的评审,以此类推)。

        投标供应商资格条件

        符合《中华人民共和国政府采购法》第二十二条资格条件:

        1.具有独立承担民事责任的能力;

        2.具有良好的商业信誉和健全的财务会计制度;

        3.具有履行合同所必需的设备和专业技术能力;

        4.有依法缴纳税收和社会保障资金的良好记录;

        5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;

        6.法律、行政法规规定的其他条件。

        (二)国有企业;事业单位;军队单位;成立三年以上的非外资控股企业。

        (三)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业的生产场经营地址或者注册登记地址为同一地址的,非国有销售型企业的股东和管理人员(法定代表人、董事、监事)之间存在近亲属、相互占股等关联的,也不得同时参加同一包的采购活动。近亲属指夫妻、直系血亲、三代以内旁系血亲或近姻亲关系。

        (四)未被列入政府采购失信名单、军队供应商暂停名单,未在军队采购失信名单禁入处罚期内,未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人。

        (五)本项目不接受联合体投标。

        招标文件申领时间、地点、方式

        (一)申领时间:2022年 5 月 26 日至 6 月 1 日,每日上午 08 : 30 至 11 : 00 ,下午 13 : 30 至 16 : 30 (北京时间)。

        (二)申领地点:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A。

        (三)申领招标文件时需提供以下资料:

        1.营业执照或事业单位法人证书复印件加盖公章(军队单位不需要提供);

        2.法定代表人资格证明书原件;

        3.法定代表人授权书原件;

        4.非外资企业或外资控股企业的书面声明(企业提供,事业单位、军队单位不需要提供);

        5.投标供应商主要股东或出资人信息;

        6.未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人名单,未被列入政府采购严重失信行为记录名单,未被列入军队供应商暂停名单,未在军队采购供应商失信名单禁入处罚期内的承诺书;

        (四)申领方式

        采取网上发售方式。投标人采取发送电子邮件方式递交报名资料,邮件主题:项目名称+项目编号+公司名称;邮件内容:列明公司名称、法定代表人或授权代表人姓名及联系方式;邮件附件:需采用A4纸幅面,将报名材料加盖企业鲜章,按顺序制作成1个PDF格式文件,文件名称与主题一致,复印件扫描无效。报名材料审核通过后,采购代理机构联系人向供应商邮箱发送谈判文件电子版;审核未通过的,采购代理机构联系人以邮件形式回复审核情况,供应商可在谈判文件申领时间内重新提交材料。采购代理机构邮箱: cuimiao@cntcitc.cn;请按照本公告所载联系方式联系招标代理公司(具体联系电话:0532-85791235),办理报名事宜。

        (五)招标文件售价:200元/标包,售后不退。

        投标开始和截止时间及地点、方式

        投标开始时间:2022年 6 月 16 日 13 时 00 分(北京时间)。

        投标截止时间:2022年 6 月 16 日 13 时 30 分(北京时间)。

        投标地点:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A。

        投标方式:由投标供应商法定代表人或授权代表现场递交投标文件,不接受邮寄等其他方式。

        开标时间、地点

        开标时间:2022年 6 月 16 日 13 时 30 分(北京时间)。

        开标地点:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A。

        八、资格审查方式:资格后审。

        九、本采购项目相关信息在《中国招标投标公共服务平台》(http://www.cebpubservice.com/)和《中国政府采购网》(www.ccgp.gov.cn)上发布。

        十、采购代理机构联系方式

        联 系 人:张工、崔工

        办公电话:0532-85791235

        移动电话:17685586772

        邮    箱:cuimiao@cntcitc.cn

        地    址:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A

        十一、监督部门联系方式

        项目监督人:  宋老师   

        办公电话:   0539-4919468   

                               招标代理机构:中招国际招标有限公司

        2022年 5 月 25 日


        合同履行期限:/

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        /


        3.本项目的特定资格要求:(一)符合《中华人民共和国政府采购法》第二十二条资格条件:1.具有独立承担民事责任的能力;2.具有良好的商业信誉和健全的财务会计制度;3.具有履行合同所必需的设备和专业技术能力;4.有依法缴纳税收和社会保障资金的良好记录;5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;6.法律、行政法规规定的其他条件。(二)国有企业;事业单位;军队单位;成立三年以上的非外资控股企业。(三)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业的生产场经营地址或者注册登记地址为同一地址的,非国有销售型企业的股东和管理人员(法定代表人、董事、监事)之间存在近亲属、相互占股等关联的,也不得同时参加同一包的采购活动。近亲属指夫妻、直系血亲、三代以内旁系血亲或近姻亲关系。(四)未被列入政府采购失信名单、军队供应商暂停名单,未在军队采购失信名单禁入处罚期内,未被“信用中国”网站列入失信被执行人、重大税收违法案件当事人。(五)本项目不接受联合体投标。

        三、获取招标文件

        时间:2022年05月26日  至 2022年06月01日,每天上午8:30至11:00,下午13:30至16:30。(北京时间,法定节假日除外)

        地点:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A

        方式:采取网上发售方式。投标人采取发送电子邮件方式递交报名资料,邮件主题:项目名称+项目编号+公司名称;邮件内容:列明公司名称、法定代表人或授权代表人姓名及联系方式;邮件附件:需采用A4纸幅面,将报名材料加盖企业鲜章,按顺序制作成1个PDF格式文件,文件名称与主题一致,复印件扫描无效。报名材料审核通过后,采购代理机构联系人向供应商邮箱发送谈判文件电子版;审核未通过的,采购代理机构联系人以邮件形式回复审核情况,供应商可在谈判文件申领时间内重新提交材料。采购代理机构邮箱: cuimiao@cntcitc.cn;请按照本公告所载联系方式联系招标代理公司(具体联系电话:0532-85791235),办理报名事宜。招标文件售价:200元/标包,售后不退。

        售价:¥200.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2022年06月16日 13点30分(北京时间)

        开标时间:2022年06月16日 13点30分(北京时间)

        地点:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜


        /



        七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名 称:某单位     

        地址:山东省临沂市        

        联系方式:崔工/17685586772      

        2.采购代理机构信息

        名 称:中招国际招标有限公司            

        地 址:青岛市市北区徐州路160号(利群·宇恒大厦)19楼A            

        联系方式:张工/0532-85791235            

        3.项目联系方式

        项目联系人:崔工

        电 话:  17685586772

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/49.html b/news/49.html new file mode 100644 index 0000000..4329624 --- /dev/null +++ b/news/49.html @@ -0,0 +1,362 @@ + + + + +Agrade工业级mSATA SSD与数字标牌的完美结合_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        Agrade工业级mSATA SSD与数字标牌的完美结合

        +
        +
        +
        +  2022-05-24 阅读:3 +
        +
        +

        数字标牌作为公众服务媒介,为用户提供最新指导和互动信息,被广泛的应用于商业和工业环境当中,从而减少或者消除文书工作,提高效率,确保服务质量。它主要通过显示数字图像、网站、餐厅菜单、天气或者时间等重要信息来为用户提供服务。常见于机场、地铁站、交通系统、餐厅、电影院、公共信息亭和图书馆等场所。

        大家知道数字标牌,但是否知道它是如何向观众显示动态内容、准确的时间信息和实时更新的吗?为了给这些设备提供所需的数据,数字标牌内部需要运行相应的系统,这就要求其中的mSATA SSD必须具有高可靠性与高稳定性,另外还要具备在极端天气条件下可以稳定运行,并且还需要周期性的编程/擦除次数足够多,符合这些情况下,就要求mSATA SSD需要承受比较恶劣的运行环境和具备严苛的抗磨损能力。

        为什么Agrade睿达工业 级mSATA SSD被认为是数字标牌应用的理想选择?

        数字标牌应用嵌入式系统需要可靠且一致的数据,以便在不停机的情况下提供完美的服务。这些设备还需要反应快,在显示屏上显示数据的延迟小。由于这些应用程序可以极大地影响业务,因此高可靠性的工业级 mSATA SSD被认为是理想的选择。

        此外,与传统机械硬盘相比,mSATA 硬盘具有许多优势:具有更高的可靠性和更低的功耗,先进的固件算法和更长的P/E Cycle,和不占空间的要求。符合这些要求的数字标牌的供应商在多方的寻找下,最终选择了Agrade睿达工业级mSATA SSD。因为其固态硬盘的特点深深的打动了数字标牌的供应商。

        Agrade睿达工业级mSATA SSD的主要特点

        01 延长生命周期

        Agrade睿达工业级mSATA SSD的设计使其能够在不丢失数据的情况下提供卓越的使用寿命。Agrade睿达工业级mSATA SSD可以轻松承受约200万小时的稳定且持续的使用,以及更长的读/写周期。

        02 最佳性能

        使用Agrade睿达工业级mSATA SSD,您的应用程序一定会有最佳性能。这些设备可以承受极端温度、振动和冲击,在以卓越性能为主要标准的数字标牌应用中。

        03 高级固件算法

        在数字标牌应用中,实时更新、时间敏感信息和其他形式的数据需要准确、快速地显示。在显示所需信息或显示不准确数据时出现轻微延迟是不可接受的。为了确保数据平滑、无错误的显示,Agrade睿达工业级mSATA SSD具有强大、先进的固件算法,确保正确完成工作。

        04 宽温条件

        Agrade睿达工业级mSATA SSD能够承受极端温度条件。可以在-40°C到85°C的温度范围内工作,并且也可以在-55°C 到 +125°C极端条件下依旧可以稳定应用。

        05 工业用途

        Agrade睿达工业级mSATA SSD不适用于普通、低档消费品。相反,它们旨在用于性能、可靠性、寿命和安全性是主要痛点的工业应用中。数字标牌中应用Agrade睿达工业级mSATA SSD常规容量范围为32GB、64GB、128GB、256GB、512GB。

        Agrade睿达系列产品以工业级SSD为核心,为国内外客户专业提供工业级CF/SD卡、Micro SD卡、工业级DOM电子硬盘、工业级SSD固态硬盘、宽温军工级固态硬盘系列产品,注于产品的质量把控和服务提升,旨在制造更高可靠性和更稳定的高品质存储产品。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/5.html b/news/5.html new file mode 100644 index 0000000..452bb92 --- /dev/null +++ b/news/5.html @@ -0,0 +1,362 @@ + + + + +衡水湖景区交通旅游标志牌全部安装完成_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        衡水湖景区交通旅游标志牌全部安装完成

        +
        +
        +
        +  2022-04-29 阅读:1 +
        +
        +

        近日,由衡水市交通运输局负责的衡水湖景区交通旅游标志牌安装工作如期完成。

        为进一步完善衡水湖景区交通基础设施,提升景区整体形象和服务品质,衡水市交通运输局按照5A创建指挥部统一安排,采取有力措施,全力推进衡水湖国家5A景区交通旅游标志牌安装工作。

        衡水湖景区交通旅游标志牌

        项目经过前期调研、现场勘查、制定方案、公开招标、组织实施等几个阶段,科学合理规划标牌设置位置、规格样式等细节,主要突出标志牌指示、引导作用,努力为游客出行提供更加全面、贴心的服务。截至目前,已在衡德高速衡水东高速口、邢衡高速冀州南绕城高速口等重要出入口增设“衡水湖旅游景区”指引标志牌5块,在园博园、闾里古镇、冀州博览馆、樱花岛等主要景点入口及环湖道路关键节点路口设置旅游景点标志牌11块,共完成投资100万元。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/50.html b/news/50.html new file mode 100644 index 0000000..f3391df --- /dev/null +++ b/news/50.html @@ -0,0 +1,362 @@ + + + + +2022年Q1中国大陆商用交互平板市场历史性连续两季度下降_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年Q1中国大陆商用交互平板市场历史性连续两季度下降

        +
        +
        +
        +  2022-05-25 阅读:25 +
        +
        +

        COVID-19疫情进入中后期,对中国大陆商用交互平板市场的影响方向也逐渐发生了变化。根据洛图科技(RUNTO)数据,2022年第一季度,中国大陆商用交互平板出货10.3万台,同比下降22.8%。

        这是自品类诞生之后首次发生第一季度下降,也是继2021年第四季度之后连续第二个季度发生下降,且跌幅均在20%以上。数据的大幅度震荡,说明商用交互平板市场仍然处在发展的初级阶段,存在相当的不稳定。

        疫情对交互平板市场的影响是深远的,也是复杂的。初期疫情触发了远程办公需求,促进视频会议流量暴增,企业级市场基础不断扩大。在企业和用户对产品的认知度迅速提高的同时,产品也经历了最大规模最大程度的测试和迭代,软硬件性能和体验迅速提升。而之后疫情的反复也使得中国大陆政府社会面清零的决心更加坚定,企业面临长短期经营困难。在大量企业按下暂停键甚至倒闭之外,正常经营的企业也开始重新审视空间成本的归集和办公资源的采购优先级。

        2020-2022Q1 中国大陆商用交互平板出货量及变化 单位:千台,%

        行业应用:企业会议仍是主流,独医疗份额下降

        企业与企业间、企业内部间的视频会议需求仍然是交互平板的核心场景,数据显示,2022年第一季度,企业会议占比55.6%,同比增长1.8个百分点;其中,中小企业在企业领域占到1/4的份额。金融行业需求结构性增速最快,上涨约1.9个百分点,市占上升至13.7%。医疗成为唯一一个占比降低的应用领域,整体份额减少了5.9个百分点。

        2022Q1 中国大陆商用平板市场行业结构及变化  单位:%

        市场格局:MAXHUB保持冠首,皓丽回归第二位

        整体市场来看,在核心原材料面板价格处于低位运行的条件下,大部分整机企业以价换量的意图非常明显。然而,海康威视在一季度在均价提升9%的同时,亦获得了3.2个百分点的份额增长,表现出色。

        在产品发布层面,今年传统商用显示企业表现的更为积极,新品所带来的流量直接带动了市场表现。根据数据显示,2022年一季度,传统商显类型企业市占达55%,与同期比上升了10个百分点。其中,视源股份旗下MAXHUB连续保持行业首位,市占25%,与同期比上升5.7个百分点,市场份额的增长幅度最大;康冠股份旗下皓丽再次回归第二位,市占约13%,增长了4.6个百分点。

        ICT类企业市占下滑4个百分点,达到14%,代表企业华为的表现未达预期,量价齐跌。值得关注的是,本季度联想市场业绩优秀,与同期比出货增长超过3倍,市场份额的增长仅次于MAXHUB,上升5.1个百分点,挤进Top10。

        传统家电类企业市占19%,与同期比减少2个百分点,其中夏普被挤出前十。

        2022Q1 中国大陆商用平板市场企业类型结构及变化  单位:%

        产品结构:65、86寸各涨2个百分点;红外份额稳定

        2022年第一季度,65寸商用平板出货4.3万台,同比下滑19.0%,但从出货结构看,65寸仍是目前商用平板市场的主流尺寸,市场份额为42%。所有尺寸中,除65寸、86寸出货份额有所增长,其余尺寸均小幅下滑。

        2022Q1 中国大陆商用平板市场尺寸结构及变化  单位:%

        触控技术方面,商用平板以红外为主。2022年第一季度,红外产品出货同比下滑22.5%,但从整体结构来看,仍然占据近94%市场份额,较去年同期微弱上涨。

        未来展望:厂商和产品都在经历变化,不改乐观预测

        整机企业在以价换量,赢取市占的同时,也正在加快从硬件向整体智能会议系统的转型。

        在疫情的影响之下,商用交互平板在会议场景的供需两端正在形成新型关系。对产品有认知的企业客户既要合理优化办公资源,调整采购节奏,又要体验智能办公带来的高效便捷。因此,功能适度,价格亲民的实惠型产品将成为适合中小企业采购的首选项。

        在其它场景的应用方面,部分商用平板系列的核心应用功能正在由智慧办公的基础上向全行业的体温监测、信息发布、智慧营销等方面进行延伸,逐渐触及到其它商显品类或创新品类。

        回顾第一季度的市场表现,其充分印证了商用交互平板发展所处的初级阶段。在此阶段,各行业企业对产品的认知群体中尚存在较大空白,因此在巨大的企业注册基数和不足10%的渗透率之下,规模仍然经历了巨大的振幅。

        尽管如此,出于对企业数字化转型、效率提升诉求的前景考虑,继续保留对该品类的乐观判断,暂维持2022年全年出货90万台,35%增长的预测。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/51.html b/news/51.html new file mode 100644 index 0000000..43adf3d --- /dev/null +++ b/news/51.html @@ -0,0 +1,362 @@ + + + + +购买决策三部曲:户外广告告诉你怎么影响消费者!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        购买决策三部曲:户外广告告诉你怎么影响消费者!

        +
        +
        +
        +  2022-05-26 阅读:15 +
        +
        +

        消费结构升级时代,品牌与消费者沟通互动愈发频繁。在此背景下,理解消费决策过程,洞悉消费行为、态度显得尤为重要。特别是在消费购买决策不同时期,户外广告都在扮演着不同的角色,影响着消费者最后的购买决定。

        消费者决策的整个心智历程,从需求产生到需求满足的全过程都十分理智。消费者付款是一念之间,但是从产生需求、搜集资料、货比三家到购买前评估的决策过程中,存在一定的心智规律,而这些规律又给予了户外广告投放思路参考。

        决策前期:刺激需求

        消费决策前期是需求确认,是现实未满足状态与理想状态之间的矛盾,从而产生需求,并为后续购买奠定基础。那么,此时的广告是设置诱因、激发未满足的需求,可以让消费者产生需求联想,也是产生美好感觉的触发线。而激发需求的广告可以像优衣库在寒潮来临时期,迅速通过大屏广告刊播新款羽绒服,让寒冷的受众感觉到穿着温暖服装的理想状态,进而刺激或确认购买需求。

        消费决策过程前期,也是创造需求的过程。像番茄酱品牌柯蒂斯兄弟户外广告,在评分低的餐厅旁边设立广告牌,并写上引导进入店铺及尝试番茄酱对比口感的广告语,再用番茄酱瓶子放在右下角,让消费者产生尝新心理,以及诱发猎奇心理,引导进店消费,从侧面提升番茄酱的购买兴趣,创造了品牌印象。

        “别去了”(左),“不妨一试”(右)

        “不要浪费你的钱”(左),“为什么不试试呢”(右)

        决策中期:提高选购效率

        确认了需求后,进入购买决策中期,选择搜集资料以及不同品牌优缺点对比,是这个时期的主要消费特征。这个时期消费者需要获取足够多的知识,直至搜集的信息利益大于搜集成本为止。其中信息包括购买经验知识、对品牌的了解等个人知识,也包括市场公开信息和品牌的传播信息等外部信息。收集信息的过程,是提升购买价值的过程,而广告在其中扮演的角色是建立核心竞争力,影响消费者未来决策,降低消费者决策的成本。

        降低消费决策成本的广告一般是突出品牌核心卖点,在广告中突出有别于市场其它竞争品牌的优势。用核心卖点覆盖其他品牌的竞争噪音,专注一个方向影响消费者。特别是数码、家电等卖点能清晰区隔的行业,他们能够在户外广告专注传播核心卖点,并利用出色画面效果完成心智占领,降低消费者选购效率,提升选购价值参考。

        户外广告广泛覆盖,大面积多频次攻占消费者的生活圈,是主导消费者心中品牌印象的主要方式。如曾经覆盖电梯、地铁、户外大屏等广告的BOSS直聘,其多频次广覆盖的广告,短时间内就完成了知名度占领,成为了消费者求职时候首先想到的平台之一。

        决策后期广告:影响转化与留存

        收集完成多个信息,消费者已经圈定了特定的购买范围,并确定在这个范围进行综合评估。不过,消费者在最后购买决定的时刻,他们的选择范围相对较窄,在消费者脑海中已经有记忆的品牌,会在最后的决定中占据优势,这也是品牌需要持续打造品牌力的原因。像肯德基,炸鸡作为其特殊的卖点已经占据大部分消费者心智,如果在饥肠辘辘的时刻,看到散发着“香气”的大牌广告,偌大的立体炸鸡,消费者心中的品牌联想就会被唤醒,随机影响接下来的购买行为。

        户外广告展示内容强制性,能够有效建立品牌知名度,同时影响着受众未来购买决策,甚至是购买转化。在传播媒介多样化导致的注意力减弱的情景下,户外广告更能从视觉上、体验上加深品牌力,增加品牌信任。美的空调年初在城市搭建了有温度的公交候车亭,只要两个路人同时坐下,就能触发空调自动制暖功能,让整个等车的瞬间充满暖意。美的的这次户外营销,打造了空调在场景下的空间记忆,让消费者感觉到品牌的良好印象,甚至影响着未来购买并留存用户的忠诚度。

        面对复杂多变的媒体营销环境,户外广告出色的空间营销能力,已经在潜移默化影响着消费者的购买决定。不过,在结合以消费者为中心的时候,也需要充分考虑品牌建设,用差异化的广告战略加快消费者购买。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/52.html b/news/52.html new file mode 100644 index 0000000..1242cb6 --- /dev/null +++ b/news/52.html @@ -0,0 +1,362 @@ + + + + +2022年中国会议平板行业竞争格局及市场份额分析_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年中国会议平板行业竞争格局及市场份额分析

        +
        +
        +
        +  2022-05-27 阅读:138 +
        +
        +

        1、优势企业涌现

          我国会议平板行业主要从教育平板行业发展而来,从供给上看,我国会议平板市场继承了教育平板市场产品的产业基础,又恰巧赶上了大尺寸液晶产品产能、供给和成本竞争力的集中凸显。如今,我国会议平板行业涌现出大量优势企业,如视源股份、华为、皓丽、海康威视、鸿合科技、京东方、海信视像、新华三等。

          2、Maxhub 市场份额占比超 27%

          从 2021 年上半年我国会议平板出货量来看,视源股份 Maxhub 市场份额占比达超 27%,华为 ideahub 市场份额占比超 19%,稳居我国会议平板行业第一梯队。

          3、市场集中度高

          从市场集中度看,我国会议平板行业市场集中度相对较高,从 2021 年上半年我国会议平板行业市场集中度看,我国会议平板行业企业 CR3 达 53.8%,CR5 达 62.1%,CR10 达 73.3%。

          4、海信视像海外营收占比高

          近年来,我国会议平板行业主要企业纷纷加强海外布局,在疫情影响下,智能会议平板正在成为会议室的核心硬件,并开始整合老会议室里常见的投影仪、幕布、麦克风、音响、手写白板,成为 "All in one" 的大屏会议终端。从营收占比上看,2020 年,海信视像海外营收占比高达 54.87%,京东方海外营收占比达 51.89%,海外营收为京东方、海信视像主要营收来源。视源股份海外市场营收占比较低,仅为 16.58%。

          整体来看,国内的市场仍是视源股份 Maxhub 的产品更受欢迎。华为由于进入会议平板市场时间较晚,目前在智能会议平板市场表现不够亮眼。随着国内智能显示市场需求增长,大屏化成了智能会议平板的发展趋势,华为和 Maxhub 又将展开激烈竞争。

          以上数据参考前瞻产业研究院《中国会议平板行业市场前瞻与投资战略规划分析报告》

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/53.html b/news/53.html new file mode 100644 index 0000000..a5b118e --- /dev/null +++ b/news/53.html @@ -0,0 +1,362 @@ + + + + +面板大厂瀚宇彩晶:面板价格已跌至历史最低点_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        面板大厂瀚宇彩晶:面板价格已跌至历史最低点

        +
        +
        +
        +  2022-05-27 阅读:6 +
        +
        +

        面板大厂瀚宇彩晶于5月26日股东会通过每股配发1元新台币现金股利。展望今年,彩晶表示,第一季因为机台调整导致产出较少,4、5月份又受到供应链问题影响,但根据最近需求和可掌握的客户订单,最快6月份可能恢复100%稼动率来生产。

          预估今年智能型手机和平板计算机两大应用面板合计占彩晶总营收比重可能来到60%以上,公司说明,主要是有些新机种通过客户认证并顺利量产出货,这可望成为今年重要的动能。

          尽管受到俄乌冲突影响引发通膨效应,造成终端需求下滑,各应用领域的品牌大厂今年以来陆续下修销售目标,不过,彩晶观察,有些应用产品尺寸持续放大,对于面板产能去化应有帮助。

          对于面板报价持续走跌,彩晶认为,面板价格是随行就市,很多应用领域的面板价格已经跌到历史低点、甚至比历史低点还低,彩晶会选择对自己相对有利的订单来接单生产。

          长期来讲,彩晶强调,因为公司产能规模不大,还是会希望找到适合的利基应用来发展,以维持稳定的业绩和获利能力,彩晶会持续朝这方面去进行产品技术开发并规划需要的产能。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/54.html b/news/54.html new file mode 100644 index 0000000..ae45ad9 --- /dev/null +++ b/news/54.html @@ -0,0 +1,362 @@ + + + + +仪征市城管开展整治占道广告牌专项整治行动_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        仪征市城管开展整治占道广告牌专项整治行动

        +
        +
        +
        +  2022-05-27 阅读:10 +
        +
        +

        为进一步提升市容市貌环境秩序和城市文明程度,近日,仪征市城管局开展了清理占道广告牌专项整治行动。

        仪征市城管队员巡查时发现,国庆路一沿街经营编织店生意的老板擅自制作一块移动广告牌摆放在路边,广告牌高1.2米,宽0.6米,影响居民通行。城管队员立即上前告知店主其行为已经违反相关法律法规,还影响行人通行,要求其立即搬离广告牌。一些商家为了达到吸引眼球的目的,擅自在绿化带、人行道设置户外广告牌,不仅影响了市容市貌,更是对行人、车辆造成了安全隐患。仪征城管部门从前期摸排情况入手,制定整治清单,全面实施占道广告牌整治行动,对解放路、国庆路、工农路等仪征市区重点路段两旁违规设置的门店宣传牌、灯箱等广告设施进行全面清理。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/55.html b/news/55.html new file mode 100644 index 0000000..849e82a --- /dev/null +++ b/news/55.html @@ -0,0 +1,362 @@ + + + + +深化中国市场布局,艾比森全国首个旗舰体验中心在重庆开业_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        深化中国市场布局,艾比森全国首个旗舰体验中心在重庆开业

        +
        +
        +
        +  2022-05-30 阅读:6 +
        +
        +

        5月27日,艾比森全国首个旗舰体验中心揭牌仪式在重庆数字大厦隆重举行。重庆市九龙坡区大数据发展局局长赵红民、艾比森董事长丁彦辉、副总裁赵凯、重庆和西南地区经销商代表及相关负责人一行共同出席仪式。

        活动现场,重庆市九龙坡区大数据发展局赵红民局长对艾比森落户重庆数字大厦致以热烈祝贺。

        赵局长指出,九龙坡区坚持以数字经济引领发展,聚力打造以重庆数字大厦为核心的全市数字经济先导区,目前经济总量与增速位居重庆前列。以艾比森为代表的名企落户重庆数字大厦,将进一步激发九龙坡区在数字经济产业发展与应用方面的独特优势,为区域高质量发展带来新气象。

        艾比森董事长丁彦辉在致辞中表示,重庆是西部唯一一个直辖市,也是西部第一个国家中心城市,区位优势显著。作为艾比森拓展中国市场、建立品牌旗舰店的第一站,重庆旗舰体验中心的启用对艾比森在西南地区的市场与渠道战略布局意义重大。希望大家坚定信心,依托艾比森深耕LED显示21年的发展经验与品牌优势,立足重庆,辐射西南市场,共促LED显示行业健康发展。

        随后,赵红民局长与丁彦辉董事长共同登台为重庆旗舰体验中心揭牌。

        座谈环节,现场嘉宾围绕LED显示行业发展趋势、区域产业生态与营商环境、艾比森发展历程与中国市场战略布局等议题展开深入交流。

        重庆旗舰体验中心由艾比森与重庆当地经销商共同建设,是艾比森深化中国市场战略布局的关键一步。旗舰体验中心集产品展示与体验、营销管理、本地服务与售后等功能于一体,将为合作伙伴发展增添强劲动力。


        重庆旗舰体验中心的开业运营,为区域用户和渠道合作伙伴搭建了近距离了解艾比森的平台,未来将成为艾比森品牌形象的重要展示窗口之一。


        随着中国市场布局的深入,艾比森将在国内更多城市开设旗舰体验中心,加强对区域的品牌辐射与支持力度,并通过渠道管理的本地化,将自身21年的发展经验分享给和艾比森志同道合、有发展潜力的中小企业,与大家共享产业红利,满足不断增长的市场需求,实现自身的全方位发展。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/56.html b/news/56.html new file mode 100644 index 0000000..b5ff57d --- /dev/null +++ b/news/56.html @@ -0,0 +1,362 @@ + + + + +TCL华星In-Cell HVA屏集成触控技术_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        TCL华星In-Cell HVA屏集成触控技术

        +
        +
        +
        +  2022-05-31 阅读:3 +
        +
        +

        随着现代智能终端设备的快速推进,屏幕触控技术已发展到更完备的阶段。近年来,我国触摸屏产业快速发展,产业规模持续扩大,产业转型升级逐步加快,如何在屏幕领域进一步发展,跻身世界一流,成为各大面板厂商持续关注的问题。

        触控技术主要可分为三类:In-Cell、On-Cell和Out Cell(外挂式)。传统的外挂式虽然发展比较成熟,但是外挂方式增加了整机厚度,同时也未能实现客户触控显示一体化的技术需求。On-Cell则是将触控集成在了屏幕上,触控层一般位于上基板外表面或者内表面,一般需要单独的触控IC,且触控精准度不佳。

        作为近年来发展最迅速的主流触控技术之一,In-Cell技术通过将触摸面板功能嵌入到液晶像素中,使得液晶屏具备了传统触摸板的感知触碰输入的能力,而且兼备最流畅的集成触控体验。

        首先,In-Cell技术改变了常规屏幕的生产工艺,直接在显示屏内部嵌入触摸传感器,减少了触摸屏,使得屏幕更轻薄。其次,传统触摸屏在阳光下比较难看清楚显示内容。In-Cell技术使屏幕减少了一层,相应也减少了贴合次数,屏幕的画面要比普通屏幕更清晰通透,透光性更好,画质得到大大提升,可读性也随之提高。不止如此,由于在液晶屏上加载了触控电路,使得液晶屏不但具备了传统触摸板的感知触碰输入的能力,而且触摸反馈更快更精准,一触即达。

        In-Cell HVATouch是HVA屏集成触控的全新方案。触控传感器完全内置到Cell内,轻便简单的模组带来更优异触控性能,通过LTDI(LargeTouch Display Integration)芯片集成显示和触控,实现低功耗和高可靠性触控显示。

        TCL华星追求极致的技术,以颠覆式产品创新为终极目标。因此,TCL华星率先开发了HVA In-Cell触控技术,四大优势凸显自身创新实力。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/57.html b/news/57.html new file mode 100644 index 0000000..a62df62 --- /dev/null +++ b/news/57.html @@ -0,0 +1,362 @@ + + + + +传统产业发展越来越离不开智能视听设备_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        传统产业发展越来越离不开智能视听设备

        +
        +
        +
        +  2022-05-31 阅读:6 +
        +
        +

        为什么说传统产业发展越来越离不开智能视听设备?首先是传统行业与视听新技术不断融合。近日,以“从音像资料馆到视听博物馆”为主题的第二届中国(北京)国际视听大会首场预热活动——广播电视志论坛以线上线下结合的方式在北京举行。在此次论坛中,智能视听设备将提供技术支撑。

        博物馆作为当代人窥探古今的窗口,通过研究、收藏、保护、阐释和展示的方式,担负起了传承承载古今文化的重要责任。由于过去技术的约束,表达和存储文化的载体全靠音像资料,随着数字化渗透进文化领域,视听博物馆问世,进一步推动了资源的再开发和利用,科技技术重构了视听产业的场景,赋予更沉浸式文化体验。

        时代不断向前发展,视听技术日新月异,通过创新的跨界融合方式,颠覆了传统行业,为其倾注了更持久的内在生命力。伴随着智能视听技术大步向前,视听设备的市场前景越发广阔,视听行业技术的进步和市场的扩大会在一定程度上带动诸如博物馆及教育等传统行业的发展。

        视听设备在各行各业发展中发挥着重要的基础设施作用,基础设施不健全,在关键节点没有技术和设备作为产业发展的支撑,何谈发展。诸如幼儿教育中,视频监控得到越来越广泛的使用,家长也因此可以时刻关注孩子在校园里的一举一动,及时了解孩子状况以便作出教育方案调整。种种场景之所以能实现,得益于国家教育政策调整的同时也离不开科技技术的进步和视听设备配套利用。越来越规范的交通,使我们出行多了一份便利,而无数个交通警察奋战在道路指挥一线的场景越来越少,是交通警察消失了吗?事实上是采用了一系列完善的视听设备,交通警察不是消失了,而是利用先进的监控技术协助执法。

        然后是持续扩大的视听用户规模,为传统行业的发展源源不断注入新活力。当下视听设备技术日趋成熟,网络视听节目制作能力和质量提升明显,一批优质作品凭借独特的美学价值、文化内涵与传播特点为观众带来丰富的视觉体验。截至2021年12月,我国网络视频(含短视频)用户规模达9.75亿,较2020年12 月增长4794万,占网民整体的94.5%。

        随着网络视听市场的持续火爆,越来越多的企业参与到网络视听行业发展中来。据广电总局统计数据显示,2018年以来,全国持证及备案网络视听机构持续增长,到2021年,全国持证及备案网络视听机构累计675家。不难看出,各产业发展势必以网络视听市场为依托,辐射传统行业。

        加之疫情等给各行各业都带来了不同程度的影响,也冲击着传统行业,促使很多行业对未来的方向策略进行调整更改。当下5G正在助力智慧视听行业释放更大势能,未来,各行各业势必要实现线上与线下相结合,从长远发展考虑,随着社会不断进步,迈拓维矩等视自主研发视听品牌迅速崛起,视听设备技术会越来越多地参与到视频监控、证券交易、多媒体教育、电商等行业中去,成为重要的一环,与之形成发展合力,所以说传统产业发展越来越离不开智能视听设备。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/58.html b/news/58.html new file mode 100644 index 0000000..d0ce2ea --- /dev/null +++ b/news/58.html @@ -0,0 +1,362 @@ + + + + +吉林省电力医院标识标牌制作等宣传服务项目更正公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        吉林省电力医院标识标牌制作等宣传服务项目更正公告

        +
        +
        +
        +  2022-05-31 阅读:4 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:0773-2240GNJLFWGK0361      

        原公告的采购项目名称:吉林省电力医院标识标牌制作等宣传服务项目      

        首次公告日期:2022年02月25日      

        二、更正信息

        更正事项:采购公告

        更正内容:


        1、提交投标文件截止时间、开标时间更正为:2022年06月15日13:00分(北京时间)。

                 2、其他内容不变。


        更正日期:2022年05月31日 

        三、其他补充事宜


        吉林省电力医院标识标牌制作等宣传服务项目

        更正公告

         

        一、项目基本情况

        原公告的采购项目编号:0773-2240GNJLFWGK0361

        原公告的采购项目名称:吉林省电力医院标识标牌制作等宣传服务项目

        首次公告日期:2022年02月25日

        二、更正信息

        更正事项:招标公告、招标文件    

        更正内容:

        1、提交投标文件截止时间、开标时间更正为:2022年06月15日13:00分(北京时间)。

        2、其他内容不变。

        更正日期:2022年05月31日

        三、其他补充事宜

        公示媒介:中国政府采购网、采购与招标网、通用技术集团中心采购平台。

        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        采购人:吉林省电力医院

        地址:长春市南关区树勋街1174号

        联系人:王思雨

        联系方式:0431-85797485

        2.采购代理机构信息

        采购代理机构:中金招标有限责任公司

        地址:长春市净月区生态大街3682号伟峰东樾11号楼2303室

        联系人:许佳、王丽艳

        电话:0431-81150785

        3.项目联系方式

        项目联系人:许佳、王丽艳

                电   话:0431-81150785


        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名 称:吉林省电力医院     

        地址:长春市南关区树勋街1174号        

        联系方式:王思雨0431-85797485      

        2.采购代理机构信息

        名 称:中金招标有限责任公司            

        地 址:长春市净月区生态大街3682号伟峰东樾11号楼2303室            

        联系方式:许佳、王丽艳0431-81150785            

        3.项目联系方式

        项目联系人:许佳、王丽艳

        电 话:  0431-81150785

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/59.html b/news/59.html new file mode 100644 index 0000000..9b88c40 --- /dev/null +++ b/news/59.html @@ -0,0 +1,362 @@ + + + + +成都东安社区卫生服务中心标识标牌采购项目(第二次)竞争性磋商采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都东安社区卫生服务中心标识标牌采购项目(第二次)竞争性磋商采购公告

        +
        +
        +
        +  2022-06-10 阅读:37 +
        +
        +

        项目概况

        成都市龙泉驿区东安社区卫生服务中心标识标牌采购项目(第二次) 采购项目的潜在供应商应在http://sale.scbid.net获取采购文件,并于2022年06月23日 14点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:SCIT-FC(Z)-2022050048L1

        项目名称:成都市龙泉驿区东安社区卫生服务中心标识标牌采购项目(第二次)

        采购方式:竞争性磋商

        预算金额:29.6885000 万元(人民币)

        最高限价(如有):29.6885000 万元(人民币)

        采购需求:

        本次采购内容为:采购成都市龙泉驿区东安社区卫生服务中心标识标牌供应商一名。

        合同履行期限:自合同签订之日起20个工作日内

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:无

        三、获取采购文件

        时间:2022年06月13日  至 2022年06月17日,每天上午9:00至12:00,下午12:00至17:00。(北京时间,法定节假日除外)

        地点:http://sale.scbid.net

        方式:磋商文件自2022年6月13日9:00至2022年6月17日17:00(北京时间)在我司指定网站(http://sale.scbid.net)获取,具体获取流程详见该网站的“标书领取操作手册”。

        售价:¥300.0 元(人民币)

        四、响应文件提交

        截止时间:2022年06月23日 14点30分(北京时间)

        地点:四川国际招标有限责任公司开标厅(四川省成都市高新区天府大道中段800号天府四街66号航兴国际广场1号楼3楼)

        五、开启

        时间:2022年06月23日 14点30分(北京时间)

        地点:四川国际招标有限责任公司开标厅(四川省成都市高新区天府大道中段800号天府四街66号航兴国际广场1号楼3楼)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:成都市龙泉驿区东安社区卫生服务中心     

        地址:成都市龙泉驿区洛带镇上街61号        

        联系方式:林老师028-84893674      

        2.采购代理机构信息

        名 称:四川国际招标有限责任公司            

        地 址:中国(四川)自由贸易试验区成都市高新区天府四街66号2栋22层1号            

        联系方式:支先生17761209163            

        3.项目联系方式

        项目联系人:支先生

        电 话:  17761209163

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/6.html b/news/6.html new file mode 100644 index 0000000..3e803d4 --- /dev/null +++ b/news/6.html @@ -0,0 +1,362 @@ + + + + +小区有哪些标识标牌?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        小区有哪些标识标牌?

        +
        +
        +
        +  2022-04-29 阅读:13 +
        +
        +

        近几年来,房地产行业在国内的发展是有目共睹的,房地产标识系统已经是每个房地产公司的标配设施了。那么在面对还没有售出或者是已经售出的楼盘,对于这些小区怎么去选择标识标牌呢?小区有哪些标识标牌?

        小区花草标识标牌:房地产中每一类的标识标牌的选择是非常重要的,根据不同设施环境配备的标识标牌也大不相同。一般来说普通住宅中的绿化面积较少,在这些花草区域,一般都会使用一些木材或不锈钢材质来制作标识标牌,因为小区的花草牌炎都是放在室外的需要有好的质量,避免快速的损坏。

        小区温馨提示语标识牌:在每个小区中我们都能够看到各种不同的小区标识标牌,这个温馨提示语的标识标牌设立的时候需要考虑到用户的行动方向和流动入口,温馨提示语标识牌的内容需要设计的风趣一些,这样才可以让用户或剧名关注到,从而对这个小区产生兴趣。

        小区楼栋单元标识:小区中的标识牌一定会有楼栋单元标识,因为没有设立楼栋单元标识那么用户在选择入住小区的时候就很容易绕迷路,找不到自己的家在哪,因此对于楼栋单元的标识牌是需要用符合人群观看的尺寸和高度。

        每个小区都有各式各样的标识标牌,每个标识标牌的设计都应该围绕主题符合小区风格,这样才能够让小区看着高端又精致。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/60.html b/news/60.html new file mode 100644 index 0000000..3e3a6bb --- /dev/null +++ b/news/60.html @@ -0,0 +1,362 @@ + + + + +快思聪8K超清 视频显示技术亮相美国InfoComm 展_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        快思聪8K超清 视频显示技术亮相美国InfoComm 展

        +
        +
        +
        +  2022-06-10 阅读:5 +
        +
        +

        InfoComm 2022 将于北京时间6月4日一6月10日在美国拉斯维加斯会议中心 (LVCC)举行, 本次盛会是北美最大的专业视听贸易展,拥有数以千计的音频、统一通信和协作、显示、视频、控制、数字标牌、家庭自动化、安全、VR 和现场活动产品。


        Crestron快思聪 作为老牌参展商此次将携众多新产品和技术应用亮相,其中备受关注的是8K超清 视频显示技术。


        3150 Paradise Road, Las Vegas, NV 89109, Las Vegas NV

        西厅,3 楼会议室 — W317 — 制造商培训

        西厅,展厅 — W603

        8K—前景与潜力:


        十多年前 ,已故普利策奖影评人罗杰·埃伯特(RogerEbert)看到了一段由65毫米模拟胶片制成的8K分辨率视频,这段视频扫描了一部名为《巴卡拉》(Bakara)的电影,这暗示了8K的前景和潜力。

        埃伯特写道:“2008年修复的蓝光是我看过或想象过的最好的视频光盘。”。


        然而,这种潜力远远超出了家庭视频环境中的卓越美学。8K提供的解决方案对从令人眼花缭乱的标识到关键的军事应用到医学的方方面面都有影响,快思聪将在6月为参加 InfoComm的人预告未来。

        快思聪商业产品营销总监迈克尔·迪贝拉(MichaelDibella)表示:“我们将展示一个零售标牌应用程序,这是一个基于软件的8K流解决方案,将内容推送到四个大型显示器上。”。这是对快思聪为稍后发布所做准备的早期观察,也是对该技术发展方向前沿的展示。

        迪贝拉对“8K”的展望:

        数字标牌-锋芒初显

        迪贝拉说∶"我们可能会首先看到8K应用于数字标牌。" 8K的生动分辨率会立即吸引眼球,但对于创造沉浸式体验的各种形式的交互式显示器来说,它是非常棒的。 迪贝拉补充道∶"届时,你将开始在企业和大学环境中看到这种应用。" 他说∶"美国企业和大学已经在这些应用上投入了大量资金,以帮助人们回到办公室和校园。"鉴于视频墙和标识在现代环境中发挥着多重作用,这一点尤其重要。

        迪贝拉说∶"我们可以传递的信息数量远远超过零售环境,非常强大!"比如,向整个组织发送信息,支持组织的品牌,提供来自其他部门的消息,作为公司新闻的传递媒介等等——正确的显示器可以作为另一个接触点,帮助员工或学生能有连接感和互通感,并有助于驱使大家期望返回办公室。更高的分辨率才是真正吸引眼球的东西。 迪贝拉指出∶"8K对视觉输出而言是一种进化。"

        高像素 高质量

        它的进化性和革命性,起源于一些非常基本的数学∶8K图像的分辨率是4K的四倍——这意味着清晰度和细节是4K的四倍。 迪贝拉说∶"这意味着在零售场所,你可以从远处清楚地看到衬衫上的品牌。在体育应用中,你从远处就能清楚地看到球或冰球,或者在控制室中分辨出政府录像的微小细节。"更高的像素意味着更高的清晰度,而更高的清晰度创造出更逼真的体验。" 这也会让玩家一—更不用说电子竞技观众了一—有更好的观赛视野。" 为虚拟运动和体育运动爱好者提供体验的超大屏幕即将在图像质量上进行重大升级。

        增加分辨率会产生某种"需求循环"。像素越多的图像在更大的屏幕上呈现出更清晰、更清晰的图像,这反过来又会推动对更大屏幕的需求,而不是将小型显示器连接在一起,用于像视频墙这样的大型装置,一个屏幕将能够提供这些"巨大"效果所需的清晰图像质量。 此外,"8K将加强视频拍摄和编辑过程,以获得更好的内容和效果。内容创作者将玩转更多像素。"DiBella解释道。

        清晰度的正确应用

        8K技术提供的好处与4K技术很像,但更好。迪贝拉说∶"随着像素的增加,我们将再次看到颜色的增强。"这种清晰度还能减轻眼睛的疲劳。

        然而,升级在某种程度上显得有些过∶"在某些时候,我们的眼睛无法处理显示器所投射的颜色,"迪贝拉说,"这就是为什么8K的价值实际上与尺寸有关。 一个巨大的显示屏在20码外显示的清晰度与50英寸4K显示屏在5码外显示的清晰度相同。”

        当然,就在撰写此文时,还没有多少8K的内容可以显示-—这意味着升级是这个等式的一个重要部分。 至于8K最终会变得多普及,迪贝拉有一个有趣的看法∶"我认为会有不错的应用,但不是通过我们习惯的应用。 我真的认为关于什么空间需要什么样的分辨率会有更详细的讨论。 空间小的地方可以使用高质量的42英寸1080p显示屏。 中间有很大的空间,这为合适的4K解决方案创造了巨大的需求。 我们会看到8K首先部署在我提到的那些培训室和大型礼堂,当然还有视频墙和标识等应用。"

        "最终,它将成为我们集成商的另一个神奇工具,"迪贝拉说

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/61.html b/news/61.html new file mode 100644 index 0000000..1a32996 --- /dev/null +++ b/news/61.html @@ -0,0 +1,362 @@ + + + + +湖北省某部大棚广告标牌制作项目竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        湖北省某部大棚广告标牌制作项目竞争性谈判公告

        +
        +
        +
        +  2022-06-10 阅读:5 +
        +
        +

        项目概况

        湖北省某部大棚广告标牌制作项目 采购项目的潜在供应商应在荆州市荆州区北京西路(万达广场)写字楼A座第1单元25层2504室获取采购文件,并于2022年06月22日 09点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:XM-2022-1730-A009

        项目名称:湖北省某部大棚广告标牌制作项目

        采购方式:竞争性谈判

        预算金额:20.2569200 万元(人民币)

        最高限价(如有):20.2569200 万元(人民币)

        采购需求:

        合同履行期限:合同签订后30日内

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        /

        3.本项目的特定资格要求:(一)符合《中华人民共和国政府采购法》第二十二条资格条件:1.具有独立承担民事责任的能力;2.具有良好的商业信誉和健全的财务会计制度;3.具有履行合同所必需的设备和专业技术能力;4.有依法缴纳税收和社会保障资金的良好记录;5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;6.法律、行政法规规定的其他条件。(二)供应商成立时间不少于3年,且为非外资独资或外资控股企业。(三)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业生产场地为同一地址的,销售型企业之间股东有关联的,一律视为有直接控股、管理关系。供应商之间有上述关系的,应主动声明,否则将给予列入不良记录名单、3年内不得参加军队采购活动的处罚。(四)本项目不接受联合体报价。

        三、获取采购文件

        时间:2022年06月10日  至 2022年06月16日,每天上午9:00至12:00,下午14:00至17:00。(北京时间,法定节假日除外)

        地点:荆州市荆州区北京西路(万达广场)写字楼A座第1单元25层2504室

        方式:供应商指定专人现场领取,不接受邮寄等其他方式。购买谈判文件时需提供以下材料原件(军队供应商库内企业不用提供)及装订成册加盖单位公章的复印件1份。1.营业执照;2.法定代表人授权书(含法定代表人和被授权人身份证复印件);3.非外资企业或外资控股企业的书面声明;4.主要股东或出资人信息。

        售价:¥200.0 元(人民币)

        四、响应文件提交

        截止时间:2022年06月22日 09点30分(北京时间)

        地点:沙市区北湖路智谷创业园内2号楼六楼602室

        五、开启

        时间:2022年06月22日 09点30分(北京时间)

        地点:沙市区北湖路智谷创业园内2号楼六楼602室

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        本采购项目相关信息在中国政府采购网(www.ccgp.gov.cn)、中国采购与招标网(www.chinabidding.com.cn)、中国招标投标公共服务平台(www.cebpubservice.com)、武汉富纳工程咨询有限公司网(www.whfnzx.com)上发布。

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:湖北省某部     

        地址:湖北省荆州市荆州区        

        联系方式:吴荣丰,19171898860      

        2.采购代理机构信息

        名 称:武汉富纳工程咨询有限公司            

        地 址:荆州市荆州区北京西路(万达广场)写字楼A座第1单元25层2504室            

        联系方式:蒋勤琼、韩方宇,0716-8806335,13227650100            

        3.项目联系方式

        项目联系人:蒋勤琼、韩方宇

        电 话:  0716-8806335,13227650100

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/62.html b/news/62.html new file mode 100644 index 0000000..c01217f --- /dev/null +++ b/news/62.html @@ -0,0 +1,362 @@ + + + + +陵水召开县公共场所外语标识标牌规范建设工作第九次联席会议_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        陵水召开县公共场所外语标识标牌规范建设工作第九次联席会议

        +
        +
        +
        +  2022-06-10 阅读:4 +
        +
        +

        6月8日,陵水召开县公共场所外语标识标牌规范建设工作第九次联席会议,听取有关工作汇报,部署下一步工作。

        6月8日,陵水召开县公共场所外语标识标牌规范建设工作第九次联席会议。记者 吴才用 摄

        县长罗桦出席会议并讲话,县委常委、县政府常务副县长符史锦主持会议,副县长郑莉出席会议。

        会议听取了县市场监管局汇报全县公共场所外语标识标牌规范建设工作情况,与会领导围绕汇报内容进行讨论并提出意见建议。

        罗桦在会上指出,公共场所外语标识标牌规范建设是海南自贸港建设的标志性基础工程,有关部门要高度重视,力争这项工作始终处于全省前列,树立陵水良好的对外形象;要从涉及旅文、交通、卫生健康、教育和城乡公共服务等五个重点领域抓好管理和维护,做到把握重点,有计划地开展好我县公共场所外语标识标牌规范建设;部门之间要形成合力推动工作,对标先进、深化措施,让我县外语标识标牌又“准”又“美”,即具备基本的指示功能,又与应用场景形成有机整体,在全县范围内形成统一规范,为城市精神文明建设增光添彩。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/63.html b/news/63.html new file mode 100644 index 0000000..61e3b12 --- /dev/null +++ b/news/63.html @@ -0,0 +1,362 @@ + + + + +商显IFPD:上半年看海外,下半年盼国内_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        商显IFPD:上半年看海外,下半年盼国内

        +
        +
        +
        +  2022-06-10 阅读:44 +
        +
        +

        《DISCIEN-2022Q1全球IFPD市场研究报告》显示,2022年一季度海外IFPD市场出货409.4K,同比增长159%,环比增长4.4%。

        图1:2021Q1-2022Q1海外IFPD出货概览

        数据来源:DISCIEN (Unit:K)

        中国市场IFPD出货238.4K,同比下滑19.9%,主要受疫情影响,以及前期铺货造成的渠道库存过高所导致。

        图2:2021Q1-2022Q1中国IFPD出货概览

        数据来源:DISCIEN (Unit:K)

        总体全球一季度IFPD市场可以用内冷外热来概括,之所以海外市场这么热,我们可以通过海外政策红利,出货节奏转移,经济及库存影响四个方面来阐述2022年Q1的高增长并推演全年海外IFPD市场的全景。

        海外政策红利:海外市场高增长主要来自于海外教育政策的密集发布,美国于2021年3月发布了第三期ESF,即教育稳定基金共计1700+亿美金;德国在去年一季度由于疫情影响,整体教育信息化资金仍旧偏向于教师、学生端的PAD(个人学习用平板电脑)上面;而土耳其去年7.85万台IFPD标案则是在下半年正式发布;同时意大利发布的《意大利教育的明天》政策则是在去年Q4开始实施;印度教育信息化起量节点则也是在去年年底;综合以上海外政策,我们需要注意政策作用于市场的节点基本是在2021年三季度开始的,这是拉动去年三四季度一反常态高出货的主要因素,也是拉动今年一季度高出货的因素之一。

        出货节奏转移:首先看下疫情以前,也就是2019年中国IFPD出口走势,可以看出IFPD主要出口旺季在当年的二季度到三季度初,背后的主要逻辑在于,全球大部分海外国家暑假放假时间在6月-9月,当时尚未受疫情影响,以美西航运为例,从订舱到最终清关卸货共计2个月左右时间。

         

        图3:2019.01-2019.12中国IFPD出口节奏概览

        数据来源:DISCIEN  (Unit:K)
         

        而现阶段受到疫情影响,整体航运各个环节时间增长,相较于疫情前目前增加2月左右周期,以此为对应6至9月暑假节奏,出货高峰势必部分前移到一季度。

        经济及库存影响:各国学校教育主要由政府拨款,拨款总额与GDP强相关,叠加各国人口结构不同,致使最终生均分配额度不同,而俄乌战争则对欧洲经济产生最直接的影响,首先是经济重心转移,包括能源、粮食等大宗商品涨价所带来的影响;第二点值得注意的是有近400万战争难民将涌入欧洲各个国家,其中18岁以下占30%以上,这将进一步分化其教育资金;第三点在于战争对全球经济的影响,IMF将欧元区2022年的GDP增长率调降1.1个百分点至2.8%。各欧元区国家中,德国被下修的幅度最大,下调了1.7个百分点至2.1%。


        图4:IMF俄乌战争前后对欧元区2022年GDP增速预测

        数据来源:IMF

        最直接的结果,从一季度市场信息来看,受到战争影响,部分地区尤其在欧洲地区项目有所延缓,前期高出货形成大量库存,3月部分海外IFPD品牌采购量大幅减少,后续欧洲地区出货将受到一定砍单影响。

        总结:总体来看,一季度的高爆发是由海外教育信息化政策出现节点位于2021年Q2及之后、迎合海外暑假需求及航运增加导致出口节奏提前共同导致,放眼整体2022年海外IFPD市场,预计二季度虽然受到战争影响导致欧洲市场受到一定抑制,但是依旧有如印度教育信息化政策及埃及普米中标9.4万台大标案等加持,预计二季度海外IFPD市场出货量仍受到一定支撑保持正增长,三季度由于去年同期政策拉动出货导致基数较高,今年三季度较去年预计将保持持平,全年整体来看,海外IFPD出货预计183.8万台,同比增长41%。

        写在最后:随着中国目前疫情逐步平息,中国整体IFPD市场也将回到正轨,从政策方面来看,2022年教育年初中央本级预算+地方预算总体增长10%,其中:

        1.支持学前教育发展资金安排230亿元,增加30亿元。

        2.义务教育薄弱环节改善与能力提升补助资金预算300亿元,增加1.5亿元。

        3.现代职业教育质量提升计划资金安排302.57亿元,增加25亿元。

        4.支持地方高校改革发展资金预算393.9亿元,增加17.4亿元。

        除了教育财政以外,4月中央全面深化改革委员会第二十五次会议中发布数字政府政策,加上5月25日10万人参加的全国稳住经济大盘电视电话会议不难看出,下半年对于国内教育、会议IFPD受到政府端刺激拉动作用是值得期待的。

        因此我们对于IFPD市场的预期也变得十分明显,上半年看海外、下半年盼国内!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/64.html b/news/64.html new file mode 100644 index 0000000..2d0d9b4 --- /dev/null +++ b/news/64.html @@ -0,0 +1,362 @@ + + + + +杭州地铁站采用AOC数字标牌,智慧交通升级_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        杭州地铁站采用AOC数字标牌,智慧交通升级

        +
        +
        +
        +  2022-06-15 阅读:7 +
        +
        +

        纵观地铁轨道交通的发展历程,在如何实现站点与乘客的高效交互方面,显示屏的作用不容小觑,它已遍布于轨道交通的站台、站厅、通道、出入口等各个位置,方便乘客随时获取出行信息。此次杭州地铁1号线即采用AOC数字标牌作为站台信息展示终端,通过高效的信息服务,提升乘客的交互体验。

            精准站台播报,信息动态显示

            实际应用中,集车厢信息标牌与城市信息系统联动等功能于一体的AOC数字标牌应用于地铁站台口,能提供全程站点、到站信息动态显示,实现精准站台播报,直观展示轨交线路走向及换乘信息,便于出行乘客及时掌握地铁站点信息,在引导出行乘客的同时,也可减轻地铁工作人员的工作负担,提高工作效率。

            聚焦政务动态,分屏滚动呈现

            与此同时,数字标牌也可用作宣传展示。一方面,兼容控制终端,实时聚焦政务动态和便民资讯,甚至滚动显示通知类即时性文字信息,以更为稳定、精准的指引方式,为乘客提供全新的信息化服务体验。此外如疫情期间防控注意事项以及商业广告等内容,均能轮播甚至分屏滚动呈现,通过综合信息展示,提供良好的公共出行服务。

            外观经典大气,长久工作运行

            不止如此,AOC数字标牌采用微边框设计,外观经典大气,独具商务质感,实际应用时也能更简约美观,提升地铁站台档次;考虑到地铁站每日长时间开放,因此终端设备发布信息的正常、持续性播放尤为关键,若采用传统显示设备,长时间连续工作后很容易会出现产品烧损现象及故障发生,势必影响到日常信息呈现。AOC数字标牌支持7x24小时全天候连续运行,工业寿命达50000小时,确保应用场景下信息可实时同步呈现,让地铁工作人员安心省心。

            智慧交通,未来已来。交通是经济发展的命脉,更是新时代城市腾飞的基石,“点亮智慧城市,先建智慧交通”,可见智慧交通的发展意义之深远。作为全球知名显示设备提供商及品牌商,秉承着八十余年来对视讯行业的专注、专业与专精,AOC即在于通过数字标牌等更完善、更全面、更丰富的全屏产品及软硬件一体化解决方案,全方位满足智慧交通下各大应用场景需求,赋能智慧交通建设,积极推动智慧交通的信息化升级转型!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/65.html b/news/65.html new file mode 100644 index 0000000..cf77be9 --- /dev/null +++ b/news/65.html @@ -0,0 +1,362 @@ + + + + +新增警示标志牌修复性养护项目(二次)竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        新增警示标志牌修复性养护项目(二次)竞争性谈判公告

        +
        +
        +
        +  2022-06-15 阅读:3 +
        +
        +

        项目概况

        新增警示标志牌修复性养护项目(二次) 采购项目的潜在供应商应在西藏德辰良项目管理有限公司获取采购文件,并于2022年06月27日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:XZDCL-ZB220602

        项目名称:新增警示标志牌修复性养护项目(二次)

        采购方式:竞争性谈判

        预算金额:44.0000000 万元(人民币)

        最高限价(如有):44.0000000 万元(人民币)

        采购需求:

        新增单悬臂式标志标牌22处,标志板采用3004型铝合金板制作,板厚3毫米,尺寸规格:3400mm*4600mm,具体要求详见竞争性谈判文件。


        合同履行期限:签订合同后30日历天

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        1.1具有独立承担民事责任能力,具有有效的营业执照;

        1.2具有良好的商业信誉和健全的财务会计制度;

        1.3具有履行合同所必需的设备和专业技术能力;

        1.4具有依法缴纳税收和社会保障资金的良好记录;

        1.5参加政府采购前三年内在经营活动中没有重大违法记录,未被列入经营异常名录或者严重违法企业名单;

        1.6法律、法规要求的其他条件。

        2.符合《中华人民共和国政府采购法实施条例》第十八条规定的条件。


        3.本项目的特定资格要求:3.1业绩要求:近三年(2019年1月1日至今)具有三项类似公路工程施工业绩(提供中标通知书或合同协议书)3.2未被列入“信用中国”网站记录失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单;不处于中国政府采购网(www.ccgp.gov.cn)政府采购严重违法失信行为信息记录中的禁止参加政府采购活动期间本次投标要求各投标单位、投标单位法定代表人不得存在行贿犯罪记录(提供近三年的“中国裁判文书网查询截图或检察机关出具的查询结果告知函”若投标单位自成立之日起不足3年,则投标单位以成立之日为查询起始时间即可,人员须查询近3年)。3.3不接受被西藏自治区交通运输厅列为禁止投标的单位参与投标。

        三、获取采购文件

        时间:2022年06月16日  至 2022年06月20日,每天上午10:00至13:00,下午15:40至18:00。(北京时间,法定节假日除外)

        地点:西藏德辰良项目管理有限公司

        方式:持营业执照、授权委托书和经办人身份证(复印件加盖公章)购买谈判文件,本项目不接受邮购报名。

        售价:¥850.0 元(人民币)

        四、响应文件提交

        截止时间:2022年06月27日 10点30分(北京时间)

        地点:西藏德辰良项目管理有限公司(拉萨市慈觉林文化旅游主题园文成大道E区2号楼)

        五、开启

        时间:2022年06月27日 10点30分(北京时间)

        地点:西藏德辰良项目管理有限公司(拉萨市慈觉林文化旅游主题园文成大道E区2号楼)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜


        1、本公告同时在《中国政府采购网》、《采购与招标网》上发布。

        2.落实政府采购政策

        2.1.执行《中华人民共和国政府采购法》、《中华人民共和国政府采购法实施条例》等有关法律、法规和和政策;

        2.2.执行《政府采购促进中小企业发展管理办法》、《关于政府采购支持监狱企业发展有关问题的通知》和《关于促进残疾人就业政府采购政策的通知》,本项目涉及小微企业、监狱企业和残疾人福利性单位;

        2.3.执行《节能产品政府采购实施意见》、《财政部环保总局关于环境标志产品政府采购实施的意见》;

        2.4.落实节约能源、保护环境、扶持不发达地区和少数民族地区、促进中小企业发展等政府采购政策。

        2.5.本项目不属于专门面向中小企业采购的项目,供应商不限制必须为中小微企业、监狱企业、残疾人福利性单位。



        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:那曲高速公路养护中心筹备组     

        地址:西藏自治区拉萨市当雄县当曲卡镇友谊路16号        

        联系方式:桑先生15728943032      

        2.采购代理机构信息

        名 称:西藏德辰良项目管理有限公司            

        地 址:拉萨市慈觉林文化旅游主题园文成大道E区2号楼            

        联系方式:王先生13628915291            

        3.项目联系方式

        项目联系人:王先生

        电 话:  13628915291

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/66.html b/news/66.html new file mode 100644 index 0000000..4440e01 --- /dev/null +++ b/news/66.html @@ -0,0 +1,362 @@ + + + + +泉州渔船安全标识制作(标识标牌)竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        泉州渔船安全标识制作(标识标牌)竞争性谈判公告

        +
        +
        +
        +  2022-06-17 阅读:10 +
        +
        +

        项目概况

        渔船安全标识制作(标识标牌) 采购项目的潜在供应商应在福建鑫盛项目管理咨询有限公司(福建省泉州市丰泽区海星街100号东海大厦B栋23层)获取采购文件,并于2022年06月27日 09点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:XSCGFZ2022112S

        项目名称: 渔船安全标识制作(标识标牌)

        采购方式:竞争性谈判

        预算金额:10.8000000 万元(人民币)

        采购需求:

        福建鑫盛项目管理咨询有限公司受 泉州市丰泽区农业农村和水利局的委托,以竞争性谈判的方式对以下项目进行采购,欢迎收到邀请函的供应商参加谈判。邀请名单如下:泉州市恒力文化传播有限公司、泉州旺乾广告有限公司、泉州市晟荣广告传媒有限公司、泉州万力广告有限公司 。

        一、采购编号:XSCGFZ2022112S

        二、项目名称: 渔船安全标识制作(标识标牌)

        三、技术规格及要求:具体详见本谈判文件第三部分

        四、谈判供应商的资格要求:

        1、谈判供应商必须符合《政府采购法》第二十二条、《政府采购法实施条例》第十九条第二款的规定条件;

        2、供应商在投标截止时间前分别通过“信用中国”网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)查询并打印相应的信用记录,提供的查询结果应为其通过上述网站获取的信用信息查询结果原始页面的打印件(或截图);

        3、本次采购项目预算价为人民币壹拾万捌仟元整(¥108000.00),超过预算金额的将视为无效谈判

        4、本项目不接受联合体谈判。

        五、谈判文件公告期限及购买谈判文件时间:2022 年06 月16 日起至 2022年 06 月 23 日止(节假日除外),每天上午8:00~12:00时,下午14:00~17:30时(北京时间);谈判文件(纸质版或电子版)每合同包售价200元,一经出售,谢绝退还。谈判文件若需邮寄,请加付邮寄费50元;对邮寄过程中可能发生的延误或丢失,采购代理机构概不负责。谈判供应商购买采购文件后,应将交易登记卡保存好,在递交谈判响应文件时必须提供交易登记卡给我司核对,否则其谈判响应文件恕不接受。若出现谈判供应商伪造交易登记卡,将取消其资格,同时对伪造交易登记卡的没收其保证金。

        六、提交谈判响应文件截止时间:2022 年 06 月 27 日 09:30 时(北京时间)。届时请谈判代表出席,逾期送达或不符合谈判文件规定的谈判响应文件恕不接受。

        七、谈判开始时间:2022 年 06月27日09:30 时(北京时间)

        八、谈判文件发售、递交及谈判地点:福建鑫盛项目管理咨询有限公司(福建省泉州市丰泽区海星街100号东海大厦B栋23层)

        九、凡对本次采购有疑义的,请以信函、电话、传真或来人与我司联系,联系人:连小姐,联系电话:0595-28679988,传真:0595-28252555,邮编 362000。采购单位: 泉州市丰泽区农业农村和水利局(地址: 泉州市丰泽区泉州文旅大厦314号),联系人:小林,联系电话:0595-22197715。

        十、开户行:

        谈判文件费用及相关服务费用账户:中国民生银行泉州田安路支行,户名:福建鑫盛项目管理咨询有限公司,账号:697422988。

        谈判保证金专户:招商银行泉州泉秀支行,户名:福建鑫盛项目管理咨询有限公司,账号:595900484210902。

        十一、有关本次招标的相关信息(包括招标文件若有修改)都将在中国政府采购网http://www.ccgp.gov.cn上公布,请潜在人随时关注相关网站,以免错漏重要信息。

        十二、根据《政府采购法》第五十二条及《政府采购法实施条例》第五十三条规定,供应商认为采购文件、采购过程和中标、成交结果使自己的权益受到损害的,可以在知道或者应知其权益受到损害之日(对采购文件质疑的,可在收到采购文件之日或者采购文件公告期限届满之日;对采购过程质疑的,可在各采购程序环节结束之日;对中标、成交结果质疑的,可以在中标、成交结果公告期限届满之日)起七个工作日内,均以书面形式向采购人提出质疑。口头质疑或质疑期限届满后提出的质疑不予接受。


        合同履行期限:详见采购文件。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        详见采购文件。


        3.本项目的特定资格要求:1、谈判供应商必须符合《政府采购法》第二十二条、《政府采购法实施条例》第十九条第二款的规定条件;2、供应商在投标截止时间前分别通过“信用中国”网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)查询并打印相应的信用记录,提供的查询结果应为其通过上述网站获取的信用信息查询结果原始页面的打印件(或截图);3、本次采购项目预算价为人民币壹拾万捌仟元整(¥108000.00),超过预算金额的将视为无效谈判4、本项目不接受联合体谈判。

        三、获取采购文件

        时间:2022年06月16日  至 2022年06月23日,每天上午8:00至12:00,下午14:00至17:30。(北京时间,法定节假日除外)

        地点:福建鑫盛项目管理咨询有限公司(福建省泉州市丰泽区海星街100号东海大厦B栋23层)

        方式:2022 年06 月16 日起至 2022年 06 月 23 日止(节假日除外),每天上午8:00~12:00时,下午14:00~17:30时(北京时间);谈判文件(纸质版或电子版)每合同包售价200元,一经出售,谢绝退还。谈判文件若需邮寄,请加付邮寄费50元;对邮寄过程中可能发生的延误或丢失,采购代理机构概不负责。谈判供应商购买采购文件后,应将交易登记卡保存好,在递交谈判响应文件时必须提供交易登记卡给我司核对,否则其谈判响应文件恕不接受。若出现谈判供应商伪造交易登记卡,将取消其资格,同时对伪造交易登记卡的没收其保证金。

        售价:¥200.0 元(人民币)

        四、响应文件提交

        截止时间:2022年06月27日 09点30分(北京时间)

        地点:福建鑫盛项目管理咨询有限公司(福建省泉州市丰泽区海星街100号东海大厦B栋23层)

        五、开启

        时间:2022年06月27日 09点30分(北京时间)

        地点:福建鑫盛项目管理咨询有限公司(福建省泉州市丰泽区海星街100号东海大厦B栋23层)

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜



        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:泉州市丰泽区农业农村和水利局     

        地址:泉州市丰泽区泉州文旅大厦314号        

        联系方式:小林 0595-22197715      

        2.采购代理机构信息

        名 称:福建鑫盛项目管理咨询有限公司            

        地 址:福建省泉州市丰泽区海星街100号东海大厦B栋23层            

        联系方式:连小姐0595-28679988            

        3.项目联系方式

        项目联系人:连小姐

        电 话:  0595-28679988

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/67.html b/news/67.html new file mode 100644 index 0000000..4f76be9 --- /dev/null +++ b/news/67.html @@ -0,0 +1,362 @@ + + + + +冠捷科技:公司数字标牌等产品广泛应用于新型城镇化建设中_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        冠捷科技:公司数字标牌等产品广泛应用于新型城镇化建设中

        +
        +
        +
        +  2022-06-22 阅读:4 +
        +
        +

        有投资者在投资者互动平台提问:为贯彻建设美好生态环境和推进新型城镇化的国家战略要求,公司数字标牌等产品是否广泛应用于新型城镇化建设中?

        冠捷科技(000727.SZ)6月20日在投资者互动平台表示,公司数字标牌产品凭借数字化、智能化、互动反馈于一体的技术优势,已广泛应用于交通、学校、医院、超市、酒店等公共场所,以新技术、新科技、新应用赋能智慧城市生态建设。公司紧跟国家发展战略机遇,努力将自身产品融入产业发展应用中。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/68.html b/news/68.html new file mode 100644 index 0000000..1b070d0 --- /dev/null +++ b/news/68.html @@ -0,0 +1,362 @@ + + + + +金华市金东区源东乡2022-2023年度广告标识标牌制作安装入围项目_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        金华市金东区源东乡2022-2023年度广告标识标牌制作安装入围项目

        +
        +
        +
        +  2022-06-22 阅读:5 +
        +
        +

        受金华市金东区源东乡人民政府委托,现就金东区源东乡2022-2023年度广告标识标牌制作安装入围项目进行公开招标采购,欢迎国内满足投标人资格要求的投标人参加投标。

        一、项目基本情况:

        (一)项目名称:金东区源东乡2022-2023年度广告标识标牌制作安装入围项目

        (二)项目编号:JHZZ2022-01

        (三)采购人式:公开招标

        (四)采购组织类型:自行采购委托中介(非政府采购)

        (五)采购需求:

        标项 采购内容 选定数量 服务期限 简要规格描述

        一 金东区源东乡2022-2023年度广告标识标牌制作安装入围 选定5家供应商 二年(合同签定之日起计算) 源东乡单项金额30万元以下的所有关于宣传和社会发展的各种形式广告设计制作和安装等,详细采购要求见本招标文件第四章。

        (六)合同履行期限:具体详见招标文件“第四章 招标内容及需求”。

        (七)本项目谢绝接受联合体投标。

        二、申请人的资格要求:

        (一)基本资格要求:

        (1)满足《中华人民共和国政府采购法》第二十二条规定;

        (2)投标人未被列入信用中国网站(www.creditchina.gov.cn)、中国政府采购网(www.ccgp.gov.cn)渠道信用记录失信被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单;

        (3)本项目不接受联合体投标。

        (二)本项目的特定资格要求:

        (1)投标人应为具有各类广告设计制作安装等相关内容的独立法人企业,并在人员、设备、资金等方面具有相应的施工能力;

        三、获取招标文件:

        (一)获取时间:2022年06月21日起至2022年07月04日,上午8:30-11:30;下午13:30-16:30,节假日除外。

        (二)获取地点:现场获取或电子邮件或邮寄方式提交报名资料。

        (三)报名/领取招标文件时应提供的资料:

        (1)单位介绍信或法人授权委托书(加盖公章);

        (2)营业执照或法人登记证书(加盖公章的复印件1份);

        (3)法人代表身份证或被授权人身份证及联系方式(加盖公章的复印件1份);

        (4)供应商资格要求中特定资格条件的证明材料(加盖公章的复印件1份)。

        注:电子邮件获取招标文件时应提供报名资料的扫描件

        (四)招标文件售价:人民币500元/份,售后不退。

        (五)未按上述方式获取招标文件的,不得对招标文件提起质疑投诉且采购代理机构有权拒绝其投标。同时请投标人在参加投标前自行随时关注项目的更正公告情况,因投标人未及时查看项目变更情况造成无效投标的责任由投标人自行承担。

        四、提交投标文件截止时间与地点:投标人应于2022年07月11日14:00-14:30时前将投标文件密封送交。

        ▲逾期送达或未密封的投标文件将予以拒收。

        五、开标时间和地点:本次招标将于2022年07月11日14点30分开标,投标人可以派授权代表(1 人)出席开标会议,并配戴口罩等疫情防护措施及金华健康码通过。

        六、其他补充事宜:

        (一)投标保证金:壹万元整(10000.00元);投标人应于2022年07月08日开标前将投标保证金以现金的形式交至开标现场。

        联系人:夏工

        手 机:13241775805

        邮 箱:zb0019@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/69.html b/news/69.html new file mode 100644 index 0000000..9e44027 --- /dev/null +++ b/news/69.html @@ -0,0 +1,362 @@ + + + + +新增报警标识2551块,深铁公安实现管内站车“报警标识”全覆盖_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        新增报警标识2551块,深铁公安实现管内站车“报警标识”全覆盖

        +
        +
        +
        +  2022-06-22 阅读:2 +
        +
        +

        6月21日,记者从深圳铁路公安处获悉,为提升为民服务质量,规范铁路站车等人员密集场所报警标识、服务站点设置,深铁公安共在辖内沿线新增各类报警标识2551块,其中报警电话标识牌1374 块、报警点路径指引牌324块、报警服务台外观标识牌24块、列车报警二维码829块,实现管内站车“报警标识”全覆盖。

        “旅客您好,您可以扫码将‘广铁微警’小程序添加到‘我的小程序’中,如果遇到需要报警求助的情况可以直接微信报警,里面有视频报警、语音报警、电话报警三种方式。”近日,值乘D3309次列车的乘警在巡乘时一边在列车每节车厢、乘务席、餐车吧台等处悬挂张贴报警标识,一边向旅客推广介绍微信报警小程序。

        旅客扫码后在乘警的讲解下使用小程序进行了模拟报警。常乘坐潮汕线列车的旅客王先生在模拟了一次报警服务后表示微信报警平台快捷又方便。

        据了解,深铁公安乘警支队在管辖的280对列车上张贴报警二维码829张,其中在管辖的269对高铁动车组列车上张贴报警二维码807张,在管辖的 11对普速列车上张贴报警二维码22张,实现管内列车“报警标识”全覆盖。

        除了列车上,深圳铁路公安处管内各派出所也梳理出车站内旅客报警求助类警情多发点,如候车室、售票厅、连廊、出站口、站台中部等位置,并组织民警在相应位置粘贴报警标识牌、指引牌,布置摆放报警服务台。

        20日下午,东莞站派出所指挥中心接到报警求助,旅客刘先生在东莞火车站广深线候车室,突然发现自己的黑色双肩包不见了。

        指挥中心立即用对讲机通知执勤民警前往处理。民警到场后了解,刘先生和其朋友当天下午准备乘车前往广州东站转车回老家,谁知道候车时突然发现自己的双肩包遗失,包内有笔记本电脑、平板电脑、相机等物,价值30000余元。

        发现双肩包不见时,刘先生非常着急,正好看到贴在候车室墙上的派出所报警电话,立即报警求助。

        根据刘先生的描述,民警判断双肩包很可能遗漏在了安检处。果然,民警带着刘先生来到一楼安检口,就发现了刘先生的黑色双肩包。

        民警一边提醒刘先生以后乘车出行一定要随时清点好自己的行李物品,一边指着安检处置台后玻璃上张贴的报警标识打起了“广告”。“你也可以扫码添加一下这个小程序,可以一键报警,一键定位,不仅有电话报警功能,还可以视频报警,能让接警人实时看到现场的情况,方便又快捷。”刘先生和朋友立即扫码添加了小程序。

        接下来,深圳铁路公安处还将听取旅客群众意见建议,根据需求持续增设、优化、更新报警标识,响应旅客群众的报警求助诉求。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/7.html b/news/7.html new file mode 100644 index 0000000..53944e5 --- /dev/null +++ b/news/7.html @@ -0,0 +1,362 @@ + + + + +杭州的那些城市标识标牌正悄悄“变脸”_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        杭州的那些城市标识标牌正悄悄“变脸”

        +
        +
        +
        +  2022-04-29 阅读:47 +
        +
        +

        去年国庆假期,杭州一名小学生去亲戚家时,在路上发现一个奇怪现象:钱塘区的二号大街上,同一路口出现了三种不同描述方式的交通标志牌:道路交通指示牌为No.2 St,路名牌为ER HAO DA JIE(拼音),自行车道标志牌为ER HAO STREET(拼音加英语)。

        最近,细心的市民朋友可能已发现,城市道路、旅游景区、交通枢纽等区域的标识标牌正悄悄发生变化,部分道路两侧的公厕指示牌、路名牌正在更新,不同区、县(市)间的交通指示牌、路名牌正在逐步统一,杭州机场、火车东站的标识标牌也焕然一新。

        今年杭州将迎来亚运会,统一的国际化标识系统,是城市基础设施、视觉形象的重要组成部分。

        记者4月26日从市城管局市容景观中心了解到,去年以来,市城管局牵头推进城市国际化标识系统建设改造工作,截至目前,全市重要道路、交通枢纽、旅游景区等重点区域建设改造任务已完成87%,累计新建、改造标识21356块。

        《导则》规范,标识标牌各类乱象逐步解决

        其实,全市很多地方的标识标牌过去都存在不规范、不统一、不准确的现象。

        市城管局市容景观中心相关负责人介绍,围绕标识系统存在的标准不统一、文字不规范、译写不准确、内容错误、要素不全等突出问题,他们牵头编制了《杭州城市国际化标识系统导则》(以下简称“导则”),从图形符号、文字、色彩、尺寸、位置等要素规范标识设置,列举7大类12小类300种常用标识图形示例,细化城市道路、交通枢纽、旅游景区等重点区域设置要求,提出杭州特色建议。

        “如今,按照《导则》,2号大街上出现的路名牌、交通指示牌和公交站牌都已统一改为NO.2 St。”相关负责人说,目前,主城区与副城区和县(市)交通指示牌、路名牌在版面、规格、颜色、译写等方面的不统一问题;火车站、公交站、地铁站和交通指示牌上关于火车站站名的译写不统一问题;钱塘区二号大街等处在同一区域不同标牌上的译写不统一等问题已基本得到解决。

        另外,城管针对城市道路及两侧范围内随意设置、重复设置、功能缺失、脏污破损的标识标牌也进行了全面清理。截至目前,通过数字城管督办整改标识标牌问题5.41万个,整改版面错误、要素不全、指向不明等标识设置不规范问题1016个;协同市外办、市教育局整改公共外语译写和语言文字使用不规范问题2万余个。

        标识标牌升级,展现杭州韵味、人文特色

        很多刚改造过的标识标牌,别具特色、很有看头。

        比如临平区人民大道、东湖南路沿线公厕指示牌,通过太阳能板充电,夜间可发光,既低碳环保,又方便市民晚上找寻;临安博物馆对馆内信息无障碍环境进行了优化提升,效果显著 , 成为杭州市首家提供在线手语咨询和全程智能语音导览一体化无障碍服务的博物馆,实现无障碍设施和信息双一流;西湖景区游船码头标识采用古色古香的牌匾和宋代古风人物卡通形象展示人文之趣;桐庐县部分标识融入桐庐山水元素等。

        市城管局市容景观中心相关负责人介绍,在这次建设改造中,他们还把标识系统与宋韵文化、江南文化、亚运元素等相结合,打造富有杭州特色的国际化标识系统。“通过融入新技术、新材料,推进标识便捷、低碳、智能;完善无障碍标识设置,保障残疾人及其他特殊人群自主、安全、方便通行,体现杭州温度;在重要窗口、特色街区、旅游景区等区域设置个性化标识,展现杭州独特韵味。”


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/70.html b/news/70.html new file mode 100644 index 0000000..5345734 --- /dev/null +++ b/news/70.html @@ -0,0 +1,362 @@ + + + + +Mini LED迎来放量年,商显行业的边界该如何重构?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        Mini LED迎来放量年,商显行业的边界该如何重构?

        +
        +
        +
        +  2022-06-22 阅读:0 +
        +
        +

        商显市场发展至今,安防、教育、交通、零售等传统行业需求已日趋饱和,市场增速逐渐放缓,表象已“潭面无风镜未磨”,实则创新之流不断涌动,全行业不断去重构边界,拓宽商显边界,开拓新的成长赛道。

        重构产品边界:创新+探索

        2021年全球新型显示面板行业营收规模创历史最高水位,达到约1366亿美元,同比增长约18.2%。受旺盛终端需求和驱动IC等上游供应链材料紧缺影响,液晶面板曾迎来历史上最长的上行周期。在此形势下,Mini LED进入产业化发展阶段,LED行业上行周期逐步开启,LED 显示技术正朝着高密度方向发展,由小间距LED 显示向Mini LED、Micro LED 不断延伸,技术突破推动产业链成熟度不断提升,预计2023 年到2024 年将迎来放量。
        2021年,中国面板企业顺势而为把握住机会实现全面盈利,也促进了京东方和中电熊猫、TCL华星和三星、杉杉和LG化学等整合,催生了新技术成长,加快创新应用进程,不断拓宽着显示产品的技术边界。
        重构场景边界:智慧+应用

        商显应用场景整体趋好,增长动力呈现多点发力、齐头并进、遍地开花的趋势。刚结束不久的冬残奥会开幕式便是商显应用最好的案例,本次冬残奥会开幕式综合运用人工智能、AR、裸眼3D等多种技术,整个鸟巢超大地屏首次实现全LED影像,以取代传统的地屏投影,画质达到16K,让世界看到了一个更具未来感、极具浪漫和美好的中国。

        在国家4K、8K 超高清视频战略的引领下,目前Mini LED 和Micro LED 在视频会议、会展广告、虚拟显示、监控调度等高端直显市场也开始逐渐渗透。伴随消费环境的变化,国民行为方式和生活习惯呈现了线上化、健康化、便捷化、非接触式消费的趋势,促使在线教育、远程医疗、远程办公、智慧餐厅等等消费场景成为商显行业关注热点。
        重构渠道边界:合作+共融

        整个商显市场的空间还将持续扩大,今年预判规模达到784亿,2025年将近1300亿。面对着行业蓬勃向上的发展趋势,供应链的垂直整合成为关键;行业的竞争形态的变化,这也加速了系统集成商的分化和转型。

        2021年商显企业面临上游成本和内外部竞争的双重压力,在这种情况下,2022年面板企业该如何平衡、分解和消化压力?面对众多行业、众多细分场景,整机厂商该如何合理开发资源?如何选择产品和行业赛道?如何回归到商显的行业本质和市场核心价值层面去思考……众多疑惑悬在空中不得而解。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/71.html b/news/71.html new file mode 100644 index 0000000..fc455e3 --- /dev/null +++ b/news/71.html @@ -0,0 +1,362 @@ + + + + +数字标牌在智慧城市的典型应用有哪些?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字标牌在智慧城市的典型应用有哪些?

        +
        +
        +
        +  2022-06-22 阅读:6 +
        +
        +

        数字标牌在智慧城市建设中发挥了重要的作用,也是智慧商场信息化落地中的重头戏,在用户端来看,数字标牌也是用户感知比较深的落地应用产品。提到数字标牌,很多用户可能会想到已经普及多年的取号机,其实这也是早期的数字标牌,也正由于有这样的普及应用落地才让用户体验到了数字标牌给我们生活带来的变化,在很多场景中,数字标牌逐渐发挥着越来越重要的作用,比如在自助点餐的餐饮场所和一些自助服务的商业场所,都可以看到不少的数字标牌的身影,今天,我们继续就这个问题进行探讨,将目前市面上数字标牌的4个主要典型应用进行分析:

        1、广告,广告机是一种比较传统的数字标牌,当然这种标牌其实与用户之间是没有联动的,互相之间并没有实际交互,所以,严格意义上讲,广告机只是上一代的数字标牌,与现阶段主流数字标牌还有较大的差异,但是,这个应用范围是非常广泛的,在各大商场商务建筑和电梯等等场所都可以看到,即使是其他类型的数字标牌,广告属性一般也是包含的。

        2、导购,在一些商业场所,过去传统的产品需求和推荐都是依赖人工的,自从数字标牌出现以后,这个导购的环节的工作也从根本上发生了改变,一些商品和服务可以通过数字标牌来呈现给消费者,一方面可以降低营业成本,同时还可以通过新奇的呈现方式给用户带来全新的购物体验,目前来看,这种数字标牌市场表现普遍比较好。

        3、寻车,在停车场这个场景中,数字标牌也逐渐多了起来,特别是针对大型的地下停车场来说,由于停车场规模过大,用户停车以后经常会面临找不到自己车辆位置的难题,这时候,寻车屏触摸一体机终端就是一个很好的解决方案,在用户入场的时候就通过系统识别记录车辆的行动轨迹和最终停车位置,当用户需要寻找车辆的时候,再通过扫码或者人脸识别的方式来反向选好车辆的停放位置,通过显示屏将车辆位置和当前所在地去往车辆位置的行动路径直接呈现给车主,车主一般可以非常轻松的找到自己车辆的位置,有效解决了停车场寻车难的痛点。这个领域相对其他数字标牌应用来说比较新,市场需求较大。

        4、消费,在传统的消费逻辑中,无论是用户挑选商品还是付款买单环节,都会涉及到大量的人工参与,数字标牌参与到这个消费模型以后,无论是选品还是支付环节,都可以通过数字标牌自助服务终端来完成,从商场信息化改造的案例中,我们发现这种优化带来的用户反馈也是比较好的,只有一小部分的来年人由于各种原因对这个自助服务比较排斥,但是,商超也会通过预留人工服务窗口的方式提供个性化的服务,整体上看,消费始终是数字标牌发力的一个重要方向。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/72.html b/news/72.html new file mode 100644 index 0000000..049bdd2 --- /dev/null +++ b/news/72.html @@ -0,0 +1,362 @@ + + + + +佳联:Scala数字标牌系统的工作机制_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        佳联:Scala数字标牌系统的工作机制

        +
        +
        +
        +  2022-06-22 阅读:8 +
        +
        +

        相信大家对于数字标牌都不陌生,在生活当中我们都看到过,无论是酒店、主题乐园的信息发布牌,还是麦当劳的点餐牌都离不开Scala。那它是怎么工作的呢?先上张图!下面这张图完整的展示了Scala数字标牌系统的工作机制,非常简单、易于操作是绝对的亮点!



        Scala Designer是一款针对运营人员使用的后台编辑系统,在这里可以轻松编辑想要推送的内容,尽情展现您的灵感。第一步就是在Scala Designer中先编辑好需要展示的内容。


        在编辑完成后,我们就需要用到Scala Content Manager了,这是一个带有后台管理功能的云端服务器。我们将媒体内容上传后,通过Scala Content Manager后台管理系统即可配置将数字内容分发至不同的播放器当中。在播放器收到信号指令后,就可以自动将内容展示到对应屏幕上啦。在系统中可以随意搭配数字标牌的布局和展示方式,它可以是这样的。

        佳联

        也可以是一分为四的。


        还可以是组合在一起显示的。


        当然也可以连接LED大屏显示。


        Scala拥有超高的自由组合度,可以充分的满足业主想要展示的内容,展示的形式也是创意无限、丰富多样的。当然远不止如此,在下期内容当中我们将细聊一下Scala的硬件和软件,看看不同的组合能摩擦出怎样的火花!记得关注我们哦。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/73.html b/news/73.html new file mode 100644 index 0000000..2607005 --- /dev/null +++ b/news/73.html @@ -0,0 +1,362 @@ + + + + +什么是曝光乘数,它是如何应用于数字户外媒体的?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        什么是曝光乘数,它是如何应用于数字户外媒体的?

        +
        +
        +
        +  2022-06-22 阅读:11 +
        +
        +

        数字领域的大多数媒体格式采用一对一的运行方式(即一次播放等于一次曝光),而数字户外媒体(DOOH)在计算受众数量时所用的方法稍显特别。作为一种一对多媒体,一次播放不仅相当于多次曝光,而且曝光量通常受时间段、日期和许多其他因素的影响而有所不同。


        随着程序化数字户外媒体的不断发展,为迎合这种特有的受众结构,曝光乘数被引入,用于体现数字户外媒体更为广阔的受众覆盖范围。
        究竟什么是曝光乘数,它又是如何应用于数字户外媒体的?   
        01什么是曝光乘数?

        讨论曝光乘数之前,有必要了解何为一般意义上的受众曝光。一次曝光是指广告被一个人观看,或在户外广告显示屏中播放一次。曝光量往往能够决定广告的成本,所以是数字、移动和户外广告等很多广告形式的核心指标。

        曝光乘数实际上是专用于数字户外媒体的乘数因子,针对每个屏幕上的每一次播放,让广告主了解一次广告播放带来多少曝光。因为每次曝光可触达多人,所以需要借助乘数来估算有多少人看到了广告,帮助广告主了解特定库存空间的触达量。

        与流行看法相反,曝光乘数其实不是所有媒体运营商都适用。该乘数针对每个户外屏幕都不一样,将每次播放转化为媒体主提供的受众数据所代表的曝光量。

        因此,1000次播放不等于1000次曝光,这与在线及移动格式不同。根据户外媒体的不同,一次播放可产生几次到几百次不等的曝光量。

        02曝光乘数如何实际应用?

        要确定曝光乘数,需要收集数据,掌握特定时间内在广告屏周围有多少人经过。这类数据可通过手机信号、GPS数据、摄像头传感器、活动或体育场馆门票销量等途径获取。

        有了这些信息,就可以确定某一特定时间内广告牌所在地理区域内的人流量,从而计算出该屏幕的曝光乘数。

        在购买基于曝光量的广告时,每千人成本(CPM)是一项常用指标,也称为每千次曝光成本。采用CPM模式购买时,广告主根据广告获得每千次曝光所需成本向媒体主支付预先确定的金额。

        如果没有曝光乘数,CPM需要全天波动才能更准确地体现特定屏幕提供的价值(和吸引的受众量)。这样一来,库存的定价将不可避免地在一天内呈现过低、过高或两者兼具的现象。

        为防止CPM在高流量时变得难以承受,我们将使用曝光乘数来调整每次播放的曝光量,从而更准确地体现受众触达和媒体定价的合理程度。

        只要可行,受众人数将由数字户外媒体主每小时提供。这意味着每天的每个小时都可使用专门的乘数来体现任何特定时间屏幕前的受众量。详见下方示例。

         

        受众(或曝光)量=播放次数x曝光乘数

        03为什么曝光乘数如此重要?

        曝光乘数不仅是将播放量转化为曝光量的有效手段,还为媒体主带来一定程度的灵活性,助其在数据受到外部因素影响时依然能有效把控向受众传达的信息。

        以疫情为例,随着各地启动封锁措施,全世界的受众数量都急剧下降。稍温和的影响因素还有季节性变化、金融市场的变化和假日到来等。如果能掌握每面广告屏确切的观看量,媒体主就可以持续保证库存合理定价。

         


        如果在受众数据波动时,能够使用实时或相对实时的百分比来调整曝光乘数,这将让媒体买家确信自己是在为实际的曝光量付费。有了适当的曝光数据,广告主也可以选择根据上述不断变化的外部因素来调整广告内容。

        作为程序化数字户外媒体领域的一项创新,曝光乘数让数字户外媒体也能够采用基于曝光量的购买模式,同时充分考虑了这种媒体覆盖范围广的明显优势。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/74.html b/news/74.html new file mode 100644 index 0000000..2fedabc --- /dev/null +++ b/news/74.html @@ -0,0 +1,362 @@ + + + + +智能大屏营销研究院院长黄升民:为什么是智能大屏?_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        智能大屏营销研究院院长黄升民:为什么是智能大屏?

        +
        +
        +
        +  2022-06-22 阅读:8 +
        +
        +

        2022年6月15-16日,由流媒体网主办,海南视听网络电视有限公司、中国电信股份有限公司海南分公司协办的「海南论道暨第23届中国智能视听与科技创新高峰论坛」在海口隆重举行。

        本届论道以“数智未来 开势笃行”为主题,聚焦智能视听和电视大屏的智能化、数字化演进趋势,围绕产业的模式升级、场景革新、价值挖掘等热门话题进行多维度的探讨,助力智能视听迈向数智未来新篇章。

        在16日上午举办的主论坛上,中国传媒大学资深教授、CAAC智能大屏营销研究院院长、中国传媒大学广告学院创院院长黄升民发表了主题为《为什么是智能大屏?》的演讲。

        以下为演讲全文:

        作为智能大屏营销研究院的院长,我一直在琢磨大屏的产业如何、市场前景如何。刚才杨崑也讲过,产业黑暗的隧道不是黑到头,还是能看到光明的地方。我认为光明来自三个方面:市场力、连接力、想象力。

        01市场力就是产业机会

        首先是市场力,我做了20年的媒体杂志,一直都在跟踪记录大屏产业发展。比如“风起大屏”这期杂志主题针对的就是广电行业的大屏并没有衰落,优秀剧目、优秀综艺不断引发大屏热;比如大屏产业也在改进提升,OTT TV出现,产生很大的渗透力;大屏端的国产操作系统TV0S,一直没有做透彻,留给大屏产业一个非常重要的机会;此外,未来电视崭新的面孔到底是什么,也是我们关注的领域。

        大屏之外,手机发展势如破竹,客厅经济的重新聚合成为行业需要直面的机会。我们说向新而生,这其中有营销的境界,有内容问题,也有创意问题,还有数据驱动的问题。我们采访了若干在大屏市场比较活跃的企业,问他们的经验所在,问他们怎么看。这个议题从2021年到现在,我们的研究跟踪一直没有断。我总结出一句话:回归家庭、回归大屏已成定势,我们即将进入财富之舟,走向更美好的未来。

        02核心在于超级连接

        为什么说“核心在于超级连接”?当社会沉寂、节奏趋缓,这时候家庭的回归就是必然,而大屏跟家庭是密不可分的,也意味着回归就是产业机会。屏大屏小,可看可不看,但产业机会稍纵即逝,不可不看。物联网、5G、6G蓬勃发展,核心就是连接,而智能大屏的连接能力就体现在终端、市场、家庭、用户、习惯、数据、场景、体验八个方面。


          图片来源:CAAC智能大屏营销研究院《智能大屏营销价值洞察与投放指南》

        连接终端。终端有两种理解,呈现的终端和连接的终端。过去电视是呈现的,声音的呈现、视频的呈现,而今天的电视加上了连接性。

        连接市场。大屏产业的机会已经得到市场玩家的广泛关注和布局,新玩家和老玩家都聚集在这里,智能大屏价值备受认可,产业加速向前。

        连接家庭。手机也是连接,是个人的连接,智能大屏的连接则是家庭的中心。所以,一切连接是从个人的角度思考,还是从家庭的角度思考,这是特别重要的。

        连接用户。大屏成为一个连接家庭人群的超级入口。用户跟观众不一样,用户是互动的,是有积极能动性的,用户会使用;而观众是被动的、欣赏性的。所以大屏的连接是进入家庭,连接用户和用户的需求,和用户的使用是密切相关的。

        连接习惯。大屏最重要的是接入,有声音、有图像、有亲近感、有精彩的东西,这些东西就是习惯的回归。很多时候我的学生说自己都不看电视、不看报纸,我说这些都是假模假式,其实还是要看的,只是把报纸移到手机上面,把电视定义在古老传统的内容上面。其实只要居家,习惯就改不了,但是会有新的习惯,那么这个时候我们想连接之中除了生活习惯、欣赏、使用之外,还有什么?

        连接数据,这是核心的问题,智能大屏的基座在于数据连接,数据可以打通,用户可以辨识,但难在我们的数据没有打通。我们过去没有数据,有了IPTV、有线双向互动以后,我们有了数据,我们的数据内部不开放,沉淀下来,没有很好的得到使用。为什么对数据这么感兴趣?因为数据代表着流量,代表着未来媒体运营网络的流动血液。以前的数据概念是标志性的,谁看谁不看、百分比是多少,这是标志性构成。数据可流动,一旦有流动,一旦带上速度,流量就显现出来了。在广告圈经常说程序化购买,其实程序化购买有大小数据库,可以适配算法,最后达到最佳的配置。但这种概念的说法对数据的理解是过时的理解,实际科学运用的时候,有没有数据?收视率是多少?观众是多少?消费行为是什么?广告主做出最好的方案进行投放,完成程序化购买,所有的行为都有记录有反馈有数据,需求完整的数据,各种各样的数据库,媒体的呈现表达要是数据的表达,同时还要是流动性的。还有一个非常重要,就是投放者的资金,迅速适配之后形成一个流动的闭环,所以程序化购买的关键不是变现的问题,而是形成整个闭环。未来的IPTV也好,有线电视也好,广电的未来之路必须突破数据的瓶颈,形成数据的汇流,这个血脉一旦打通,就有商业的前途。

        场景连接。大屏不只是尺寸的问题,只是告诉社会我们这个屏是没有边界的。我们不要把自己定死,你是小屏我是大屏,我是大尺寸,我就高清晰。应该是什么?我是无限的延伸,我的好处是场景可以无限的扩大。我们做好内容,好内容就是可观赏性的内容,实际上今后大量的垂类内容是实用性的内容,更多的场景植入就是商业。大屏对于居家的老人而言,有很好的内容场景,达到智能化的对话,完全可以做家庭的维护。


        图片来源:CAAC智能大屏营销研究院《智能大屏营销价值洞察与投放指南》

        连接体验。大屏内容的开发是垂类的,场景背后就是商业价值,这时候我们最想强调体验式的连接,声音、视觉、沉浸式的体验。大屏是天然的家庭中心,同时有多种呈现画面的方式。目前,大屏从技术改造方面仍有很大提升空间,这种体验感还有待完善,这是非常大的一个问题,这个连接一旦突破,前景完全不一样。

        我们梳理8个大屏可以实现的超级连接,产业、用户、商业前景都是一体的。2022年的一个关键词叫做“超连接”,在向5G和6G迈进的时候,这是万物互联非常关键的地方。

        媒体大脑的控制下是超媒体巨人,连接终端、连接用户、连接消费,连接品牌主、OTT、运营商、新媒体,我们也把它称之为超连接。

        03想象力决定产业未来

        我们谈到了很多问题,但关键是我们能不能突破这些问题。市场态势是向上的,媒体的变革曲曲折折,它的未来是什么?

        我以前写过一句话:国有企业的今天就是国有媒体的明天。其实,国有企业揭不开锅,重新起步,才有国企改革,才有后来的蓬勃发展。今天我们又轮回到了一个低谷,我们需要重新起来抓住产业的机会。其实,很多时候只是我们的想象力不够,我们一定要看到产业的改变。

        大屏面对的是信息无比丰裕的时代,以前我就曾说过,一个内容生产无限,数据传输无限,信息消费无限的时代,生产传输消费、大屏的呈现也是无限的。应对这个“资源无比丰裕合理取舍”的崭新时代,智能大屏不仅需要更多的黑科技、商业传奇、心智启迪,更多的破局来自于人对于大屏产业未来的想象力。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/75.html b/news/75.html new file mode 100644 index 0000000..86ad71e --- /dev/null +++ b/news/75.html @@ -0,0 +1,362 @@ + + + + +AOC智慧电子班牌助油甘埔小学数字化升级!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        AOC智慧电子班牌助油甘埔小学数字化升级!

        +
        +
        +
        +  2022-06-22 阅读:10 +
        +
        +

        当今时代下,教育领域其实还有着教学资源良莠不齐、师生互动成本高、学情数据反馈慢、教学设备利用率低等教学痛点,如何打造可视化的校园数据管控平台,引领教育创新正是关键所在。作为全球知名显示设备提供商,此次AOC即以旗下智慧电子班牌助力东莞市凤岗镇油甘埔小学数字化转型升级,以科技赋能智慧教育!

        方案概述

        结合东莞市凤岗镇油甘埔小学的实际需求,AOC以智慧电子班牌打造智慧班牌解决方案。方案将大数据、物联网和人工智能等新兴技术和教学管理工作融合,并具备人脸、刷卡考勤、会议签到、云端控制等功能,不仅可以满足常态化教学课堂空间应用需求,还能有效提升学校管理水平和管理效率。

        智慧班牌解决方案
        便捷展示,满足班级个性化需求

        AOC电子班牌实际应用于油甘埔小学的各班班级门口,其支持学生走班课堂实时打卡签到,实时反馈请假、迟到、未到等考勤数据,便于教务人员清晰知晓当日各班级到校情况及离校情况。同时,结合教育管理场景,电子班牌还提供新闻列表、相册轮播、学生课表等多种模板方案和辅助功能,可展示班级通知、班级动态、班级课表、班级相册、班级荣誉、值日生、倒计时等多种信息,便捷展示班级文化特色,满足班级个性化需求。

        针对特殊情况,电子班牌还可以支持发送紧急通知,采用霸屏模式进行规定时间段内的信息展示;针对开学、家长会、领导寻访等特殊事件发生时,则可灵活展示欢迎信息。

        电子班牌还支持终端远程控制、信息查询、学校信息发布以及班级信息发布。对于教师或校方管理人员而言,可通过班牌的校园管理平台实现节目模板自定义搭配,便于快速制作各类班级节目及快速发布,同时各班级信息通过后台即可快速查询,清晰明了。

        在油甘埔小学会议室内则采用智能会议平板轻松展开智慧班牌的实操培训。实际应用中,通过会议平板无线传屏以及大屏无线反向触控设备功能,可以实现多设备同时传屏操作,便于进行班牌培训资料展示。通过智能会议平板的白板书写功能,则能实时对培训重点进行批注圈画,一目了然,提高培训效率。同时,所有培训内容也无需教师记录笔记,其支持云端及扫码、邮件等多形式保存会议内容,有助于教师实时查看相关的培训内容,带来高效便捷教务办公新体验。

        以科技赋能教育,以智慧创造未来。长久以来,AOC始终专注于智慧教育领域,大力推进信息技术与教育教学融合及大数据应用,甚至通过创新教育解决方案的打造,促进教育均衡及提质,推动教育信息化发展!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/76.html b/news/76.html new file mode 100644 index 0000000..19a66eb --- /dev/null +++ b/news/76.html @@ -0,0 +1,362 @@ + + + + +海南明确到2024年6月建成公共场所外语标识标牌体系_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        海南明确到2024年6月建成公共场所外语标识标牌体系

        +
        +
        +
        +  2022-06-24 阅读:3 +
        +
        +

        记者近日从海南省外办获悉,《海南省公共场所外语标识标牌规范建设三年行动方案(2022—2024)》(以下简称《方案》)已印发,提出到2024年6月,全省要建成布局科学、译写准确、信息规范、设计美观的公共场所外语标识标牌体系。

        未来3年,海南省公共场所外语标识标牌规范建设工作将聚焦6个方面重点任务:制定出台各级各领域行动方案、制定存量和增量台账清单、建立健全审核评估体系、建设英文译写管理数据库、提升能力建设及营造社会各界全方位常态化参与氛围。

        省外办相关负责人介绍,《方案》明确2022年为基础建设年,重点发布3个指导性文件,建立全省规范建设任务台账清单,各建设主体根据实际需求启动增量新建或存量整改工作;2023年为重点建设年,聚焦重点建设任务,做好海南自由贸易港全岛封关运作口岸设施、环岛旅游公路、海南热带雨林国家公园等重点工程以及海南自由贸易港重点园区、省市(县)级政务服务中心规范建设工作。2024年为收尾建设年,重点做好查漏补缺。

        省外办还同步印发了《海南省应当设置使用外语标识公共场所类别和信息种类》,解决公共场所外语标识标牌“哪要建,建哪些”的问题,划定建设范围。

        省外办相关负责人介绍,新一轮公共场所外语标识标牌规范建设工作明确以2024年6月作为全面完成时间节点,持续擦亮城市国际化“门面”,助力加快建设具有世界影响力的中国特色自由贸易港。

        据了解,海南已于去年7月全面完成公共场所外语标识标牌规范建设第一阶段任务,在交通、旅文、教育、卫生、城乡公共服务设施五大重点领域3841个重点公共场所建设22.93万块外语标识标牌,取得阶段性成果。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/77.html b/news/77.html new file mode 100644 index 0000000..fc00f93 --- /dev/null +++ b/news/77.html @@ -0,0 +1,362 @@ + + + + +2022年Q1中国大陆消费零售类自助设备整体出货下降7%_市场行情__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        2022年Q1中国大陆消费零售类自助设备整体出货下降7%

        +
        +
        +
        +  2022-06-24 阅读:28 +
        +
        +

        根据洛图科技(RUNTO)发布的《2022年中国大陆消费零售类自助设备市场分析报告》,2022年第1季度,中国大陆消费零售类自助设备市场出货约13万台,与同期比下降7%。

        自助设备是指由人机交互界面组成,用户可根据设备提示进行操作,可储存信息,并提供查询、打印、缴费以及产品贩售等服务功能的电子信息设备。

        自助设备分类图示

        信息来源:洛图科技(RUNTO)整理

        洛图科技(RUNTO)按行业应用将自助设备分为:消费零售类、公共服务类、医疗服务类和金融类等。本文聚焦于消费零售类产品,主要包含自助点单机、自助收银机、自助售货机等。其中,今年第1季度,自助点单机出货占比63%,自助收银机出货占比27%,自助售货机出货占比10%。

        2022Q1中国大陆消费零售类自助设备市场产品结构

        数据来源:洛图科技(RUNTO),单位:%

        自助点单机:桌面产品占九成;屏幕以15.6、15寸为主

        新零售的热度相较之前略有下降,疫情持续给零售业带来了显著冲击。根据洛图科技(RUNTO)数据显示,2022年第1季度,自助点单机出货8.2万台,与同期相比下降7.3%。

        从细分产品看,桌面产品需求量最大,占九成;手持、立式等产品仅占到10%。

        从配置屏幕看,双屏产品占比56%,单屏产品占比44%,尺寸主要集中在15.6寸,其次是15寸。双屏产品中,15.6寸的渗透率达到44%;单屏产品中,15.6寸的渗透率为23%。
        2022Q1中国大陆自助点单机市场屏幕尺寸结构

        数据来源:洛图科技(RUNTO),单位:%

        自助收银机:电子收银秤涨7%;电容触控垄断

        后疫情时代,“无接触”概念使得自助收银机在商超的需求明显增长,尤其电子收银秤的采购显著上升。根据洛图科技(RUNTO)数据显示,2022年第1季度自助收银机出货3.5万台,与同期相比上涨1.7%。

        从细分产品分,立式收银机占比58%,出货超2万台,同比下降1.9%;电子收银秤占比42%,出货接近1.5万台,同比增长7.2%。

        自助收银机产品的主要特点是,基本全部采用电容触控技术,安卓系统占比54%。在屏幕配置方面,双屏产品占比66%,单屏产品占比34%;一般情况下立式收银机为单屏配置。从屏幕尺寸看,立式收银机尺寸主要为27寸、23.8/24寸、21.5寸,电子收银秤主要为15.6+15.6、15.6+10.1寸。

        自助售货机:布设减缓,出货下降23.8%
        当下消费者倾向于购物的即时性,能够满足随时随地购买零食、饮料和生活用品的需求。但自助售货机市场业务量分散,运营维护问题突出;其次疫情的多点爆发,致使较多项目不断延期,设备布设减缓。根据洛图科技(RUNTO)数据,2022年一季度自助售货机出货1.2万台,与同期比下降23.8%。

        自助售货机按售卖产品类型看,以售卖饮料/零食类产品占比最多,生鲜冷超其次;其它类型中,医疗类、文创类、盒饭速食类产品增长较快。

        从配置屏幕看,以单屏产品为主,占比94%,主要覆盖32寸、22寸、21.5寸。双屏产品占比仅6%,其中支付屏主要是5寸和10寸,信息发布屏以55寸、32寸、21.5寸为主。

        整体来看,疫情的反复、消费者观念的转变、经济大环境的变化等因素,使得新零售行业局势在2022年显得捉摸不定。洛图科技(RUNTO)预计,2022年全年中国大陆消费零售类自助设备出货将维持在90-110万台区间。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/78.html b/news/78.html new file mode 100644 index 0000000..9e40f10 --- /dev/null +++ b/news/78.html @@ -0,0 +1,362 @@ + + + + +总投资25亿元!海佳LED显示屏模组生产项目签约安溪县_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        总投资25亿元!海佳LED显示屏模组生产项目签约安溪县

        +
        +
        +
        +  2022-06-24 阅读:36 +
        +
        +

        近日,第二十届中国·海峡创新项目成果交易会在福州海峡国际会展中心开幕。在同期举办的世界闽商大会签约仪式上,安溪县海佳LED显示屏模组生产项目参加现场签约,总投资额25亿元。

        由投资方海佳集团股份有限公司投资的海佳LED显示屏模组生产项目,规划用地面积120亩,总建设面积20万平方米,主要建设集产品研发、生产及销售为一体的LED显示屏模组产业基地。目前项目正在进行场地平整、方案设计和前期报批手续办理,下半年将力争部分厂房基础开工。

        总投资25亿元!海佳<a href=http://www.av-china.com/led/ target=_blank>LED显示屏</a>模组生产项目签约安溪县

        安溪县工信商相关负责人表示,海佳智能显示产业园项目的成功落地,有力推动安溪县产业向智能化、绿色化、高端化转型,为安溪高质量发展夯实产业根基。安溪县将坚持“一项目一机制促进度”“一企一策促发展”,以“妈妈式”服务,全过程穿透、全流程提速、全要素保障,推动项目快建设、企业快发展。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/79.html b/news/79.html new file mode 100644 index 0000000..98ac196 --- /dev/null +++ b/news/79.html @@ -0,0 +1,362 @@ + + + + +智微智能IPO:推动数字标牌产业可视化发展_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        智微智能IPO:推动数字标牌产业可视化发展

        +
        +
        +
        +  2022-07-13 阅读:9 +
        +
        +

        2020年,全球数字标牌市场的价值为214.9亿美元,预计从2021年到2028年将以7.5%的复合年增长率增长,到2028年将达到382.3亿美元。面对全球快速增长的数字标牌市场规模,以及不断变化的应用需求,深圳市智微智能科技股份有限公司(以下简称“智微智能”)聚焦数字标牌整体解决方案的升级和服务能力的提升,基于最新英特尔12代处理器,打造全新数字标牌解决方案,加速数字标牌智能化升级。

        数字标牌可提供数字信息、设计宣传、创意广告和其他服务,这些服务将使数字标牌在零售、酒店、娱乐、运动场所、医疗健康、企业、银行等众多垂直行业得到应用。然而,随着AI,5G等新技术的发展,以及更高清的显示技术的日益普及,市场对于数字标牌产品有了更高的需求。

        根据智微智能IPO招股书披露显示,智微智能专注于硬件研发和高品质柔性制造,凭借产品研发实力及制造实力,灵活的定制能力与稳定的交付能力,智微智能可为客户提供专业的解决方案及快捷的客户服务。

        为满足海外市场的差异化需求,智微智能创新推出数字标牌播放终端系列新品,无论是外观材料,还是结构设计都做出了进一步的优化,都彰显了匠人精神。智微智能新一代H系列和K系列数字标牌终端采用铝合金一体压铸而成,尺寸小巧,支持VESA壁挂,适配更多应用场景同时,方便客户安装以及产品升级。终端正面采用鳍片式散热结构、利用空气对流及热辐射效应,达到优质散热效果。满足更高性能稳定应用,K系列风扇款,基于鳍片式散热结构同时正面搭配风扇设计,利用工业美学,精细且富含质感。

        智微智能H085数字标牌终端基于Intel Elkhart Lake长生命周期的CPU,满足客户长期稳定供应需求,是一款MINI型播放终端。双通道LPDDR4X内存颗粒,兼具性能和成本优势;丰富的USB接口设计,可拓展更多的外设;整体支持4G/5G, WIFI6,体验高速移动网络;HDMI+DP 4K异步双显,展示流畅视频解码能力。

        智微智能K105作为最新一代高性能款数字标牌播放终端,采用Intel全新12代 Alder Lake-P处理器,自带Xe Graphics显卡,显示性能强悍,支持HDMI+DP三路显示输出,最高支持8K超高清显示。4G/5G,WIFI6以及双千兆有线网络,可以实现场景,有线、无线不同类型的快速传输需求,搭配TPM2.0模组,保障设备的数据安全。

        智微智能K105F无风扇数字标牌播放终端,功耗仅15W,静音、节能省电,可使用于室内条件优渥的场景中。延续性I/O设计,方便升级迭代。

        此外,智微智能还同步推出英文版JIPS信息发布系统,集动画、信息发布、人机交互、数据展示与分析、广告运营等多功能于一体,简易操作,可以帮助海外数字标牌客户轻松地进行前端运营和后端管理,实现更加个性化和更为丰富的多重功能需求。

        作为商显解决方案优质提供商,一直以来,智微智能以满足并超越客户需求为己任,旨在利用自身的优势,打造更优质的数字标牌解决方案,为零售商超、轨道交通、医疗等行业用户带来极致的标牌方案,助推无处不在的可视化发展。想要了解更多关于智微智能IPO的相关信息,敬请持续关注!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/8.html b/news/8.html new file mode 100644 index 0000000..93e234d --- /dev/null +++ b/news/8.html @@ -0,0 +1,362 @@ + + + + +濮阳市档案馆有奖征集标识logo的公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        濮阳市档案馆有奖征集标识logo的公告

        +
        +
        +
        +  2022-04-30 阅读:7 +
        +
        +

        濮阳市档案馆成立于1983年,是市级国家综合档案馆,现为国家一级档案馆、濮阳市爱国主义教育基地。馆藏自明清以来档案43万卷件,包括濮阳市不同历史时期的各类国家机关、企事业单位、知名人士形成的文书、科技、照片等各类档案。在市委市政府的重视和社会各界的支持下,濮阳市档案馆大力丰富馆藏,不断改进管理技术,拓展服务功能,基本建成门类齐全、结构合理、载体多样、具有地方特色的馆藏体系。为了进一步拓展社会服务功能,增强档案文化的辐射力,决定面向社会公开征集濮阳市档案馆标识logo。


        一、应征作品的要求

        1、准确体现档案主题,体现档案文化内涵;

        2、充分反映濮阳龙文化的特征,具有较深的地方文化内涵;

        3、创意应厚重大气、构图简洁凝练、新颖独特,兼具吸引力、号召力和启发性;

        4、投稿内容应包括logo中心意思说明和设计理念,包括logo各组成元素说明,以及设计整体文化内涵与象征意义。

        5、应征稿件需分别附彩图和黑白图样(电脑样稿和手工稿均可,统一为A4规格),并附文字说明;

        6、投稿人注明身份(姓名、单位、电话号码、身份证号码、联系方式);

        7、参选作品应为新创作且未发表过的作品;


        二、征集活动时间

        自本通告公布之日起至2022年5月20日。


        三、评审和奖励:

        本次征集活动由濮阳市档案馆组织相关知名人士、馆领导等组成评审委员会,经综合评选,选出濮阳市档案馆标识logo。最后确定的濮阳市档案馆标识logo将在濮阳档案信息网和濮阳档案微信公众号公布,对录用的作品将给予物质奖励1000元奖励,并由濮阳市档案馆颁发荣誉证书。


        四、特别申明

        1.应征作品不得违反《中华人民共和国商标法》的有关规定,必须是设计者本人(或团体)原创、未发表过的作品,如有抄袭他人创意、构思的行为,或作品发生知识产权、版权纠纷等,所有法律后果由设计者自行承担。

        2.应征作品的著作权受中华人民共和国法律保护。作品自被主办方公布为获奖作品之日起,一切知识产权归主办方所有。主办方有权对获奖作品进行任何形式的使用、开发、修改、授权、许可或保护等活动。

        3.本活动不收报名费,所投稿件一律不退;

        4.凡投稿人均被视为认可本申明的内容。


        五、投稿方式:

        应征作品发送电子邮件或邮寄均可。

        1、电子邮箱:pysdagwz@163.com

        2、邮寄地址:河南省濮阳市华龙区石化路229号濮阳市档案馆电子档案管理科,邮编:457000,电话:18739301828。

        濮阳市档案馆

        2022年4月24日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/80.html b/news/80.html new file mode 100644 index 0000000..b4bb97b --- /dev/null +++ b/news/80.html @@ -0,0 +1,362 @@ + + + + +甘肃省天水高速公路处2022年标志标牌维护项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        甘肃省天水高速公路处2022年标志标牌维护项目招标公告

        +
        +
        +
        +  2022-07-13 阅读:4 +
        +
        +

        甘肃省天水高速公路处招标项目的潜在投标人应在甘肃省公共资源交易网(https://ggzyjy.gansu.gov.cn)在线免费获得获取招标文件,并于2022-08-09 11:00:00(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:2022zfcg03089

        项目名称:甘肃省天水高速公路处2022年标志标牌维护项目

        预算金额:576.0000(万元)

        最高限价:534.0725(万元)

        采购需求:运行10年以上标志标牌更换反光膜7975.26㎡,新增单柱式标志143块,双柱式标志1块、拆除标志36块,标志牌立柱、法兰日常养护除锈刷漆2828.57㎡。

        合同履行期限:按合同约定执行

        本项目(是/否)接受联合体投标:否

        二、申请人的资格要求

        1.满足《中华人民共和国政府采购法》第二十二条规定;(1)供应商必须提供企业营业执照副本,国家和地方税务登记证副本,组织机构代码证副本(此三证已办理统一社会信用代码的只需提供营业执照副本);(2)提供2021年经第三方审计机构出具的财务审计报告(成立不满一年的,须提供银行资信证明);提供2022年内任意一个月依法缴纳税收和社会保障资金的相关材料;(3)具备履行合同所必需的设备和专业技术能力的证明材料;(4)参加政府采购活动前3年内在经营活动中没有重大违法记录的书面声明;(5)具备法律、行政法规规定的其他条件的证明材料;(6)供应商或其法定代表人、拟委任的项目负责人、技术负责人在近三年内不得有行贿犯罪行为(供应商须自行提供承诺函);(7)供应商须为未被列入“信用中国”网站 “记录失信被执行人或重大税收违法案件当事人名单或政府采购严重违法失信行为”记录名单;不处于中国政府采购网“政府采购严重违法失信行为信息记录”中的禁止参加政府采购活动期间。(以投标截止前5个工作日在“信用中国”网站、中国政府采购网及“信用甘肃”网站现场查询结果为准,如相关失信记录失效,供应商需提供相关证明资料)。

        2.落实政府采购政策需满足的资格要求:(1)根据财政部发布的《政府采购促进中小企业发展管理办法》规定,本项目对小型和微型企业产品的价格给予10%的扣除。(2)根据财政部、民政部、中国残疾人联合会发布的《关于促进残疾人就业政府采购政策的通知》规定,本项目对残疾人福利性单位产品的价格给予10%的扣除。(3)根据财政部发布的《关于政府采购支持监狱企业发展有关问题的通知》规定,本项目对监狱企业产品的价格给予10%的扣除。

        3.本项目的特定资格要求:供应商应具备行政主管部门颁发的公路交通工程(公路安全设施)专业承包壹级资质,具备有效的安全生产许可证。

        三、获取招标文件

        时间:2022-07-13至2022-07-19,每天上午00:00至12:00,下午12:00至23:59

        地点:甘肃省公共资源交易网(https://ggzyjy.gansu.gov.cn)在线免费获得

        方式:1.社会公众可通过甘肃省公共资源交易网免费下载或查阅招标采购文件。拟参与甘肃省公共资源交易活动的潜在投标人需先在甘肃省公共资源交易网上注册,获取“用户名+密码+验证码”,以软认证方式登录;也可以用数字证书(CA)方式登录。这两种方式均可进行我要投标等后续工作(具体内容详见招标采购文件)。 2.招标文件(或资格预审文件)中规定的“我要投标”的起止时间要求如下: 网上我要投标的截止时间为招标文件(或资格预审文件)规定的截止时间,(规定时间为n × 24小时,n≧5)。

        售价:0.0(元)

        四、提交投标文件截止时间、开标时间和地点

        时间:2022-08-09 11:00:00

        地点:甘肃省公共资源交易中心(兰州市城关区雁兴路68号)第六电子开标厅

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜

        ①甘肃省公共资源交易网:https://ggzyjy.gansu.gov.cn

        ②信用中国”网站:https://www.creditchina.gov.cn

        ③中国政府采购网网址:http://www.ccgp.gov.cn/

        七、对本次招标提出询问,请按以下方式联系

        1.采购人信息

        名 称:甘肃省天水高速公路处

        地 址:甘肃省天水市秦州区罗峪路左家场收费站院内

        联系方式:0938-8358283

        2.采购代理机构信息

        名 称:甘肃省招标中心有限公司

        地 址:甘肃省兰州市城关区飞雁街118号1-19层

        联系方式:0931-2909715 18919946958

        3.项目联系方式

        项目联系人:冯辰维震

        电 话:0931-2909715 18919946958

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/81.html b/news/81.html new file mode 100644 index 0000000..ab4e090 --- /dev/null +++ b/news/81.html @@ -0,0 +1,362 @@ + + + + +日溪乡乡村振兴标识标牌项目邀请招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        日溪乡乡村振兴标识标牌项目邀请招标公告

        +
        +
        +
        +  2022-07-26 阅读:6 +
        +
        +

        项目概况

        日溪乡乡村振兴标识标牌项目 招标项目的潜在投标人应在福州市晋安区华林路338号锦绣福城东区29楼获取招标文件,并于2022年08月15日 10点00分(北京时间)前递交投标文件。


        一、项目基本情况

        项目编号:榕晋建招[2022]040号

        项目名称:日溪乡乡村振兴标识标牌项目

        预算金额:29.6000000 万元(人民币)

        最高限价(如有):29.6000000 万元(人民币)

        采购需求:

        标的名称:标识标牌安装服务

        数量:1项

        服务要求:“总导览图..等要求”


        合同履行期限:周期30个日历天

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        落实政府采购政策的证明材料(专门面向中小企业采购):1、供应商提供的服务应符合《政府采购促进中小企业发展管理办法》(财库〔2020〕46号) 第四条规定的情形,且应当提供《政府采购促进中小企业发展管理办法》(财库2020〕46号)规定的《中小企业声明函》,格式见第七章《投标文件格式》附件。 2、供 应商为监狱企业的视同小型和微型企业,可不提供以上第1材料,但应当提供由省级以上监狱管理局、戒毒管理局(含新疆生产建设兵团)出具的 属于监狱企业的证明文件。3、供应商为残疾人福利性单位的视同小型和微型企业,可不提供以上第1点材料,但应当提供《残疾人福利性单位声明函》,格式见第七章《投标文件格式》附件。4、本项目为 服务 类采购项目,采购标的对应的中小企业划分标准所属行业为其他未列明行业。


        3.本项目的特定资格要求:无

        三、获取招标文件

        时间:2022年07月26日  至 2022年08月02日,每天上午8:30至12:00,下午14:30至17:30。(北京时间,法定节假日除外)

        地点:福州市晋安区华林路338号锦绣福城东区29楼

        方式:投标人凭《投标邀请书》原件直接到福州晋建工程造价咨询有限公司购买邀请招标文件

        售价:¥300.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2022年08月15日 10点00分(北京时间)

        开标时间:2022年08月15日 10点00分(北京时间)

        地点:福州市晋安区华林路338号锦绣福城东区29楼

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜


        附1:提交投标保证金的银行账户信息

        银行账户

        开户名称:福州晋建工程造价咨询有限公司

        开户银行:福建海峡银行福州金城支行

        账    号:8111301010800445265

        附2:采购标的一览表 

        金额单位:人民币元

        合同包

        品目号

        采购标的

        允许进口

        数量

        品目号预算(元)

        合同包预算(元)

        投标保证金(元)

        1

        1-1

        标识标牌安装服务

        1项

        296000

        296000

        2960

         七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名 称:福州市晋安区日溪乡人民政府     

        地址:福建省福州市晋安区日溪乡        

        联系方式:周先生 87932565      

        2.采购代理机构信息

        名 称:福州晋建工程造价咨询有限公司            

        地 址:福州市晋安区华林路338号锦绣福城东区29楼            

        联系方式:李工 0591-83635908            

        3.项目联系方式

        项目联系人:李工

        电 话:  0591-83635908

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/82.html b/news/82.html new file mode 100644 index 0000000..dd65750 --- /dev/null +++ b/news/82.html @@ -0,0 +1,362 @@ + + + + +电子纸进入户外标牌领域,与太阳能结合实现零碳排放及智慧信息化_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        电子纸进入户外标牌领域,与太阳能结合实现零碳排放及智慧信息化

        +
        +
        +
        +  2022-07-26 阅读:6 +
        +
        +

        在上月举行的2022美国国际视听技术及系统集成展览会(InfoComm USA)上,我们有留意到获得此次大会“最佳户外数字标牌显示器”奖的是由美国Nanov Display公司推出的一款太阳能供电电子纸户外显示器,主要用于标牌和公交车站标志,可以实时显示巴士到达时间表或用于寻路地图等。

        在此次展会上展出的是基于此种电子纸显示器设计的公交站杆,它使用了两块 13.3 英寸的电子纸显示屏,与此公交站杆配备的太阳能电池板能够在三小时内产生 75 瓦的电力,电力存储在锂离子电池组中,为整个系统供电,系统包括电子纸显示屏、LTE 调制解调器、实时乘客信息系统和 LED 灯(LED 灯照亮显示屏,使其在夜间可读)。

           

        该系统每天消耗仅 25 瓦的电量,所以这种电子纸公交站杆可以在没有阳光的情况下持续运作长达三天,非常适合像美国大东北这种冬季少阳光的地区;为防电子纸屏幕被破坏以及防止屏幕上出现冬季冷凝现象,Nanov还使用光学粘合技术将电子纸屏幕和前壳保护玻璃粘合在一起;由于电子纸的特性使得该系统可以在不耗电的情况下显示保存静态公交时刻表、公交地图以及低电量、互联网断开、过热、冻结屏幕、计算机故障或其他异常情况的警报消息;此电子纸公交站杆系统为了实现更低能耗,它的监控器是基于云的内容管理系统上运行的,且在冬季运行时还配备了自动温度控制加热器系统,在恶劣条件下(-25 摄氏度)将会被打开;总之,此款太阳能供电电子纸显示器非常适合环境恶劣的户外使用且同时又能达到低碳节能效果。

        其实,早在2018年,中国上海就已开始推行太阳能供电的31.2英寸电子纸公交站牌,解决无电车站的智慧信息化。根据ePaper Insight统计数据显示,截止2021年底,上海已经安装超过6000套电子纸站牌与站杆,基本实现了浦西无电车站的全覆盖,也使上海成为了全球首个电子纸公交站牌站杆批量建设城市,占有该领域最大市场份额,开启了电子纸批量户外应用的先河。

        根据CINNO Research旗下ePaper Insight主编的电子纸产业蓝皮书系列之《电子纸智慧公交应用市场分析报告》数据显示,2021年,全球户外电子纸公交站牌站杆项目总计已经超过万套。ePaper Insight首席分析师周华预测,随着电子纸技术的成熟,除了现有主导市场的黑白电子纸站牌外,更多彩色的电子纸站牌即将进入市场,同时能实现秒级快速刷新,预期该细分市场也将实现不断增长。

        8月18-20日,第十八届深圳国际物联网展,9号馆,电子纸生态专区,一目了然,一站到位。电子纸显示模组厂商齐聚电子纸生态专区:E Ink元太科技、兴泰科技、东方科脉、清越光电、亚世光电、联积电子,覆盖黑白、三色、四色、五色、七色、全彩色等电子纸全品类、全系列规格。其中,还有最新的快速刷新型全彩色与多次可柔性技术的精彩呈现。

        此外,10余家电子纸生态应用厂商带来电子纸在零售、医疗、教育、办公、交通、民航、物流、工业等领域的智慧物联应用。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/83.html b/news/83.html new file mode 100644 index 0000000..b378f8b --- /dev/null +++ b/news/83.html @@ -0,0 +1,362 @@ + + + + +系统化服务和展示需求,潮起数字标牌利用新技术构建新价值_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        系统化服务和展示需求,潮起数字标牌利用新技术构建新价值

        +
        +
        +
        +  2022-07-26 阅读:4 +
        +
        +

        2022年全国两会期间,数字经济、智慧城市再一次成为各界关注的焦点。“十四五”规划和2035远景目标指出:要加快数字社会建设步伐、提供智慧便捷的公共服务、建设智慧城市和数字乡村,构筑美好数字生活新图景。

        过去两年,智慧城市行业涌现了不少亿元以上的项目。其中,数字标牌在智慧城市建设中的使用,呈现爆发趋势。2021年国内市场数字标牌销量达1036.7千台,同比增长25.4%,销额达43.6亿元,同比增长15.5%。智慧城市发展计划为部署数字标牌解决方案提供了一个综合平台,人工智能等突破性技术的推动数字标牌功能性发展需求。

        系统化服务和展示需求

        推动市展发展

        近年来,数字显示硬件变得更具性价比,因此很多应用产业正在对数字标牌解决方案进行大量投入,伴随“系统化服务”提升,数字标牌硬件搭配内容发布软件一体化设计,以及能够提供的服务包括集成和安装、维护和咨询等体系的加强和完善,也进一步推动了数字标牌市场发展。

        (图片来源于网络)

        5G、AI、IoT等新技术的催化下,数字标牌开始不仅仅局限于单向传播,更成为人与数据的交互核心。如在零售行业,为零售商提供个性化服务、基于主题的数字增强体验和其它高级服务;在银行和金融领域,充当客户接触点,为他们提供更多的智能服务和沉浸式体验。新技术的发展将不断提升数字标牌行业应用价值。此外,显示器技术的提升,也将促进客户对数字标牌解决方案的需求。

        应用领域再拓宽

         根据应用,数字标牌市场可分为零售、酒店、娱乐、体育场馆、企业、银行、医疗保健、教育和交通等。2021 年,零售应用领域的收入占比最大,超过 20%。数字化广告是一种有效的产品营销方式,可以最有效地吸引目标消费者的注意力。零售领域是需要数字化广告来营销和推广产品和服务的最突出的领域。

        (图片来源于网络)

        梯媒及交通领域在数字标牌的使用率上也将实现快速增长。数字标牌在交通领域的应用上不仅包括在机场、火车站、地铁站和公交车站应用数字化宣传和海报,还广泛用于道路上的出租车、公共交通巴士和其他宣传产品和服务的车辆。由于新兴国家的快速城市化和交通运输业的发展,广告行业有望增长,最终推动数字标牌市场的增长。

        越来越多的医院将数字标牌用于多种用途,如共享重要的注册信息、叫号通知、传达健康提示以及预约信息。

        利用技术构建新价值

         

        个性化互动营销

        数字标牌的智能化,个性化和内容丰富化是其核心优势。越来越多的行业关注数字标牌的互动营销的功能完善性。展示无处不在的可视化营销理念,智微智能打造数字标牌系统级解决方案,基于服务器、边缘计算、商显终端等硬件产品搭配信息发布系统,实现更加智能化的内容展示和信息传递。

        快速响应

        无论是静态广告,还是动态资讯,数字标牌都能以较快的速度将最新的信息播报给大众,如天气、停车位状态、航班信息、库存信息等。因此快速的信息处理是一个好产品的基础。智微智能伴随平台芯片和技术的发展,不断迭代,最新一代ARM新品,能够轻松处理人机互动,完成信息采集与处理。 

        高清显示,高分辨率 

        大众对资讯的要求越来越高,这也就要求数字标牌显示屏要更加地清晰。智微智能数字标牌方案支持HDMI,EDP等多类型高清4K视频显示,满足大众对显示和色彩的更高需求。

        位点营销

        数字标牌是基于地点广告的最佳选择,研究表明,70%以上的受众会对数字标牌的内容感兴趣,这对于商家营销有莫大的助推作用。数字标牌的影响无处不在,应用场景多种多样,智微智能拥有主板、高性能播放终端、无风扇播放终端、MINI终端多类型、多规格产品,可满足不同地点、不同应用部署需求。

        全新方案

        推动数字标牌跃进之路

        智微智能拥有丰富全面的数字标牌方案,包括基于最新ARM和X86平台的D系列高性价比Mini显示和S系列多串口,高扩展标准3.5寸多类型数字标牌主板,以及T系列(室内款)、D系列(户外款)、H系列(低功耗款)和K系列(高性能款)等适用不同场景的数字标牌终端设备。

        基于最新瑞芯微RK356X平台,智微智能推出R66D以及R68D新一代D系列数字标牌主板。强劲芯片性能,提供超强视频编解码能力;USB, GPIO以及串口等多种拓展接口,可直接应用于外部设备控制和拓展;丰富的点屏接口选择,支持主流的电阻、电容等多种触摸屏;延续性IO以及超薄设计,方便客户产品升级迭代;为客户提供最具性价比的选择,智微智能不断保持主流芯片方案更新,并提供不同的产品配置,匹配客户需求。

        智微智能S系列最新数字标牌主板,采用瑞芯微RK3568平台,相比D系列S系列具备更丰富的串口扩展,可控制更多外设;灵活的网络选择,支持4G/5G移动网络;延续性I/O设计,主流芯片方案更新以及不同配置选择,同样保障客户迭代性能和性价比。

        T系列数字标牌终端T066,采用瑞芯微RK3566处理器,性能强劲,且芯片具备长生命周期,能够长时间稳定供应;整机支持红外控制,方便快捷;无风扇散热,尺寸超小,便于安装;极简风格设计,极具性价比。

        打造系统级方案,智微智能推出JIPS信息发布系统,集H5动画、信息发布、交互触控、数据展示、广告运营等多功能于一体,可以帮助数字标牌广告加强前端互动,实现更加个性化和更为丰富的内容展示需求。

        数字标牌系统方案增值服务,智微智能为使用ARM方案的客户开发了130+个API供客户调用,并打造业界首款界面化API调用工具SPIRIT软件。满足不同类型产品和场景的应用需求,智微智能同样提供固件定制化开发配合服务。通过专业的团队,及时、快速地响应客户需求,协助客户开发生产测试工具,保证客户的生产交付。 

        在综合政策、需求、技术等因素的影响下,数字标牌势必继续飞速发展。未来,智微智能将以技术为动力,打造硬件、软件、服务一站式数字标牌应用平台,持续为更多行业提供专业、创新的数字标牌解决方案,全力推进产业数字化转型,赋能数字经济高质量发展!

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/84.html b/news/84.html new file mode 100644 index 0000000..5876870 --- /dev/null +++ b/news/84.html @@ -0,0 +1,362 @@ + + + + +视爵光旭LED显示屏入驻成都双流国际机场T2航站楼外_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        视爵光旭LED显示屏入驻成都双流国际机场T2航站楼外

        +
        +
        +
        +  2022-07-26 阅读:0 +
        +
        +

        2022年5月,成都双流国际机场T2航站楼外车道旁,竖立了四块全新的直立式LED广告牌。这些广告牌全部采用视爵光旭的领秀系列,尺寸为3.5m*3m ,呈现的广告内容醒目而鲜明。

          成都双流国际机场是中国最繁忙的机场之一,每天都有大量旅客从这里起降。由于客流量巨大,机场打算在T2航站楼外的下客道旁建一些LED显示屏进行商业宣传。但是,要引起路人的注意,广告牌需要满足两个条件,即外观大方、展示效果好 。

          外观上,考虑到航站楼前的空间有限,为了在此搭建整洁大方的屏幕,视爵光旭的解决方案是采用户外领秀系列。该系列柜体采用铝型材系统框架,边缘厚度仅为83.35mm ,既美观又现代化 。此外,屏幕下方还设置了两个脚架,使屏幕处于恰到好处的观看高度,即使处于一段距离外也能轻松观看到上面的内容。

          展示效果上,为广告目的打造的户外屏幕,需要保证画面感 具有足够的吸引力,这样才能有效地传播广告信息,给路人留下深刻印象。从这个角度上考虑,应用于机场的视爵光旭领秀系列表现极为出色,仅3.91mm的精细像素间距、5000nits 的亮度、3840Hz 的高刷新率,即使在阳光明媚的白天也能清晰夺目地展示广告。

          除了考虑整体的外观和效果,视爵光旭团队在系列选择上也有其考量。为方便安装,选择采用轻量化设计的领秀系列,其箱体仅19kg ,框架高度稳定,组装方便,无需担心磕碰。此外,它支持前后维护 ,LED模块、独立电源和数据单元可以很容易地拆卸下来进行检查和修复。

          关于视爵光旭 领秀系列

          视爵光旭领秀系列适用于广场、商圈、交通枢纽等多种固装户外广告应用场景。制造工艺上,领秀系列采用轻质铝型材系统框架,耐用度高,前后维护,防护等级达IP65 ,可在各种户外条件正常运行。此外,该系列在任何照明条件下都能以高亮度、高刷新率和高对比度提供卓越而生动的图像质量。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/85.html b/news/85.html new file mode 100644 index 0000000..6b7250a --- /dev/null +++ b/news/85.html @@ -0,0 +1,362 @@ + + + + +“一屏观天下” 行业先锋三星开拓商用显示更广空间_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        “一屏观天下” 行业先锋三星开拓商用显示更广空间

        +
        +
        +
        +  2022-07-29 阅读:0 +
        +
        +

        作为全球显示技术领域的领导者,三星通过不断研发创新,不仅在家用显示领域为用户提供了性能卓越的产品,在商用显示领域也同样力求满足不同行业和不同场景的使用需求。基于Micro LED技术的新一代显示屏The Wall、全球首个用于智能数字标牌的芯片系统(SoC)和QLED 8K广告牌等,这些产品代表着三星在显示领域持续深耕的结果,凭借强大的产品力,三星连续13年在全球商用显示器市场上排名第一。

        LED显示屏 :探索新场景 满足新视听

        以多元的创新理念满足各领域的商显需求,三星LED显示屏充分展现出了三星引领行业的创新实力。精细的模块化设计实现自由体验,LED显示屏可以无限开拓商业视野,为行业带来全新的思考和广泛的解决方案。

        三星The Wall系列显示屏作为最新一代商用显示器产品,再次彰显三星对于显示产品的重新构思,为企业内容展示提供无限可能。产品通过全新的产品设计理念,融合MicroLED、8K、Micro AI芯片、Micro-Motion、Ultra Chroma等技术,突破现有桎梏,为客户打造自由随心、“创”见未来,安全可靠的全新“视界”。其搭载Micro AI处理器,能够即时分析和优化内容,并经过人工智能升级和深度学习技术,最终可实现8K分辨率内容优化。凭借众多先进显示技术的融合它可以真实还原画面细节并提升原始图像质量,呈现绚烂丰富色彩,为用户提供更加清晰、真实的视觉体验。The Wall不仅增强了性能、提升了视觉效果,更拓展了应用场景。它采用模块化设计,用户可根据各类场景的不同使用需求,自由拼接每一块屏幕,做到画面的无限扩展。它可被广泛应用于指挥调度、会议办公和展览展示等场景。

        The Wall的最新产品IAB系列All-in-One MicroLED一体机——拥有146 英寸UHD、146 英寸FHD、110 英寸FHD三种规格,通过领先的画面质量和创新的安装设计为用户带来传统The Wall产品外的新选择。该系列产品具备The Wall同样至臻画质的同时,外观纤薄简洁,极具艺术美感。隐藏式音箱外加四边超薄边框设计,摆脱传统一体机厚重底边的“突兀感”。产品内置云办公解决方案,支持Microsoft365远程办公,VMWare企业级云桌面及RDP远程桌面。无需外接其他设备(PC或手机),轻松实现远程办公。

        在使用方面,The Wall All-in-One可以设立于企业大厅或会议室的中心位置,以完整超清的屏幕助力其传递信息、强调价值观。

        三星IER/IEA系列通过领先的图像优化技术吸引客户,可提供更清晰、更逼真的内容。微调均匀性和准确的色彩,即使在低亮度下也始终可以确保更出色的图像显示效果。无障碍安装和灵活的配置选项,保证了不同领域企业用户都可以拥有不受环境限制的、醒目的信息显示屏。产品支持LED HDR,确保图像真实表达。其灵活的箱体设计,支持各种异形安装方案。

        智能数字标牌:更出色的性能 更高的标准

        三星智能数字标牌以强大的显示技术和便捷的智能化应用取胜。无论是室内还是户外,无论周围的环境光条件优劣,智能数字标牌都可以提供卓越的画质,打造震撼的视觉画面,以出色的性能、额外的信息实现更高的行业标准,从而吸引更多的注意力。

        三星Flip是一款直观易用的数字化白板,可通过简单的用户界面提供强大的协作功能、通过先进的数字化体验提供全新功能,有效推动团队智能快捷地进行工作。Flip的笔模式图标可为用户提供多种颜色、样式和粗细程度,以及如真实纸笔书写般的流畅使用体验。画笔模式下,Flip可提供不同样式的画笔和灵活混色的调色板,并识别多种肌理感,让用户在细腻的笔触中创作。强大的功能使得Flip可广泛用于多种商务应用领域。嵌入式的通用模板可以用作日历、日程安排程序、笔记或检查;滚动和锁定功能方便了用户查阅资料、保护机密会议信息和敏感内容不外泄;屏幕共享、触控共享、远程PC和蓝牙控制等适合大型会议场景,方便实时内容共享和控制,有效避免延误,做到高效协作。

        三星户外显示器集合钢化、经TUV安全认证的图像质量和亮度自动适应装置为一体,优化信息传递,从而为用户带来卓越而便捷的可视性。在阳光直射下,高对比率和低反射率的特点有利于弱化反射,呈现出丰富清晰的图像。户外显示器还可抵御尘土、热量、湿气等可变因素,其集成式自冷系统使显示屏在无外部保护的情况下,在-30度到50度的温度中正常工作。因此,在任何户外环境中,户外显示器均可做到全天候运行,通过展示信息持续的可视性和内容的完整性提升户外广告的体验。

        Crystal UHD 4K专业显示屏拥有QHB、QMB、QBB等多系列产品,通过绝佳的视觉设计和多样的智能功能为用户解锁商业显示的新可能。由三星视频处理技术和量子点4K处理器驱动, Crystal UHD 4K专业显示屏能够提升画面的清晰度和稳定性,提高分辨率至高清水平,展现出逼真丰盈的色彩。QHB、QMB系列显示屏采用可靠的防眩光面板,让用户在不同角度和时间都能看到清晰内容。纤窄边框和对称设计大幅度节省空间,简化了安装方式;整洁的电缆导轨帮助显示屏融入不同的商业环境,准确展示商业信息。

        此外,通过智能技术,Crystal UHD 4K专业显示屏做到了提升环境专业性和商业氛围。智能校准将每台显示器正确校准,按照准确的颜色要求,展示品牌标识和其他宣传内容;Tizen零配置可以实现远程安装,免去不必要的业务出行和现场安装。该系列产品可应用于多个场景。会议中,SmartView+ 使屏幕共享更为便捷,屏幕间无需电缆连接即可全面协作;自定义主页功能可以简化会议操作和管理,提升整体工作效能。专业模式为特定的垂直领域带来更多可能性:导演模式将大幅度减少后期处理工作量,在拍摄中展现拍摄内容的真实色彩借助DICOM模拟模式,医疗团队可模拟如X射线的医疗图像,满足DICOM的灰度标准。以新形式展示丰富内容,Crystal UHD 4K专业显示屏可以提高用户的协作效果,助力实现商业目标。

        主打纤薄设计,三星视频墙显示屏可以灵活部署,打造安放在不同位置、契合不同需求的视频墙。其新品VHR-R, VMB-R, VHB-E, VMB-E, VMB-U 系列可以提供长时在线、节省空间的解决方案,为用户提供沉浸式的视觉体验。为确保出色的图像质量,视频墙显示屏经过了严格的多步骤校准过程进行颜色微调,用户还可以使用三星的免费软件Color Expert Pro调整颜色参数设置,以满足其个性化需求。Color Expert Pro 还可以通过移动摄像头提供快速简便的视频墙校准,即使是非专业用户也可以轻松同时调整高达5x5的视频墙白平衡,而无需额外的设备。特殊的防眩光面板保持了生动和准确的视觉效果,防止来自光线的干扰,呈现生动的视觉效果。宽阔的视角减少了潜在的图像失真, 使得内容细节更加贴切和清晰。此外,三星通过不同亮度、边框宽度和箱体厚度的视频墙选项满足用户需求,其刀片般超窄边框和拼接设计可以跨越多个屏幕,减少了视觉干扰,提供不间断且一致的视觉体验,有效吸引观众。

        针对不同的需求,视频墙显示屏可应用于展厅、会议室和零售等多个场景和领域,并通过沉浸式数字体验有效改善线下环境,优化运营效率,实现动态推广和信息推送,满足用户的使用偏好。

        此外,三星Neo QLED 8K标牌、视频墙显示屏、Window display和交互屏 QMB-T 系列等智能数字标牌产品也做到了经济性和可用性兼备,为用户提供了优质的视觉体验,实现真正的“为专业而设计”。

        一体化解决方案 :智能应用 呈现精彩

        三星不仅为商业市场提供了专业的显示器,同时还配套与LED显示屏和智能数字标牌系列完全兼容的解决方案,做到直观、高效、智能一体化集成,让企业和用户可以随时随地对显示器进行操作和控制,推动内容和数据的有效管理,带来更沉浸的应用场景体验。

        三星MagiclNFO 是一款支持内容、设备和数据管理的一体化解决方案,可以实现快速有效的数据通信,通过数字标牌的展示力量推动业绩增长。MagiclNFO 由编辑器、服务器和播放器三个主要组成成分构建而成:编辑器可以在直观界面中进行内容创建;服务器提供内容管理,便于播放列表安排和内容发布;播放器可与强大的屏幕兼容适配。从内容创建到发布和监控,用户可以在一个平台上轻松实现内容、设备和数据管理,使得日程安排、硬件控制和数据分析更加便捷,从而推动自动化和可视化的呈现。同时,MagiclNFO 还可以提供数据更新链条和实时的数据反馈,以确定商业活动的有效性和相关性;一站式设备和内容管理可以使得用户在单个平台上远程管理所有内容,以控制内容显示、访问硬件设置和解决问题,并与现有的管理软件同步,检查设备运行状况和固件目标更新。最后,MagiclNFO 还支持WEB内容的灵活定制和实时修改,以实现业务灵活性。在数字标牌行业发展的当下,为保护用户免受网络安全威胁,三星寻求获得广泛认可和使用的安全标准ISO进行认证,使得MagiclNFO成为获得双重认证的解决方案,为其内容安全提供了保障。

        基于多种网页格式的超强兼容性,三星智能数字标牌还内置了功能强大的三星智能标牌平台(SSSP),可以轻松创建、安排、管理显示内容,配置和整合标牌解决方案,降低了运营成本并提高了生产效率。无需额外的PC或媒体播放器,仅需要一根电源线和网线,SSSP便可利用三星成熟的遥控技术,快速完成内容部署及分享操作;通过内存或USB驱动,中央电脑上的内容还可直接连接多台显示器。此外,双核 CPU和集成的高性能视频处理器可以降低解决方案的成本,同步和连续处理多种内容。

        针对不同类型的显示器,SSSP也提供了更多独特的功能支持。Crystal UHD系列可定期根据网络引擎进行升级,将新内容可以实时上传至SSSP,使创意表达更具吸引力;V视频墙显示屏系列可通过应用程序和内置的播放器,在N x N视频墙上轻松播放创建的内容,节约了大量运行成本;提高数字标牌区域,打造更加优越的运营效果。此外,远程网络检查、三层保护和自动化应用测试等也为解决方案的一体化提供领先的技术支持。

        三星商业显示器以强大的技术能力、过硬的产品质量和人性化的服务设计成为行业先锋,打造了多维度的业务新生态,在生产生活中承担着不可替代的重要角色。为满足用户广泛的需求和卓越的使用体验,三星在提供丰富的产品组合之外,还推出了具有竞争力的解决方案。三星的商用产品,在全球各地的房地产、交通、体育场馆、监控指挥等行业均有诸多成功案例。未来,三星将凭借技术创新继续领跑商用显示市场,以更高的品质追求拓展更多的可能性。


        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/86.html b/news/86.html new file mode 100644 index 0000000..0a16182 --- /dev/null +++ b/news/86.html @@ -0,0 +1,362 @@ + + + + +Omdia全新专业显示器(ProAV)垂直市场观察服务助力企业发掘和锁定数字标牌行业的商机_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        Omdia全新专业显示器(ProAV)垂直市场观察服务助力企业发掘和锁定数字标牌行业的商机

        +
        +
        +
        +  2022-07-29 阅读:37 +
        +
        +

        在 2022 年还剩半年的当下,根据 Omdia 最新的 LCD、OLED 和 LED 视频显示器技术追踪报告预测,专业显示器(Pro AV) 领域将实现 3.5% 的年同比增长,规模达到近 180 亿美元。随着全球经济从疫情中逐渐恢复,整体专业显示器产品行业内的数字技术重大转移将会影响到大多数细分领域对不同类型显示产品的需求。因此,Omdia 最近推出了一项新的Pro AV 垂直市场服务观察服务,旨在为数字标牌行业带来对于按照垂直市场划分的平板显示器和 LED 视频显示器之间对比的高层次观察。     

        图 1:2022 年专业显示器产品营收预测,按产品类别划分

        来源:全新专业显示器垂直市场观察服务(Pro AV Vertical Market Viewpoint Service)


        在该份报告中,Omdia 提供了一份对八个区域十个不同垂直市场中按照显示器尺寸(单位:平方米)对不同产品类别进行的对比。过去几年来,专业显示器产品行业目睹了直发光LED (dvLED) 显示器的崛起,众多该类型产品都瞄准了之前由 LCD 专业显示器所统治的应用领域,例如控制室和政府企业等关键应用等。对于 2021 年,在除了中国之外的所有区域,Omdia 预计将近有 70% - 80% 的用于控制室的显示器,仍以 LCD 超窄边框拼接墙为主,因为精细像素间距的 LED 视频墙价格仍然比较昂贵。此外,在其它垂直市场中,LCD 和 LED 视频显示器之间的重叠部分也会更为显著,这包括了公共场所、企业应用、零售业和交通等垂直市场。

        该报告还提供了各地区内按不同显示技术产品和垂直市场划分的主要营收对比数据。2022 年第一季度的 LCD、OLED 和 LED 视频显示器总营收实现了 12.3% 的年同比增长,达到了 41 亿美元。2020 和 2021 年的大部分营收均来自于互动平板 (IFP) 显示器的爆发式增长,疫情在全球范围内加速了学生们的远程学习和混合学习,此外还有远程工作,以及大学生们和办公人员在诸如教室和会议室等企业设置场景中对于协作工具的需求的增长。

        总体而言,这两种显示技术在不同垂直市场中竞争和协同变得越来越多普遍,都是由于现代化数字标牌解决方案的技术进步才得以成为现实。



        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/87.html b/news/87.html new file mode 100644 index 0000000..973f48e --- /dev/null +++ b/news/87.html @@ -0,0 +1,362 @@ + + + + +南通市海门区召开户外广告和店招标牌设施集中整治工作会议_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        南通市海门区召开户外广告和店招标牌设施集中整治工作会议

        +
        +
        +
        +  2022-07-29 阅读:4 +
        +
        +

        为全面提升我区文明城市形象,美化城市视觉空间秩序,展现城市建筑天际线,以崭新的城市面貌迎接党的二十大胜利召开。7月26日,我区召开户外广告和店招标牌设施集中整治工作会议,区政府副区长茅敏勇参加会议并作工作部署,区城管局党组书记、局长张磊主持会议。区文明办、住建局、交通局和各街镇分管领导,海晟集团相关业务条线负责人参加会议。

        会议解读了《海门区户外广告和店招标牌设施集中整治行动方案》相关要求。按照行动方案,要求各街镇做到“一镇(街)一策”,完善组织领导架构,统筹安排执法力量,周密部署形成合力,有序开展相关工作,达到“拆除一批、规范一批、提升一批”的总体整治目标。海门街道和三星镇就本次整治行动分别做表态发言。

        茅敏勇强调,一要提高政治站位,凝聚共识,切实增强整治工作的责任感紧迫感。要紧紧围绕建设更高水平全国文明城市的具体要求,进一步提高思想认识,增强做好户外广告整治工作的责任感和紧迫感,切实把整治工作抓紧抓好,抓出成效。二要紧盯工作目标,全力推进,全面落实整治工作的各项任务要求。要结合本区域、本单位实际进一步细化分解,落实责任,坚决打好这次整治战役。三要统筹组织,密切协作,全面形成整治工作合力。要上前一步,主动作为,坚持不懈地把整治工作推向深入,确保整治工作取得实实在在的成效。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/88.html b/news/88.html new file mode 100644 index 0000000..fe7e031 --- /dev/null +++ b/news/88.html @@ -0,0 +1,362 @@ + + + + +某部医院门诊导视系统(标识标牌)采购项目竞争性谈判公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        某部医院门诊导视系统(标识标牌)采购项目竞争性谈判公告

        +
        +
        +
        +  2022-07-29 阅读:39 +
        +
        +

        项目概况

        某部医院门诊导视系统(标识标牌)采购项目 采购项目的潜在供应商应在远瞩采购云平台(http://wanlong.sh-yuanzhu.com)电子招投标系统获取采购文件,并于2022年08月10日 14点00分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:2022-JWSHYY-W3004、WLZB-2022072701

        项目名称:某部医院门诊导视系统(标识标牌)采购项目

        采购方式:竞争性谈判

        预算金额:9.5200000 万元(人民币)

        最高限价(如有):9.5200000 万元(人民币)

        采购需求:

        包号

        项目名称

        规格型号

        技术要求

        计量

        单位

        数量

        交货

        时间

        交货地点

        备注

        1

        某部医院门诊导视系统(标识标牌)采购项目

        详见采购项目技术和商务要求

        详见采购项目技术和商务要求

        1

        合同签订之日起10个工作日内全部交货并安装完毕

        上海市、需方指定。


        说明

        1.投标供应商须对所投包内所有产品和数量进行唯一报价,否则视为无效投标。

        2.投标报价应包括所有货物供应、运输、安装调试、技术培训、售后服务、备品备件和伴随服务等价格。

        3.投标供应商必须保证所投产品为全新、未使用过的产品。

         


        合同履行期限:合同签订之日起10个工作日内全部交货并安装完毕

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:


        3.本项目的特定资格要求:(一)符合《中华人民共和国政府采购法》第二十二条资格条件:1.具有独立承担民事责任的能力;2.具有良好的商业信誉和健全的财务会计制度;3.具有履行合同所必需的设备和专业技术能力;4.有依法缴纳税收和社会保障资金的良好记录;5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;6.法律、行政法规规定的其他条件。(二)供应商成立时间不少于3年,且为非外资独资或外资控股企业。(三)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加同一包的采购活动。生产型企业生产场地为同一地址的,销售型企业之间股东有关联的,一律视为有直接控股、管理关系。供应商之间有上述关系的,应主动声明,否则将给予列入不良记录名单、3年内不得参加军队采购活动的处罚。(四)本项目不接受联合体报价。

        三、获取采购文件

        时间:2022年07月28日  至 2022年08月03日,每天上午9:00至12:00,下午12:30至17:00。(北京时间,法定节假日除外)

        地点:远瞩采购云平台(http://wanlong.sh-yuanzhu.com)电子招投标系统

        方式:登录万隆公司远瞩采购云平台(http://wanlong.sh-yuanzhu.com)电子招投标系统购买

        售价:¥600.0 元(人民币)

        四、响应文件提交

        截止时间:2022年08月10日 14点00分(北京时间)

        地点:报价文件递交地点:远瞩采购云平台(http://wanlong.sh-yuanzhu.com)电子招投标系统网上投标。纸质文件递交至上海市黄浦区迎勋路168号17楼

        五、开启

        时间:2022年08月10日 14点00分(北京时间)

        地点:报价文件递交地点:远瞩采购云平台(http://wanlong.sh-yuanzhu.com)电子招投标系统网上投标。纸质文件递交至上海市黄浦区迎勋路168号17楼

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜


        具体报名流程和谈判事宜详见:

        https://www.sh-yuanzhu.com/yuanzhu/views/announce/StatuteD.html?uuid=560451aa6b1e4fd1a78e0cff78d94114&id=



        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:某部医院     

        地址:/        

        联系方式:马助理,021-81124802      

        2.采购代理机构信息

        名 称:万隆建设工程咨询集团有限公司            

        地 址:上海市黄浦区迎勋路168号17楼            

        联系方式:王老师、叶老师,63788398-1723            

        3.项目联系方式

        项目联系人:王老师

        电 话:  63788398-1723

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/89.html b/news/89.html new file mode 100644 index 0000000..320af99 --- /dev/null +++ b/news/89.html @@ -0,0 +1,362 @@ + + + + +杭州河道标识系统完成国际化更新_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        杭州河道标识系统完成国际化更新

        +
        +
        +
        +  2022-08-08 阅读:10 +
        +
        +

        记者近日从市城管局水设施河道中心获悉,经过城管部门半年的忙碌,截至7月底,杭州共排查了上万块河道标识标牌,其中不符合《杭州城市国际化标识系统导则》的有5703块,目前已经完成更新改造。

        杭州正在打造国际化大都市,以往很多河道标识系统存在中英文书写不正确、标识牌不够美观等问题。今年年初,市城管部门决定全面推进城市河道标识国际化建设改造工作。

        “我们以亚运场馆、亚运通勤道路周边城市河道为重点范围,在此基础上,完成整个杭州市区城市河道管理区域的标识系统更新。”市城管局水设施河道中心相关负责人透露,标识系统更新主要分为三大部分,分别是统一标识牌造型、修正中英文书写和规范标识牌安装。

        河道标识系统更新过程中,工作人员对原有的不锈钢、纸质等标识牌进行更换,标明管理单位及联系电话以便信息反馈;统一以灰色、深原木色为标准,力求与周边环境相协调。另外,对所有标识牌的中英文书写进行重新校核,针对中文错别字、英文不规范翻译等问题,进行专项整改,必要时重新制作标识牌,重新安装。同时,统一标识牌的长宽高等参数,对安装高度不足、底座裸露等不规范安装的,责令安装单位及时整改。

        拱墅区亚运公园如今已成了周边市民的休闲好去处,最近大家在公园水系散步时,就可看到岸边按照规范要求加密布置了45块警示牌,不仅让亲水空间更安全,看起来也更舒适美观。

        上城区体育中心将承办杭州亚运会足球项目比赛,届时在体育馆边上的新塘河将是游客、运动员放松休闲散步的“首选”去处。前期,工作人员在巡河中发现新塘河排出口告示牌部分破损缺失,告示牌落款错误的现象,针对此种情况,城管部门立即进行了标识标牌的更新工作,在上城区体育中心“最后一公里”范围内共布置了15块警示牌,2块信息牌,1块告示牌,60块河道排出口牌。更新之后的标识标牌,风格统一,信息清楚,让市民和游客一目了然。

        萧山区的北塘公园今年也完成了公园标识系统维修更新,更换增设了约50处标识牌。

        位于城北的新天地商业区,石桥河部分段落穿过,涉及商业地块,经过河道中心与施工单位多次现场踏勘选址,并与周边街道商家协调沟通,最终选定人流量较大且与商业区景观融合良好的位置,在保证河道标牌安装到位的情况下维持了城市景观和谐。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/9.html b/news/9.html new file mode 100644 index 0000000..b0ff6e4 --- /dev/null +++ b/news/9.html @@ -0,0 +1,362 @@ + + + + +SM ENTERTAINMENT SQUARE标识牌在美国洛杉矶中心竖立_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        SM ENTERTAINMENT SQUARE标识牌在美国洛杉矶中心竖立

        +
        +
        +
        +  2022-04-30 阅读:7 +
        +
        +

        位于美国洛杉矶(以下简称“LA”)中心的“SM ENTERTAINMENT SQUARE”正式设置了标识牌,成为了话题。


        “SM ENTERTAINMENT SQUARE”是LA市内第6大道和牛津ABNEW交叉路的名称,4月28日(当地时间)该位置竖立了一块标识牌,写有介绍李秀满总制作人为“韩流和全球K-POP热潮的开拓者”的信息,吸引了人们的视线。

        SM ENTERTAINMENT SQUARE标识牌

        此前,2020年10月LA市议会为了赞誉SM娱乐和李秀满总制作人引领K-POP热潮,在全球音乐市场取得的成果,以及在LA当地宣传韩国文化方面做出的贡献,曾命名“SM ENTERTAINMENT SQUARE”。


        此外,“SM ENTERTAINMENT SQUARE”是在纽约时报广场等具有象征意义的美国街道上,首次被命名的韩国娱乐企业的名字,因此意义重大。


        另外,李秀满总制作人是SM娱乐的创始人,也是掀起全球K-POP热潮的韩国代表制作人,2005年在亚洲市场取得的巨大成就得到认可,不仅获得了美国LA市场的功劳牌,还获得了2017年文化人士首次“灵山外交人士”奖,成为连续5年(2017-2021)入选美国“Variety 500”的首位韩国人,首位获得美国“Asia Society”颁发的“2016 Asia Game Changer Awards”的韩国人,美国Billboard“2020 Billboard Impact List”唯一入选的韩国人等,印证了其全球影响力。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/90.html b/news/90.html new file mode 100644 index 0000000..8933377 --- /dev/null +++ b/news/90.html @@ -0,0 +1,362 @@ + + + + +上海市张江科学会堂新增标识标牌制作安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        上海市张江科学会堂新增标识标牌制作安装项目招标公告

        +
        +
        +
        +  2022-08-08 阅读:10 +
        +
        +

        项目所在地区:上海市
        一、招标条件
        本张江科学会堂新增标识标牌制作安装项目已由项目审批/核准/备案机关批准,项目资 金来源为国有资金98.71674万元,招标人为上海张江文化控股有限公司。本项目已具备招 标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:1.招标内容:张江科学会堂新增标识标牌制作安装项目,具体要求详见招标文 件第三章—技术要求书。2.项目地址:上海市浦东新区海科路1393号。3.交货期:合 同签订后15日历天内完成制作、安装。4.质保服务期:2年(自本合同项目全部移交给招 标人并获招标人书面接收确认之日起算)。5.最高投标限价:98.71674万元。
        范围:本招标项目划分为1个标段,本次招标为其中的: (001)张江科学会堂新增标识标牌制作安装项目;
        三、投标人资格要求
        (001张江科学会堂新增标识标牌制作安装项目)的投标人资格能力要求:
        1.投标人应 在中华人民共和国境内(不包括香港、澳门、台湾地区)有效注册,具有独立法人资格、遵 守中华人民共和国的法律、法规和条例;
        2.投标人未被国家财政部指定的“信用中国”网站(www.credictchina.gov.cn)列入失信 被执行人、重大税收违法案件当事人名单、政府采购严重违法失信行为记录名单;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年08月09日09时00分到2022年08月13日16时00分
        获取方式:有意向的投标人请于上述获取日期范围内向招标代理机构指定邮箱发送如下资料的原件扫描件:1)营业执照副本复印件(盖章);2) 投标人的法定代表人证明及身份证复印件,法定代表人授权委托书原件,受委托人身份证复 印件:本次招标文件收取工本费人民币1000元/本,售后不退。注①投标人须提供上述资料 的复印件须加盖公章。②获取招标文件时提供的资料应与投标文件中的资格证明文件一致,
        如有不同,以投标文件为准。③投标人提供的一切资料均应以中文为准,如果因为语言误差 造成的损失由投标人负责。
        五、投标文件的递交
        递交截止时间:2022年08月31日09时30分
        六、开标时间
        开标时间:2022年08月31日09时30分
        请联系后获取详细的招标公告、报名表格、项目附件及相关文件等。
        联系人:赵 琳
        联系电话:185 1840 8518
        邮 箱:zqsd8518@126.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/91.html b/news/91.html new file mode 100644 index 0000000..9a17f95 --- /dev/null +++ b/news/91.html @@ -0,0 +1,362 @@ + + + + +成都市龙泉驿区消防救援大队正规化建设标识标牌项目竞争性磋商采购公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        成都市龙泉驿区消防救援大队正规化建设标识标牌项目竞争性磋商采购公告

        +
        +
        +
        +  2022-08-08 阅读:26 +
        +
        +

        成都市龙泉驿区消防救援大队正规化建设标识标牌项目 采购项目的潜在供应商应在成都市高新区盛邦街88号“汇锦广场”C座910号获取采购文件,并于2022年08月19日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:GHJZ-QY-20220001

        项目名称:成都市龙泉驿区消防救援大队正规化建设标识标牌项目

        采购方式:竞争性磋商

        预算金额:23.0000000 万元(人民币)

        最高限价(如有):23.0000000 万元(人民币)

        采购需求:

        本项目共1包,拟确定成都市龙泉驿区消防救援大队正规化建设标识标牌项目供应商一名。


        合同履行期限:自合同签订后15日内。

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        无。


        3.本项目的特定资格要求:1、供应商单位及其现任法定代表人、主要负责人近三年不具有行贿犯罪记录;2、本项目不接受联合体磋商。

        三、获取采购文件

        时间:2022年08月09日  至 2022年08月15日,每天上午9:00至12:00,下午12:00至17:00。(北京时间,法定节假日除外)

        地点:成都市高新区盛邦街88号“汇锦广场”C座910号

        方式:1、现场获取:获取磋商文件时,经办人员当场提交以下资料:供应商为法人或者其他组织的,只需提供单位介绍信、经办人身份证明(复印件加盖公章);供应商为自然人的,只需提供本人身份证明。2、在线获取:需提供获取标书申请表(须包含项目名称、项目编号、单位名称、纳税人识别号、通讯地址、联系人及联系电话、电子邮箱、获取日期等,格式自拟)并加盖供应商公章,在磋商文件获取截止前将扫描件发送至四川国弘建中工程咨询有限公司邮箱(3334171684@qq.com),报名时间以实际收到邮件时间为准。

        售价:¥0.0 元(人民币)

        四、响应文件提交

        截止时间:2022年08月19日 10点30分(北京时间)

        地点:成都市高新区盛邦街88号“汇锦广场”C座910号

        五、开启

        时间:2022年08月19日 10点30分(北京时间)

        地点:成都市高新区盛邦街88号“汇锦广场”C座910号

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        无。


        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:成都市龙泉驿区消防救援大队     

        地址:成都市龙泉驿区汽车城大道300号        

        联系方式:李老师:028-84868407      

        2.采购代理机构信息

        名 称:四川国弘建中工程咨询有限公司            

        地 址:成都市高新区盛邦街88号“汇锦广场”C座910号            

        联系方式:刘女士:028-85121268、15351365430            

        3.项目联系方式

        项目联系人:刘女士

        电 话:  028-85121268、15351365430

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/92.html b/news/92.html new file mode 100644 index 0000000..bf9583c --- /dev/null +++ b/news/92.html @@ -0,0 +1,362 @@ + + + + +潮州某单位宣传标牌(二期)建设项目公开招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        潮州某单位宣传标牌(二期)建设项目公开招标公告

        +
        +
        +
        +  2022-08-08 阅读:8 +
        +
        +

        项目概况

        潮州某单位宣传标牌(二期)建设项目 招标项目的潜在投标人应在汕头市龙湖区新一城商业中心2幢1梯6楼获取招标文件,并于2022年08月30日 10点00分(北京时间)前递交投标文件。

        一、项目基本情况

        项目编号:2022-JLDJCG-G1015

        项目名称:潮州某单位宣传标牌(二期)建设项目

        预算金额:79.2204860 万元(人民币)

        最高限价(如有):79.2204860 万元(人民币)

        采购需求:

        采购人提供的施工图纸内容和工程预算书内容。

        合同履行期限:合同签订之日起60个日历天内完成

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        3.本项目的特定资格要求:1.供应商应具备《政府采购法》第二十二条规定的条件;2.供应商必须具备有效工商营业执照的建筑总承包三级或者钢结构承包三级(或以上)的其中一项,并取得有效的《安全生产许可证》;3.拟派项目负责人须具备建筑二级及以上注册建造师执业资格,且须在本企业注册,并取得有效的安全生产考核合格证(B类);4.本项目不接受联合体投标;注:(1)单位负责人为同一人或者存在直接控股、管理关系的不同供应商,不得同时参加本项目投标;(2)为本项目提供整体设计、规范编制或者项目管理、监理、检测等服务的供应商,不得再参与本项目投标。

        三、获取招标文件

        时间:2022年08月08日  至 2022年08月12日,每天上午9:00至11:00,下午14:00至16:30。(北京时间,法定节假日除外)

        地点:汕头市龙湖区新一城商业中心2幢1梯6楼

        方式:现场购买

        售价:¥300.0 元,本公告包含的招标文件售价总和

        四、提交投标文件截止时间、开标时间和地点

        提交投标文件截止时间:2022年08月30日 10点00分(北京时间)

        开标时间:2022年08月30日 10点00分(北京时间)

        地点:汕头市龙湖区新一城商业中心2幢1梯6楼

        五、公告期限

        自本公告发布之日起5个工作日。

        六、其他补充事宜


        购买招标文件经办人,需提供:

        1.有效的法人或其他组织的营业执照(或事业法人登记证副本等相关证明)复印件(加盖投标人公章,提供原件核对);

        2.经办人如是法定代表人/负责人,需提供法定代表人/负责人资格证明书原件及法定代表人/负责人身份证复印件(加盖投标人公章,提供原件核对);

        3.经办人如是投标人授权代表,需提供法定代表人/负责人授权委托书原件及授权代表身份证复印件(加盖投标人公章,提供法定代表人身份证及授权代表身份证,提供原件核对);

        4.资质证书复印件(加盖投标人公章,提供原件核对)

        5.安全生产许可证复印件(加盖投标人公章,提供原件核对);

        6.项目负责人注册建造师证、其安全生产考核合格B证及二代身份证复印件(加盖投标人公章,提供原件核对);

        注:1)本项目只接受购买本招标文件的供应商投标;

        2)以上文件在购买招标文件必须提供原件核对,文件提供人应保证以上文件真实可靠,如因所提供文件不实导致与本项目有关的任何损失由提供人承担。

        七、对本次招标提出询问,请按以下方式联系。

        1.采购人信息

        名 称:潮州某单位     

        地址:/        

        联系方式:方老师18666051235      

        2.采购代理机构信息

        名 称:广东建荣建设管理有限公司            

        地 址:汕头市龙湖区新一城商业中心2幢1梯6楼            

        联系方式:翁工0754-87276613            

        3.项目联系方式

        项目联系人:方老师

        电 话:  18666051235

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/93.html b/news/93.html new file mode 100644 index 0000000..0656bcf --- /dev/null +++ b/news/93.html @@ -0,0 +1,362 @@ + + + + +标识标牌设计,围绕这几个核心,才更具有特色的辨识度!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        标识标牌设计,围绕这几个核心,才更具有特色的辨识度!

        +
        +
        +
        +  2022-09-22 阅读:2 +
        +
        +

        1、文化特色

        北京是中国历史上最典型的古城。它是外国人最向往的城市之一,拥有举世闻名的文化。然而,北京机场的标识系统却找不到中国民族文化特色的影子,每一个角落都折射出现代西方文明的痕迹。

        2、设计水平

        标识标牌设计不同于典型的商业设计。它的技术和形式类似于商业设计,具有一定的宣传效果;但性质却大不相同。就目前而言,仍有许多标牌对形式、颜色、文字和设计没有给予足够的重视。


        3、与建筑和谐

        标识设计应考虑周边建筑环境、文化特色等因素。在欧式建筑中安装具有中国古典特色的标识,会让人产生不和谐感。标识标牌起到很好的引导作用;仿古建筑就用仿古风格的标识牌。


        4、可持续发展

        环境是历史的重叠。通过各个时代的景观特征和历史环境的连续性,给人以丰富的感受。适应时代发展,体现时代技术水平;具有时代特色。同时,地理环境、社会习俗、文化艺术等都不同程度地影响着环境的发展。


        5、标准化、系统化

        首先,标识牌设计应该具有系统的视觉外观。设计过程需要所有参与设计的成员整合想法。除了设计理念的一致性外,还要制定统一的标牌手册,包括标准的颜色、标准的字体、统一的设计形式、统一的尺寸、统一的材料、统一的规划方案。确保施工过程的准确性和设计的完整性。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/94.html b/news/94.html new file mode 100644 index 0000000..55e4b91 --- /dev/null +++ b/news/94.html @@ -0,0 +1,362 @@ + + + + +生物医药加速器(二期)标识标牌采购与安装项目招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        生物医药加速器(二期)标识标牌采购与安装项目招标公告

        +
        +
        +
        +  2022-09-22 阅读:12 +
        +
        +

        生物医药加速器(二期)标识标牌采购与安装项目招标公告
        (招标编号:/)
        项目所在地:上海市,市辖区,浦东新区
        一、招标条件
        生物医药加速器(二期)标识标牌采购与安装项目已由项目审批/核准/备案机关批准, 项目资金来源为国有资金367万元,招标人为上海国际医学园区集团有限公司。本项目已具 备招标条件,现招标方式为公开招标。
        二、项目概况和招标范围
        规模:生物医药加速器(二期)标识标牌采购与安装项目
        范围:本招标项目划分为1个标段,本次招标为其中的:
        (001)生物医药加速器(二期)标识标牌采购与安装项目;
        三、投标人资格要求
        (001生物医药加速器(二期)标识标牌采购与安装项目)的投标人资格能力要求:
        (1)具有独立法人资格及相应的经营范围;具有良好的信誉、能力的企业:近三年财务状况良好。
        (2)本项目不允许联合体投标。;
        本项目不允许联合体投标。
        四、招标文件的获取
        获取时间:从2022年09月21日09时00分到2022年09月25日16时00分
        获取方式:获取时间:从2022年9月21日09时00分到2022年9月25日16时00 分;
        获取方式:凡有意参加投标者,请于上述时间每日上午09:00-11:00, 下午13:00-16:00(北京时间,双休日需提前预约)获取招标文件。
        获取招标文件需提交的资料(1) 营业执照或事业单位法人证书、税务登记证(三证合一的可不提供)、组织机构代码证(三 证合一的可不提供)(复印件);(2)法定代表人授权委托书原件、被授权人身份证原件及 复印件;(3)贸易公司(作为代理)需制造商出具的授权函并携带原件复核。(4)以上资 料复印件均需加盖企业公章,原件复查。注获取招标文件期间投标人所递交的获取招标文 件材料如发现携带资料不全或不符合要求者视为自动放弃获取招标文件。本项目招标文件工 本费为人民币1000元。
        五、投标文件的递交截止时间:2022年10月11日09时00分
        六、开标时间:2022年10月11日09时00分
        联系人:侯 工
        手 机:152 1067 5113
        邮 箱:ztbxx177@163.com

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/95.html b/news/95.html new file mode 100644 index 0000000..a006662 --- /dev/null +++ b/news/95.html @@ -0,0 +1,362 @@ + + + + +宁南县人民医院第二住院综合大楼标识标牌制作安装项目(二次)采购更正公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        宁南县人民医院第二住院综合大楼标识标牌制作安装项目(二次)采购更正公告

        +
        +
        +
        +  2022-09-22 阅读:39 +
        +
        +

        一、项目基本情况

        原公告的采购项目编号:N5134272022000072

        原公告的采购项目名称:第二住院综合大楼标识标牌制作安装项目(二次)

        首次公告日期:2022年09月19日

        二、更正信息:


        更正事项:采购公告

        更正原因:

        对采购清单、其他要求及开标时间进行更正

        更正内容:

        原公告的响应文件提交截止时间:2022-09-23 10:30:00,更正为:2022-09-27 10:00:00。

        原公告的开启时间:2022-09-23 10:30:00,更正为:2022-09-27 10:00:00。

        原公告的代理机构联系方式:028-83417783-610,更正为:028-83195233-610。

        原公告的项目联系人联系电话:028-83417783-610,更正为:028-83195233-610。

        具体详见采购文件

        其他内容不变

        更正日期:2022年09月22日


        三、其他补充事项

        供应商需遵守凉山彝族自治州最新防疫政策及当地防疫要求,具体防疫要求请咨询凉山州疫病预防控制中心电话:0834-2893055

        四、凡对本次公告内容提出询问,请按以下方式联系。

        1.采购人信息

        名称:宁南县人民医院

        地址:四川省凉山彝族自治州宁南县宁远镇顺城北街206号

        联系方式:0834-4575455

        2.采购代理机构信息

        名称:四川中科远洋工程项目管理有限公司

        地址:四川省成都市金牛万达写字楼SoHo A座16楼1601号

        联系方式:028-83195233-610

        3.项目联系方式

        项目联系人:彭女士

        电话:028-83195233-610


        四川中科远洋工程项目管理有限公司

        2022年09月22日

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/96.html b/news/96.html new file mode 100644 index 0000000..e781a28 --- /dev/null +++ b/news/96.html @@ -0,0 +1,362 @@ + + + + +克拉玛依某单位车库标牌制作询价邀请书_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        克拉玛依某单位车库标牌制作询价邀请书

        +
        +
        +
        +  2022-09-22 阅读:10 +
        +
        +

        项目概况

        克拉玛依某单位车库标牌制作 采购项目的潜在供应商应在新疆维吾尔自治区克拉玛依市克拉玛依区迎宾路17号获取采购文件,并于2022年10月18日 10点30分(北京时间)前提交响应文件。

        一、项目基本情况

        项目编号:2022-JWXJKL-W4084

        项目名称:克拉玛依某单位车库标牌制作

        采购方式:询价

        预算金额:6.1600000 万元(人民币)

        采购需求:


        合同履行期限:签订合同之日起15日内完成所有项目安装

        本项目( 不接受  )联合体投标。

        二、申请人的资格要求:

        1.满足《中华人民共和国政府采购法》第二十二条规定;

        2.落实政府采购政策需满足的资格要求:

        1.具有独立承担民事责任的能力;

        2.具有良好的商业信誉和健全的财务会计制度;

        3.具有履行合同所必需的设备和专业技术能力;

        4.有依法缴纳税收和社会保障资金的良好记录;

        5.参加政府采购活动前3年内,在经营活动中没有重大违法记录;

        6.法律、行政法规规定的其他条件。


        3.本项目的特定资格要求:1.工商营业执照满足采购文件要求;2.法定代表人资格证明书和授权书满足采购文件要求;3.报价方关于资格的声明函满足询价文件要求;4.报价方经营范围(或货物销售授权书)等满足询价文件要求

        三、获取采购文件

        时间:2022年09月22日 至 2022年09月28日,每天上午10:00至13:30,下午16:30至18:30。(北京时间,法定节假日除外)

        地点:新疆维吾尔自治区克拉玛依市克拉玛依区迎宾路17号

        方式:供应商指定专人现场领取或通过电报、电传、电话以及电子邮件等方式递交报名,现场领取招标文件或者网上下载

        售价:¥0.0 元(人民币)

        四、响应文件提交

        截止时间:2022年10月18日 10点30分(北京时间)

        地点:新疆维吾尔自治区克拉玛依市克拉玛依区迎宾路17号

        五、开启

        时间:2022年10月18日 10点30分(北京时间)

        地点:新疆维吾尔自治区克拉玛依市克拉玛依区迎宾路17号

        六、公告期限

        自本公告发布之日起3个工作日。

        七、其他补充事宜

        八、凡对本次采购提出询问,请按以下方式联系。

        1.采购人信息

        名 称:克拉玛依某单位     

        地址:新疆克拉玛依市迎宾路17号        

        联系方式:王进贤19999711968      

        2.项目联系方式

        项目联系人:王进贤

        电 话:  19999711968

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/97.html b/news/97.html new file mode 100644 index 0000000..a6f83fa --- /dev/null +++ b/news/97.html @@ -0,0 +1,362 @@ + + + + +蚌埠市交通运输综合行政执法支队基层站所标识标牌安装工程招标公告_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        蚌埠市交通运输综合行政执法支队基层站所标识标牌安装工程招标公告

        +
        +
        +
        +  2022-09-22 阅读:9 +
        +
        +

        一、项目概况

        1、工程名称:基层站所标识标牌安装工程

        2、招标人:蚌埠市交通运输综合行政执法支队

        3、资金来源:财政资金

        4、招标预算:51.73万元

        二、项目招标内容

        1、项目地点:招标人指定地点

        2、招标范围:工程量清单中规定所有内容。

        3、计划工期:40日历天

        4、质量要求:符合国家工程质量验收合格标准。

        三、投标人资格要求

        (1)投标人须具有独立法人资格,具备建筑工程施工总承包叁级及以上资质,具有有效的安全生产许可证。

        (2)投标人拟派项目经理须具备建筑工程专业贰级及以上注册建造师资格,并持有有效安全生产考核(B类)证书;

        (2)本次招标不接受联合体投标。

        四、招标文件的获取

        1、网上报名:凡有意参加投标者,将以下资料扫描发送至招标代理公司指定邮箱(1070619845@qq.com)或微信(本机号码,备注公司名称及所投标项目简称),单位介绍信或法人授权委托书原件(材料中注明被授权人的联系方式及电子邮箱)不符合要求的报名将不予接收。

        2、报名时间:2022年9月21日至2022年10月8日(北京时间上午8:30-12:00 时,下午14:30-17:30时,节假日不休)

        3、招标文件售价:以电子版发售,每套人民币贰佰元(200元),售后不退。

        五、开标及投标文件递交截止时间:2022年10月9日9时30分

        六、开标地点及投标文件递交地点:蚌埠市淮上区永昌国际C座2218-2221室

        七、联系方式

        招标人名称:蚌埠市交通运输综合行政执法支队

        联系人:许先生

        联系方式:0552-7285568

        地址:蚌埠市龙子湖区沿淮路885号

        招标代理机构:天鉴国际工程管理有限公司

        联 系 人:钱工

        电  话:15905525478

        地  址:蚌埠市紫阳大厦1909室

        八、监督电话

        财政部门:0552-2055225    

        上级主管部门:0552-3028822

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/98.html b/news/98.html new file mode 100644 index 0000000..6c726de --- /dev/null +++ b/news/98.html @@ -0,0 +1,362 @@ + + + + +预计2022年中国人脸识别市场规模高增长,拉动全产业链发展_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        预计2022年中国人脸识别市场规模高增长,拉动全产业链发展

        +
        +
        +
        +  2022-09-22 阅读:10 +
        +
        +

        根据中商产业研究院整理数据显示,2020年中国人脸识别行业市场规模达到45亿元,而2022年中国人脸识别市场规模将达到68亿元,实现高增长。

        01人脸识别的应用领域不断拓展

        人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术,借助摄像机或摄像头采集人脸图像或视频流,并自动在图像或视频流中检测和跟踪人脸,进而实现人脸图像特征提取、信息匹配和身份识别等功能。相较于指纹、虹膜等生物识别方式,人脸识别具有非接触性、唯一性、并发性等技术优势,因而受到了国家政策的大力扶持,也吸引了越来越多的市场资本关注。

        人脸识别技术应用于金融领域(图源:千图网)

        华北工控了解到,随着人工智能、计算机、光学成像等相关技术的加速发展,人脸识别在各领域的应用正逐渐深化。在安防领域,人脸识别技术已成功应用到视频监控、人证查验通道等细分场景;在金融领域,基于人脸识别的实名认证、交易支付等已经普及应用;在交通领域,众多地铁站、火车站、机场等纷纷安装了人脸识别通行设备进行出入口管理,给我们的生活带来便利,提高安全性。

        在这样的形势下,国内越来越多的科技企业加紧布局人脸识别产业。华北工控作为行业专用嵌入式计算机产品提供商,也推出了人脸识别系统专用嵌入式产品方案。

        02人脸识别系统嵌入式产品方案

        华北工控提供X86架构和ARM架构的多样化嵌入式主板服务于人脸识别领域客户,包括嵌入式核心板、PICO-ITX工控主板、嵌入式3.5寸主板、Mini-ITX主板等、ATX主板等。

        华北工控人脸识别系统应用产品示意图

        产品支持客户定制,从功能接口、配件、版型、外围设备安装到操作系统、产品驱动、安全软件,华北工控均可为客户提供高度弹性且客制化的产品及服务。

        产品支持搭载英特尔、AMD、海思、瑞芯微、恩智浦等平台处理器,可以根据不同芯片组平台实现差异化功能扩展,以及不同的CPU/GPU运算能力需要。

        产品具备工业级高可靠性,严格按照工业级标准打造,具备抗震、防尘、防潮等坚固耐用特性,支持在宽温、复杂电磁环境等各种条件下稳定运行。

        目前华北工控已成功助力安防、金融领域客户实现人脸识别系统设备的应用落地。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/99.html b/news/99.html new file mode 100644 index 0000000..6a316e2 --- /dev/null +++ b/news/99.html @@ -0,0 +1,362 @@ + + + + +数字橱窗引爆商业视觉第二空间!_行业焦点__找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        +

        数字橱窗引爆商业视觉第二空间!

        +
        +
        +
        +  2022-09-22 阅读:11 +
        +
        +

        橱窗历来是一个能够吸引路人驻足围观的创意舞台。品牌通过富有创意的视觉效果激发消费者的购物欲望,也通过标志性的橱窗设计向顾客传达其品牌故事与文化。

        Digital Display

        技术的发展也让橱窗展示这项拥有超过百年历史的艺术形式持续保持活力。

        数字赋能“橱窗魔力” ✦

        Digital Power

        数字技术的加入,橱窗展示被进一步激发其展示艺术的活力和创造性。反应式装置、触摸屏、增强现实(Augmented Reality,AR)、视觉数字技术等交互新方式让静态橱窗有了新的玩法。

        淘气厨具的橱窗

        Nimmersatt-das Spiel mit den Hungrigen(永不满足——饥饿者的游戏)

        采用了一个交互式的机械音响装置,25 个听筒和盖子,25 个伺服马达,2 个扬声器,一个 Mac mini,Kinect 和 Arduino Mega。

        每个罐子的盖子都牵着一根电缆,盖子的打开或关闭,取决于行人站的位置。

        玩打砖块的橱窗

        PolaCafé ——Brick

        打砖块是许多人玩过的手机游戏,故其拥有大量的玩家,很快就聚集了大量的围观人群。在这里玩游戏,那就只有两个字:拉风。

        在这个小小的橱窗前,人们能够通过控制自己的身体来控制挡板,让小球无限反弹下去,打到更多砖块。

        吹起丝巾的橱窗

        BLOW

        屏幕内一位美丽的女士睁开双眼,轻柔吹气,屏幕外的丝巾被准确地吹起,随后女士微笑着闭上眼。整个作品非常简单,循环播放。

        这一设计既能表现潮流感,又能体现出商品的轻柔质感。吸引路人的目光,自然是不在话下。

        目光注视的橱窗

        AINZ&TULPE 化妆品店—— Looks

        在互动橱窗 Looks 中,传感器可以检测商店外路过的人。当路人经过橱窗,橱窗上妆容精致的女性们便会齐齐看向路人的方向。

        当路人停下脚步,触摸屏幕上自己喜欢的面孔时,对应的女性便会展现她的美丽,妆容所使用的化妆品也会全部列出。

        解锁数字橱窗“密码” ✦

        Digital Passpord

        相比传统商业广告,数字橱窗更具有吸引力和神秘的视觉体验。不但吸引经过的人驻足,还可以利用识别技术,精准定位目标人群,甚至可以变身成为虚拟实体店完成电子商务交易。

        背后有怎样的“黑科技”加持?

        数码橱窗技术是一种利用全息纳米触摸膜(彩炫互动膜)进行透明交互触摸传播的新型媒体技术。

        依附于商家的玻璃橱窗、玻璃门,将企业宣传、商品信息展示映射到玻璃介质上,吸引路过的潜在顾客进行互动。

        ✦全息纳米触摸膜

        通过在橱窗中使用数字艺术,我们正在迎接新美学的兴起,它是数字技术的视觉语言,也是我们信息饱和时代的缩影。

        +
        +反对 0举报 0 +收藏 0 + +
        +
        +
        +

        免责声明:
        本站部份内容系网友自发上传与转载,不代表本网赞同其观点;
        如涉及内容、版权等问题,请在30日内联系,我们将在第一时间删除内容!

        +
        +
        + +
        + +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/ajax.php b/news/ajax.php new file mode 100644 index 0000000..2f5f7a1 --- /dev/null +++ b/news/ajax.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/news/config.inc.php b/news/config.inc.php new file mode 100644 index 0000000..16ccca3 --- /dev/null +++ b/news/config.inc.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/news/hangqing/index.html b/news/hangqing/index.html new file mode 100644 index 0000000..d42e861 --- /dev/null +++ b/news/hangqing/index.html @@ -0,0 +1,466 @@ + + + + +市场行情_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   下一页»   共25条/2页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangqing/list1.html b/news/hangqing/list1.html new file mode 100644 index 0000000..d42e861 --- /dev/null +++ b/news/hangqing/list1.html @@ -0,0 +1,466 @@ + + + + +市场行情_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   下一页»   共25条/2页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangqing/list2.html b/news/hangqing/list2.html new file mode 100644 index 0000000..439daf8 --- /dev/null +++ b/news/hangqing/list2.html @@ -0,0 +1,350 @@ + + + + +市场行情_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   下一页»   共25条/2页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/index.html b/news/hangye/index.html new file mode 100644 index 0000000..1afdf55 --- /dev/null +++ b/news/hangye/index.html @@ -0,0 +1,467 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   3   4   5   6   7   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list1.html b/news/hangye/list1.html new file mode 100644 index 0000000..1afdf55 --- /dev/null +++ b/news/hangye/list1.html @@ -0,0 +1,467 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   3   4   5   6   7   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list10.html b/news/hangye/list10.html new file mode 100644 index 0000000..6b90740 --- /dev/null +++ b/news/hangye/list10.html @@ -0,0 +1,457 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   8   9   10   11   12   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list11.html b/news/hangye/list11.html new file mode 100644 index 0000000..09dedd9 --- /dev/null +++ b/news/hangye/list11.html @@ -0,0 +1,457 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   9   10   11   12   13   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list12.html b/news/hangye/list12.html new file mode 100644 index 0000000..c86e8d5 --- /dev/null +++ b/news/hangye/list12.html @@ -0,0 +1,462 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   9   10   11   12   13   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list13.html b/news/hangye/list13.html new file mode 100644 index 0000000..1190a11 --- /dev/null +++ b/news/hangye/list13.html @@ -0,0 +1,463 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   9   10   11   12   13   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list14.html b/news/hangye/list14.html new file mode 100644 index 0000000..3b4d625 --- /dev/null +++ b/news/hangye/list14.html @@ -0,0 +1,464 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   9   10   11   12   13   …  14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list15.html b/news/hangye/list15.html new file mode 100644 index 0000000..3a92671 --- /dev/null +++ b/news/hangye/list15.html @@ -0,0 +1,435 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   9   10   11   12   13   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list2.html b/news/hangye/list2.html new file mode 100644 index 0000000..de8cb4c --- /dev/null +++ b/news/hangye/list2.html @@ -0,0 +1,460 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   3   4   5   6   7   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list3.html b/news/hangye/list3.html new file mode 100644 index 0000000..26467a6 --- /dev/null +++ b/news/hangye/list3.html @@ -0,0 +1,456 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …  3   4   5   6   7   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list4.html b/news/hangye/list4.html new file mode 100644 index 0000000..f046388 --- /dev/null +++ b/news/hangye/list4.html @@ -0,0 +1,468 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   3   4   5   6   7   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list5.html b/news/hangye/list5.html new file mode 100644 index 0000000..11b80c4 --- /dev/null +++ b/news/hangye/list5.html @@ -0,0 +1,467 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   3   4   5   6   7   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list6.html b/news/hangye/list6.html new file mode 100644 index 0000000..deab33e --- /dev/null +++ b/news/hangye/list6.html @@ -0,0 +1,462 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   4   5   6   7   8   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list7.html b/news/hangye/list7.html new file mode 100644 index 0000000..f4c3317 --- /dev/null +++ b/news/hangye/list7.html @@ -0,0 +1,456 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   5   6   7   8   9   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list8.html b/news/hangye/list8.html new file mode 100644 index 0000000..49a0296 --- /dev/null +++ b/news/hangye/list8.html @@ -0,0 +1,458 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   6   7   8   9   10   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/hangye/list9.html b/news/hangye/list9.html new file mode 100644 index 0000000..d279b69 --- /dev/null +++ b/news/hangye/list9.html @@ -0,0 +1,453 @@ + + + + +焦点行业资讯_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        +
        + +
        +
         «上一页   1   2   …   7   8   9   10   11   …   14   15   下一页»   共296条/15页 
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/index.html b/news/index.html new file mode 100644 index 0000000..03fdaa5 --- /dev/null +++ b/news/index.html @@ -0,0 +1,460 @@ + + + + +标识标牌行业资讯_广告行业新闻_找标牌网 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        +
        +
        找标牌网 + +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        + +
        +
        +
        +
        +
        +
        + +
        + + + + + + \ No newline at end of file diff --git a/news/index.php b/news/index.php new file mode 100644 index 0000000..9aa7b38 --- /dev/null +++ b/news/index.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/news/list.php b/news/list.php new file mode 100644 index 0000000..ab43ed4 --- /dev/null +++ b/news/list.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/news/search.php b/news/search.php new file mode 100644 index 0000000..802d62c --- /dev/null +++ b/news/search.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/news/show.php b/news/show.php new file mode 100644 index 0000000..6dd9dad --- /dev/null +++ b/news/show.php @@ -0,0 +1,6 @@ + \ No newline at end of file